bool ConnectionFactory::createRemoteConnection(const enum ngsCatalogObjectType type, const std::string &path, const Options &options) { switch(type) { case CAT_CONTAINER_NGW: { std::string url = options.asString(KEY_URL); if(url.empty()) { return errorMessage(_("Missing required option 'url'")); } std::string login = options.asString(KEY_LOGIN); if(login.empty()) { login = "******"; } else { std::string oldLogin(login); login = CPLString(login).Trim(); if(!compare(oldLogin, login, true)) { warningMessage("Login was trimmed!"); } } std::string password = options.asString(KEY_PASSWORD); bool isGuest = options.asBool(KEY_IS_GUEST); CPLJSONDocument connectionFile; CPLJSONObject root = connectionFile.GetRoot(); root.Add(KEY_TYPE, type); root.Add(KEY_URL, url); root.Add(KEY_LOGIN, login); root.Add(KEY_IS_GUEST, isGuest); if(!password.empty()) { root.Add(KEY_PASSWORD, encrypt(password)); } return connectionFile.Save(path); } default: return errorMessage(_("Unsupported connection type %d"), type); } }
bool ConnectionFactory::checkRemoteConnection(const enum ngsCatalogObjectType type, const Options &options) { resetError(); switch(type) { case CAT_CONTAINER_NGW: { std::string url = options.asString(KEY_URL); if(url.empty()) { return errorMessage(_("Missing required option 'url'")); } std::string login = options.asString(KEY_LOGIN); if(login.empty()) { login = "******"; } else { std::string oldLogin(login); login = CPLString(login).Trim(); if(!compare(oldLogin, login, true)) { warningMessage("Login was trimmed!"); } } std::string password = options.asString(KEY_PASSWORD); CPLStringList requestOptions; std::string headers = "Accept: */*"; Options authOptions; authOptions.add(KEY_TYPE, "basic"); authOptions.add(KEY_LOGIN, login); authOptions.add(KEY_PASSWORD, password); AuthStore::authAdd(url, authOptions); std::string auth = AuthStore::authHeader(url); AuthStore::authRemove(url); if(!auth.empty()) { headers += "\r\n"; headers += auth; } requestOptions.AddNameValue("HEADERS", headers.c_str()); CPLJSONDocument checkReq; if(!checkReq.LoadUrl(ngw::getCurrentUserUrl(url), requestOptions)) { return errorMessage(CPLGetLastErrorMsg()); } CPLJSONObject root = checkReq.GetRoot(); if(!root.IsValid()) { return errorMessage(_("Response is invalid")); } if(root.GetString("keyname") == login) { return true; } return errorMessage(_("User '%s' failed to connect to %s."), login.c_str(), url.c_str()); } default: return errorMessage(_("Unsupported connection type %d"), type); } }