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-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								package  validate  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"net/mail" 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-09 01:31:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"strings" 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-11 13:19:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									apimodel  "github.com/superseriousbusiness/gotosocial/internal/api/model" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 13:14:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/config" 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 12:16:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/gtsmodel" 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/superseriousbusiness/gotosocial/internal/regexes" 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									pwv  "github.com/wagslane/go-password-validator" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"golang.org/x/text/language" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
									
										
										
										
											2023-01-23 07:25:11 +09:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumPasswordLength          =  256 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									minimumPasswordEntropy         =  60  // dictates password strength. See https://github.com/wagslane/go-password-validator 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									minimumReasonLength            =  40 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									maximumReasonLength            =  500 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									maximumSiteTitleLength         =  40 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									maximumShortDescriptionLength  =  500 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									maximumDescriptionLength       =  5000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									maximumSiteTermsLength         =  5000 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumUsernameLength          =  64 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-14 23:47:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumEmojiCategoryLength     =  64 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-06 09:30:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumProfileFieldLength      =  255 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 12:16:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumProfileFields           =  6 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-25 10:37:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumListTitleLength         =  200 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// NewPassword returns an error if the given password is not sufficiently strong, or nil if it's ok.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  NewPassword ( password  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  password  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( "no password provided" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  len ( [ ] rune ( password ) )  >  maximumPasswordLength  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-08 14:25:55 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "password should be no more than %d chars" ,  maximumPasswordLength ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-09 01:31:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  err  :=  pwv . Validate ( password ,  minimumPasswordEntropy ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Modify error message to include percentage requred entropy the password has 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										percent  :=  int ( 100  *  pwv . GetEntropy ( password )  /  minimumPasswordEntropy ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( strings . ReplaceAll ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											err . Error ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"insecure password" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-08 10:40:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											fmt . Sprintf ( "password is only %d%% strength" ,  percent ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-09 01:31:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil  // pasword OK 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Username makes sure that a given username is valid (ie., letters, numbers, underscores, check length).  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// Returns an error if not.  
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  Username ( username  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  username  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( "no username provided" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ! regexes . Username . MatchString ( username )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "given username %s was invalid: must contain only lowercase letters, numbers, and underscores, max %d characters" ,  username ,  maximumUsernameLength ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Email makes sure that a given email address is a valid address.  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// Returns an error if not.  
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  Email ( email  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  email  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( "no email provided" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_ ,  err  :=  mail . ParseAddress ( email ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Language checks that the given language string is a 2- or 3-letter ISO 639 code.  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// Returns an error if the language cannot be parsed. See: https://pkg.go.dev/golang.org/x/text/language  
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  Language ( lang  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  lang  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( "no language provided" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									_ ,  err  :=  language . ParseBase ( lang ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// SignUpReason checks that a sufficient reason is given for a server signup request  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  SignUpReason ( reason  string ,  reasonRequired  bool )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									if  ! reasonRequired  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// we don't care! 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// we're not going to do anything with this text anyway if no reason is required 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  reason  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( "no reason provided" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									length  :=  len ( [ ] rune ( reason ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  length  <  minimumReasonLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "reason should be at least %d chars but '%s' was %d" ,  minimumReasonLength ,  reason ,  length ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  length  >  maximumReasonLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "reason should be no more than %d chars but given reason was %d" ,  maximumReasonLength ,  length ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// DisplayName checks that a requested display name is valid  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  DisplayName ( displayName  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									// TODO: add some validation logic here -- length, characters, etc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Note checks that a given profile/account note/bio is valid  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  Note ( note  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									// TODO: add some validation logic here -- length, characters, etc 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Privacy checks that the desired privacy setting is valid  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  Privacy ( privacy  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2021-09-11 13:19:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  privacy  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "empty string for privacy not allowed" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  apimodel . Visibility ( privacy )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  apimodel . VisibilityDirect ,  apimodel . VisibilityMutualsOnly ,  apimodel . VisibilityPrivate ,  apimodel . VisibilityPublic ,  apimodel . VisibilityUnlisted : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-06 12:09:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  fmt . Errorf ( "privacy '%s' was not recognized, valid options are 'direct', 'mutuals_only', 'private', 'public', 'unlisted'" ,  privacy ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-02 03:06:40 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// StatusContentType checks that the desired status format setting is valid.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  StatusContentType ( statusContentType  string )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  statusContentType  ==  ""  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-06 12:09:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "empty string for status format not allowed" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-02 03:06:40 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									switch  apimodel . StatusContentType ( statusContentType )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  apimodel . StatusContentTypePlain ,  apimodel . StatusContentTypeMarkdown : 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-06 12:09:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-02 03:06:40 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  fmt . Errorf ( "status content type '%s' was not recognized, valid options are 'text/plain', 'text/markdown'" ,  statusContentType ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-01 20:46:45 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 13:14:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  CustomCSS ( customCSS  string )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ! config . GetAccountsAllowCustomCSS ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  errors . New ( "accounts-allow-custom-css is not enabled for this instance" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-25 15:18:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maximumCustomCSSLength  :=  config . GetAccountsCustomCSSLength ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  length  :=  len ( [ ] rune ( customCSS ) ) ;  length  >  maximumCustomCSSLength  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 13:14:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "custom_css must be less than %d characters, but submitted custom_css was %d characters" ,  maximumCustomCSSLength ,  length ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2023-05-25 15:18:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-12 13:14:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// EmojiShortcode just runs the given shortcode through the regular expression  
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// for emoji shortcodes, to figure out whether it's a valid shortcode, ie., 2-30 characters,  
						 
					
						
							
								
									
										
										
										
											2023-06-02 17:42:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// a-zA-Z, numbers, and underscores.  
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  EmojiShortcode ( shortcode  string )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ! regexes . EmojiShortcode . MatchString ( shortcode )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-02 17:42:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "shortcode %s did not pass validation, must be between 2 and 30 characters, letters, numbers, and underscores only" ,  shortcode ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-19 19:42:19 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-11-14 23:47:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// EmojiCategory validates the length of the given category string.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  EmojiCategory ( category  string )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  length  :=  len ( category ) ;  length  >  maximumEmojiCategoryLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "emoji category %s did not pass validation, must be less than %d characters, but provided value was %d characters" ,  category ,  maximumEmojiCategoryLength ,  length ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// SiteTitle ensures that the given site title is within spec.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  SiteTitle ( siteTitle  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  length  :=  len ( [ ] rune ( siteTitle ) ) ;  length  >  maximumSiteTitleLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "site title should be no more than %d chars but given title was %d" ,  maximumSiteTitleLength ,  length ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// SiteShortDescription ensures that the given site short description is within spec.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  SiteShortDescription ( d  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  length  :=  len ( [ ] rune ( d ) ) ;  length  >  maximumShortDescriptionLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "short description should be no more than %d chars but given description was %d" ,  maximumShortDescriptionLength ,  length ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// SiteDescription ensures that the given site description is within spec.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  SiteDescription ( d  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  length  :=  len ( [ ] rune ( d ) ) ;  length  >  maximumDescriptionLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "description should be no more than %d chars but given description was %d" ,  maximumDescriptionLength ,  length ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// SiteTerms ensures that the given site terms string is within spec.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  SiteTerms ( t  string )  error  {  
						 
					
						
							
								
									
										
										
										
											2022-11-03 14:38:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  length  :=  len ( [ ] rune ( t ) ) ;  length  >  maximumSiteTermsLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "terms should be no more than %d chars but given terms was %d" ,  maximumSiteTermsLength ,  length ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-23 16:35:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-08-29 16:52:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-01 18:29:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// ULID returns true if the passed string is a valid ULID.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ULID ( i  string )  bool  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  regexes . ULID . MatchString ( i ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-08-29 16:52:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-03-06 09:30:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 12:16:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// ProfileFields validates the length of provided fields slice,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// and also iterates through the fields and trims each name + value  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// to maximumProfileFieldLength, if they were above.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ProfileFields ( fields  [ ] * gtsmodel . Field )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  len ( fields )  >  maximumProfileFields  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-06 09:30:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  fmt . Errorf ( "cannot have more than %d profile fields" ,  maximumProfileFields ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 12:16:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Trim each field name + value to maximum allowed length. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  field  :=  range  fields  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										n  :=  [ ] rune ( field . Name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( n )  >  maximumProfileFieldLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											field . Name  =  string ( n [ : maximumProfileFieldLength ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										v  :=  [ ] rune ( field . Value ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  len ( v )  >  maximumProfileFieldLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											field . Value  =  string ( v [ : maximumProfileFieldLength ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-06 09:30:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-05-09 12:16:10 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-06 09:30:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2023-05-25 10:37:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// ListTitle validates the title of a new or updated List.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ListTitle ( title  string )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  title  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "list title must be provided, and must be no more than %d chars" ,  maximumListTitleLength ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  length  :=  len ( [ ] rune ( title ) ) ;  length  >  maximumListTitleLength  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "list title length must be no more than %d chars, provided title was %d chars" ,  maximumListTitleLength ,  length ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// ListRepliesPolicy validates the replies_policy of a new or updated list.  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ListRepliesPolicy ( repliesPolicy  gtsmodel . RepliesPolicy )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									switch  repliesPolicy  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  "" ,  gtsmodel . RepliesPolicyFollowed ,  gtsmodel . RepliesPolicyList ,  gtsmodel . RepliesPolicyNone : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// No problem. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Uh oh. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  fmt . Errorf ( "list replies_policy must be either empty or one of 'followed', 'list', 'none'" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}