[feature] Report Masto version in /api/v1/instance (#1977)
This commit is contained in:
parent
43a2753ef0
commit
f8f0312042
|
@ -400,6 +400,15 @@ instance-expose-public-timeline: false
|
||||||
# Default: true
|
# Default: true
|
||||||
instance-deliver-to-shared-inboxes: true
|
instance-deliver-to-shared-inboxes: true
|
||||||
|
|
||||||
|
# Bool. This flag will inject a Mastodon version into the version field that
|
||||||
|
# is included in /api/v1/instance. This version is often used by Mastodon clients
|
||||||
|
# to do API feature detection. By injecting a Mastodon compatible version, it is
|
||||||
|
# possible to cajole those clients to behave correctly with GoToSocial.
|
||||||
|
#
|
||||||
|
# Options: [true, false]
|
||||||
|
# Default: false
|
||||||
|
instance-inject-mastodon-version: false
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
##### ACCOUNTS CONFIG #####
|
##### ACCOUNTS CONFIG #####
|
||||||
###########################
|
###########################
|
||||||
|
|
|
@ -80,6 +80,7 @@ type Configuration struct {
|
||||||
InstanceExposeSuspendedWeb bool `name:"instance-expose-suspended-web" usage:"Expose list of suspended instances as webpage on /about/suspended"`
|
InstanceExposeSuspendedWeb bool `name:"instance-expose-suspended-web" usage:"Expose list of suspended instances as webpage on /about/suspended"`
|
||||||
InstanceExposePublicTimeline bool `name:"instance-expose-public-timeline" usage:"Allow unauthenticated users to query /api/v1/timelines/public"`
|
InstanceExposePublicTimeline bool `name:"instance-expose-public-timeline" usage:"Allow unauthenticated users to query /api/v1/timelines/public"`
|
||||||
InstanceDeliverToSharedInboxes bool `name:"instance-deliver-to-shared-inboxes" usage:"Deliver federated messages to shared inboxes, if they're available."`
|
InstanceDeliverToSharedInboxes bool `name:"instance-deliver-to-shared-inboxes" usage:"Deliver federated messages to shared inboxes, if they're available."`
|
||||||
|
InstanceInjectMastodonVersion bool `name:"instance-inject-mastodon-version" usage:"This injects a Mastodon compatible version in /api/v1/instance to help Mastodon clients that use that version for feature detection"`
|
||||||
|
|
||||||
AccountsRegistrationOpen bool `name:"accounts-registration-open" usage:"Allow anyone to submit an account signup request. If false, server will be invite-only."`
|
AccountsRegistrationOpen bool `name:"accounts-registration-open" usage:"Allow anyone to submit an account signup request. If false, server will be invite-only."`
|
||||||
AccountsApprovalRequired bool `name:"accounts-approval-required" usage:"Do account signups require approval by an admin or moderator before user can log in? If false, new registrations will be automatically approved."`
|
AccountsApprovalRequired bool `name:"accounts-approval-required" usage:"Do account signups require approval by an admin or moderator before user can log in? If false, new registrations will be automatically approved."`
|
||||||
|
|
|
@ -849,6 +849,31 @@ func GetInstanceDeliverToSharedInboxes() bool { return global.GetInstanceDeliver
|
||||||
// SetInstanceDeliverToSharedInboxes safely sets the value for global configuration 'InstanceDeliverToSharedInboxes' field
|
// SetInstanceDeliverToSharedInboxes safely sets the value for global configuration 'InstanceDeliverToSharedInboxes' field
|
||||||
func SetInstanceDeliverToSharedInboxes(v bool) { global.SetInstanceDeliverToSharedInboxes(v) }
|
func SetInstanceDeliverToSharedInboxes(v bool) { global.SetInstanceDeliverToSharedInboxes(v) }
|
||||||
|
|
||||||
|
// GetInstanceInjectMastodonVersion safely fetches the Configuration value for state's 'InstanceInjectMastodonVersion' field
|
||||||
|
func (st *ConfigState) GetInstanceInjectMastodonVersion() (v bool) {
|
||||||
|
st.mutex.RLock()
|
||||||
|
v = st.config.InstanceInjectMastodonVersion
|
||||||
|
st.mutex.RUnlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetInstanceInjectMastodonVersion safely sets the Configuration value for state's 'InstanceInjectMastodonVersion' field
|
||||||
|
func (st *ConfigState) SetInstanceInjectMastodonVersion(v bool) {
|
||||||
|
st.mutex.Lock()
|
||||||
|
defer st.mutex.Unlock()
|
||||||
|
st.config.InstanceInjectMastodonVersion = v
|
||||||
|
st.reloadToViper()
|
||||||
|
}
|
||||||
|
|
||||||
|
// InstanceInjectMastodonVersionFlag returns the flag name for the 'InstanceInjectMastodonVersion' field
|
||||||
|
func InstanceInjectMastodonVersionFlag() string { return "instance-inject-mastodon-version" }
|
||||||
|
|
||||||
|
// GetInstanceInjectMastodonVersion safely fetches the value for global configuration 'InstanceInjectMastodonVersion' field
|
||||||
|
func GetInstanceInjectMastodonVersion() bool { return global.GetInstanceInjectMastodonVersion() }
|
||||||
|
|
||||||
|
// SetInstanceInjectMastodonVersion safely sets the value for global configuration 'InstanceInjectMastodonVersion' field
|
||||||
|
func SetInstanceInjectMastodonVersion(v bool) { global.SetInstanceInjectMastodonVersion(v) }
|
||||||
|
|
||||||
// GetAccountsRegistrationOpen safely fetches the Configuration value for state's 'AccountsRegistrationOpen' field
|
// GetAccountsRegistrationOpen safely fetches the Configuration value for state's 'AccountsRegistrationOpen' field
|
||||||
func (st *ConfigState) GetAccountsRegistrationOpen() (v bool) {
|
func (st *ConfigState) GetAccountsRegistrationOpen() (v bool) {
|
||||||
st.mutex.RLock()
|
st.mutex.RLock()
|
||||||
|
|
|
@ -45,6 +45,7 @@ const (
|
||||||
instanceAccountsMaxFeaturedTags = 10
|
instanceAccountsMaxFeaturedTags = 10
|
||||||
instanceAccountsMaxProfileFields = 6 // FIXME: https://github.com/superseriousbusiness/gotosocial/issues/1876
|
instanceAccountsMaxProfileFields = 6 // FIXME: https://github.com/superseriousbusiness/gotosocial/issues/1876
|
||||||
instanceSourceURL = "https://github.com/superseriousbusiness/gotosocial"
|
instanceSourceURL = "https://github.com/superseriousbusiness/gotosocial"
|
||||||
|
instanceMastodonVersion = "3.5.3"
|
||||||
)
|
)
|
||||||
|
|
||||||
var instanceStatusesSupportedMimeTypes = []string{
|
var instanceStatusesSupportedMimeTypes = []string{
|
||||||
|
@ -52,6 +53,10 @@ var instanceStatusesSupportedMimeTypes = []string{
|
||||||
string(apimodel.StatusContentTypeMarkdown),
|
string(apimodel.StatusContentTypeMarkdown),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func toMastodonVersion(in string) string {
|
||||||
|
return instanceMastodonVersion + "+" + strings.ReplaceAll(in, " ", "-")
|
||||||
|
}
|
||||||
|
|
||||||
func (c *converter) AccountToAPIAccountSensitive(ctx context.Context, a *gtsmodel.Account) (*apimodel.Account, error) {
|
func (c *converter) AccountToAPIAccountSensitive(ctx context.Context, a *gtsmodel.Account) (*apimodel.Account, error) {
|
||||||
// we can build this sensitive account easily by first getting the public account....
|
// we can build this sensitive account easily by first getting the public account....
|
||||||
apiAccount, err := c.AccountToAPIAccountPublic(ctx, a)
|
apiAccount, err := c.AccountToAPIAccountPublic(ctx, a)
|
||||||
|
@ -740,6 +745,10 @@ func (c *converter) InstanceToAPIV1Instance(ctx context.Context, i *gtsmodel.Ins
|
||||||
MaxTootChars: uint(config.GetStatusesMaxChars()),
|
MaxTootChars: uint(config.GetStatusesMaxChars()),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.GetInstanceInjectMastodonVersion() {
|
||||||
|
instance.Version = toMastodonVersion(instance.Version)
|
||||||
|
}
|
||||||
|
|
||||||
// configuration
|
// configuration
|
||||||
instance.Configuration.Statuses.MaxCharacters = config.GetStatusesMaxChars()
|
instance.Configuration.Statuses.MaxCharacters = config.GetStatusesMaxChars()
|
||||||
instance.Configuration.Statuses.MaxMediaAttachments = config.GetStatusesMediaMaxFiles()
|
instance.Configuration.Statuses.MaxMediaAttachments = config.GetStatusesMediaMaxFiles()
|
||||||
|
@ -839,6 +848,10 @@ func (c *converter) InstanceToAPIV2Instance(ctx context.Context, i *gtsmodel.Ins
|
||||||
Rules: []interface{}{}, // todo: not implemented
|
Rules: []interface{}{}, // todo: not implemented
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.GetInstanceInjectMastodonVersion() {
|
||||||
|
instance.Version = toMastodonVersion(instance.Version)
|
||||||
|
}
|
||||||
|
|
||||||
// thumbnail
|
// thumbnail
|
||||||
thumbnail := apimodel.InstanceV2Thumbnail{}
|
thumbnail := apimodel.InstanceV2Thumbnail{}
|
||||||
|
|
||||||
|
|
|
@ -108,6 +108,7 @@ EXPECT=$(cat <<"EOF"
|
||||||
"instance-expose-public-timeline": true,
|
"instance-expose-public-timeline": true,
|
||||||
"instance-expose-suspended": true,
|
"instance-expose-suspended": true,
|
||||||
"instance-expose-suspended-web": true,
|
"instance-expose-suspended-web": true,
|
||||||
|
"instance-inject-mastodon-version": true,
|
||||||
"landing-page-user": "admin",
|
"landing-page-user": "admin",
|
||||||
"letsencrypt-cert-dir": "/gotosocial/storage/certs",
|
"letsencrypt-cert-dir": "/gotosocial/storage/certs",
|
||||||
"letsencrypt-email-address": "",
|
"letsencrypt-email-address": "",
|
||||||
|
@ -215,6 +216,7 @@ GTS_INSTANCE_EXPOSE_SUSPENDED=true \
|
||||||
GTS_INSTANCE_EXPOSE_SUSPENDED_WEB=true \
|
GTS_INSTANCE_EXPOSE_SUSPENDED_WEB=true \
|
||||||
GTS_INSTANCE_EXPOSE_PUBLIC_TIMELINE=true \
|
GTS_INSTANCE_EXPOSE_PUBLIC_TIMELINE=true \
|
||||||
GTS_INSTANCE_DELIVER_TO_SHARED_INBOXES=false \
|
GTS_INSTANCE_DELIVER_TO_SHARED_INBOXES=false \
|
||||||
|
GTS_INSTANCE_INJECT_MASTODON_VERSION=true \
|
||||||
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_REGISTRATION_OPEN=true \
|
GTS_ACCOUNTS_REGISTRATION_OPEN=true \
|
||||||
|
|
Loading…
Reference in New Issue