// // License type: BSD 3-Clause License // License copy: https://github.com/Telecominfraproject/wlan-cloud-ucentralgw/blob/master/LICENSE // // Created by Stephane Bourque on 2021-03-04. // Arilia Wireless Inc. // #include "Poco/JSON/Parser.h" #include "Poco/JSON/Stringifier.h" #include "RESTAPI_SecurityObjects.h" #include "framework/RESTAPI_utils.h" using OpenWifi::RESTAPI_utils::field_from_json; using OpenWifi::RESTAPI_utils::field_to_json; namespace OpenWifi::SecurityObjects { void AclTemplate::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "Read", Read_); field_to_json(Obj, "ReadWrite", ReadWrite_); field_to_json(Obj, "ReadWriteCreate", ReadWriteCreate_); field_to_json(Obj, "Delete", Delete_); field_to_json(Obj, "PortalLogin", PortalLogin_); } ResourceAccessType ResourceAccessTypeFromString(const std::string &s) { if (!Poco::icompare(s, "READ")) return READ; if (!Poco::icompare(s, "MODIFY")) return MODIFY; if (!Poco::icompare(s, "DELETE")) return DELETE; if (!Poco::icompare(s, "CREATE")) return CREATE; if (!Poco::icompare(s, "TEST")) return TEST; if (!Poco::icompare(s, "MOVE")) return MOVE; return NONE; } std::string ResourceAccessTypeToString(const ResourceAccessType &T) { switch (T) { case READ: return "READ"; case MODIFY: return "MODIFY"; case DELETE: return "DELETE"; case CREATE: return "CREATE"; case TEST: return "TEST"; case MOVE: return "MOVE"; default: return "NONE"; } } USER_ROLE UserTypeFromString(const std::string &U) { if (!Poco::icompare(U, "root")) return ROOT; else if (!Poco::icompare(U, "admin")) return ADMIN; else if (!Poco::icompare(U, "subscriber")) return SUBSCRIBER; else if (!Poco::icompare(U, "partner")) return PARTNER; else if (!Poco::icompare(U, "csr")) return CSR; else if (!Poco::icompare(U, "system")) return SYSTEM; else if (!Poco::icompare(U, "installer")) return INSTALLER; else if (!Poco::icompare(U, "noc")) return NOC; else if (!Poco::icompare(U, "accounting")) return ACCOUNTING; return UNKNOWN; } std::string UserTypeToString(USER_ROLE U) { switch (U) { case ROOT: return "root"; case ADMIN: return "admin"; case SUBSCRIBER: return "subscriber"; case PARTNER: return "partner"; case CSR: return "csr"; case SYSTEM: return "system"; case INSTALLER: return "installer"; case NOC: return "noc"; case ACCOUNTING: return "accounting"; case UNKNOWN: default: return "unknown"; } } bool AclTemplate::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "Read", Read_); field_from_json(Obj, "ReadWrite", ReadWrite_); field_from_json(Obj, "ReadWriteCreate", ReadWriteCreate_); field_from_json(Obj, "Delete", Delete_); field_from_json(Obj, "PortalLogin", PortalLogin_); return true; } catch (...) { std::cout << "Cannot parse: AclTemplate" << std::endl; } return false; } void WebToken::to_json(Poco::JSON::Object &Obj) const { Poco::JSON::Object AclTemplateObj; acl_template_.to_json(AclTemplateObj); field_to_json(Obj, "access_token", access_token_); field_to_json(Obj, "refresh_token", refresh_token_); field_to_json(Obj, "token_type", token_type_); field_to_json(Obj, "expires_in", expires_in_); field_to_json(Obj, "idle_timeout", idle_timeout_); field_to_json(Obj, "created", created_); field_to_json(Obj, "username", username_); field_to_json(Obj, "userMustChangePassword", userMustChangePassword); field_to_json(Obj, "errorCode", errorCode); Obj.set("aclTemplate", AclTemplateObj); field_to_json(Obj, "errorCode", errorCode); field_to_json(Obj, "lastRefresh", lastRefresh_); } bool WebToken::from_json(const Poco::JSON::Object::Ptr &Obj) { try { if (Obj->isObject("aclTemplate")) { Poco::JSON::Object::Ptr AclTemplate = Obj->getObject("aclTemplate"); acl_template_.from_json(AclTemplate); } field_from_json(Obj, "access_token", access_token_); field_from_json(Obj, "refresh_token", refresh_token_); field_from_json(Obj, "token_type", token_type_); field_from_json(Obj, "expires_in", expires_in_); field_from_json(Obj, "idle_timeout", idle_timeout_); field_from_json(Obj, "created", created_); field_from_json(Obj, "username", username_); field_from_json(Obj, "userMustChangePassword", userMustChangePassword); field_from_json(Obj, "lastRefresh", lastRefresh_); return true; } catch (...) { std::cout << "Cannot parse: WebToken" << std::endl; } return false; } void MobilePhoneNumber::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "number", number); field_to_json(Obj, "verified", verified); field_to_json(Obj, "primary", primary); } bool MobilePhoneNumber::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "number", number); field_from_json(Obj, "verified", verified); field_from_json(Obj, "primary", primary); return true; } catch (...) { std::cout << "Cannot parse: MobilePhoneNumber" << std::endl; } return false; }; void MfaAuthInfo::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "enabled", enabled); field_to_json(Obj, "method", method); } bool MfaAuthInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "enabled", enabled); field_from_json(Obj, "method", method); return true; } catch (...) { std::cout << "Cannot parse: MfaAuthInfo" << std::endl; } return false; } void UserLoginLoginExtensions::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "mobiles", mobiles); field_to_json(Obj, "mfa", mfa); field_to_json(Obj, "authenticatorSecret", authenticatorSecret); } bool UserLoginLoginExtensions::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "mobiles", mobiles); field_from_json(Obj, "mfa", mfa); field_from_json(Obj, "authenticatorSecret", authenticatorSecret); return true; } catch (...) { std::cout << "Cannot parse: UserLoginLoginExtensions" << std::endl; } return false; } void MFAChallengeRequest::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "uuid", uuid); field_to_json(Obj, "question", question); field_to_json(Obj, "created", created); field_to_json(Obj, "method", method); } bool MFAChallengeRequest::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "uuid", uuid); field_from_json(Obj, "question", question); field_from_json(Obj, "created", created); field_from_json(Obj, "method", method); return true; } catch (...) { std::cout << "Cannot parse: MFAChallengeRequest" << std::endl; } return false; }; void MFAChallengeResponse::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "uuid", uuid); field_to_json(Obj, "answer", answer); } bool MFAChallengeResponse::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "uuid", uuid); field_from_json(Obj, "answer", answer); return true; } catch (...) { std::cout << "Cannot parse: MFAChallengeResponse" << std::endl; } return false; } void UserInfo::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "id", id); field_to_json(Obj, "name", name); field_to_json(Obj, "description", description); field_to_json(Obj, "avatar", avatar); field_to_json(Obj, "email", email); field_to_json(Obj, "validated", validated); field_to_json(Obj, "validationEmail", validationEmail); field_to_json(Obj, "validationDate", validationDate); field_to_json(Obj, "creationDate", creationDate); field_to_json(Obj, "validationURI", validationURI); field_to_json(Obj, "changePassword", changePassword); field_to_json(Obj, "lastLogin", lastLogin); field_to_json(Obj, "currentLoginURI", currentLoginURI); field_to_json(Obj, "lastPasswordChange", lastPasswordChange); field_to_json(Obj, "lastEmailCheck", lastEmailCheck); field_to_json(Obj, "waitingForEmailCheck", waitingForEmailCheck); field_to_json(Obj, "locale", locale); field_to_json(Obj, "notes", notes); field_to_json(Obj, "location", location); field_to_json(Obj, "owner", owner); field_to_json(Obj, "suspended", suspended); field_to_json(Obj, "blackListed", blackListed); field_to_json(Obj, "userRole", userRole, UserTypeToString); field_to_json(Obj, "userTypeProprietaryInfo", userTypeProprietaryInfo); field_to_json(Obj, "securityPolicy", securityPolicy); field_to_json(Obj, "securityPolicyChange", securityPolicyChange); field_to_json(Obj, "currentPassword", currentPassword); field_to_json(Obj, "lastPasswords", lastPasswords); field_to_json(Obj, "oauthType", oauthType); field_to_json(Obj, "oauthUserInfo", oauthUserInfo); field_to_json(Obj, "modified", modified); field_to_json(Obj, "signingUp", signingUp); }; bool UserInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "id", id); field_from_json(Obj, "name", name); field_from_json(Obj, "description", description); field_from_json(Obj, "avatar", avatar); field_from_json(Obj, "email", email); field_from_json(Obj, "validationEmail", validationEmail); field_from_json(Obj, "validationURI", validationURI); field_from_json(Obj, "currentLoginURI", currentLoginURI); field_from_json(Obj, "locale", locale); field_from_json(Obj, "notes", notes); field_from_json(Obj, "location", location); field_from_json(Obj, "owner", owner); field_from_json(Obj, "userRole", userRole, UserTypeFromString); field_from_json(Obj, "securityPolicy", securityPolicy); field_from_json(Obj, "userTypeProprietaryInfo", userTypeProprietaryInfo); field_from_json(Obj, "validationDate", validationDate); field_from_json(Obj, "creationDate", creationDate); field_from_json(Obj, "lastLogin", lastLogin); field_from_json(Obj, "lastPasswordChange", lastPasswordChange); field_from_json(Obj, "lastEmailCheck", lastEmailCheck); field_from_json(Obj, "securityPolicyChange", securityPolicyChange); field_from_json(Obj, "validated", validated); field_from_json(Obj, "changePassword", changePassword); field_from_json(Obj, "waitingForEmailCheck", waitingForEmailCheck); field_from_json(Obj, "suspended", suspended); field_from_json(Obj, "blackListed", blackListed); field_from_json(Obj, "currentPassword", currentPassword); field_from_json(Obj, "lastPasswords", lastPasswords); field_from_json(Obj, "oauthType", oauthType); field_from_json(Obj, "oauthUserInfo", oauthUserInfo); field_from_json(Obj, "modified", modified); field_from_json(Obj, "signingUp", signingUp); return true; } catch (const Poco::Exception &E) { std::cout << "Cannot parse: UserInfo" << std::endl; } return false; }; void UserInfoList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "users", users); } bool UserInfoList::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "users", users); return true; } catch (...) { std::cout << "Cannot parse: InternalServiceInfo" << std::endl; } return false; } void InternalServiceInfo::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "privateURI", privateURI); field_to_json(Obj, "publicURI", publicURI); field_to_json(Obj, "token", token); }; bool InternalServiceInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "privateURI", privateURI); field_from_json(Obj, "publicURI", publicURI); field_from_json(Obj, "token", token); return true; } catch (...) { std::cout << "Cannot parse: InternalServiceInfo" << std::endl; } return false; }; void InternalSystemServices::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "key", key); field_to_json(Obj, "version", version); field_to_json(Obj, "services", services); }; bool InternalSystemServices::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "key", key); field_from_json(Obj, "version", version); field_from_json(Obj, "services", services); return true; } catch (...) { std::cout << "Cannot parse: InternalSystemServices" << std::endl; } return false; }; void SystemEndpoint::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "type", type); field_to_json(Obj, "id", id); field_to_json(Obj, "vendor", vendor); field_to_json(Obj, "uri", uri); field_to_json(Obj, "authenticationType", authenticationType); }; bool SystemEndpoint::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "type", type); field_from_json(Obj, "id", id); field_from_json(Obj, "vendor", vendor); field_from_json(Obj, "uri", uri); field_from_json(Obj, "authenticationType", authenticationType); return true; } catch (...) { std::cout << "Cannot parse: SystemEndpoint" << std::endl; } return false; }; void SystemEndpointList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "endpoints", endpoints); } bool SystemEndpointList::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "endpoints", endpoints); return true; } catch (...) { std::cout << "Cannot parse: SystemEndpointList" << std::endl; } return false; } void UserInfoAndPolicy::to_json(Poco::JSON::Object &Obj) const { Poco::JSON::Object UI, TI; userinfo.to_json(UI); webtoken.to_json(TI); Obj.set("tokenInfo", TI); Obj.set("userInfo", UI); } bool UserInfoAndPolicy::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "tokenInfo", webtoken); field_from_json(Obj, "userInfo", userinfo); return true; } catch (...) { std::cout << "Cannot parse: UserInfoAndPolicy" << std::endl; } return false; } void NoteInfo::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "created", created); field_to_json(Obj, "createdBy", createdBy); field_to_json(Obj, "note", note); } bool NoteInfo::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "created", created); field_from_json(Obj, "createdBy", createdBy); field_from_json(Obj, "note", note); return true; } catch (...) { std::cout << "Cannot parse: NoteInfo" << std::endl; } return false; } bool MergeNotes(Poco::JSON::Object::Ptr Obj, const UserInfo &UInfo, NoteInfoVec &Notes) { try { if (Obj->has("notes") && Obj->isArray("notes")) { SecurityObjects::NoteInfoVec NIV; NIV = RESTAPI_utils::to_object_array( Obj->get("notes").toString()); for (auto const &i : NIV) { SecurityObjects::NoteInfo ii{.created = (uint64_t)Utils::Now(), .createdBy = UInfo.email, .note = i.note}; Notes.push_back(ii); } } return true; } catch (...) { std::cout << "Cannot parse: MergeNotes" << std::endl; } return false; } bool MergeNotes(const NoteInfoVec &NewNotes, const UserInfo &UInfo, NoteInfoVec &ExistingNotes) { for (auto const &i : NewNotes) { SecurityObjects::NoteInfo ii{ .created = (uint64_t)Utils::Now(), .createdBy = UInfo.email, .note = i.note}; ExistingNotes.push_back(ii); } return true; } void ProfileAction::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "resource", resource); field_to_json(Obj, "access", access, ResourceAccessTypeToString); } bool ProfileAction::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "resource", resource); field_from_json(Obj, "access", access, ResourceAccessTypeFromString); return true; } catch (...) { std::cout << "Cannot parse: ProfileAction" << std::endl; } return false; } void SecurityProfile::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "id", id); field_to_json(Obj, "name", name); field_to_json(Obj, "description", description); field_to_json(Obj, "policy", policy); field_to_json(Obj, "role", role); field_to_json(Obj, "notes", notes); } bool SecurityProfile::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "id", id); field_from_json(Obj, "name", name); field_from_json(Obj, "description", description); field_from_json(Obj, "policy", policy); field_from_json(Obj, "role", role); field_from_json(Obj, "notes", notes); return true; } catch (...) { std::cout << "Cannot parse: SecurityProfile" << std::endl; } return false; } void SecurityProfileList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "profiles", profiles); } bool SecurityProfileList::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "profiles", profiles); return true; } catch (...) { std::cout << "Cannot parse: SecurityProfileList" << std::endl; } return false; } void ActionLink::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "id", id); field_to_json(Obj, "action", action); field_to_json(Obj, "userId", userId); field_to_json(Obj, "actionTemplate", actionTemplate); field_to_json(Obj, "variables", variables); field_to_json(Obj, "locale", locale); field_to_json(Obj, "message", message); field_to_json(Obj, "sent", sent); field_to_json(Obj, "created", created); field_to_json(Obj, "expires", expires); field_to_json(Obj, "completed", completed); field_to_json(Obj, "canceled", canceled); field_to_json(Obj, "userAction", userAction); } bool ActionLink::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "id", id); field_from_json(Obj, "action", action); field_from_json(Obj, "userId", userId); field_from_json(Obj, "actionTemplate", actionTemplate); field_from_json(Obj, "variables", variables); field_from_json(Obj, "locale", locale); field_from_json(Obj, "message", message); field_from_json(Obj, "sent", sent); field_from_json(Obj, "created", created); field_from_json(Obj, "expires", expires); field_from_json(Obj, "completed", completed); field_from_json(Obj, "canceled", canceled); field_from_json(Obj, "userAction", userAction); return true; } catch (...) { std::cout << "Cannot parse: ActionLink" << std::endl; } return false; } void Preferences::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "id", id); field_to_json(Obj, "modified", modified); field_to_json(Obj, "data", data); } bool Preferences::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "id", id); field_from_json(Obj, "modified", modified); field_from_json(Obj, "data", data); return true; } catch (...) { std::cout << "Cannot parse: Preferences" << std::endl; } return false; } void SubMfaConfig::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "id", id); field_to_json(Obj, "type", type); field_to_json(Obj, "sms", sms); field_to_json(Obj, "email", email); } bool SubMfaConfig::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "id", id); field_from_json(Obj, "type", type); field_from_json(Obj, "sms", sms); field_from_json(Obj, "email", email); return true; } catch (...) { std::cout << "Cannot parse: SubMfaConfig" << std::endl; } return false; } void Token::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "token", token); field_to_json(Obj, "refreshToken", refreshToken); field_to_json(Obj, "tokenType", tokenType); field_to_json(Obj, "userName", userName); field_to_json(Obj, "created", created); field_to_json(Obj, "expires", expires); field_to_json(Obj, "idleTimeout", idleTimeout); field_to_json(Obj, "revocationDate", revocationDate); field_to_json(Obj, "lastRefresh", lastRefresh); } bool Token::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "token", token); field_from_json(Obj, "refreshToken", refreshToken); field_from_json(Obj, "tokenType", tokenType); field_from_json(Obj, "userName", userName); field_from_json(Obj, "created", created); field_from_json(Obj, "expires", expires); field_from_json(Obj, "idleTimeout", idleTimeout); field_from_json(Obj, "revocationDate", revocationDate); field_from_json(Obj, "lastRefresh", lastRefresh); return true; } catch (...) { std::cout << "Cannot parse: Token" << std::endl; } return false; } void LoginRecordInfo::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "sessionId", sessionId); field_to_json(Obj, "userId", userId); field_to_json(Obj, "email", email); field_to_json(Obj, "login", login); field_to_json(Obj, "logout", logout); } void ApiKeyAccessRight::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "service", service); field_to_json(Obj, "access", access); } bool ApiKeyAccessRight::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "service", service); field_from_json(Obj, "access", access); return true; } catch (...) { std::cout << "Cannot parse: Token" << std::endl; } return false; } void ApiKeyAccessRightList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "acls", acls); } bool ApiKeyAccessRightList::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "acls", acls); return true; } catch (...) { std::cout << "Cannot parse: Token" << std::endl; } return false; } void ApiKeyEntry::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "id", id); field_to_json(Obj, "userUuid", userUuid); field_to_json(Obj, "name", name); field_to_json(Obj, "apiKey", apiKey); field_to_json(Obj, "salt", salt); field_to_json(Obj, "description", description); field_to_json(Obj, "expiresOn", expiresOn); field_to_json(Obj, "rights", rights); field_to_json(Obj, "lastUse", lastUse); } bool ApiKeyEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "id", id); field_from_json(Obj, "userUuid", userUuid); field_from_json(Obj, "name", name); field_from_json(Obj, "apiKey", apiKey); field_from_json(Obj, "salt", salt); field_from_json(Obj, "description", description); field_from_json(Obj, "expiresOn", expiresOn); field_from_json(Obj, "rights", rights); field_from_json(Obj, "lastUse", lastUse); return true; } catch (...) { std::cout << "Cannot parse: Token" << std::endl; } return false; } void ApiKeyEntryList::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "apiKeys", apiKeys); } bool ApiKeyEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "apiKeys", apiKeys); return true; } catch (...) { std::cout << "Cannot parse: Token" << std::endl; } return false; } void ExtraSystemConfiguration::to_json(Poco::JSON::Object &Obj) const { field_to_json(Obj, "parameterName", parameterName); field_to_json(Obj, "parameterValue", parameterValue); } bool ExtraSystemConfiguration::from_json(const Poco::JSON::Object::Ptr &Obj) { try { field_from_json(Obj, "parameterName", parameterName); field_from_json(Obj, "parameterValue", parameterValue); return true; } catch (...) { std::cout << "Cannot parse: Token" << std::endl; } return false; } } // namespace OpenWifi::SecurityObjects