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  }