From 7d6aaba921c35952c49af753d49925429cd58bf8 Mon Sep 17 00:00:00 2001 From: Tsvetoslav Dimov Date: Wed, 31 Jul 2024 15:56:06 +0100 Subject: [PATCH] fix: validate imdb lists ids --- internal/config/config.go | 14 ++++++++++++++ internal/config/config_test.go | 23 +++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/internal/config/config.go b/internal/config/config.go index ab1fb3f..62ff33e 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -3,6 +3,7 @@ package config import ( "fmt" "os" + "regexp" "slices" "strings" "time" @@ -121,6 +122,9 @@ func (c *Config) Validate() error { default: return fmt.Errorf("field 'IMDB_AUTH' must be one of: %s", strings.Join(validIMDbAuthMethods(), ", ")) } + if err := c.validateListIdentifiers(); err != nil { + return fmt.Errorf("field 'IMDB_LISTS' is invalid: %w", err) + } if isNilOrEmpty(c.Trakt.Email) { return fmt.Errorf("field 'TRAKT_EMAIL' is required") } @@ -142,6 +146,16 @@ func (c *Config) Validate() error { return c.checkDummies() } +func (c *Config) validateListIdentifiers() error { + re := regexp.MustCompile(`^ls[0-9]{9}$`) + for _, id := range *c.IMDb.Lists { + if ok := re.MatchString(id); !ok { + return fmt.Errorf("valid list id starts with ls and is followed by 9 digits, but got %s", id) + } + } + return nil +} + func (c *Config) WriteFile(path string) error { data, err := c.koanf.Marshal(yaml.Parser()) if err != nil { diff --git a/internal/config/config_test.go b/internal/config/config_test.go index c9a9fa6..9a054b1 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -129,6 +129,7 @@ func TestConfig_Validate(t *testing.T) { clientID = "clientID" clientSecret = "clientSecret" cookieAtMain = "cookieAtMain" + lists = make([]string, 0) ) type fields struct { @@ -148,6 +149,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: &email, @@ -229,6 +231,21 @@ func TestConfig_Validate(t *testing.T) { assertions.Contains(err.Error(), "IMDB_AUTH") }, }, + { + name: "invalid IMDb.Lists", + fields: fields{ + IMDb: IMDb{ + Auth: pointer(IMDbAuthMethodCredentials), + Email: &email, + Password: &password, + Lists: pointer([]string{"invalid"}), + }, + }, + assertions: func(assertions *assert.Assertions, err error) { + assertions.NotNil(err) + assertions.Contains(err.Error(), "IMDB_LISTS") + }, + }, { name: "missing Trakt.Email", fields: fields{ @@ -236,6 +253,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: nil, @@ -253,6 +271,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: &email, @@ -271,6 +290,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: &email, @@ -290,6 +310,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: &email, @@ -310,6 +331,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: &email, @@ -333,6 +355,7 @@ func TestConfig_Validate(t *testing.T) { Auth: pointer(IMDbAuthMethodCredentials), Email: &email, Password: &password, + Lists: &lists, }, Trakt: Trakt{ Email: &email,