Skip to content

Commit ab62f66

Browse files
authored
refactor(api,cdsctl): remove group and project permission import (#6068)
1 parent 73a1333 commit ab62f66

16 files changed

+174
-752
lines changed

cli/cdsctl/group.go

-52
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import (
88

99
"github.com/ovh/cds/cli"
1010
"github.com/ovh/cds/sdk"
11-
"github.com/ovh/cds/sdk/cdsclient"
12-
"github.com/ovh/cds/sdk/exportentities"
1311
)
1412

1513
var groupCmd = cli.Command{
@@ -27,8 +25,6 @@ func group() *cobra.Command {
2725
cli.NewDeleteCommand(groupDeleteCmd, groupDeleteRun, nil, withAllCommandModifiers()...),
2826
cli.NewCommand(groupGrantCmd, groupGrantRun, nil, withAllCommandModifiers()...),
2927
cli.NewCommand(groupRevokeCmd, groupRevokeRun, nil, withAllCommandModifiers()...),
30-
cli.NewCommand(groupExportCmd, groupExportRun, nil, withAllCommandModifiers()...),
31-
cli.NewCommand(groupImportCmd, groupImportRun, nil, withAllCommandModifiers()...),
3228
groupMember(),
3329
})
3430
}
@@ -206,51 +202,3 @@ func groupRevokeRun(v cli.Values) error {
206202

207203
return nil
208204
}
209-
210-
var groupExportCmd = cli.Command{
211-
Name: "export",
212-
Short: "Export a CDS group",
213-
Args: []cli.Arg{
214-
{
215-
Name: "group-name",
216-
},
217-
},
218-
Flags: []cli.Flag{
219-
{
220-
Name: "format",
221-
Usage: "Specify export format (json or yaml)",
222-
Default: "yaml",
223-
},
224-
},
225-
}
226-
227-
func groupExportRun(v cli.Values) error {
228-
buf, err := client.GroupExport(v.GetString("group-name"), cdsclient.Format(v.GetString("format")))
229-
if err != nil {
230-
return err
231-
}
232-
fmt.Println(string(buf))
233-
return nil
234-
}
235-
236-
var groupImportCmd = cli.Command{
237-
Name: "import",
238-
Short: "Import a group",
239-
Args: []cli.Arg{
240-
{Name: "path"},
241-
},
242-
}
243-
244-
func groupImportRun(c cli.Values) error {
245-
path := c.GetString("path")
246-
contentFile, format, err := exportentities.OpenPath(path)
247-
if err != nil {
248-
return err
249-
}
250-
defer contentFile.Close() //nolint
251-
if _, err := client.GroupImport(contentFile, cdsclient.ContentType(format.ContentType())); err != nil {
252-
return err
253-
}
254-
fmt.Println("Group imported.")
255-
return nil
256-
}

cli/cdsctl/project.go

