diff --git a/applications/user.moon b/applications/user.moon index 7cd0fd9b..cad4812f 100644 --- a/applications/user.moon +++ b/applications/user.moon @@ -293,6 +293,7 @@ class MoonRocksUser extends lapis.Application assert_valid @params, { {"profile", type: "table"} + {"email", type: "string"} } profile = trim_filter @params.profile, @@ -312,6 +313,18 @@ class MoonRocksUser extends lapis.Application data: difference } + if @user.email != @params.email + old_email = @user.email + @user\update_email @params.email + import UserActivityLogs from require "models" + + UserActivityLogs\create_from_request @, { + user_id: @user.id + source: "web" + action: "account.update_email" + data: {old_email, @user.email} + } + redirect_to: @url_for "user_settings.profile" } diff --git a/models/user_activity_logs.moon b/models/user_activity_logs.moon index bef57865..c4df459e 100644 --- a/models/user_activity_logs.moon +++ b/models/user_activity_logs.moon @@ -62,13 +62,10 @@ class UserActivityLogs extends Model table.insert parts, "set #{k}" table.concat parts, ", " + when "account.update_email" + "updated email from #{@data[1]} to #{@data[2]}" when "account.update_password_attempt" @data.reason when "account.create_api_key", "account.revoke_api_key" if @data.key @data.key\sub(1, 10) .. "…" - - - - - diff --git a/models/user_sessions.moon b/models/user_sessions.moon index eb1c2e31..f6bf442c 100644 --- a/models/user_sessions.moon +++ b/models/user_sessions.moon @@ -13,6 +13,7 @@ class UserSessions extends Model admin: 4 login_github: 5 register_github: 6 + update_email: 7 } @create_from_request: (req, user, more_params) => diff --git a/models/users.moon b/models/users.moon index c4c04ff2..d5e93e86 100644 --- a/models/users.moon +++ b/models/users.moon @@ -110,6 +110,17 @@ class Users extends Model order by similarity(username, ?) desc ]], query, query, per_page: 50 + update_email: (email, r) => + dupemail = Users\find [db.raw "lower(email)"]: email\lower! + return nil, "duplicate email" unless dupemail == nil + + @update email: email + if r + if r.current_user_session + r.current_user_session\revoke! + @write_session r, type: "update_email" + return true + update_password: (pass, r) => @update encrypted_password: bcrypt.digest pass, bcrypt.salt 5 if r diff --git a/views/user_settings/profile.moon b/views/user_settings/profile.moon index d287af5e..511afd14 100644 --- a/views/user_settings/profile.moon +++ b/views/user_settings/profile.moon @@ -5,6 +5,17 @@ class UserSettingsProfile extends require "widgets.user_settings_page" @csrf_input! data = @user\get_data! + div class: "row", -> + label -> + div class: "label", "Your email" + + input { + type: "text" + class: "medium_input" + name: "email" + value: @user.email + } + div class: "row", -> label -> div class: "label", "Your website"