diff options
Diffstat (limited to 'internal/processing')
| -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 {  | 
