github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/migration/migrations/1516643303_update_auth_providers.down.go (about) 1 package migrations 2 3 import ( 4 "database/sql" 5 "encoding/json" 6 "errors" 7 8 "github.com/hashicorp/go-multierror" 9 ) 10 11 func (self *migrations) Down_1516643303() error { 12 13 type team struct { 14 id int64 15 auth []byte 16 nonce sql.NullString 17 } 18 19 tx, err := self.DB.Begin() 20 if err != nil { 21 return err 22 } 23 24 rows, err := tx.Query("SELECT id, auth, nonce FROM teams") 25 if err != nil { 26 return err 27 } 28 29 teams := []team{} 30 31 for rows.Next() { 32 team := team{} 33 34 if err = rows.Scan(&team.id, &team.auth, &team.nonce); err != nil { 35 return err 36 } 37 38 teams = append(teams, team) 39 } 40 41 _, err = tx.Exec("ALTER TABLE teams ADD COLUMN basic_auth json") 42 if err != nil { 43 return rollback(tx, err) 44 } 45 46 for _, team := range teams { 47 48 var noncense *string 49 if team.nonce.Valid { 50 noncense = &team.nonce.String 51 } 52 53 decryptedAuth, err := self.Strategy.Decrypt(string(team.auth), noncense) 54 if err != nil { 55 return rollback(tx, err) 56 } 57 58 var authConfig map[string]interface{} 59 err = json.Unmarshal(decryptedAuth, &authConfig) 60 if err != nil { 61 return rollback(tx, err) 62 } 63 64 var basicAuthConfig map[string]string 65 66 if config, ok := authConfig["basicauth"]; ok { 67 if configMap, ok := config.(map[string]interface{}); ok { 68 basicAuthConfig = map[string]string{} 69 basicAuthConfig["basic_auth_username"] = configMap["username"].(string) 70 basicAuthConfig["basic_auth_password"] = configMap["password"].(string) 71 } else { 72 rollback(tx, errors.New("malformed basicauth provider")) 73 } 74 } 75 76 delete(authConfig, "noauth") 77 delete(authConfig, "basicauth") 78 79 newAuth, err := json.Marshal(authConfig) 80 if err != nil { 81 return err 82 } 83 84 newBasicAuth, err := json.Marshal(basicAuthConfig) 85 if err != nil { 86 rollback(tx, err) 87 return err 88 } 89 90 encryptedAuth, noncense, err := self.Strategy.Encrypt(newAuth) 91 if err != nil { 92 rollback(tx, err) 93 return err 94 } 95 96 _, err = tx.Exec("UPDATE teams SET basic_auth = $1, auth = $2, nonce = $3 WHERE id = $4", newBasicAuth, encryptedAuth, noncense, team.id) 97 if err != nil { 98 return rollback(tx, err) 99 } 100 } 101 102 err = tx.Commit() 103 if err != nil { 104 return rollback(tx, err) 105 } 106 107 return nil 108 } 109 110 func rollback(tx *sql.Tx, err error) error { 111 txErr := tx.Rollback() 112 if txErr != nil { 113 err = multierror.Append(err, txErr) 114 } 115 return err 116 }