diff --git a/lib/volumen/admin_routes.rb b/lib/volumen/admin_routes.rb index cec9b05..7ae8d3b 100644 --- a/lib/volumen/admin_routes.rb +++ b/lib/volumen/admin_routes.rb @@ -133,6 +133,12 @@ module Volumen change_name end + app.post "/admin/settings/fediverse" do + require_login! + check_csrf! + change_fediverse_creator + end + app.post "/admin/settings/users" do require_login! require_admin! diff --git a/lib/volumen/server.rb b/lib/volumen/server.rb index 8f9ff8a..b94cbc7 100644 --- a/lib/volumen/server.rb +++ b/lib/volumen/server.rb @@ -205,6 +205,10 @@ module Volumen current_user_record&.name end + def current_user_fediverse + current_user_record&.fediverse_creator + end + def admin? current_role == "admin" end @@ -304,6 +308,21 @@ module Volumen render_settings(notice: name ? "Display name updated." : "Display name cleared.") end + def change_fediverse_creator + value = params["fediverse_creator"].to_s.strip + if value.empty? + users.update_fediverse_creator(current_user, nil) + return render_settings(notice: "Fediverse handle cleared.") + end + + unless value.match?(Post::FEDIVERSE_CREATOR_REGEX) + return render_settings(error: "Fediverse handle must look like @user@host.") + end + + users.update_fediverse_creator(current_user, value) + render_settings(notice: "Fediverse handle updated.") + end + def create_user name = presence(params["username"]) password = presence(params["password"]) diff --git a/lib/volumen/users.rb b/lib/volumen/users.rb index 3964bf2..c4f8551 100644 --- a/lib/volumen/users.rb +++ b/lib/volumen/users.rb @@ -15,7 +15,7 @@ module Volumen ROLES = %w[admin author].freeze DEFAULT_ROLE = "author" - User = Struct.new(:username, :password_hash, :role, :name) + User = Struct.new(:username, :password_hash, :role, :name, :fediverse_creator) def initialize(path:, bootstrap_hash: nil) @path = path @@ -33,7 +33,7 @@ module Volumen elsif @bootstrap_hash.empty? [] else - [User.new("admin", @bootstrap_hash, "admin", nil)] + [User.new("admin", @bootstrap_hash, "admin", nil, nil)] end end end @@ -54,7 +54,7 @@ module Volumen def add(username, password, role = DEFAULT_ROLE) return nil if username.to_s.empty? || find(username) - user = User.new(username, Password.hash(password), normalize_role(role), nil) + user = User.new(username, Password.hash(password), normalize_role(role), nil, nil) persist(all + [user]) user end @@ -63,6 +63,12 @@ module Volumen mutate(username) { |user| user.name = name.to_s.empty? ? nil : name.to_s } end + def update_fediverse_creator(username, value) + mutate(username) do |user| + user.fediverse_creator = value.to_s.empty? ? nil : value.to_s + end + end + def update_password(username, password) mutate(username) { |user| user.password_hash = Password.hash(password) } end @@ -125,7 +131,8 @@ module Volumen def read_file data = TomlRB.load_file(@path) Array(data["users"]).map do |entry| - User.new(entry["username"], entry["password_hash"], entry["role"] || "admin", entry["name"]) + User.new(entry["username"], entry["password_hash"], entry["role"] || "admin", + entry["name"], entry["fediverse_creator"]) end end @@ -143,6 +150,7 @@ module Volumen "role" => user.role } hash["name"] = user.name if user.name + hash["fediverse_creator"] = user.fediverse_creator if user.fediverse_creator hash end end diff --git a/lib/volumen/web/views/form.erb b/lib/volumen/web/views/form.erb index eb49ec9..9ffee07 100644 --- a/lib/volumen/web/views/form.erb +++ b/lib/volumen/web/views/form.erb @@ -67,7 +67,7 @@