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 }