From 94d0a14ceb52b272289d3a12434699c09b59204a Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Tue, 12 Mar 2024 11:36:15 +0000 Subject: [PATCH 1/2] task: delete atlas validations --- internal/flag/flags.go | 2 - internal/validate/common_password.go | 414 --------------------------- internal/validate/validate.go | 88 ------ internal/validate/validate_test.go | 212 -------------- 4 files changed, 716 deletions(-) delete mode 100644 internal/validate/common_password.go diff --git a/internal/flag/flags.go b/internal/flag/flags.go index 5ece351fd8..fff29f8cb9 100644 --- a/internal/flag/flags.go +++ b/internal/flag/flags.go @@ -119,7 +119,6 @@ const ( Key = "key" // Key flag CollectionName = "collectionName" // CollectionName flag Database = "db" // Database flag - Unique = "unique" // Unique flag RSName = "rsName" // RSName flag Sparse = "sparse" // Sparse flag Locale = "locale" // Locale flag @@ -171,7 +170,6 @@ const ( MonthlySnapshotRetentionMonths = "monthlySnapshotRetentionMonths" // MonthlySnapshotRetentionMonths flag Policy = "policy" // Policy flag SystemID = "systemId" // SystemID flag - Default = "default" // Default flag Timestamp = "timestamp" // Timestamp flag OwnerID = "ownerId" // OwnerID flag LinkToken = "linkToken" // LinkToken flag diff --git a/internal/validate/common_password.go b/internal/validate/common_password.go deleted file mode 100644 index ade50d3245..0000000000 --- a/internal/validate/common_password.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2021 MongoDB Inc -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package validate - -var commonPasswords = map[string]bool{ - "000000": true, - "111111": true, - "11111111": true, - "112233": true, - "121212": true, - "123123": true, - "123456": true, - "1234567": true, - "12345678": true, - "123456789": true, - "131313": true, - "232323": true, - "654321": true, - "666666": true, - "696969": true, - "777777": true, - "7777777": true, - "8675309": true, - "987654": true, - "aaaaaa": true, - "abc123": true, - "abcdef": true, - "abgrtyu": true, - "access": true, - "access14": true, - "action": true, - "albert": true, - "alberto": true, - "alexis": true, - "alejandra": true, - "alejandro": true, - "amanda": true, - "amateur": true, - "america": true, - "andrea": true, - "andrew": true, - "angela": true, - "angels": true, - "animal": true, - "anthony": true, - "apollo": true, - "apples": true, - "arsenal": true, - "arthur": true, - "asdfgh": true, - "ashley": true, - "asshole": true, - "august": true, - "austin": true, - "badboy": true, - "bailey": true, - "banana": true, - "barney": true, - "baseball": true, - "batman": true, - "beatriz": true, - "beaver": true, - "beavis": true, - "bigcock": true, - "bigdaddy": true, - "bigdick": true, - "bigdog": true, - "bigtits": true, - "birdie": true, - "bitches": true, - "biteme": true, - "blazer": true, - "blonde": true, - "blondes": true, - "blowjob": true, - "blowme": true, - "bond007": true, - "bonita": true, - "bonnie": true, - "booboo": true, - "booger": true, - "boomer": true, - "boston": true, - "brandon": true, - "brandy": true, - "braves": true, - "brazil": true, - "bronco": true, - "broncos": true, - "bulldog": true, - "buster": true, - "butter": true, - "butthead": true, - "calvin": true, - "camaro": true, - "cameron": true, - "canada": true, - "captain": true, - "carlos": true, - "carter": true, - "casper": true, - "charles": true, - "charlie": true, - "cheese": true, - "chelsea": true, - "chester": true, - "chicago": true, - "chicken": true, - "cocacola": true, - "coffee": true, - "college": true, - "compaq": true, - "computer": true, - "consumer": true, - "cookie": true, - "cooper": true, - "corvette": true, - "cowboy": true, - "cowboys": true, - "crystal": true, - "cumming": true, - "cumshot": true, - "dakota": true, - "dallas": true, - "daniel": true, - "danielle": true, - "debbie": true, - "dennis": true, - "diablo": true, - "diamond": true, - "doctor": true, - "doggie": true, - "dolphin": true, - "dolphins": true, - "donald": true, - "dragon": true, - "dreams": true, - "driver": true, - "eagle1": true, - "eagles": true, - "edward": true, - "einstein": true, - "erotic": true, - "estrella": true, - "extreme": true, - "falcon": true, - "fender": true, - "ferrari": true, - "firebird": true, - "fishing": true, - "florida": true, - "flower": true, - "flyers": true, - "football": true, - "forever": true, - "freddy": true, - "freedom": true, - "fucked": true, - "fucker": true, - "fucking": true, - "fuckme": true, - "fuckyou": true, - "gandalf": true, - "gateway": true, - "gators": true, - "gemini": true, - "george": true, - "giants": true, - "ginger": true, - "gizmodo": true, - "golden": true, - "golfer": true, - "gordon": true, - "gregory": true, - "guitar": true, - "gunner": true, - "hammer": true, - "hannah": true, - "hardcore": true, - "harley": true, - "heather": true, - "helpme": true, - "hentai": true, - "hockey": true, - "hooters": true, - "horney": true, - "hotdog": true, - "hunter": true, - "hunting": true, - "iceman": true, - "iloveyou": true, - "internet": true, - "iwantu": true, - "jackie": true, - "jackson": true, - "jaguar": true, - "jasmine": true, - "jasper": true, - "jennifer": true, - "jeremy": true, - "jessica": true, - "johnny": true, - "johnson": true, - "jordan": true, - "joseph": true, - "joshua": true, - "junior": true, - "justin": true, - "killer": true, - "knight": true, - "ladies": true, - "lakers": true, - "lauren": true, - "leather": true, - "legend": true, - "letmein": true, - "little": true, - "london": true, - "lovers": true, - "maddog": true, - "madison": true, - "maggie": true, - "magnum": true, - "marine": true, - "mariposa": true, - "marlboro": true, - "martin": true, - "marvin": true, - "master": true, - "matrix": true, - "matthew": true, - "maverick": true, - "maxwell": true, - "melissa": true, - "member": true, - "mercedes": true, - "merlin": true, - "michael": true, - "michelle": true, - "mickey": true, - "midnight": true, - "miller": true, - "mistress": true, - "monica": true, - "monkey": true, - "monster": true, - "morgan": true, - "mother": true, - "mountain": true, - "muffin": true, - "murphy": true, - "mustang": true, - "naked": true, - "nascar": true, - "nathan": true, - "naughty": true, - "ncc1701": true, - "newyork": true, - "nicholas": true, - "nicole": true, - "nipple": true, - "nipples": true, - "oliver": true, - "orange": true, - "packers": true, - "panther": true, - "panties": true, - "parker": true, - "password": true, - "password1": true, - "password12": true, - "password123": true, - "patrick": true, - "peaches": true, - "peanut": true, - "pepper": true, - "phantom": true, - "phoenix": true, - "player": true, - "please": true, - "pookie": true, - "porsche": true, - "prince": true, - "princess": true, - "private": true, - "purple": true, - "pussies": true, - "qazwsx": true, - "qwerty": true, - "qwertyui": true, - "rabbit": true, - "rachel": true, - "racing": true, - "raiders": true, - "rainbow": true, - "ranger": true, - "rangers": true, - "rebecca": true, - "redskins": true, - "redsox": true, - "redwings": true, - "richard": true, - "robert": true, - "roberto": true, - "rocket": true, - "rosebud": true, - "runner": true, - "rush2112": true, - "russia": true, - "samantha": true, - "sammy": true, - "samson": true, - "sandra": true, - "saturn": true, - "scooby": true, - "scooter": true, - "scorpio": true, - "scorpion": true, - "sebastian": true, - "secret": true, - "sexsex": true, - "shadow": true, - "shannon": true, - "shaved": true, - "sierra": true, - "silver": true, - "skippy": true, - "slayer": true, - "smokey": true, - "snoopy": true, - "soccer": true, - "sophie": true, - "spanky": true, - "sparky": true, - "spider": true, - "squirt": true, - "srinivas": true, - "startrek": true, - "starwars": true, - "steelers": true, - "steven": true, - "sticky": true, - "stupid": true, - "success": true, - "suckit": true, - "summer": true, - "sunshine": true, - "superman": true, - "surfer": true, - "swimming": true, - "sydney": true, - "tequiero": true, - "taylor": true, - "tennis": true, - "teresa": true, - "tester": true, - "testing": true, - "theman": true, - "thomas": true, - "thunder": true, - "thx1138": true, - "tiffany": true, - "tigers": true, - "tigger": true, - "tomcat": true, - "topgun": true, - "toyota": true, - "travis": true, - "trouble": true, - "trustno1": true, - "tucker": true, - "turtle": true, - "twitter": true, - "united": true, - "vagina": true, - "victor": true, - "victoria": true, - "viking": true, - "voodoo": true, - "voyager": true, - "walter": true, - "warrior": true, - "welcome": true, - "whatever": true, - "william": true, - "willie": true, - "wilson": true, - "winner": true, - "winston": true, - "winter": true, - "wizard": true, - "xavier": true, - "xxxxxx": true, - "xxxxxxxx": true, - "yamaha": true, - "yankee": true, - "yankees": true, - "yellow": true, - "zxcvbn": true, - "zxcvbnm": true, - "zzzzzz": true, -} diff --git a/internal/validate/validate.go b/internal/validate/validate.go index a64360bc7a..6752be4740 100644 --- a/internal/validate/validate.go +++ b/internal/validate/validate.go @@ -19,16 +19,12 @@ import ( "errors" "fmt" "net/url" - "os" - "regexp" "strings" "github.com/mongodb/mongodb-atlas-cli/mongocli/v2/internal/config" "github.com/mongodb/mongodb-atlas-cli/mongocli/v2/internal/search" ) -const minPasswordLength = 10 - // toString tries to cast an interface to string. func toString(val interface{}) (string, error) { var u string @@ -150,14 +146,6 @@ To log out, run: %s auth logout`, ) } -func Token() error { - if t, err := config.Token(); t != nil { - return err - } - - return ErrMissingCredentials -} - func FlagInSlice(value, flag string, validValues []string) error { if search.StringInSlice(validValues, value) { return nil @@ -165,79 +153,3 @@ func FlagInSlice(value, flag string, validValues []string) error { return fmt.Errorf(`invalid value for "%s", allowed values: "%s"`, flag, strings.Join(validValues, `", "`)) } - -var ErrInvalidPath = errors.New("invalid path") - -func Path(val interface{}) error { - path, ok := val.(string) - if !ok { - return fmt.Errorf("%w: %v", ErrInvalidPath, val) - } - - if _, err := os.Stat(path); err != nil { - return fmt.Errorf("%w: %s", ErrInvalidPath, path) - } - - return nil -} - -func OptionalPath(val interface{}) error { - if val == nil { - return nil - } - s, err := toString(val) - if err != nil || s == "" { - return err - } - return Path(val) -} - -var ErrInvalidClusterName = errors.New("invalid cluster name") - -func ClusterName(val interface{}) error { - name, ok := val.(string) - if !ok { - return fmt.Errorf("%w: %v", ErrInvalidClusterName, val) - } - match, _ := regexp.MatchString("^[a-zA-Z0-9][a-zA-Z0-9-]*$", name) - if match { - return nil - } - - return fmt.Errorf("%w. Cluster names can only contain ASCII letters, numbers, and hyphens: %s", ErrInvalidClusterName, name) -} - -var ErrInvalidDBUsername = errors.New("invalid db username") - -func DBUsername(val interface{}) error { - name, ok := val.(string) - if !ok { - return fmt.Errorf("%w: %v", ErrInvalidDBUsername, val) - } - match, _ := regexp.MatchString("^[a-zA-Z0-9]+[a-zA-Z0-9-_]*$", name) - if match { - return nil - } - - return fmt.Errorf("%w: %s", ErrInvalidDBUsername, name) -} - -var ErrWeakPassword = errors.New("the password provided is too common") -var ErrShortPassword = errors.New("the password provided is too short") - -func WeakPassword(val interface{}) error { - password, ok := val.(string) - if !ok { - return ErrWeakPassword - } - - if len(password) < minPasswordLength { - return fmt.Errorf("%w min: %d", ErrShortPassword, minPasswordLength) - } - - if commonPasswords[strings.ToLower(password)] { - return ErrWeakPassword - } - - return nil -} diff --git a/internal/validate/validate_test.go b/internal/validate/validate_test.go index 17adf63c97..3c7cef8a19 100644 --- a/internal/validate/validate_test.go +++ b/internal/validate/validate_test.go @@ -17,7 +17,6 @@ package validate import ( - "os" "testing" "github.com/spf13/viper" @@ -308,214 +307,3 @@ func TestOptionalURL(t *testing.T) { }) } } - -func TestPath(t *testing.T) { - f, err := os.CreateTemp("", "sample") - if err != nil { - t.Fatal(err) - } - t.Cleanup(func() { - os.Remove(f.Name()) - }) - - tests := []struct { - name string - val interface{} - wantErr bool - }{ - { - name: "valid", - val: f.Name(), - wantErr: false, - }, - { - name: "empty", - val: "", - wantErr: true, - }, - { - name: "nil", - val: nil, - wantErr: true, - }, - { - name: "invalid value", - val: 1, - wantErr: true, - }, - } - for _, tt := range tests { - val := tt.val - wantErr := tt.wantErr - t.Run(tt.name, func(t *testing.T) { - if err2 := Path(val); (err2 != nil) != wantErr { - t.Errorf("Path() error = %v, wantErr %v", err2, wantErr) - } - }) - } -} - -func TestOptionalPath(t *testing.T) { - f, err := os.CreateTemp("", "sample") - if err != nil { - t.Fatal(err) - } - t.Cleanup(func() { - os.Remove(f.Name()) - }) - - tests := []struct { - name string - val interface{} - wantErr bool - }{ - { - name: "valid", - val: f.Name(), - wantErr: false, - }, - { - name: "empty", - val: "", - wantErr: false, - }, - { - name: "nil", - val: nil, - wantErr: false, - }, - { - name: "invalid value", - val: 1, - wantErr: true, - }, - } - for _, tt := range tests { - val := tt.val - wantErr := tt.wantErr - t.Run(tt.name, func(t *testing.T) { - if err2 := OptionalPath(val); (err2 != nil) != wantErr { - t.Errorf("OptionalPath() error = %v, wantErr %v", err2, wantErr) - } - }) - } -} - -func TestClusterName(t *testing.T) { - tests := []struct { - name string - val interface{} - wantErr bool - }{ - { - name: "valid (single word)", - val: "Cluster0", - wantErr: false, - }, - { - name: "valid (dashed)", - val: "Cluster-0", - wantErr: false, - }, - { - name: "invalid (space)", - val: "Cluster 0", - wantErr: true, - }, - { - name: "invalid (underscore)", - val: "Cluster_0", - wantErr: true, - }, - { - name: "invalid (spacial char)", - val: "Cluster-ñ", - wantErr: true, - }, - } - for _, tt := range tests { - val := tt.val - wantErr := tt.wantErr - t.Run(tt.name, func(t *testing.T) { - if err := ClusterName(val); (err != nil) != wantErr { - t.Errorf("ClusterName() error = %v, wantErr %v", err, wantErr) - } - }) - } -} - -func TestDBUsername(t *testing.T) { - tests := []struct { - name string - val interface{} - wantErr bool - }{ - { - name: "valid (single word)", - val: "admin", - wantErr: false, - }, - { - name: "valid (dashed)", - val: "admin-test", - wantErr: false, - }, - { - name: "valid (underscore)", - val: "admin_test", - wantErr: false, - }, - { - name: "invalid (space)", - val: "admin test", - wantErr: true, - }, - { - name: "invalid (spacial char)", - val: "admin-ñ", - wantErr: true, - }, - } - for _, tt := range tests { - val := tt.val - wantErr := tt.wantErr - t.Run(tt.name, func(t *testing.T) { - if err := DBUsername(val); (err != nil) != wantErr { - t.Errorf("DBUsername() error = %v, wantErr %v", err, wantErr) - } - }) - } -} - -func TestWeakPassword(t *testing.T) { - tests := []struct { - name string - val interface{} - wantErr bool - }{ - { - name: "valid password", - val: "password!@3!", - wantErr: false, - }, - { - name: "weak password", - val: "password", - wantErr: true, - }, - { - name: "weak password", - val: "password1", - wantErr: true, - }, - } - for _, tt := range tests { - val := tt.val - wantErr := tt.wantErr - t.Run(tt.name, func(t *testing.T) { - if err := WeakPassword(val); (err != nil) != wantErr { - t.Errorf("WeakPassword() error = %v, wantErr %v", err, wantErr) - } - }) - } -} From a84397dd6ce6afe8d4337167536e2efb7d7a7728 Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Tue, 12 Mar 2024 11:42:43 +0000 Subject: [PATCH 2/2] errors --- internal/cli/errors.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/internal/cli/errors.go b/internal/cli/errors.go index 73e29fef3e..8eb275d08b 100644 --- a/internal/cli/errors.go +++ b/internal/cli/errors.go @@ -15,7 +15,6 @@ package cli import ( - "errors" "fmt" "github.com/mongodb/mongodb-atlas-cli/mongocli/v2/internal/flag" @@ -25,6 +24,3 @@ const requiredF = `required flag(s) "%s" not set` var errMissingProjectID = fmt.Errorf(requiredF, flag.ProjectID) var ErrMissingOrgID = fmt.Errorf(requiredF, flag.OrgID) -var ErrFreeClusterAlreadyExists = errors.New("this project already has another free cluster. To learn how to create non-free clusters, run \"atlas cluster create --help\"") -var ErrNoRegionExistsTryCommand = errors.New(`the region does not exist. To find the available regions, run "atlas cluster availableRegions list"`) -var ErrNameExists = errors.New(`the name already exists. Please run "atlas cluster list" to review existing cluster names`)