| 
									
										
										
										
											2023-03-12 16:00:57 +01:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  | // (at your option) any later version. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | // GNU Affero General Public License for more details. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  | // along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2021-03-11 14:30:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | package testrig | 
					
						
							| 
									
										
										
										
											2021-03-11 14:30:14 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-07 13:31:39 +01:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2024-07-12 09:39:47 +00:00
										 |  |  | 	"context" | 
					
						
							| 
									
										
										
										
											2024-08-09 10:53:29 +00:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2024-04-04 17:42:42 +02:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 	"strconv" | 
					
						
							| 
									
										
										
										
											2023-01-17 13:29:44 +01:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-26 15:34:10 +02:00
										 |  |  | 	"code.superseriousbusiness.org/gotosocial/internal/config" | 
					
						
							|  |  |  | 	"code.superseriousbusiness.org/gotosocial/internal/language" | 
					
						
							|  |  |  | 	"code.superseriousbusiness.org/gotosocial/internal/media/ffmpeg" | 
					
						
							| 
									
										
										
										
											2023-01-17 13:29:44 +01:00
										 |  |  | 	"codeberg.org/gruf/go-bytesize" | 
					
						
							| 
									
										
										
										
											2021-12-07 13:31:39 +01:00
										 |  |  | 	"github.com/coreos/go-oidc/v3/oidc" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-12 09:39:47 +00:00
										 |  |  | func init() { | 
					
						
							|  |  |  | 	ctx := context.Background() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Ensure global ffmpeg WASM pool initialized. | 
					
						
							| 
									
										
										
										
											2024-08-09 10:53:29 +00:00
										 |  |  | 	fmt.Println("testrig: precompiling ffmpeg WASM") | 
					
						
							| 
									
										
										
										
											2024-07-12 09:39:47 +00:00
										 |  |  | 	if err := ffmpeg.InitFfmpeg(ctx, 1); err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Ensure global ffmpeg WASM pool initialized. | 
					
						
							| 
									
										
										
										
											2024-08-09 10:53:29 +00:00
										 |  |  | 	fmt.Println("testrig: precompiling ffprobe WASM") | 
					
						
							| 
									
										
										
										
											2024-07-12 09:39:47 +00:00
										 |  |  | 	if err := ffmpeg.InitFfprobe(ctx, 1); err != nil { | 
					
						
							|  |  |  | 		panic(err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | // InitTestConfig initializes viper | 
					
						
							|  |  |  | // configuration with test defaults. | 
					
						
							| 
									
										
										
										
											2021-12-07 13:31:39 +01:00
										 |  |  | func InitTestConfig() { | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 	config.Defaults = testDefaults() | 
					
						
							|  |  |  | 	config.Reset() | 
					
						
							| 
									
										
										
										
											2021-12-07 13:31:39 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | func testDefaults() config.Configuration { | 
					
						
							|  |  |  | 	return config.Configuration{ | 
					
						
							|  |  |  | 		LogLevel:                 envStr("GTS_LOG_LEVEL", "error"), | 
					
						
							|  |  |  | 		LogTimestampFormat:       "02/01/2006 15:04:05.000", | 
					
						
							|  |  |  | 		LogDbQueries:             true, | 
					
						
							|  |  |  | 		ApplicationName:          "gotosocial", | 
					
						
							|  |  |  | 		LandingPageUser:          "", | 
					
						
							|  |  |  | 		ConfigPath:               "", | 
					
						
							|  |  |  | 		Host:                     "localhost:8080", | 
					
						
							|  |  |  | 		AccountDomain:            "localhost:8080", | 
					
						
							|  |  |  | 		Protocol:                 "http", | 
					
						
							|  |  |  | 		BindAddress:              "127.0.0.1", | 
					
						
							|  |  |  | 		Port:                     8080, | 
					
						
							|  |  |  | 		TrustedProxies:           []string{"127.0.0.1/32", "::1"}, | 
					
						
							|  |  |  | 		DbType:                   envStr("GTS_DB_TYPE", "sqlite"), | 
					
						
							|  |  |  | 		DbAddress:                envStr("GTS_DB_ADDRESS", ":memory:"), | 
					
						
							|  |  |  | 		DbPort:                   envInt("GTS_DB_PORT", 0), | 
					
						
							|  |  |  | 		DbUser:                   envStr("GTS_DB_USER", ""), | 
					
						
							|  |  |  | 		DbPassword:               envStr("GTS_DB_PASSWORD", ""), | 
					
						
							|  |  |  | 		DbDatabase:               envStr("GTS_DB_DATABASE", ""), | 
					
						
							|  |  |  | 		DbTLSMode:                envStr("GTS_DB_TLS_MODE", ""), | 
					
						
							|  |  |  | 		DbTLSCACert:              envStr("GTS_DB_TLS_CA_CERT", ""), | 
					
						
							|  |  |  | 		DbMaxOpenConnsMultiplier: 8, | 
					
						
							|  |  |  | 		DbSqliteJournalMode:      "WAL", | 
					
						
							|  |  |  | 		DbSqliteSynchronous:      "NORMAL", | 
					
						
							|  |  |  | 		DbSqliteCacheSize:        8 * bytesize.MiB, | 
					
						
							|  |  |  | 		DbSqliteBusyTimeout:      time.Minute * 5, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		WebTemplateBaseDir: "./web/template/", | 
					
						
							|  |  |  | 		WebAssetBaseDir:    "./web/assets/", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		InstanceFederationMode:         config.InstanceFederationModeDefault, | 
					
						
							|  |  |  | 		InstanceFederationSpamFilter:   true, | 
					
						
							|  |  |  | 		InstanceExposePeers:            true, | 
					
						
							|  |  |  | 		InstanceExposeSuspended:        true, | 
					
						
							|  |  |  | 		InstanceExposeSuspendedWeb:     true, | 
					
						
							|  |  |  | 		InstanceDeliverToSharedInboxes: true, | 
					
						
							|  |  |  | 		InstanceLanguages: language.Languages{ | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				TagStr: "nl", | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				TagStr: "en-gb", | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2023-11-17 11:35:28 +01:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2025-01-08 11:29:40 +01:00
										 |  |  | 		InstanceSubscriptionsProcessFrom:  "23:00",        // 11pm, | 
					
						
							|  |  |  | 		InstanceSubscriptionsProcessEvery: 24 * time.Hour, // 1/day. | 
					
						
							| 
									
										
										
										
											2025-02-12 09:49:33 -08:00
										 |  |  | 		InstanceAllowBackdatingStatuses:   true, | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-02-10 15:46:36 +01:00
										 |  |  | 		AccountsRegistrationOpen:         true, | 
					
						
							|  |  |  | 		AccountsReasonRequired:           true, | 
					
						
							|  |  |  | 		AccountsRegistrationDailyLimit:   10, | 
					
						
							|  |  |  | 		AccountsRegistrationBacklogLimit: 20, | 
					
						
							|  |  |  | 		AccountsAllowCustomCSS:           true, | 
					
						
							|  |  |  | 		AccountsCustomCSSLength:          10000, | 
					
						
							| 
									
										
											  
											
												[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>
											
										 
											2025-05-14 13:25:21 +00:00
										 |  |  | 		AccountsMaxProfileFields:         8, | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		MediaDescriptionMinChars: 0, | 
					
						
							|  |  |  | 		MediaDescriptionMaxChars: 500, | 
					
						
							|  |  |  | 		MediaRemoteCacheDays:     7, | 
					
						
							| 
									
										
										
										
											2024-07-12 09:39:47 +00:00
										 |  |  | 		MediaLocalMaxSize:        40 * bytesize.MiB, | 
					
						
							|  |  |  | 		MediaRemoteMaxSize:       40 * bytesize.MiB, | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 		MediaEmojiLocalMaxSize:   51200,          // 50KiB | 
					
						
							|  |  |  | 		MediaEmojiRemoteMaxSize:  102400,         // 100KiB | 
					
						
							|  |  |  | 		MediaCleanupFrom:         "00:00",        // midnight. | 
					
						
							|  |  |  | 		MediaCleanupEvery:        24 * time.Hour, // 1/day. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// the testrig only uses in-memory storage, so we can | 
					
						
							|  |  |  | 		// safely set this value to 'test' to avoid running storage | 
					
						
							|  |  |  | 		// migrations, and other silly things like that | 
					
						
							|  |  |  | 		StorageBackend:       "test", | 
					
						
							|  |  |  | 		StorageLocalBasePath: "", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		StatusesMaxChars:           5000, | 
					
						
							|  |  |  | 		StatusesPollMaxOptions:     6, | 
					
						
							|  |  |  | 		StatusesPollOptionMaxChars: 50, | 
					
						
							|  |  |  | 		StatusesMediaMaxFiles:      6, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		LetsEncryptEnabled:      false, | 
					
						
							|  |  |  | 		LetsEncryptPort:         0, | 
					
						
							|  |  |  | 		LetsEncryptCertDir:      "", | 
					
						
							|  |  |  | 		LetsEncryptEmailAddress: "", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		OIDCEnabled:          false, | 
					
						
							|  |  |  | 		OIDCIdpName:          "", | 
					
						
							|  |  |  | 		OIDCSkipVerification: false, | 
					
						
							|  |  |  | 		OIDCIssuer:           "", | 
					
						
							|  |  |  | 		OIDCClientID:         "", | 
					
						
							|  |  |  | 		OIDCClientSecret:     "", | 
					
						
							|  |  |  | 		OIDCScopes:           []string{oidc.ScopeOpenID, "profile", "email", "groups"}, | 
					
						
							|  |  |  | 		OIDCLinkExisting:     false, | 
					
						
							|  |  |  | 		OIDCAdminGroups:      []string{"adminRole"}, | 
					
						
							|  |  |  | 		OIDCAllowedGroups:    []string{"allowedRole"}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		SMTPHost:               "", | 
					
						
							|  |  |  | 		SMTPPort:               0, | 
					
						
							|  |  |  | 		SMTPUsername:           "", | 
					
						
							|  |  |  | 		SMTPPassword:           "", | 
					
						
							|  |  |  | 		SMTPFrom:               "GoToSocial", | 
					
						
							|  |  |  | 		SMTPDiscloseRecipients: false, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-05 16:22:45 +00:00
										 |  |  | 		TracingEnabled: false, | 
					
						
							|  |  |  | 		MetricsEnabled: false, | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		SyslogEnabled:  false, | 
					
						
							|  |  |  | 		SyslogProtocol: "udp", | 
					
						
							|  |  |  | 		SyslogAddress:  "localhost:514", | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-06 15:51:45 +00:00
										 |  |  | 		Advanced: config.AdvancedConfig{ | 
					
						
							| 
									
										
										
										
											2025-05-07 11:59:39 +00:00
										 |  |  | 			CookiesSamesite:  "lax", | 
					
						
							|  |  |  | 			SenderMultiplier: 0, // 1 sender only, regardless of CPU | 
					
						
							| 
									
										
										
										
											2025-05-06 15:51:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			RateLimit: config.RateLimitConfig{ | 
					
						
							|  |  |  | 				Requests: 0, // disabled | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			Throttling: config.ThrottlingConfig{ | 
					
						
							|  |  |  | 				Multiplier: 0, // disabled | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2025-05-07 11:59:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			ScraperDeterrence: config.ScraperDeterrenceConfig{ | 
					
						
							|  |  |  | 				Enabled:    envBool("GTS_ADVANCED_SCRAPER_DETERRENCE_ENABLED", false), | 
					
						
							|  |  |  | 				Difficulty: uint8(envInt("GTS_ADVANCED_SCRAPER_DETERRENCE_DIFFICULTY", 4)), //nolint | 
					
						
							|  |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2025-05-06 15:51:45 +00:00
										 |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		SoftwareVersion: "0.0.0-testrig", | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// simply use cache defaults. | 
					
						
							|  |  |  | 		Cache: config.Defaults.Cache, | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-29 13:57:26 +00:00
										 |  |  | func envBool(key string, _default bool) bool { | 
					
						
							|  |  |  | 	return env(key, _default, func(value string) bool { | 
					
						
							|  |  |  | 		b, _ := strconv.ParseBool(value) | 
					
						
							|  |  |  | 		return b | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 15:46:15 +00:00
										 |  |  | func envInt(key string, _default int) int { | 
					
						
							|  |  |  | 	return env(key, _default, func(value string) int { | 
					
						
							|  |  |  | 		i, _ := strconv.Atoi(value) | 
					
						
							|  |  |  | 		return i | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func envStr(key string, _default string) string { | 
					
						
							|  |  |  | 	return env(key, _default, func(value string) string { | 
					
						
							|  |  |  | 		return value | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func env[T any](key string, _default T, parse func(string) T) T { | 
					
						
							|  |  |  | 	value, ok := os.LookupEnv(key) | 
					
						
							|  |  |  | 	if ok { | 
					
						
							|  |  |  | 		return parse(value) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return _default | 
					
						
							| 
									
										
										
										
											2021-03-11 14:30:14 +01:00
										 |  |  | } |