| 1 | #include "mtx/user_interactive.hpp" |
| 2 | |
| 3 | #include <nlohmann/json.hpp> |
| 4 | |
| 5 | namespace mtx::user_interactive { |
| 6 | void |
| 7 | from_json(const nlohmann::json &obj, OAuth2Params ¶ms) |
| 8 | { |
| 9 | params.uri = obj.value(key: "uri" , default_value: "" ); |
| 10 | } |
| 11 | |
| 12 | void |
| 13 | from_json(const nlohmann::json &obj, PolicyDescription &d) |
| 14 | { |
| 15 | d.name = obj.value(key: "name" , default_value: "" ); |
| 16 | d.url = obj.value(key: "url" , default_value: "" ); |
| 17 | } |
| 18 | void |
| 19 | from_json(const nlohmann::json &obj, Policy &policy) |
| 20 | { |
| 21 | policy.version = obj.at(key: "version" ).get<std::string>(); |
| 22 | |
| 23 | for (const auto &e : obj.items()) |
| 24 | if (e.key() != "version" ) |
| 25 | policy.langToPolicy.emplace(args: e.key(), args: e.value().get<PolicyDescription>()); |
| 26 | } |
| 27 | |
| 28 | void |
| 29 | from_json(const nlohmann::json &obj, TermsParams &terms) |
| 30 | { |
| 31 | terms.policies = obj["policies" ].get<std::unordered_map<std::string, Policy>>(); |
| 32 | } |
| 33 | |
| 34 | void |
| 35 | from_json(const nlohmann::json &obj, Flow &flow) |
| 36 | { |
| 37 | flow.stages = obj["stages" ].get<Stages>(); |
| 38 | } |
| 39 | void |
| 40 | from_json(const nlohmann::json &obj, Unauthorized &u) |
| 41 | { |
| 42 | if (obj.contains(key: "completed" )) |
| 43 | u.completed = obj.at(key: "completed" ).get<Stages>(); |
| 44 | |
| 45 | u.session = obj.value(key: "session" , default_value: "" ); |
| 46 | u.flows = obj.at(key: "flows" ).get<std::vector<Flow>>(); |
| 47 | |
| 48 | if (obj.contains(key: "params" )) { |
| 49 | for (const auto &e : obj["params" ].items()) { |
| 50 | if (e.key() == auth_types::terms) |
| 51 | u.params.emplace(args: e.key(), args: e.value().get<TermsParams>()); |
| 52 | else if (e.key() == auth_types::oauth2) |
| 53 | u.params.emplace(args: e.key(), args: e.value().get<OAuth2Params>()); |
| 54 | else |
| 55 | u.params.emplace(args: e.key(), args: e.value().dump()); |
| 56 | } |
| 57 | } |
| 58 | } |
| 59 | |
| 60 | namespace { |
| 61 | template<class... Ts> |
| 62 | struct overloaded : Ts... |
| 63 | { |
| 64 | using Ts::operator()...; |
| 65 | }; |
| 66 | template<class... Ts> |
| 67 | overloaded(Ts...) -> overloaded<Ts...>; |
| 68 | } |
| 69 | |
| 70 | namespace auth { |
| 71 | static void |
| 72 | to_json(nlohmann::json &obj, const ThreePIDCred &cred) |
| 73 | { |
| 74 | obj["sid" ] = cred.sid; |
| 75 | obj["client_secret" ] = cred.client_secret; |
| 76 | |
| 77 | if (!cred.id_server.empty()) { |
| 78 | obj["id_server" ] = cred.id_server; |
| 79 | obj["id_access_token" ] = cred.id_access_token; |
| 80 | } |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | void |
| 85 | to_json(nlohmann::json &obj, const Auth &auth) |
| 86 | { |
| 87 | obj["session" ] = auth.session; |
| 88 | |
| 89 | std::visit(visitor: overloaded{ |
| 90 | [&obj](const auth::Password &password) { |
| 91 | obj["type" ] = auth_types::password; |
| 92 | obj["password" ] = password.password; |
| 93 | |
| 94 | if (password.identifier_type == auth::Password::IdType::UserId) { |
| 95 | obj["identifier" ]["type" ] = "m.id.user" ; |
| 96 | obj["identifier" ]["user" ] = password.identifier_user; |
| 97 | } else { |
| 98 | obj["identifier" ]["type" ] = "m.id.thirdparty" ; |
| 99 | obj["identifier" ]["medium" ] = password.identifier_medium; |
| 100 | obj["identifier" ]["address" ] = password.identifier_address; |
| 101 | } |
| 102 | }, |
| 103 | [&obj](const auth::ReCaptcha &captcha) { |
| 104 | obj["type" ] = auth_types::recaptcha; |
| 105 | obj["response" ] = captcha.response; |
| 106 | }, |
| 107 | [&obj](const auth::Token &token) { |
| 108 | obj["type" ] = auth_types::token; |
| 109 | obj["token" ] = token.token; |
| 110 | obj["txn_id" ] = token.txn_id; |
| 111 | }, |
| 112 | [&obj](const auth::EmailIdentity &id) { |
| 113 | obj["type" ] = auth_types::email_identity; |
| 114 | obj["threepid_creds" ] = id.threepidCred; |
| 115 | }, |
| 116 | [&obj](const auth::MSISDN &id) { |
| 117 | obj["type" ] = auth_types::msisdn; |
| 118 | obj["threepid_creds" ] = id.threepidCred; |
| 119 | }, |
| 120 | [&obj](const auth::RegistrationToken ®istration_token) { |
| 121 | obj["type" ] = auth_types::registration_token; |
| 122 | obj["token" ] = registration_token.token; |
| 123 | }, |
| 124 | [&obj](const auth::OAuth2 &) { obj["type" ] = auth_types::oauth2; }, |
| 125 | [&obj](const auth::SSO &) { obj["type" ] = auth_types::sso; }, |
| 126 | [&obj](const auth::Terms &) { obj["type" ] = auth_types::terms; }, |
| 127 | [&obj](const auth::Dummy &) { obj["type" ] = auth_types::dummy; }, |
| 128 | [](const auth::Fallback &) {}, |
| 129 | }, |
| 130 | variants: auth.content); |
| 131 | } |
| 132 | } |
| 133 | |