From f3c35e8e558477792846d448573a893588b0263a Mon Sep 17 00:00:00 2001 From: miraikumiko Date: Thu, 12 Jun 2025 11:10:24 +0200 Subject: [PATCH] Add keys to instance_settings --- lib/nulla/key_gen.ex | 16 +++++++++ lib/nulla/models/instance_settings.ex | 6 ++-- lib/nulla/utils.ex | 4 +-- ...0250527054942_create_instance_settings.exs | 34 ++++++++++++++++--- .../20250604083506_create_notes.exs | 2 +- 5 files changed, 52 insertions(+), 10 deletions(-) create mode 100644 lib/nulla/key_gen.ex diff --git a/lib/nulla/key_gen.ex b/lib/nulla/key_gen.ex new file mode 100644 index 0000000..48740c8 --- /dev/null +++ b/lib/nulla/key_gen.ex @@ -0,0 +1,16 @@ +defmodule Nulla.KeyGen do + def generate_keys do + rsa_key = :public_key.generate_key({:rsa, 2048, 65537}) + + {:RSAPrivateKey, :"two-prime", n, e, _d, _p, _q, _dp, _dq, _qi, _other} = rsa_key + public_key = {:RSAPublicKey, n, e} + + private_entry = {:PrivateKeyInfo, :public_key.der_encode(:RSAPrivateKey, rsa_key), :not_encrypted} + public_entry = {:SubjectPublicKeyInfo, :public_key.der_encode(:RSAPublicKey, public_key), :not_encrypted} + + private_pem = :public_key.pem_encode([private_entry]) + public_pem = :public_key.pem_encode([public_entry]) + + {public_pem, private_pem} + end +end diff --git a/lib/nulla/models/instance_settings.ex b/lib/nulla/models/instance_settings.ex index de903c7..0a2f38f 100644 --- a/lib/nulla/models/instance_settings.ex +++ b/lib/nulla/models/instance_settings.ex @@ -11,7 +11,7 @@ defmodule Nulla.Models.InstanceSettings do field :registration, :boolean, default: false field :max_characters, :integer, default: 5000 field :max_upload_size, :integer, default: 50 - field :offset, :integer, default: 100 + field :api_offset, :integer, default: 100 field :public_key, :string field :private_key, :string end @@ -26,7 +26,7 @@ defmodule Nulla.Models.InstanceSettings do :registration, :max_characters, :max_upload_size, - :offset, + :api_offset, :public_key, :private_key ]) @@ -37,7 +37,7 @@ defmodule Nulla.Models.InstanceSettings do :registration, :max_characters, :max_upload_size, - :offset, + :api_offset, :public_key, :private_key ]) diff --git a/lib/nulla/utils.ex b/lib/nulla/utils.ex index cf01214..9335dd3 100644 --- a/lib/nulla/utils.ex +++ b/lib/nulla/utils.ex @@ -28,7 +28,7 @@ defmodule Nulla.Utils do %User{id: user_id} -> instance_settings = InstanceSettings.get_instance_settings!() - per_page = instance_settings.offset + per_page = instance_settings.api_offset offset = (page - 1) * per_page query = @@ -67,7 +67,7 @@ defmodule Nulla.Utils do %User{id: user_id} -> instance_settings = InstanceSettings.get_instance_settings!() - per_page = instance_settings.offset + per_page = instance_settings.api_offset offset = (page - 1) * per_page query = diff --git a/priv/repo/migrations/20250527054942_create_instance_settings.exs b/priv/repo/migrations/20250527054942_create_instance_settings.exs index cc3aad5..45fd5f9 100644 --- a/priv/repo/migrations/20250527054942_create_instance_settings.exs +++ b/priv/repo/migrations/20250527054942_create_instance_settings.exs @@ -4,16 +4,42 @@ defmodule Nulla.Repo.Migrations.CreateInstanceSettings do def change do create table(:instance_settings) do add :name, :string, default: "Nulla", null: false - add :description, :string, default: "Freedom Social Network", null: false + add :description, :text, default: "Freedom Social Network", null: false add :domain, :string, default: "localhost", null: false add :registration, :boolean, default: false, null: false add :max_characters, :integer, default: 5000, null: false add :max_upload_size, :integer, default: 50, null: false - add :offset, :integer, default: 100, null: false - add :public_key, :string - add :private_key, :string + add :api_offset, :integer, default: 100, null: false + add :public_key, :text + add :private_key, :text timestamps() end + + flush() + + execute(fn -> + {public_key, private_key} = Nulla.KeyGen.generate_keys() + now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + domain = + Application.get_env(:nulla, NullaWeb.Endpoint, []) + |> Keyword.get(:url, []) + |> Keyword.get(:host, "localhost") + esc = fn str -> "'#{String.replace(str, "'", "''")}'" end + sql = """ + INSERT INTO instance_settings ( + name, description, domain, registration, + max_characters, max_upload_size, api_offset, + public_key, private_key, inserted_at, updated_at + ) VALUES ( + 'Nulla', 'Freedom Social Network', '#{domain}', false, + 5000, 50, 100, + #{esc.(public_key)}, #{esc.(private_key)}, + '#{now}', '#{now}' + ) + """ + + Ecto.Adapters.SQL.query!(Nulla.Repo, sql, []) + end) end end diff --git a/priv/repo/migrations/20250604083506_create_notes.exs b/priv/repo/migrations/20250604083506_create_notes.exs index 61ce44f..e14f519 100644 --- a/priv/repo/migrations/20250604083506_create_notes.exs +++ b/priv/repo/migrations/20250604083506_create_notes.exs @@ -3,7 +3,7 @@ defmodule Nulla.Repo.Migrations.CreateNotes do def change do create table(:notes) do - add :content, :string + add :content, :text add :visibility, :string, default: "public" add :sensitive, :boolean, default: false add :language, :string