github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/migration/migrations/1516643303_update_auth_providers.up.go (about)

     1  package migrations
     2  
     3  import (
     4  	"database/sql"
     5  	"encoding/json"
     6  )
     7  
     8  func (self *migrations) Up_1516643303() error {
     9  
    10  	type team struct {
    11  		id        int64
    12  		basicAuth []byte
    13  		auth      []byte
    14  		nonce     sql.NullString
    15  	}
    16  
    17  	tx, err := self.DB.Begin()
    18  	if err != nil {
    19  		return err
    20  	}
    21  
    22  	rows, err := tx.Query("SELECT id, basic_auth, auth, nonce FROM teams")
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	teams := []team{}
    28  
    29  	for rows.Next() {
    30  		team := team{}
    31  
    32  		if err = rows.Scan(&team.id, &team.basicAuth, &team.auth, &team.nonce); err != nil {
    33  			return err
    34  		}
    35  
    36  		teams = append(teams, team)
    37  	}
    38  
    39  	for _, team := range teams {
    40  
    41  		var noncense *string
    42  		if team.nonce.Valid {
    43  			noncense = &team.nonce.String
    44  		}
    45  
    46  		decryptedAuth, err := self.Strategy.Decrypt(string(team.auth), noncense)
    47  		if err != nil {
    48  			tx.Rollback()
    49  			return err
    50  		}
    51  
    52  		var authConfig map[string]interface{}
    53  		json.Unmarshal(decryptedAuth, &authConfig)
    54  
    55  		if authConfig == nil {
    56  			authConfig = map[string]interface{}{}
    57  		}
    58  
    59  		var basicAuthConfig map[string]string
    60  		json.Unmarshal(team.basicAuth, &basicAuthConfig)
    61  
    62  		if basicAuthConfig == nil {
    63  			basicAuthConfig = map[string]string{}
    64  		}
    65  
    66  		username := basicAuthConfig["basic_auth_username"]
    67  		password := basicAuthConfig["basic_auth_password"]
    68  
    69  		if username != "" && password != "" {
    70  			authConfig["basicauth"] = map[string]string{
    71  				"username": username,
    72  				"password": password,
    73  			}
    74  		}
    75  
    76  		if len(authConfig) == 0 {
    77  			authConfig["noauth"] = map[string]bool{
    78  				"noauth": true,
    79  			}
    80  		}
    81  
    82  		newAuth, err := json.Marshal(authConfig)
    83  		if err != nil {
    84  			return rollback(tx, err)
    85  		}
    86  
    87  		encryptedAuth, noncense, err := self.Strategy.Encrypt(newAuth)
    88  		if err != nil {
    89  			return rollback(tx, err)
    90  		}
    91  
    92  		_, err = tx.Exec("UPDATE teams SET auth = $1, nonce = $2 WHERE id = $3", encryptedAuth, noncense, team.id)
    93  		if err != nil {
    94  			return rollback(tx, err)
    95  		}
    96  	}
    97  
    98  	_, err = tx.Exec("ALTER TABLE teams DROP COLUMN IF EXISTS basic_auth")
    99  	if err != nil {
   100  		return rollback(tx, err)
   101  	}
   102  
   103  	err = tx.Commit()
   104  	if err != nil {
   105  		return rollback(tx, err)
   106  	}
   107  
   108  	return nil
   109  }