mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-30 22:11:07 +00:00 
			
		
		
		
	Introduced ErrNotValid
This commit is contained in:
		
					parent
					
						
							
								cb4690e570
							
						
					
				
			
			
				commit
				
					
						c4f9f8578a
					
				
			
		
					 8 changed files with 47 additions and 22 deletions
				
			
		|  | @ -25,7 +25,7 @@ func GetFederationHost(ctx context.Context, ID int64) (*FederationHost, error) { | ||||||
| 		return nil, fmt.Errorf("FederationInfo record %v does not exist", ID) | 		return nil, fmt.Errorf("FederationInfo record %v does not exist", ID) | ||||||
| 	} | 	} | ||||||
| 	if res, err := validation.IsValid(host); !res { | 	if res, err := validation.IsValid(host); !res { | ||||||
| 		return nil, fmt.Errorf("FederationInfo is not valid: %v", err) | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return host, nil | 	return host, nil | ||||||
| } | } | ||||||
|  | @ -39,14 +39,14 @@ func FindFederationHostByFqdn(ctx context.Context, fqdn string) (*FederationHost | ||||||
| 		return nil, nil | 		return nil, nil | ||||||
| 	} | 	} | ||||||
| 	if res, err := validation.IsValid(host); !res { | 	if res, err := validation.IsValid(host); !res { | ||||||
| 		return nil, fmt.Errorf("FederationInfo is not valid: %v", err) | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return host, nil | 	return host, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func CreateFederationHost(ctx context.Context, host *FederationHost) error { | func CreateFederationHost(ctx context.Context, host *FederationHost) error { | ||||||
| 	if res, err := validation.IsValid(host); !res { | 	if res, err := validation.IsValid(host); !res { | ||||||
| 		return fmt.Errorf("FederationInfo is not valid: %v", err) | 		return err | ||||||
| 	} | 	} | ||||||
| 	_, err := db.GetEngine(ctx).Insert(host) | 	_, err := db.GetEngine(ctx).Insert(host) | ||||||
| 	return err | 	return err | ||||||
|  | @ -54,7 +54,7 @@ func CreateFederationHost(ctx context.Context, host *FederationHost) error { | ||||||
| 
 | 
 | ||||||
| func UpdateFederationHost(ctx context.Context, host *FederationHost) error { | func UpdateFederationHost(ctx context.Context, host *FederationHost) error { | ||||||
| 	if res, err := validation.IsValid(host); !res { | 	if res, err := validation.IsValid(host); !res { | ||||||
| 		return fmt.Errorf("FederationInfo is not valid: %v", err) | 		return err | ||||||
| 	} | 	} | ||||||
| 	_, err := db.GetEngine(ctx).ID(host.ID).Update(host) | 	_, err := db.GetEngine(ctx).ID(host.ID).Update(host) | ||||||
| 	return err | 	return err | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ package forgefed | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"reflect" | 	"reflect" | ||||||
|  | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"code.gitea.io/gitea/modules/validation" | 	"code.gitea.io/gitea/modules/validation" | ||||||
|  | @ -52,12 +53,14 @@ func Test_NodeInfoWellKnownValidate(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sut = NodeInfoWellKnown{Href: "./federated-repo.prod.meissa.de/api/v1/nodeinfo"} | 	sut = NodeInfoWellKnown{Href: "./federated-repo.prod.meissa.de/api/v1/nodeinfo"} | ||||||
| 	if _, err := validation.IsValid(sut); err.Error() != "Href has to be absolute\nValue  is not contained in allowed values [http https]" { | 	_, err := validation.IsValid(sut) | ||||||
|  | 	if !validation.IsErrNotValid(err) && strings.Contains(err.Error(), "Href has to be absolute\nValue  is not contained in allowed values [http https]") { | ||||||
| 		t.Errorf("validation error expected but was: %v\n", err) | 		t.Errorf("validation error expected but was: %v\n", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	sut = NodeInfoWellKnown{Href: "https://federated-repo.prod.meissa.de/api/v1/nodeinfo?alert=1"} | 	sut = NodeInfoWellKnown{Href: "https://federated-repo.prod.meissa.de/api/v1/nodeinfo?alert=1"} | ||||||
| 	if _, err := validation.IsValid(sut); err.Error() != "Href may not contain query" { | 	_, err = validation.IsValid(sut) | ||||||
|  | 	if !validation.IsErrNotValid(err) && strings.Contains(err.Error(), "Href has to be absolute\nValue  is not contained in allowed values [http https]") { | ||||||
| 		t.Errorf("sut should be valid, %v, %v", sut, err) | 		t.Errorf("sut should be valid, %v, %v", sut, err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -5,7 +5,6 @@ package repo | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" |  | ||||||
| 
 | 
 | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	"code.gitea.io/gitea/modules/validation" | 	"code.gitea.io/gitea/modules/validation" | ||||||
|  | @ -26,7 +25,7 @@ func FindFollowingReposByRepoID(ctx context.Context, repoID int64) ([]*Following | ||||||
| 	} | 	} | ||||||
| 	for _, followingRepo := range followingRepoList { | 	for _, followingRepo := range followingRepoList { | ||||||
| 		if res, err := validation.IsValid(*followingRepo); !res { | 		if res, err := validation.IsValid(*followingRepo); !res { | ||||||
| 			return make([]*FollowingRepo, 0, maxFollowingRepos), fmt.Errorf("FederationInfo is not valid: %v", err) | 			return make([]*FollowingRepo, 0, maxFollowingRepos), err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return followingRepoList, nil | 	return followingRepoList, nil | ||||||
|  | @ -35,7 +34,7 @@ func FindFollowingReposByRepoID(ctx context.Context, repoID int64) ([]*Following | ||||||
| func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoList []*FollowingRepo) error { | func StoreFollowingRepos(ctx context.Context, localRepoID int64, followingRepoList []*FollowingRepo) error { | ||||||
| 	for _, followingRepo := range followingRepoList { | 	for _, followingRepo := range followingRepoList { | ||||||
| 		if res, err := validation.IsValid(*followingRepo); !res { | 		if res, err := validation.IsValid(*followingRepo); !res { | ||||||
| 			return fmt.Errorf("FederationInfo is not valid: %v", err) | 			return err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ func init() { | ||||||
| 
 | 
 | ||||||
| func CreateFederatedUser(ctx context.Context, user *User, federatedUser *FederatedUser) error { | func CreateFederatedUser(ctx context.Context, user *User, federatedUser *FederatedUser) error { | ||||||
| 	if res, err := validation.IsValid(user); !res { | 	if res, err := validation.IsValid(user); !res { | ||||||
| 		return fmt.Errorf("User is not valid: %v", err) | 		return err | ||||||
| 	} | 	} | ||||||
| 	overwrite := CreateUserOverwriteOptions{ | 	overwrite := CreateUserOverwriteOptions{ | ||||||
| 		IsActive:     optional.Some(false), | 		IsActive:     optional.Some(false), | ||||||
|  | @ -38,7 +38,7 @@ func CreateFederatedUser(ctx context.Context, user *User, federatedUser *Federat | ||||||
| 
 | 
 | ||||||
| 	federatedUser.UserID = user.ID | 	federatedUser.UserID = user.ID | ||||||
| 	if res, err := validation.IsValid(federatedUser); !res { | 	if res, err := validation.IsValid(federatedUser); !res { | ||||||
| 		return fmt.Errorf("FederatedUser is not valid: %v", err) | 		return err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	_, err = db.GetEngine(ctx).Insert(federatedUser) | 	_, err = db.GetEngine(ctx).Insert(federatedUser) | ||||||
|  | @ -69,10 +69,10 @@ func FindFederatedUser(ctx context.Context, externalID string, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if res, err := validation.IsValid(*user); !res { | 	if res, err := validation.IsValid(*user); !res { | ||||||
| 		return nil, nil, fmt.Errorf("FederatedUser is not valid: %v", err) | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 	if res, err := validation.IsValid(*federatedUser); !res { | 	if res, err := validation.IsValid(*federatedUser); !res { | ||||||
| 		return nil, nil, fmt.Errorf("FederatedUser is not valid: %v", err) | 		return nil, nil, err | ||||||
| 	} | 	} | ||||||
| 	return user, federatedUser, nil | 	return user, federatedUser, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -32,8 +32,8 @@ func NewActorID(uri string) (ActorID, error) { | ||||||
| 		return ActorID{}, err | 		return ActorID{}, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if valid, outcome := validation.IsValid(result); !valid { | 	if valid, err := validation.IsValid(result); !valid { | ||||||
| 		return ActorID{}, outcome | 		return ActorID{}, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return result, nil | 	return result, nil | ||||||
|  | @ -83,8 +83,8 @@ func NewPersonID(uri, source string) (PersonID, error) { | ||||||
| 
 | 
 | ||||||
| 	// validate Person specific path | 	// validate Person specific path | ||||||
| 	personID := PersonID{result} | 	personID := PersonID{result} | ||||||
| 	if valid, outcome := validation.IsValid(personID); !valid { | 	if valid, err := validation.IsValid(personID); !valid { | ||||||
| 		return PersonID{}, outcome | 		return PersonID{}, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return personID, nil | 	return personID, nil | ||||||
|  | @ -137,8 +137,8 @@ func NewRepositoryID(uri, source string) (RepositoryID, error) { | ||||||
| 
 | 
 | ||||||
| 	// validate Person specific path | 	// validate Person specific path | ||||||
| 	repoID := RepositoryID{result} | 	repoID := RepositoryID{result} | ||||||
| 	if valid, outcome := validation.IsValid(repoID); !valid { | 	if valid, err := validation.IsValid(repoID); !valid { | ||||||
| 		return RepositoryID{}, outcome | 		return RepositoryID{}, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return repoID, nil | 	return repoID, nil | ||||||
|  |  | ||||||
|  | @ -92,7 +92,9 @@ func TestPersonIdValidation(t *testing.T) { | ||||||
| 	sut.Host = "an.other.host" | 	sut.Host = "an.other.host" | ||||||
| 	sut.Port = "" | 	sut.Port = "" | ||||||
| 	sut.UnvalidatedInput = "https://an.other.host/path/1" | 	sut.UnvalidatedInput = "https://an.other.host/path/1" | ||||||
| 	if _, err := validation.IsValid(sut); err.Error() != "path: \"path\" has to be a person specific api path" { | 
 | ||||||
|  | 	_, err := validation.IsValid(sut) | ||||||
|  | 	if validation.IsErrNotValid(err) && strings.Contains(err.Error(), "path: \"path\" has to be a person specific api path\n") { | ||||||
| 		t.Errorf("validation error expected but was: %v\n", err) | 		t.Errorf("validation error expected but was: %v\n", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -6,20 +6,37 @@ package validation | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"reflect" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"unicode/utf8" | 	"unicode/utf8" | ||||||
| 
 | 
 | ||||||
| 	"code.gitea.io/gitea/modules/timeutil" | 	"code.gitea.io/gitea/modules/timeutil" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | // ErrNotValid represents an validation error | ||||||
|  | type ErrNotValid struct { | ||||||
|  | 	Message string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (err ErrNotValid) Error() string { | ||||||
|  | 	return fmt.Sprintf("Validation Error: %v", err.Message) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // IsErrNotValid checks if an error is a ErrNotValid. | ||||||
|  | func IsErrNotValid(err error) bool { | ||||||
|  | 	_, ok := err.(ErrNotValid) | ||||||
|  | 	return ok | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type Validateable interface { | type Validateable interface { | ||||||
| 	Validate() []string | 	Validate() []string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func IsValid(v Validateable) (bool, error) { | func IsValid(v Validateable) (bool, error) { | ||||||
| 	if err := v.Validate(); len(err) > 0 { | 	if err := v.Validate(); len(err) > 0 { | ||||||
|  | 		typeof := reflect.TypeOf(v) | ||||||
| 		errString := strings.Join(err, "\n") | 		errString := strings.Join(err, "\n") | ||||||
| 		return false, fmt.Errorf(errString) | 		return false, ErrNotValid{fmt.Sprint(typeof, ": ", errString)} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return true, nil | 	return true, nil | ||||||
|  |  | ||||||
|  | @ -26,9 +26,13 @@ func Test_IsValid(t *testing.T) { | ||||||
| 		t.Errorf("sut expected to be valid: %v\n", sut.Validate()) | 		t.Errorf("sut expected to be valid: %v\n", sut.Validate()) | ||||||
| 	} | 	} | ||||||
| 	sut = Sut{valid: false} | 	sut = Sut{valid: false} | ||||||
| 	if res, _ := IsValid(sut); res { | 	res, err := IsValid(sut) | ||||||
|  | 	if res { | ||||||
| 		t.Errorf("sut expected to be invalid: %v\n", sut.Validate()) | 		t.Errorf("sut expected to be invalid: %v\n", sut.Validate()) | ||||||
| 	} | 	} | ||||||
|  | 	if err == nil || !IsErrNotValid(err) || err.Error() != "Validation Error: validation.Sut: invalid" { | ||||||
|  | 		t.Errorf("validation error expected, but was %v", err) | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Test_ValidateNotEmpty_ForString(t *testing.T) { | func Test_ValidateNotEmpty_ForString(t *testing.T) { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue