mirror of
https://github.com/superseriousbusiness/gotosocial
synced 2025-06-05 21:59:39 +02:00
[feature] Configurable max profile fields (#4175)
# Description > If this is a code change, please include a summary of what you've coded, and link to the issue(s) it closes/implements. > > If this is a documentation change, please briefly describe what you've changed and why. Profile fields, right? So I made them a configurable amount and show them on the instance features. Closes #1876 All changes I did are described in the commits. I tried to cover as much as possible, but I don't know this codebase to know what I've missed. I have tested it manually and it works (settings page, `/api/v1/instances`, server-side validation). Not done: - An "Add profile fields" button, so that instances with a high profile fields count (e.g. 100) aren't an issue when trying to skip the profile fields (in some form, accessibility) - Updating the swagger docs that specify a specific amount of profile fields for the updating endpoint (not sure how to proceed with that) - Unchecked checklist items ## Checklist Please put an x inside each checkbox to indicate that you've read and followed it: `[ ]` -> `[x]` If this is a documentation change, only the first checkbox must be filled (you can delete the others if you want). - [X] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md). - [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat. - [X] I/we have not leveraged AI to create the proposed changes. - [x] I/we have performed a self-review of added code. - [X] I/we have written code that is legible and maintainable by others. - [ ] I/we have commented the added code, particularly in hard-to-understand areas. - [X] I/we have made any necessary changes to documentation. - [ ] I/we have added tests that cover new code. - [X] I/we have run tests and they pass locally with the changes. - [x] I/we have run `go fmt ./...` and `golangci-lint run`. Notes about checklist: - ["Approval" to work on this reference](https://matrix.to/#/!mlPctfMHjyopbOnliM:superseriousbusiness.org/$P0Z1Qmny6GNIgxhre69gll8KSD690HC8nVvNpXmu3nU?via=superseriousbusiness.org&via=matrix.org&via=tchncs.de) - `golangci-lint run` output ignored due to complaining about ffmpeg and some other code I didn't touch Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4175 Reviewed-by: kim <gruf@noreply.codeberg.org> Co-authored-by: Jackson <jackson@jacksonchen666.com> Co-committed-by: Jackson <jackson@jacksonchen666.com>
This commit is contained in:
@@ -1581,9 +1581,7 @@ definitions:
|
|||||||
type: integer
|
type: integer
|
||||||
x-go-name: MaxFeaturedTags
|
x-go-name: MaxFeaturedTags
|
||||||
max_profile_fields:
|
max_profile_fields:
|
||||||
description: |-
|
description: The maximum number of profile fields allowed for each account.
|
||||||
The maximum number of profile fields allowed for each account.
|
|
||||||
Currently not configurable, so this is hardcoded to 6. (https://codeberg.org/superseriousbusiness/gotosocial/issues/1876)
|
|
||||||
format: int64
|
format: int64
|
||||||
type: integer
|
type: integer
|
||||||
x-go-name: MaxProfileFields
|
x-go-name: MaxProfileFields
|
||||||
|
@@ -64,4 +64,12 @@ accounts-allow-custom-css: false
|
|||||||
# Examples: [500, 5000, 9999]
|
# Examples: [500, 5000, 9999]
|
||||||
# Default: 10000
|
# Default: 10000
|
||||||
accounts-custom-css-length: 10000
|
accounts-custom-css-length: 10000
|
||||||
|
|
||||||
|
# Int. The maximum number of profile fields allowed for each account.
|
||||||
|
#
|
||||||
|
# Note that going way higher than the default might break federation.
|
||||||
|
#
|
||||||
|
# Examples: [4, 6, 12]
|
||||||
|
# Default: 6
|
||||||
|
accounts-max-profile-fields: 6
|
||||||
```
|
```
|
||||||
|
@@ -533,6 +533,14 @@ accounts-allow-custom-css: false
|
|||||||
# Default: 10000
|
# Default: 10000
|
||||||
accounts-custom-css-length: 10000
|
accounts-custom-css-length: 10000
|
||||||
|
|
||||||
|
# Int. The maximum number of profile fields allowed for each account.
|
||||||
|
#
|
||||||
|
# Note that going way higher than the default might break federation.
|
||||||
|
#
|
||||||
|
# Examples: [4, 6, 12]
|
||||||
|
# Default: 6
|
||||||
|
accounts-max-profile-fields: 6
|
||||||
|
|
||||||
########################
|
########################
|
||||||
##### MEDIA CONFIG #####
|
##### MEDIA CONFIG #####
|
||||||
########################
|
########################
|
||||||
|
@@ -147,7 +147,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch1() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
@@ -290,7 +290,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch2() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
@@ -433,7 +433,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch3() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
@@ -627,7 +627,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch6() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
@@ -792,7 +792,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch8() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
@@ -976,7 +976,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch9() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
|
@@ -60,7 +60,6 @@ type InstanceConfigurationAccounts struct {
|
|||||||
// Currently not implemented, so this is hardcoded to 10.
|
// Currently not implemented, so this is hardcoded to 10.
|
||||||
MaxFeaturedTags int `json:"max_featured_tags"`
|
MaxFeaturedTags int `json:"max_featured_tags"`
|
||||||
// The maximum number of profile fields allowed for each account.
|
// The maximum number of profile fields allowed for each account.
|
||||||
// Currently not configurable, so this is hardcoded to 6. (https://codeberg.org/superseriousbusiness/gotosocial/issues/1876)
|
|
||||||
MaxProfileFields int `json:"max_profile_fields"`
|
MaxProfileFields int `json:"max_profile_fields"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -105,6 +105,7 @@ type Configuration struct {
|
|||||||
AccountsRegistrationBacklogLimit int `name:"accounts-registration-backlog-limit" usage:"Limit how big the 'accounts pending approval' queue can grow before registration is closed. 0 or less = no limit."`
|
AccountsRegistrationBacklogLimit int `name:"accounts-registration-backlog-limit" usage:"Limit how big the 'accounts pending approval' queue can grow before registration is closed. 0 or less = no limit."`
|
||||||
AccountsAllowCustomCSS bool `name:"accounts-allow-custom-css" usage:"Allow accounts to enable custom CSS for their profile pages and statuses."`
|
AccountsAllowCustomCSS bool `name:"accounts-allow-custom-css" usage:"Allow accounts to enable custom CSS for their profile pages and statuses."`
|
||||||
AccountsCustomCSSLength int `name:"accounts-custom-css-length" usage:"Maximum permitted length (characters) of custom CSS for accounts."`
|
AccountsCustomCSSLength int `name:"accounts-custom-css-length" usage:"Maximum permitted length (characters) of custom CSS for accounts."`
|
||||||
|
AccountsMaxProfileFields int `name:"accounts-max-profile-fields" usage:"Maximum number of profile fields allowed for each account."`
|
||||||
|
|
||||||
MediaDescriptionMinChars int `name:"media-description-min-chars" usage:"Min required chars for an image description"`
|
MediaDescriptionMinChars int `name:"media-description-min-chars" usage:"Min required chars for an image description"`
|
||||||
MediaDescriptionMaxChars int `name:"media-description-max-chars" usage:"Max permitted chars for an image description"`
|
MediaDescriptionMaxChars int `name:"media-description-max-chars" usage:"Max permitted chars for an image description"`
|
||||||
|
@@ -75,6 +75,7 @@ var Defaults = Configuration{
|
|||||||
AccountsRegistrationBacklogLimit: 20,
|
AccountsRegistrationBacklogLimit: 20,
|
||||||
AccountsAllowCustomCSS: false,
|
AccountsAllowCustomCSS: false,
|
||||||
AccountsCustomCSSLength: 10000,
|
AccountsCustomCSSLength: 10000,
|
||||||
|
AccountsMaxProfileFields: 6,
|
||||||
|
|
||||||
MediaDescriptionMinChars: 0,
|
MediaDescriptionMinChars: 0,
|
||||||
MediaDescriptionMaxChars: 1500,
|
MediaDescriptionMaxChars: 1500,
|
||||||
|
@@ -79,6 +79,7 @@ func (cfg *Configuration) RegisterFlags(flags *pflag.FlagSet) {
|
|||||||
flags.Int("accounts-registration-backlog-limit", cfg.AccountsRegistrationBacklogLimit, "Limit how big the 'accounts pending approval' queue can grow before registration is closed. 0 or less = no limit.")
|
flags.Int("accounts-registration-backlog-limit", cfg.AccountsRegistrationBacklogLimit, "Limit how big the 'accounts pending approval' queue can grow before registration is closed. 0 or less = no limit.")
|
||||||
flags.Bool("accounts-allow-custom-css", cfg.AccountsAllowCustomCSS, "Allow accounts to enable custom CSS for their profile pages and statuses.")
|
flags.Bool("accounts-allow-custom-css", cfg.AccountsAllowCustomCSS, "Allow accounts to enable custom CSS for their profile pages and statuses.")
|
||||||
flags.Int("accounts-custom-css-length", cfg.AccountsCustomCSSLength, "Maximum permitted length (characters) of custom CSS for accounts.")
|
flags.Int("accounts-custom-css-length", cfg.AccountsCustomCSSLength, "Maximum permitted length (characters) of custom CSS for accounts.")
|
||||||
|
flags.Int("accounts-max-profile-fields", cfg.AccountsMaxProfileFields, "Maximum amount of profile fields an account can have.")
|
||||||
flags.Int("media-description-min-chars", cfg.MediaDescriptionMinChars, "Min required chars for an image description")
|
flags.Int("media-description-min-chars", cfg.MediaDescriptionMinChars, "Min required chars for an image description")
|
||||||
flags.Int("media-description-max-chars", cfg.MediaDescriptionMaxChars, "Max permitted chars for an image description")
|
flags.Int("media-description-max-chars", cfg.MediaDescriptionMaxChars, "Max permitted chars for an image description")
|
||||||
flags.Int("media-remote-cache-days", cfg.MediaRemoteCacheDays, "Number of days to locally cache media from remote instances. If set to 0, remote media will be kept indefinitely.")
|
flags.Int("media-remote-cache-days", cfg.MediaRemoteCacheDays, "Number of days to locally cache media from remote instances. If set to 0, remote media will be kept indefinitely.")
|
||||||
@@ -206,7 +207,7 @@ func (cfg *Configuration) RegisterFlags(flags *pflag.FlagSet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (cfg *Configuration) MarshalMap() map[string]any {
|
func (cfg *Configuration) MarshalMap() map[string]any {
|
||||||
cfgmap := make(map[string]any, 181)
|
cfgmap := make(map[string]any, 182)
|
||||||
cfgmap["log-level"] = cfg.LogLevel
|
cfgmap["log-level"] = cfg.LogLevel
|
||||||
cfgmap["log-timestamp-format"] = cfg.LogTimestampFormat
|
cfgmap["log-timestamp-format"] = cfg.LogTimestampFormat
|
||||||
cfgmap["log-db-queries"] = cfg.LogDbQueries
|
cfgmap["log-db-queries"] = cfg.LogDbQueries
|
||||||
@@ -257,6 +258,7 @@ func (cfg *Configuration) MarshalMap() map[string]any {
|
|||||||
cfgmap["accounts-registration-backlog-limit"] = cfg.AccountsRegistrationBacklogLimit
|
cfgmap["accounts-registration-backlog-limit"] = cfg.AccountsRegistrationBacklogLimit
|
||||||
cfgmap["accounts-allow-custom-css"] = cfg.AccountsAllowCustomCSS
|
cfgmap["accounts-allow-custom-css"] = cfg.AccountsAllowCustomCSS
|
||||||
cfgmap["accounts-custom-css-length"] = cfg.AccountsCustomCSSLength
|
cfgmap["accounts-custom-css-length"] = cfg.AccountsCustomCSSLength
|
||||||
|
cfgmap["accounts-max-profile-fields"] = cfg.AccountsMaxProfileFields
|
||||||
cfgmap["media-description-min-chars"] = cfg.MediaDescriptionMinChars
|
cfgmap["media-description-min-chars"] = cfg.MediaDescriptionMinChars
|
||||||
cfgmap["media-description-max-chars"] = cfg.MediaDescriptionMaxChars
|
cfgmap["media-description-max-chars"] = cfg.MediaDescriptionMaxChars
|
||||||
cfgmap["media-remote-cache-days"] = cfg.MediaRemoteCacheDays
|
cfgmap["media-remote-cache-days"] = cfg.MediaRemoteCacheDays
|
||||||
@@ -805,6 +807,14 @@ func (cfg *Configuration) UnmarshalMap(cfgmap map[string]any) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ival, ok := cfgmap["accounts-max-profile-fields"]; ok {
|
||||||
|
var err error
|
||||||
|
cfg.AccountsMaxProfileFields, err = cast.ToIntE(ival)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error casting %#v -> int for 'accounts-max-profile-fields': %w", ival, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ival, ok := cfgmap["media-description-min-chars"]; ok {
|
if ival, ok := cfgmap["media-description-min-chars"]; ok {
|
||||||
var err error
|
var err error
|
||||||
cfg.MediaDescriptionMinChars, err = cast.ToIntE(ival)
|
cfg.MediaDescriptionMinChars, err = cast.ToIntE(ival)
|
||||||
@@ -3138,6 +3148,31 @@ func GetAccountsCustomCSSLength() int { return global.GetAccountsCustomCSSLength
|
|||||||
// SetAccountsCustomCSSLength safely sets the value for global configuration 'AccountsCustomCSSLength' field
|
// SetAccountsCustomCSSLength safely sets the value for global configuration 'AccountsCustomCSSLength' field
|
||||||
func SetAccountsCustomCSSLength(v int) { global.SetAccountsCustomCSSLength(v) }
|
func SetAccountsCustomCSSLength(v int) { global.SetAccountsCustomCSSLength(v) }
|
||||||
|
|
||||||
|
// AccountsMaxProfileFieldsFlag returns the flag name for the 'AccountsMaxProfileFields' field
|
||||||
|
func AccountsMaxProfileFieldsFlag() string { return "accounts-max-profile-fields" }
|
||||||
|
|
||||||
|
// GetAccountsMaxProfileFields safely fetches the Configuration value for state's 'AccountsMaxProfileFields' field
|
||||||
|
func (st *ConfigState) GetAccountsMaxProfileFields() (v int) {
|
||||||
|
st.mutex.RLock()
|
||||||
|
v = st.config.AccountsMaxProfileFields
|
||||||
|
st.mutex.RUnlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetAccountsMaxProfileFields safely sets the Configuration value for state's 'AccountsMaxProfileFields' field
|
||||||
|
func (st *ConfigState) SetAccountsMaxProfileFields(v int) {
|
||||||
|
st.mutex.Lock()
|
||||||
|
defer st.mutex.Unlock()
|
||||||
|
st.config.AccountsMaxProfileFields = v
|
||||||
|
st.reloadToViper()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAccountsMaxProfileFields safely fetches the value for global configuration 'AccountsMaxProfileFields' field
|
||||||
|
func GetAccountsMaxProfileFields() int { return global.GetAccountsMaxProfileFields() }
|
||||||
|
|
||||||
|
// SetAccountsMaxProfileFields safely sets the value for global configuration 'AccountsMaxProfileFields' field
|
||||||
|
func SetAccountsMaxProfileFields(v int) { global.SetAccountsMaxProfileFields(v) }
|
||||||
|
|
||||||
// MediaDescriptionMinCharsFlag returns the flag name for the 'MediaDescriptionMinChars' field
|
// MediaDescriptionMinCharsFlag returns the flag name for the 'MediaDescriptionMinChars' field
|
||||||
func MediaDescriptionMinCharsFlag() string { return "media-description-min-chars" }
|
func MediaDescriptionMinCharsFlag() string { return "media-description-min-chars" }
|
||||||
|
|
||||||
|
@@ -50,7 +50,6 @@ const (
|
|||||||
instancePollsMinExpiration = 300 // seconds
|
instancePollsMinExpiration = 300 // seconds
|
||||||
instancePollsMaxExpiration = 2629746 // seconds
|
instancePollsMaxExpiration = 2629746 // seconds
|
||||||
instanceAccountsMaxFeaturedTags = 10
|
instanceAccountsMaxFeaturedTags = 10
|
||||||
instanceAccountsMaxProfileFields = 6 // FIXME: https://codeberg.org/superseriousbusiness/gotosocial/issues/1876
|
|
||||||
instanceSourceURL = "https://codeberg.org/superseriousbusiness/gotosocial"
|
instanceSourceURL = "https://codeberg.org/superseriousbusiness/gotosocial"
|
||||||
instanceMastodonVersion = "3.5.3"
|
instanceMastodonVersion = "3.5.3"
|
||||||
)
|
)
|
||||||
@@ -1814,7 +1813,7 @@ func (c *Converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins
|
|||||||
instance.Configuration.Polls.MaxExpiration = instancePollsMaxExpiration
|
instance.Configuration.Polls.MaxExpiration = instancePollsMaxExpiration
|
||||||
instance.Configuration.Accounts.AllowCustomCSS = config.GetAccountsAllowCustomCSS()
|
instance.Configuration.Accounts.AllowCustomCSS = config.GetAccountsAllowCustomCSS()
|
||||||
instance.Configuration.Accounts.MaxFeaturedTags = instanceAccountsMaxFeaturedTags
|
instance.Configuration.Accounts.MaxFeaturedTags = instanceAccountsMaxFeaturedTags
|
||||||
instance.Configuration.Accounts.MaxProfileFields = instanceAccountsMaxProfileFields
|
instance.Configuration.Accounts.MaxProfileFields = config.GetAccountsMaxProfileFields()
|
||||||
instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated.
|
instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated.
|
||||||
instance.Configuration.OIDCEnabled = config.GetOIDCEnabled()
|
instance.Configuration.OIDCEnabled = config.GetOIDCEnabled()
|
||||||
|
|
||||||
@@ -1992,7 +1991,7 @@ func (c *Converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins
|
|||||||
instance.Configuration.Polls.MaxExpiration = instancePollsMaxExpiration
|
instance.Configuration.Polls.MaxExpiration = instancePollsMaxExpiration
|
||||||
instance.Configuration.Accounts.AllowCustomCSS = config.GetAccountsAllowCustomCSS()
|
instance.Configuration.Accounts.AllowCustomCSS = config.GetAccountsAllowCustomCSS()
|
||||||
instance.Configuration.Accounts.MaxFeaturedTags = instanceAccountsMaxFeaturedTags
|
instance.Configuration.Accounts.MaxFeaturedTags = instanceAccountsMaxFeaturedTags
|
||||||
instance.Configuration.Accounts.MaxProfileFields = instanceAccountsMaxProfileFields
|
instance.Configuration.Accounts.MaxProfileFields = config.GetAccountsMaxProfileFields()
|
||||||
instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated.
|
instance.Configuration.Emojis.EmojiSizeLimit = int(config.GetMediaEmojiLocalMaxSize()) // #nosec G115 -- Already validated.
|
||||||
instance.Configuration.OIDCEnabled = config.GetOIDCEnabled()
|
instance.Configuration.OIDCEnabled = config.GetOIDCEnabled()
|
||||||
|
|
||||||
|
@@ -2517,7 +2517,7 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV1ToFrontend() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"emojis": {
|
"emojis": {
|
||||||
"emoji_size_limit": 51200
|
"emoji_size_limit": 51200
|
||||||
@@ -2621,7 +2621,7 @@ func (suite *InternalToFrontendTestSuite) TestInstanceV2ToFrontend() {
|
|||||||
"accounts": {
|
"accounts": {
|
||||||
"allow_custom_css": true,
|
"allow_custom_css": true,
|
||||||
"max_featured_tags": 10,
|
"max_featured_tags": 10,
|
||||||
"max_profile_fields": 6
|
"max_profile_fields": 8
|
||||||
},
|
},
|
||||||
"statuses": {
|
"statuses": {
|
||||||
"max_characters": 5000,
|
"max_characters": 5000,
|
||||||
|
@@ -42,7 +42,6 @@ const (
|
|||||||
maximumUsernameLength = 64
|
maximumUsernameLength = 64
|
||||||
maximumEmojiCategoryLength = 64
|
maximumEmojiCategoryLength = 64
|
||||||
maximumProfileFieldLength = 255
|
maximumProfileFieldLength = 255
|
||||||
maximumProfileFields = 6
|
|
||||||
maximumListTitleLength = 200
|
maximumListTitleLength = 200
|
||||||
maximumFilterKeywordLength = 40
|
maximumFilterKeywordLength = 40
|
||||||
maximumFilterTitleLength = 200
|
maximumFilterTitleLength = 200
|
||||||
@@ -269,6 +268,7 @@ func ULID(i string, name string) error {
|
|||||||
// and also iterates through the fields and trims each name + value
|
// and also iterates through the fields and trims each name + value
|
||||||
// to maximumProfileFieldLength, if they were above.
|
// to maximumProfileFieldLength, if they were above.
|
||||||
func ProfileFields(fields []*gtsmodel.Field) error {
|
func ProfileFields(fields []*gtsmodel.Field) error {
|
||||||
|
maximumProfileFields := config.GetAccountsMaxProfileFields()
|
||||||
if len(fields) > maximumProfileFields {
|
if len(fields) > maximumProfileFields {
|
||||||
return fmt.Errorf("cannot have more than %d profile fields", maximumProfileFields)
|
return fmt.Errorf("cannot have more than %d profile fields", maximumProfileFields)
|
||||||
}
|
}
|
||||||
|
@@ -7,6 +7,7 @@ EXPECT=$(cat << "EOF"
|
|||||||
"account-domain": "peepee",
|
"account-domain": "peepee",
|
||||||
"accounts-allow-custom-css": true,
|
"accounts-allow-custom-css": true,
|
||||||
"accounts-custom-css-length": 5000,
|
"accounts-custom-css-length": 5000,
|
||||||
|
"accounts-max-profile-fields": 8,
|
||||||
"accounts-reason-required": false,
|
"accounts-reason-required": false,
|
||||||
"accounts-registration-backlog-limit": 100,
|
"accounts-registration-backlog-limit": 100,
|
||||||
"accounts-registration-daily-limit": 50,
|
"accounts-registration-daily-limit": 50,
|
||||||
@@ -247,6 +248,7 @@ GTS_INSTANCE_LANGUAGES="nl,en-gb" \
|
|||||||
GTS_INSTANCE_STATS_MODE="baffle" \
|
GTS_INSTANCE_STATS_MODE="baffle" \
|
||||||
GTS_ACCOUNTS_ALLOW_CUSTOM_CSS=true \
|
GTS_ACCOUNTS_ALLOW_CUSTOM_CSS=true \
|
||||||
GTS_ACCOUNTS_CUSTOM_CSS_LENGTH=5000 \
|
GTS_ACCOUNTS_CUSTOM_CSS_LENGTH=5000 \
|
||||||
|
GTS_ACCOUNTS_MAX_PROFILE_FIELDS=8 \
|
||||||
GTS_ACCOUNTS_REGISTRATION_BACKLOG_LIMIT=100 \
|
GTS_ACCOUNTS_REGISTRATION_BACKLOG_LIMIT=100 \
|
||||||
GTS_ACCOUNTS_REGISTRATION_DAILY_LIMIT=50 \
|
GTS_ACCOUNTS_REGISTRATION_DAILY_LIMIT=50 \
|
||||||
GTS_ACCOUNTS_REGISTRATION_OPEN=true \
|
GTS_ACCOUNTS_REGISTRATION_OPEN=true \
|
||||||
|
@@ -109,6 +109,7 @@ func testDefaults() config.Configuration {
|
|||||||
AccountsRegistrationBacklogLimit: 20,
|
AccountsRegistrationBacklogLimit: 20,
|
||||||
AccountsAllowCustomCSS: true,
|
AccountsAllowCustomCSS: true,
|
||||||
AccountsCustomCSSLength: 10000,
|
AccountsCustomCSSLength: 10000,
|
||||||
|
AccountsMaxProfileFields: 8,
|
||||||
|
|
||||||
MediaDescriptionMinChars: 0,
|
MediaDescriptionMinChars: 0,
|
||||||
MediaDescriptionMaxChars: 500,
|
MediaDescriptionMaxChars: 500,
|
||||||
|
@@ -81,6 +81,11 @@ Polls can have up to
|
|||||||
<b>{{- .instance.Configuration.Polls.MaxCharactersPerOption }} characters per option</b>.
|
<b>{{- .instance.Configuration.Polls.MaxCharactersPerOption }} characters per option</b>.
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- define "profileLimits" -}}
|
||||||
|
Profiles can have up to
|
||||||
|
<b>{{- .instance.Configuration.Accounts.MaxProfileFields }} profile fields</b>.
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
{{- with . }}
|
{{- with . }}
|
||||||
<main class="about">
|
<main class="about">
|
||||||
<nav class="about-section" aria-labelledby="toc">
|
<nav class="about-section" aria-labelledby="toc">
|
||||||
@@ -137,6 +142,7 @@ Polls can have up to
|
|||||||
<ul>
|
<ul>
|
||||||
<li>{{- template "statusLimits" . -}}</li>
|
<li>{{- template "statusLimits" . -}}</li>
|
||||||
<li>{{- template "pollLimits" . -}}</li>
|
<li>{{- template "pollLimits" . -}}</li>
|
||||||
|
<li>{{- template "profileLimits" . -}}</li>
|
||||||
<li>{{- template "customCSSLimits" . -}}</li>
|
<li>{{- template "customCSSLimits" . -}}</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user