import Uri from "../ThirdParty/Uri.js";
|
import defined from "./defined.js";
|
import DeveloperError from "./DeveloperError.js";
|
|
/**
|
* A singleton that contains all of the servers that are trusted. Credentials will be sent with
|
* any requests to these servers.
|
*
|
* @namespace TrustedServers
|
*
|
* @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing}
|
*/
|
var TrustedServers = {};
|
var _servers = {};
|
|
/**
|
* Adds a trusted server to the registry
|
*
|
* @param {String} host The host to be added.
|
* @param {Number} port The port used to access the host.
|
*
|
* @example
|
* // Add a trusted server
|
* TrustedServers.add('my.server.com', 80);
|
*/
|
TrustedServers.add = function (host, port) {
|
//>>includeStart('debug', pragmas.debug);
|
if (!defined(host)) {
|
throw new DeveloperError("host is required.");
|
}
|
if (!defined(port) || port <= 0) {
|
throw new DeveloperError("port is required to be greater than 0.");
|
}
|
//>>includeEnd('debug');
|
|
var authority = host.toLowerCase() + ":" + port;
|
if (!defined(_servers[authority])) {
|
_servers[authority] = true;
|
}
|
};
|
|
/**
|
* Removes a trusted server from the registry
|
*
|
* @param {String} host The host to be removed.
|
* @param {Number} port The port used to access the host.
|
*
|
* @example
|
* // Remove a trusted server
|
* TrustedServers.remove('my.server.com', 80);
|
*/
|
TrustedServers.remove = function (host, port) {
|
//>>includeStart('debug', pragmas.debug);
|
if (!defined(host)) {
|
throw new DeveloperError("host is required.");
|
}
|
if (!defined(port) || port <= 0) {
|
throw new DeveloperError("port is required to be greater than 0.");
|
}
|
//>>includeEnd('debug');
|
|
var authority = host.toLowerCase() + ":" + port;
|
if (defined(_servers[authority])) {
|
delete _servers[authority];
|
}
|
};
|
|
function getAuthority(url) {
|
var uri = new Uri(url);
|
uri.normalize();
|
|
// Removes username:password@ so we just have host[:port]
|
var authority = uri.authority();
|
if (authority.length === 0) {
|
return undefined; // Relative URL
|
}
|
uri.authority(authority);
|
|
if (authority.indexOf("@") !== -1) {
|
var parts = authority.split("@");
|
authority = parts[1];
|
}
|
|
// If the port is missing add one based on the scheme
|
if (authority.indexOf(":") === -1) {
|
var scheme = uri.scheme();
|
if (scheme.length === 0) {
|
scheme = window.location.protocol;
|
scheme = scheme.substring(0, scheme.length - 1);
|
}
|
if (scheme === "http") {
|
authority += ":80";
|
} else if (scheme === "https") {
|
authority += ":443";
|
} else {
|
return undefined;
|
}
|
}
|
|
return authority;
|
}
|
|
/**
|
* Tests whether a server is trusted or not. The server must have been added with the port if it is included in the url.
|
*
|
* @param {String} url The url to be tested against the trusted list
|
*
|
* @returns {boolean} Returns true if url is trusted, false otherwise.
|
*
|
* @example
|
* // Add server
|
* TrustedServers.add('my.server.com', 81);
|
*
|
* // Check if server is trusted
|
* if (TrustedServers.contains('https://my.server.com:81/path/to/file.png')) {
|
* // my.server.com:81 is trusted
|
* }
|
* if (TrustedServers.contains('https://my.server.com/path/to/file.png')) {
|
* // my.server.com isn't trusted
|
* }
|
*/
|
TrustedServers.contains = function (url) {
|
//>>includeStart('debug', pragmas.debug);
|
if (!defined(url)) {
|
throw new DeveloperError("url is required.");
|
}
|
//>>includeEnd('debug');
|
var authority = getAuthority(url);
|
if (defined(authority) && defined(_servers[authority])) {
|
return true;
|
}
|
|
return false;
|
};
|
|
/**
|
* Clears the registry
|
*
|
* @example
|
* // Remove a trusted server
|
* TrustedServers.clear();
|
*/
|
TrustedServers.clear = function () {
|
_servers = {};
|
};
|
export default TrustedServers;
|