From 7227202a86431a8647b750f18507220ef8a50f08 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 20 Nov 2024 10:49:19 -0600 Subject: [PATCH 1/3] Instruct Soapbox to use up to 10 custom profile fields --- src/controllers/api/instance.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/controllers/api/instance.ts b/src/controllers/api/instance.ts index 3b2d99fb..fe8f76ae 100644 --- a/src/controllers/api/instance.ts +++ b/src/controllers/api/instance.ts @@ -49,6 +49,9 @@ const instanceV1Controller: AppController = async (c) => { pleroma: { metadata: { features, + fields_limits: { + max_fields: 10, + }, }, }, languages: ['en'], @@ -141,6 +144,9 @@ const instanceV2Controller: AppController = async (c) => { pleroma: { metadata: { features, + fields_limits: { + max_fields: 10, + }, }, }, registrations: { From 39cb1ec0c940825646830ddd1144143353ef713f Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 20 Nov 2024 10:50:49 -0600 Subject: [PATCH 2/3] renderAccount: only display up to 10 profile fields --- src/views/mastodon/accounts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/mastodon/accounts.ts b/src/views/mastodon/accounts.ts index 927b00d5..4845304e 100644 --- a/src/views/mastodon/accounts.ts +++ b/src/views/mastodon/accounts.ts @@ -60,7 +60,7 @@ async function renderAccount( } } const { html } = parseNoteContent(about || '', []); - const fields = _fields?.map(([name, value]) => ({ name, value, verified_at: null })) ?? []; + const fields = _fields?.slice(0, 10).map(([name, value]) => ({ name, value, verified_at: null })) ?? []; return { id: pubkey, From 81780bec7268b00382d1a8c00e72418b8f9be885 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 20 Nov 2024 10:58:21 -0600 Subject: [PATCH 3/3] Let field limits be configurable --- src/config.ts | 11 +++++++++++ src/controllers/api/instance.ts | 8 ++++++-- src/views/mastodon/accounts.ts | 9 ++++++++- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/config.ts b/src/config.ts index 68175a46..68bf3ed8 100644 --- a/src/config.ts +++ b/src/config.ts @@ -350,6 +350,17 @@ class Conf { }; }, }; + static profileFields = { + get maxFields(): number { + return Number(Deno.env.get('PROFILE_FIELDS_MAX_FIELDS') || 10); + }, + get nameLength(): number { + return Number(Deno.env.get('PROFILE_FIELDS_NAME_LENGTH') || 255); + }, + get valueLength(): number { + return Number(Deno.env.get('PROFILE_FIELDS_VALUE_LENGTH') || 2047); + }, + }; } const optionalBooleanSchema = z diff --git a/src/controllers/api/instance.ts b/src/controllers/api/instance.ts index fe8f76ae..92e517c3 100644 --- a/src/controllers/api/instance.ts +++ b/src/controllers/api/instance.ts @@ -50,7 +50,9 @@ const instanceV1Controller: AppController = async (c) => { metadata: { features, fields_limits: { - max_fields: 10, + max_fields: Conf.profileFields.maxFields, + name_length: Conf.profileFields.nameLength, + value_length: Conf.profileFields.valueLength, }, }, }, @@ -145,7 +147,9 @@ const instanceV2Controller: AppController = async (c) => { metadata: { features, fields_limits: { - max_fields: 10, + max_fields: Conf.profileFields.maxFields, + name_length: Conf.profileFields.nameLength, + value_length: Conf.profileFields.valueLength, }, }, }, diff --git a/src/views/mastodon/accounts.ts b/src/views/mastodon/accounts.ts index 4845304e..9b13efbf 100644 --- a/src/views/mastodon/accounts.ts +++ b/src/views/mastodon/accounts.ts @@ -60,7 +60,14 @@ async function renderAccount( } } const { html } = parseNoteContent(about || '', []); - const fields = _fields?.slice(0, 10).map(([name, value]) => ({ name, value, verified_at: null })) ?? []; + + const fields = _fields + ?.slice(0, Conf.profileFields.maxFields) + .map(([name, value]) => ({ + name: name.slice(0, Conf.profileFields.nameLength), + value: value.slice(0, Conf.profileFields.valueLength), + verified_at: null, + })) ?? []; return { id: pubkey,