@@ -19,14 +19,19 @@ package scm
1919import (
2020 "context"
2121 "fmt"
22+ "net/http"
23+ "strings"
24+
2225 "github.com/emicklei/go-restful/v3"
26+ gogit "github.com/go-git/go-git/v5"
27+ "github.com/go-git/go-git/v5/config"
28+ "github.com/go-git/go-git/v5/storage/memory"
2329 goscm "github.com/jenkins-x/go-scm/scm"
2430 "github.com/kubesphere/ks-devops/pkg/client/git"
2531 "github.com/kubesphere/ks-devops/pkg/kapis"
2632 "github.com/kubesphere/ks-devops/pkg/kapis/common"
2733 v1 "k8s.io/api/core/v1"
2834 "sigs.k8s.io/controller-runtime/pkg/client"
29- "strings"
3035)
3136
3237// handler holds all the API handlers of SCM
@@ -48,14 +53,58 @@ func (h *handler) verify(request *restful.Request, response *restful.Response) {
4853 secretNamespace := request .QueryParameter ("secretNamespace" )
4954 server := common .GetQueryParameter (request , queryParameterServer )
5055
51- _ , code , err := h .getOrganizations (scm , server , secretName , secretNamespace , 1 , 1 , false )
56+ code , err := 0 , error (nil )
57+ switch scm {
58+ case "git" :
59+ if server == "" {
60+ err := fmt .Errorf ("server is required" )
61+ kapis .HandleError (request , response , err )
62+ response .WriteHeaderAndEntity (http .StatusBadRequest , err )
63+ return
64+ }
65+ code , err = h .checkRepoAccess (server , secretName , secretNamespace )
66+
67+ default :
68+ _ , code , err = h .getOrganizations (scm , server , secretName , secretNamespace , 1 , 1 , false )
69+ }
5270
5371 response .Header ().Set (restful .HEADER_ContentType , restful .MIME_JSON )
5472 verifyResult := git .VerifyResult (err , code )
5573 verifyResult .CredentialID = secretName
5674 _ = response .WriteAsJson (verifyResult )
5775}
5876
77+ func (h * handler ) checkRepoAccess (repourl , secretName , secretNamespace string ) (int , error ) {
78+ storage := memory .NewStorage ()
79+ remote := gogit .NewRemote (storage , & config.RemoteConfig {
80+ Name : "origin" ,
81+ URLs : []string {repourl },
82+ })
83+
84+ listOption := & gogit.ListOptions {}
85+ if secretName != "" && secretNamespace != "" {
86+ factory := git .NewClientFactory ("git" , & v1.SecretReference {
87+ Namespace : secretNamespace , Name : secretName ,
88+ }, h .Client )
89+ token , user , privateKey , err := factory .GetTokenFromSecret (& v1.SecretReference {Namespace : secretNamespace , Name : secretName })
90+ if err != nil {
91+ return http .StatusInternalServerError , err
92+ }
93+
94+ listOption .Auth , err = getAuthMethod (repourl , user , token , privateKey )
95+ if err != nil {
96+ return http .StatusBadRequest , err
97+ }
98+ }
99+
100+ _ , err := remote .List (listOption )
101+ if err != nil {
102+ return http .StatusForbidden , fmt .Errorf ("access verification failed: %v" , err )
103+ }
104+
105+ return http .StatusOK , nil
106+ }
107+
59108func (h * handler ) getOrganizations (scm , server , secret , namespace string , page , size int , includeUser bool ) (orgs []* goscm.Organization , code int , err error ) {
60109 factory := git .NewClientFactory (scm , & v1.SecretReference {
61110 Namespace : namespace , Name : secret ,
0 commit comments