diff options
Diffstat (limited to 'internal/processing/status/create.go')
-rw-r--r-- | internal/processing/status/create.go | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/internal/processing/status/create.go b/internal/processing/status/create.go index 5f2cb8212..1513018ae 100644 --- a/internal/processing/status/create.go +++ b/internal/processing/status/create.go @@ -117,14 +117,14 @@ func (p *Processor) Create( return nil, errWithCode } - if err := processVisibility(form, requester.Settings.Privacy, status); err != nil { + if err := p.processVisibility(ctx, form, requester.Settings.Privacy, status); err != nil { return nil, gtserror.NewErrorInternalError(err) } - // Process policy AFTER visibility as it - // relies on status.Visibility being set. - if err := processInteractionPolicy(form, requester.Settings, status); err != nil { - return nil, gtserror.NewErrorInternalError(err) + // Process policy AFTER visibility as it relies + // on status.Visibility and form.Visibility being set. + if errWithCode := processInteractionPolicy(form, requester.Settings, status); errWithCode != nil { + return nil, errWithCode } if err := processLanguage(form, requester.Settings.Language, status); err != nil { @@ -337,7 +337,8 @@ func (p *Processor) processMediaIDs(ctx context.Context, form *apimodel.StatusCr return nil } -func processVisibility( +func (p *Processor) processVisibility( + ctx context.Context, form *apimodel.StatusCreateRequest, accountDefaultVis gtsmodel.Visibility, status *gtsmodel.Status, @@ -347,13 +348,17 @@ func processVisibility( case form.Visibility != "": status.Visibility = typeutils.APIVisToVis(form.Visibility) - // Fall back to account default. + // Fall back to account default, set + // this back on the form for later use. case accountDefaultVis != "": status.Visibility = accountDefaultVis + form.Visibility = p.converter.VisToAPIVis(ctx, accountDefaultVis) - // What? Fall back to global default. + // What? Fall back to global default, set + // this back on the form for later use. default: status.Visibility = gtsmodel.VisibilityDefault + form.Visibility = p.converter.VisToAPIVis(ctx, gtsmodel.VisibilityDefault) } // Set federated according to "local_only" field, @@ -365,17 +370,32 @@ func processVisibility( } func processInteractionPolicy( - _ *apimodel.StatusCreateRequest, + form *apimodel.StatusCreateRequest, settings *gtsmodel.AccountSettings, status *gtsmodel.Status, -) error { - // TODO: parse policy for this - // status from form and prefer this. +) gtserror.WithCode { + // If policy is set on the + // form then prefer this. + // // TODO: prevent scope widening by // limiting interaction policy if // inReplyTo status has a stricter // interaction policy than this one. + if form.InteractionPolicy != nil { + p, err := typeutils.APIInteractionPolicyToInteractionPolicy( + form.InteractionPolicy, + form.Visibility, + ) + + if err != nil { + errWithCode := gtserror.NewErrorBadRequest(err, err.Error()) + return errWithCode + } + + status.InteractionPolicy = p + return nil + } switch status.Visibility { |