2021-05-31 11:25:47 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-05-31 11:25:47 +03:00
2022-11-02 11:54:36 +03:00
package v1_15 //nolint
2021-05-31 11:25:47 +03:00
import (
2021-07-24 19:03:58 +03:00
"code.gitea.io/gitea/modules/json"
2021-05-31 11:25:47 +03:00
"code.gitea.io/gitea/modules/util"
"xorm.io/builder"
"xorm.io/xorm"
)
2022-11-02 11:54:36 +03:00
func DeleteMigrationCredentials ( x * xorm . Engine ) ( err error ) {
2021-06-14 22:07:49 +03:00
// Task represents a task
type Task struct {
ID int64
DoerID int64 ` xorm:"index" ` // operator
OwnerID int64 ` xorm:"index" ` // repo owner id, when creating, the repoID maybe zero
RepoID int64 ` xorm:"index" `
Type int
Status int ` xorm:"index" `
StartTime int64
EndTime int64
PayloadContent string ` xorm:"TEXT" `
Errors string ` xorm:"TEXT" ` // if task failed, saved the error reason
Created int64 ` xorm:"created" `
}
const TaskTypeMigrateRepo = 0
const TaskStatusStopped = 2
2021-05-31 11:25:47 +03:00
const batchSize = 100
// only match migration tasks, that are not pending or running
cond := builder . Eq {
2021-06-14 22:07:49 +03:00
"type" : TaskTypeMigrateRepo ,
2021-05-31 11:25:47 +03:00
} . And ( builder . Gte {
2021-06-14 22:07:49 +03:00
"status" : TaskStatusStopped ,
2021-05-31 11:25:47 +03:00
} )
sess := x . NewSession ( )
defer sess . Close ( )
for start := 0 ; ; start += batchSize {
2021-06-14 22:07:49 +03:00
tasks := make ( [ ] * Task , 0 , batchSize )
2023-07-07 08:31:56 +03:00
if err := sess . Limit ( batchSize , start ) . Where ( cond , 0 ) . Find ( & tasks ) ; err != nil {
return err
2021-05-31 11:25:47 +03:00
}
if len ( tasks ) == 0 {
break
}
2023-07-07 08:31:56 +03:00
if err := sess . Begin ( ) ; err != nil {
return err
2021-05-31 11:25:47 +03:00
}
for _ , t := range tasks {
if t . PayloadContent , err = removeCredentials ( t . PayloadContent ) ; err != nil {
2023-07-07 08:31:56 +03:00
return err
2021-05-31 11:25:47 +03:00
}
2023-07-07 08:31:56 +03:00
if _ , err := sess . ID ( t . ID ) . Cols ( "payload_content" ) . Update ( t ) ; err != nil {
return err
2021-05-31 11:25:47 +03:00
}
}
2023-07-07 08:31:56 +03:00
if err := sess . Commit ( ) ; err != nil {
return err
2021-05-31 11:25:47 +03:00
}
}
2022-06-20 13:02:49 +03:00
return err
2021-05-31 11:25:47 +03:00
}
func removeCredentials ( payload string ) ( string , error ) {
2021-06-14 22:07:49 +03:00
// MigrateOptions defines the way a repository gets migrated
// this is for internal usage by migrations module and func who interact with it
type MigrateOptions struct {
// required: true
CloneAddr string ` json:"clone_addr" binding:"Required" `
CloneAddrEncrypted string ` json:"clone_addr_encrypted,omitempty" `
AuthUsername string ` json:"auth_username" `
AuthPassword string ` json:"-" `
AuthPasswordEncrypted string ` json:"auth_password_encrypted,omitempty" `
AuthToken string ` json:"-" `
AuthTokenEncrypted string ` json:"auth_token_encrypted,omitempty" `
// required: true
UID int ` json:"uid" binding:"Required" `
// required: true
RepoName string ` json:"repo_name" binding:"Required" `
Mirror bool ` json:"mirror" `
LFS bool ` json:"lfs" `
LFSEndpoint string ` json:"lfs_endpoint" `
Private bool ` json:"private" `
Description string ` json:"description" `
OriginalURL string
GitServiceType int
Wiki bool
Issues bool
Milestones bool
Labels bool
Releases bool
Comments bool
PullRequests bool
ReleaseAssets bool
MigrateToRepoID int64
MirrorInterval string ` json:"mirror_interval" `
}
var opts MigrateOptions
2021-05-31 11:25:47 +03:00
err := json . Unmarshal ( [ ] byte ( payload ) , & opts )
if err != nil {
return "" , err
}
opts . AuthPassword = ""
opts . AuthToken = ""
2022-03-31 05:25:40 +03:00
opts . CloneAddr = util . SanitizeCredentialURLs ( opts . CloneAddr )
2021-05-31 11:25:47 +03:00
confBytes , err := json . Marshal ( opts )
if err != nil {
return "" , err
}
return string ( confBytes ) , nil
}