code.gitea.io/gitea@v1.21.7/models/migrations/v1_15/v180.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package v1_15 //nolint
     5  
     6  import (
     7  	"code.gitea.io/gitea/modules/json"
     8  	"code.gitea.io/gitea/modules/util"
     9  
    10  	"xorm.io/builder"
    11  	"xorm.io/xorm"
    12  )
    13  
    14  func DeleteMigrationCredentials(x *xorm.Engine) (err error) {
    15  	// Task represents a task
    16  	type Task struct {
    17  		ID             int64
    18  		DoerID         int64 `xorm:"index"` // operator
    19  		OwnerID        int64 `xorm:"index"` // repo owner id, when creating, the repoID maybe zero
    20  		RepoID         int64 `xorm:"index"`
    21  		Type           int
    22  		Status         int `xorm:"index"`
    23  		StartTime      int64
    24  		EndTime        int64
    25  		PayloadContent string `xorm:"TEXT"`
    26  		Errors         string `xorm:"TEXT"` // if task failed, saved the error reason
    27  		Created        int64  `xorm:"created"`
    28  	}
    29  
    30  	const TaskTypeMigrateRepo = 0
    31  	const TaskStatusStopped = 2
    32  
    33  	const batchSize = 100
    34  
    35  	// only match migration tasks, that are not pending or running
    36  	cond := builder.Eq{
    37  		"type": TaskTypeMigrateRepo,
    38  	}.And(builder.Gte{
    39  		"status": TaskStatusStopped,
    40  	})
    41  
    42  	sess := x.NewSession()
    43  	defer sess.Close()
    44  
    45  	for start := 0; ; start += batchSize {
    46  		tasks := make([]*Task, 0, batchSize)
    47  		if err := sess.Limit(batchSize, start).Where(cond, 0).Find(&tasks); err != nil {
    48  			return err
    49  		}
    50  		if len(tasks) == 0 {
    51  			break
    52  		}
    53  		if err := sess.Begin(); err != nil {
    54  			return err
    55  		}
    56  		for _, t := range tasks {
    57  			if t.PayloadContent, err = removeCredentials(t.PayloadContent); err != nil {
    58  				return err
    59  			}
    60  			if _, err := sess.ID(t.ID).Cols("payload_content").Update(t); err != nil {
    61  				return err
    62  			}
    63  		}
    64  		if err := sess.Commit(); err != nil {
    65  			return err
    66  		}
    67  	}
    68  	return err
    69  }
    70  
    71  func removeCredentials(payload string) (string, error) {
    72  	// MigrateOptions defines the way a repository gets migrated
    73  	// this is for internal usage by migrations module and func who interact with it
    74  	type MigrateOptions struct {
    75  		// required: true
    76  		CloneAddr             string `json:"clone_addr" binding:"Required"`
    77  		CloneAddrEncrypted    string `json:"clone_addr_encrypted,omitempty"`
    78  		AuthUsername          string `json:"auth_username"`
    79  		AuthPassword          string `json:"-"`
    80  		AuthPasswordEncrypted string `json:"auth_password_encrypted,omitempty"`
    81  		AuthToken             string `json:"-"`
    82  		AuthTokenEncrypted    string `json:"auth_token_encrypted,omitempty"`
    83  		// required: true
    84  		UID int `json:"uid" binding:"Required"`
    85  		// required: true
    86  		RepoName        string `json:"repo_name" binding:"Required"`
    87  		Mirror          bool   `json:"mirror"`
    88  		LFS             bool   `json:"lfs"`
    89  		LFSEndpoint     string `json:"lfs_endpoint"`
    90  		Private         bool   `json:"private"`
    91  		Description     string `json:"description"`
    92  		OriginalURL     string
    93  		GitServiceType  int
    94  		Wiki            bool
    95  		Issues          bool
    96  		Milestones      bool
    97  		Labels          bool
    98  		Releases        bool
    99  		Comments        bool
   100  		PullRequests    bool
   101  		ReleaseAssets   bool
   102  		MigrateToRepoID int64
   103  		MirrorInterval  string `json:"mirror_interval"`
   104  	}
   105  
   106  	var opts MigrateOptions
   107  	err := json.Unmarshal([]byte(payload), &opts)
   108  	if err != nil {
   109  		return "", err
   110  	}
   111  
   112  	opts.AuthPassword = ""
   113  	opts.AuthToken = ""
   114  	opts.CloneAddr = util.SanitizeCredentialURLs(opts.CloneAddr)
   115  
   116  	confBytes, err := json.Marshal(opts)
   117  	if err != nil {
   118  		return "", err
   119  	}
   120  	return string(confBytes), nil
   121  }