diff options
Diffstat (limited to 'internal/api/client/statuses')
| -rw-r--r-- | internal/api/client/statuses/statuscreate.go | 62 | 
1 files changed, 49 insertions, 13 deletions
diff --git a/internal/api/client/statuses/statuscreate.go b/internal/api/client/statuses/statuscreate.go index 5034e53b1..cc9b78384 100644 --- a/internal/api/client/statuses/statuscreate.go +++ b/internal/api/client/statuses/statuscreate.go @@ -21,6 +21,7 @@ import (  	"errors"  	"fmt"  	"net/http" +	"strconv"  	"github.com/gin-gonic/gin"  	apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" @@ -117,7 +118,10 @@ func (m *Module) StatusCreatePOSTHandler(c *gin.Context) {  	c.JSON(http.StatusOK, apiStatus)  } -// validateNormalizeCreateStatus checks the form for disallowed combinations of attachments and overlength inputs. +// validateNormalizeCreateStatus checks the form +// for disallowed combinations of attachments and +// overlength inputs. +//  // Side effect: normalizes the post's language tag.  func validateNormalizeCreateStatus(form *apimodel.AdvancedStatusCreateForm) error {  	hasStatus := form.Status != "" @@ -134,8 +138,6 @@ func validateNormalizeCreateStatus(form *apimodel.AdvancedStatusCreateForm) erro  	maxChars := config.GetStatusesMaxChars()  	maxMediaFiles := config.GetStatusesMediaMaxFiles() -	maxPollOptions := config.GetStatusesPollMaxOptions() -	maxPollChars := config.GetStatusesPollOptionMaxChars()  	maxCwChars := config.GetStatusesCWMaxChars()  	if form.Status != "" { @@ -149,16 +151,8 @@ func validateNormalizeCreateStatus(form *apimodel.AdvancedStatusCreateForm) erro  	}  	if form.Poll != nil { -		if len(form.Poll.Options) == 0 { -			return errors.New("poll with no options") -		} -		if len(form.Poll.Options) > maxPollOptions { -			return fmt.Errorf("too many poll options provided, %d provided but limit is %d", len(form.Poll.Options), maxPollOptions) -		} -		for _, p := range form.Poll.Options { -			if length := len([]rune(p)); length > maxPollChars { -				return fmt.Errorf("poll option too long, %d characters provided but limit is %d", length, maxPollChars) -			} +		if err := validateNormalizeCreatePoll(form); err != nil { +			return err  		}  	} @@ -178,3 +172,45 @@ func validateNormalizeCreateStatus(form *apimodel.AdvancedStatusCreateForm) erro  	return nil  } + +func validateNormalizeCreatePoll(form *apimodel.AdvancedStatusCreateForm) error { +	maxPollOptions := config.GetStatusesPollMaxOptions() +	maxPollChars := config.GetStatusesPollOptionMaxChars() + +	// Normalize poll expiry if necessary. +	// If we parsed this as JSON, expires_in +	// may be either a float64 or a string. +	if ei := form.Poll.ExpiresInI; ei != nil { +		switch e := ei.(type) { +		case float64: +			form.Poll.ExpiresIn = int(e) + +		case string: +			expiresIn, err := strconv.Atoi(e) +			if err != nil { +				return fmt.Errorf("could not parse expires_in value %s as integer: %w", e, err) +			} + +			form.Poll.ExpiresIn = expiresIn + +		default: +			return fmt.Errorf("could not parse expires_in type %T as integer", ei) +		} +	} + +	if len(form.Poll.Options) == 0 { +		return errors.New("poll with no options") +	} + +	if len(form.Poll.Options) > maxPollOptions { +		return fmt.Errorf("too many poll options provided, %d provided but limit is %d", len(form.Poll.Options), maxPollOptions) +	} + +	for _, p := range form.Poll.Options { +		if length := len([]rune(p)); length > maxPollChars { +			return fmt.Errorf("poll option too long, %d characters provided but limit is %d", length, maxPollChars) +		} +	} + +	return nil +}  | 
