Mercurial > prosody-hg
comparison plugins/mod_register_ibr.lua @ 8736:a071c203a1a0
mod_register_ibr: Reshape the code using early returns to reduce needless indentation
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 07 Apr 2018 02:57:05 +0200 |
| parents | 9918f324a0be |
| children | 6d71845bf56f |
comparison
equal
deleted
inserted
replaced
| 8735:856a40ec4a0a | 8736:a071c203a1a0 |
|---|---|
| 113 local log = session.log or module._log; | 113 local log = session.log or module._log; |
| 114 | 114 |
| 115 if session.type ~= "c2s_unauthed" then | 115 if session.type ~= "c2s_unauthed" then |
| 116 log("debug", "Attempted registration when disabled or already authenticated"); | 116 log("debug", "Attempted registration when disabled or already authenticated"); |
| 117 session.send(st.error_reply(stanza, "cancel", "service-unavailable")); | 117 session.send(st.error_reply(stanza, "cancel", "service-unavailable")); |
| 118 elseif require_encryption and not session.secure then | 118 return true; |
| 119 end | |
| 120 | |
| 121 if require_encryption and not session.secure then | |
| 119 session.send(st.error_reply(stanza, "modify", "policy-violation", "Encryption is required")); | 122 session.send(st.error_reply(stanza, "modify", "policy-violation", "Encryption is required")); |
| 123 return true; | |
| 124 end | |
| 125 | |
| 126 local query = stanza.tags[1]; | |
| 127 if stanza.attr.type == "get" then | |
| 128 local reply = st.reply(stanza); | |
| 129 reply:add_child(registration_query); | |
| 130 session.send(reply); | |
| 131 return true; | |
| 132 end | |
| 133 | |
| 134 -- stanza.attr.type == "set" | |
| 135 if query.tags[1] and query.tags[1].name == "remove" then | |
| 136 session.send(st.error_reply(stanza, "auth", "registration-required")); | |
| 137 return true; | |
| 138 end | |
| 139 | |
| 140 local data, errors = parse_response(query); | |
| 141 if errors then | |
| 142 log("debug", "Error parsing registration form:"); | |
| 143 for field, err in pairs(errors) do | |
| 144 log("debug", "Field %q: %s", field, err); | |
| 145 end | |
| 146 session.send(st.error_reply(stanza, "modify", "not-acceptable")); | |
| 147 return true; | |
| 148 end | |
| 149 | |
| 150 local username, password = nodeprep(data.username), data.password; | |
| 151 data.username, data.password = nil, nil; | |
| 152 local host = module.host; | |
| 153 if not username or username == "" then | |
| 154 log("debug", "The requested username is invalid."); | |
| 155 session.send(st.error_reply(stanza, "modify", "not-acceptable", "The requested username is invalid.")); | |
| 156 return true; | |
| 157 end | |
| 158 | |
| 159 local user = { username = username , host = host, additional = data, ip = session.ip, session = session, allowed = true } | |
| 160 module:fire_event("user-registering", user); | |
| 161 if not user.allowed then | |
| 162 log("debug", "Registration disallowed by module: %s", user.reason or "no reason given"); | |
| 163 session.send(st.error_reply(stanza, "modify", "not-acceptable", user.reason)); | |
| 164 return true; | |
| 165 end | |
| 166 | |
| 167 if usermanager_user_exists(username, host) then | |
| 168 log("debug", "Attempt to register with existing username"); | |
| 169 session.send(st.error_reply(stanza, "cancel", "conflict", "The requested username already exists.")); | |
| 170 return true; | |
| 171 end | |
| 172 | |
| 173 -- TODO unable to write file, file may be locked, etc, what's the correct error? | |
| 174 local error_reply = st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk."); | |
| 175 if usermanager_create_user(username, password, host) then | |
| 176 data.registered = os.time(); | |
| 177 if not account_details:set(username, data) then | |
| 178 log("debug", "Could not store extra details"); | |
| 179 usermanager_delete_user(username, host); | |
| 180 session.send(error_reply); | |
| 181 return true; | |
| 182 end | |
| 183 session.send(st.reply(stanza)); -- user created! | |
| 184 log("info", "User account created: %s@%s", username, host); | |
| 185 module:fire_event("user-registered", { | |
| 186 username = username, host = host, source = "mod_register", | |
| 187 session = session }); | |
| 120 else | 188 else |
| 121 local query = stanza.tags[1]; | 189 log("debug", "Could not create user"); |
| 122 if stanza.attr.type == "get" then | 190 session.send(error_reply); |
| 123 local reply = st.reply(stanza); | |
| 124 reply:add_child(registration_query); | |
| 125 session.send(reply); | |
| 126 elseif stanza.attr.type == "set" then | |
| 127 if query.tags[1] and query.tags[1].name == "remove" then | |
| 128 session.send(st.error_reply(stanza, "auth", "registration-required")); | |
| 129 else | |
| 130 local data, errors = parse_response(query); | |
| 131 if errors then | |
| 132 log("debug", "Error parsing registration form:"); | |
| 133 for field, err in pairs(errors) do | |
| 134 log("debug", "Field %q: %s", field, err); | |
| 135 end | |
| 136 session.send(st.error_reply(stanza, "modify", "not-acceptable")); | |
| 137 else | |
| 138 local username, password = nodeprep(data.username), data.password; | |
| 139 data.username, data.password = nil, nil; | |
| 140 local host = module.host; | |
| 141 if not username or username == "" then | |
| 142 log("debug", "The requested username is invalid."); | |
| 143 session.send(st.error_reply(stanza, "modify", "not-acceptable", "The requested username is invalid.")); | |
| 144 return true; | |
| 145 end | |
| 146 local user = { username = username , host = host, additional = data, ip = session.ip, session = session, allowed = true } | |
| 147 module:fire_event("user-registering", user); | |
| 148 if not user.allowed then | |
| 149 log("debug", "Registration disallowed by module: %s", user.reason or "no reason given"); | |
| 150 session.send(st.error_reply(stanza, "modify", "not-acceptable", user.reason)); | |
| 151 elseif usermanager_user_exists(username, host) then | |
| 152 log("debug", "Attempt to register with existing username"); | |
| 153 session.send(st.error_reply(stanza, "cancel", "conflict", "The requested username already exists.")); | |
| 154 else | |
| 155 -- TODO unable to write file, file may be locked, etc, what's the correct error? | |
| 156 local error_reply = st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk."); | |
| 157 if usermanager_create_user(username, password, host) then | |
| 158 data.registered = os.time(); | |
| 159 if not account_details:set(username, data) then | |
| 160 log("debug", "Could not store extra details"); | |
| 161 usermanager_delete_user(username, host); | |
| 162 session.send(error_reply); | |
| 163 return true; | |
| 164 end | |
| 165 session.send(st.reply(stanza)); -- user created! | |
| 166 log("info", "User account created: %s@%s", username, host); | |
| 167 module:fire_event("user-registered", { | |
| 168 username = username, host = host, source = "mod_register", | |
| 169 session = session }); | |
| 170 else | |
| 171 log("debug", "Could not create user"); | |
| 172 session.send(error_reply); | |
| 173 end | |
| 174 end | |
| 175 end | |
| 176 end | |
| 177 end | |
| 178 end | 191 end |
| 179 return true; | 192 return true; |
| 180 end); | 193 end); |
