std::string fieldValue(Swift::Form::ref form, const std::string &key, const std::string &def) { const std::vector<FormField::ref> fields = form->getFields(); for (std::vector<FormField::ref>::const_iterator it = fields.begin(); it != fields.end(); it++) { #if HAVE_SWIFTEN_3 FormField::ref field = *it; const std::vector<std::string> values = field->getValues(); if (field->getName() == key) { return values.empty() ? "" : values[0]; } #else TextSingleFormField::ref textSingle = SWIFTEN_SHRPTR_NAMESPACE::dynamic_pointer_cast<TextSingleFormField>(*it); if (textSingle && textSingle->getName() == key) { return textSingle->getValue(); } TextPrivateFormField::ref textPrivate = SWIFTEN_SHRPTR_NAMESPACE::dynamic_pointer_cast<TextPrivateFormField>(*it); if (textPrivate && textPrivate->getName() == key) { return textPrivate->getValue(); } ListSingleFormField::ref listSingle = SWIFTEN_SHRPTR_NAMESPACE::dynamic_pointer_cast<ListSingleFormField>(*it); if (listSingle && listSingle->getName() == key) { return listSingle->getValue(); } BooleanFormField::ref boolean = SWIFTEN_SHRPTR_NAMESPACE::dynamic_pointer_cast<BooleanFormField>(*it); if (boolean && boolean->getName() == key) { return boolean->getValue() ? "1" : "0"; } #endif } return def; }
bool UserRegistration::handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::InBandRegistrationPayload> payload) { if (CONFIG_STRING(m_config, "service.protocol") == "irc") { Swift::GetResponder<Swift::InBandRegistrationPayload>::sendError(from, id, ErrorPayload::BadRequest, ErrorPayload::Modify); return true; } std::string barejid = from.toBare().toString(); // AbstractUser *user = m_component->userManager()->getUserByJID(barejid); if (!CONFIG_BOOL(m_config,"registration.enable_public_registration")) { std::list<std::string> const &x = CONFIG_LIST(m_config,"service.allowed_servers"); if (std::find(x.begin(), x.end(), from.getDomain()) == x.end()) { // Log("UserRegistration", "This user has no permissions to register an account"); Swift::SetResponder<Swift::InBandRegistrationPayload>::sendError(from, id, ErrorPayload::BadRequest, ErrorPayload::Modify); return true; } } UserInfo res; bool registered = m_storageBackend->getUser(barejid, res); std::string encoding; std::string language; Form::ref form = payload->getForm(); if (form) { const std::vector<FormField::ref> fields = form->getFields(); for (std::vector<FormField::ref>::const_iterator it = fields.begin(); it != fields.end(); it++) { TextSingleFormField::ref textSingle = boost::dynamic_pointer_cast<TextSingleFormField>(*it); if (textSingle) { if (textSingle->getName() == "username") { payload->setUsername(textSingle->getValue()); } else if (textSingle->getName() == "encoding") { encoding = textSingle->getValue(); } continue; } TextPrivateFormField::ref textPrivate = boost::dynamic_pointer_cast<TextPrivateFormField>(*it); if (textPrivate) { if (textPrivate->getName() == "password") { payload->setPassword(textPrivate->getValue()); } continue; } ListSingleFormField::ref listSingle = boost::dynamic_pointer_cast<ListSingleFormField>(*it); if (listSingle) { if (listSingle->getName() == "language") { language = listSingle->getValue(); } continue; } BooleanFormField::ref boolean = boost::dynamic_pointer_cast<BooleanFormField>(*it); if (boolean) { if (boolean->getName() == "unregister") { if (boolean->getValue()) { payload->setRemove(true); } } continue; } } } if (payload->isRemove()) { unregisterUser(barejid); Swift::SetResponder<Swift::InBandRegistrationPayload>::sendResponse(from, id, InBandRegistrationPayload::ref()); return true; } if (!payload->getUsername() || !payload->getPassword()) { Swift::SetResponder<Swift::InBandRegistrationPayload>::sendError(from, id, ErrorPayload::NotAcceptable, ErrorPayload::Modify); return true; } // Register or change password if (payload->getUsername()->empty() || (payload->getPassword()->empty() && CONFIG_STRING(m_config, "service.protocol") != "twitter" && CONFIG_STRING(m_config, "service.protocol") != "bonjour") // || localization.getLanguages().find(language) == localization.getLanguages().end() ) { Swift::SetResponder<Swift::InBandRegistrationPayload>::sendError(from, id, ErrorPayload::NotAcceptable, ErrorPayload::Modify); return true; } if (CONFIG_STRING(m_config, "service.protocol") == "xmpp") { // User tries to register himself. if ((Swift::JID(*payload->getUsername()).toBare() == from.toBare())) { Swift::SetResponder<Swift::InBandRegistrationPayload>::sendError(from, id, ErrorPayload::NotAcceptable, ErrorPayload::Modify); return true; } // User tries to register someone who's already registered. UserInfo user_row; bool registered = m_storageBackend->getUser(Swift::JID(*payload->getUsername()).toBare().toString(), user_row); if (registered) { Swift::SetResponder<Swift::InBandRegistrationPayload>::sendError(from, id, ErrorPayload::NotAcceptable, ErrorPayload::Modify); return true; } } std::string username = *payload->getUsername(); // m_component->protocol()->prepareUsername(username); std::string newUsername(username); if (!CONFIG_STRING(m_config, "registration.username_mask").empty()) { newUsername = CONFIG_STRING(m_config, "registration.username_mask"); // replace(newUsername, "$username", username.c_str()); } // if (!m_component->protocol()->isValidUsername(newUsername)) { // Log("UserRegistration", "This is not valid username: "******"registration.reg_allowed_usernames").empty() && // !g_regex_match_simple(CONFIG_STRING(m_config, "registration.reg_allowed_usernames"), newUsername.c_str(),(GRegexCompileFlags) (G_REGEX_CASELESS | G_REGEX_EXTENDED), (GRegexMatchFlags) 0)) { // Log("UserRegistration", "This is not valid username: "******"UserRegistration", "changing user password: "******", " << username); res.jid = barejid; res.password = *payload->getPassword(); res.language = language; res.encoding = encoding; m_storageBackend->setUser(res); onUserUpdated(res); } Swift::SetResponder<Swift::InBandRegistrationPayload>::sendResponse(from, id, InBandRegistrationPayload::ref()); return true; }