-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ func projectCommands() []*cobra.Command {
2727
cli.NewDeleteCommand(projectDeleteCmd, projectDeleteRun, nil, withAllCommandModifiers()...),
2828
cli.NewCommand(projectFavoriteCmd, projectFavoriteRun, nil, withAllCommandModifiers()...),
2929
projectKey(),
30-
projectGroup(),
3130
projectVariable(),
3231
projectIntegration(),
3332
projectRepositoryManager(),

cli/cdsctl/project_group.go

-85
This file was deleted.

engine/api/api_routes.go

-3
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ func (api *API) InitRouter() {
117117

118118
// Group
119119
r.Handle("/group", Scope(sdk.AuthConsumerScopeGroup), r.GET(api.getGroupsHandler), r.POST(api.postGroupHandler))
120-
r.Handle("/group/import", Scope(sdk.AuthConsumerScopeGroup), r.POST(api.postGroupImportHandler))
121120
r.Handle("/group/{permGroupName}", Scope(sdk.AuthConsumerScopeGroup), r.GET(api.getGroupHandler), r.PUT(api.putGroupHandler), r.DELETE(api.deleteGroupHandler))
122-
r.Handle("/group/{permGroupName}/export", Scope(sdk.AuthConsumerScopeGroup), r.GET(api.getGroupExportHandler))
123121
r.Handle("/group/{permGroupName}/user", Scope(sdk.AuthConsumerScopeGroup), r.POST(api.postGroupUserHandler))
124122
r.Handle("/group/{permGroupName}/user/{username}", Scope(sdk.AuthConsumerScopeGroup), r.PUT(api.putGroupUserHandler), r.DELETE(api.deleteGroupUserHandler))
125123
r.Handle("/group/{permGroupName}/project", Scope(sdk.AuthConsumerScopeGroup), r.GET(api.getProjectGroupHandler))
@@ -162,7 +160,6 @@ func (api *API) InitRouter() {
162160
r.Handle("/project/{permProjectKey}", Scope(sdk.AuthConsumerScopeProject), r.GET(api.getProjectHandler), r.PUT(api.updateProjectHandler), r.DELETE(api.deleteProjectHandler))
163161
r.Handle("/project/{permProjectKey}/labels", Scope(sdk.AuthConsumerScopeProject), r.PUT(api.putProjectLabelsHandler))
164162
r.Handle("/project/{permProjectKey}/group", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postGroupInProjectHandler))
165-
r.Handle("/project/{permProjectKey}/group/import", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postImportGroupsInProjectHandler))
166163
r.Handle("/project/{permProjectKey}/group/{groupName}", Scope(sdk.AuthConsumerScopeProject), r.PUT(api.putGroupRoleOnProjectHandler), r.DELETE(api.deleteGroupFromProjectHandler))
167164
r.Handle("/project/{permProjectKey}/variable", Scope(sdk.AuthConsumerScopeProject), r.GET(api.getVariablesInProjectHandler))
168165
r.Handle("/project/{permProjectKey}/encrypt", Scope(sdk.AuthConsumerScopeProject), r.POST(api.postEncryptVariableHandler), r.DELETE(api.deleteEncryptVariableHandler))

engine/api/group.go

-165
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package api
22

33
import (
44
"context"
5-
"io/ioutil"
65
"net/http"
76

87
"github.com/gorilla/mux"
@@ -14,7 +13,6 @@ import (
1413
"github.com/ovh/cds/engine/api/user"
1514
"github.com/ovh/cds/engine/service"
1615
"github.com/ovh/cds/sdk"
17-
"github.com/ovh/cds/sdk/exportentities"
1816
)
1917

2018
func (api *API) getGroupsHandler() service.Handler {
@@ -78,40 +76,6 @@ func (api *API) getGroupHandler() service.Handler {
7876
}
7977
}
8078

81-
func (api *API) getGroupExportHandler() service.Handler {
82-
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
83-
vars := mux.Vars(r)
84-
85-
groupName := vars["permGroupName"]
86-
87-
format := FormString(r, "format")
88-
if format == "" {
89-
format = "yaml"
90-
}
91-
f, err := exportentities.GetFormat(format)
92-
if err != nil {
93-
return err
94-
}
95-
96-
g, err := group.LoadByName(ctx, api.mustDB(), groupName, group.LoadOptions.Default)
97-
if err != nil {
98-
return err
99-
}
100-
101-
b, err := exportentities.Marshal(g, f)
102-
if err != nil {
103-
return err
104-
}
105-
106-
if _, err := w.Write(b); err != nil {
107-
return sdk.WithStack(err)
108-
}
109-
110-
w.Header().Add("Content-Type", f.ContentType())
111-
return nil
112-
}
113-
}
114-
11579
func (api *API) postGroupHandler() service.Handler {
11680
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
11781
var newGroup sdk.Group
@@ -493,132 +457,3 @@ func (api *API) deleteGroupUserHandler() service.Handler {
493457
return service.WriteJSON(w, g, http.StatusOK)
494458
}
495459
}
496-
497-
func (api *API) postGroupImportHandler() service.Handler {
498-
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
499-
body, err := ioutil.ReadAll(r.Body)
500-
if err != nil {
501-
return sdk.NewErrorWithStack(err, sdk.NewErrorFrom(sdk.ErrWrongRequest, "unable to read body"))
502-
}
503-
504-
contentType := r.Header.Get("Content-Type")
505-
if contentType == "" {
506-
contentType = http.DetectContentType(body)
507-
}
508-
format, err := exportentities.GetFormatFromContentType(contentType)
509-
if err != nil {
510-
return err
511-
}
512-
513-
var data sdk.Group
514-
if err := exportentities.Unmarshal(body, format, &data); err != nil {
515-
return err
516-
}
517-
if err := data.IsValid(); err != nil {
518-
return err
519-
}
520-
if err := data.Members.IsValid(); err != nil {
521-
return err
522-
}
523-
524-
tx, err := api.mustDB().Begin()
525-
if err != nil {
526-
return sdk.WrapError(err, "cannot start transaction")
527-
}
528-
defer tx.Rollback() // nolint
529-
530-
oldGroup, err := group.LoadByName(ctx, tx, data.Name,
531-
group.LoadOptions.WithMembers,
532-
group.LoadOptions.WithOrganization,
533-
)
534-
if err != nil && !sdk.ErrorIs(err, sdk.ErrNotFound) {
535-
return sdk.WrapError(err, "cannot load group: %s", data.Name)
536-
}
537-
if oldGroup != nil {
538-
if !isGroupAdmin(ctx, oldGroup) {
539-
if isAdmin(ctx) {
540-
trackSudo(ctx, w)
541-
} else {
542-
return sdk.WithStack(sdk.ErrForbidden)
543-
}
544-
}
545-
}
546-
547-
// Add user data and validate members
548-
for i := range data.Members {
549-
var u *sdk.AuthentifiedUser
550-
if data.Members[i].ID != "" {
551-
u, err = user.LoadByID(ctx, tx, data.Members[i].ID)
552-
} else {
553-
u, err = user.LoadByUsername(ctx, tx, data.Members[i].Username)
554-
}
555-
if err != nil {
556-
return err
557-
}
558-
data.Members[i].ID = u.ID
559-
}
560-
561-
if err := group.Upsert(ctx, tx, oldGroup, &data); err != nil {
562-
return sdk.WrapError(err, "cannot update group with id: %d", data.ID)
563-
}
564-
565-
// Check that user's Organization match group Organization
566-
if err := group.EnsureOrganization(ctx, tx, &data); err != nil {
567-
return err
568-
}
569-
570-
if oldGroup != nil {
571-
// Remove the group from consumers for removed users
572-
removedUserIDs := oldGroup.Members.DiffUserIDs(data.Members)
573-
for i := range removedUserIDs {
574-
u, err := user.LoadByID(ctx, tx, removedUserIDs[i])
575-
if err != nil {
576-
return err
577-
}
578-
if err := authentication.ConsumerInvalidateGroupForUser(ctx, tx, &data, u); err != nil {
579-
return err
580-
}
581-
}
582-
583-
// Restore group on consumers for added users
584-
addedUserIDs := data.Members.DiffUserIDs(oldGroup.Members)
585-
for i := range addedUserIDs {
586-
if err := authentication.ConsumerRestoreInvalidatedGroupForUser(ctx, tx, data.ID, addedUserIDs[i]); err != nil {
587-
return err
588-
}
589-
}
590-
}
591-
592-
if err := tx.Commit(); err != nil {
593-
return sdk.WithStack(err)
594-
}
595-
596-
// In case where the user remove himself from group, do not return it
597-
consumer := getAPIConsumer(ctx)
598-
for i := range data.Members {
599-
var found bool
600-
if data.Members[i].ID == consumer.AuthentifiedUser.ID {
601-
found = true
602-
break
603-
}
604-
if !found {
605-
return service.WriteJSON(w, nil, http.StatusOK)
606-
}
607-
}
608-
609-
// Load extra data for group
610-
if err := group.LoadOptions.Default(ctx, api.mustDB(), &data); err != nil {
611-
return err
612-
}
613-
614-
b, err := exportentities.Marshal(data, format)
615-
if err != nil {
616-
return err
617-
}
618-
if _, err := w.Write(b); err != nil {
619-
return sdk.WithStack(err)
620-
}
621-
w.Header().Add("Content-Type", format.ContentType())
622-
return nil
623-
}
624-
}

0 commit comments

Comments
 (0)