Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
a69013c8
Unverified
Commit
a69013c8
authored
Oct 11, 2018
by
Torkel Ödegaard
Committed by
GitHub
Oct 11, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #13611 from grafana/remove-user-from-org-and-system
Remove user form org in single org setup improvement
parents
69e0311c
19b69a82
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
79 additions
and
37 deletions
+79
-37
pkg/api/org_users.go
+15
-9
pkg/models/org_user.go
+4
-2
pkg/services/sqlstore/org_test.go
+15
-0
pkg/services/sqlstore/org_users.go
+25
-10
pkg/services/sqlstore/user.go
+20
-16
No files found.
pkg/api/org_users.go
View file @
a69013c8
...
...
@@ -102,26 +102,32 @@ func updateOrgUserHelper(cmd m.UpdateOrgUserCommand) Response {
// DELETE /api/org/users/:userId
func
RemoveOrgUserForCurrentOrg
(
c
*
m
.
ReqContext
)
Response
{
userID
:=
c
.
ParamsInt64
(
":userId"
)
return
removeOrgUserHelper
(
c
.
OrgId
,
userID
)
return
removeOrgUserHelper
(
&
m
.
RemoveOrgUserCommand
{
UserId
:
c
.
ParamsInt64
(
":userId"
),
OrgId
:
c
.
OrgId
,
ShouldDeleteOrphanedUser
:
true
,
})
}
// DELETE /api/orgs/:orgId/users/:userId
func
RemoveOrgUser
(
c
*
m
.
ReqContext
)
Response
{
userID
:=
c
.
ParamsInt64
(
":userId"
)
orgID
:=
c
.
ParamsInt64
(
":orgId"
)
return
removeOrgUserHelper
(
orgID
,
userID
)
return
removeOrgUserHelper
(
&
m
.
RemoveOrgUserCommand
{
UserId
:
c
.
ParamsInt64
(
":userId"
),
OrgId
:
c
.
ParamsInt64
(
":orgId"
),
})
}
func
removeOrgUserHelper
(
orgID
int64
,
userID
int64
)
Response
{
cmd
:=
m
.
RemoveOrgUserCommand
{
OrgId
:
orgID
,
UserId
:
userID
}
if
err
:=
bus
.
Dispatch
(
&
cmd
);
err
!=
nil
{
func
removeOrgUserHelper
(
cmd
*
m
.
RemoveOrgUserCommand
)
Response
{
if
err
:=
bus
.
Dispatch
(
cmd
);
err
!=
nil
{
if
err
==
m
.
ErrLastOrgAdmin
{
return
Error
(
400
,
"Cannot remove last organization admin"
,
nil
)
}
return
Error
(
500
,
"Failed to remove user from organization"
,
err
)
}
if
cmd
.
UserWasDeleted
{
return
Success
(
"User deleted"
)
}
return
Success
(
"User removed from organization"
)
}
pkg/models/org_user.go
View file @
a69013c8
...
...
@@ -72,8 +72,10 @@ type OrgUser struct {
// COMMANDS
type
RemoveOrgUserCommand
struct
{
UserId
int64
OrgId
int64
UserId
int64
OrgId
int64
ShouldDeleteOrphanedUser
bool
UserWasDeleted
bool
}
type
AddOrgUserCommand
struct
{
...
...
pkg/services/sqlstore/org_test.go
View file @
a69013c8
...
...
@@ -182,6 +182,21 @@ func TestAccountDataAccess(t *testing.T) {
})
})
Convey
(
"Removing user from org should delete user completely if in no other org"
,
func
()
{
// make sure ac2 has no org
err
:=
DeleteOrg
(
&
m
.
DeleteOrgCommand
{
Id
:
ac2
.
OrgId
})
So
(
err
,
ShouldBeNil
)
// remove frome ac2 from ac1 org
remCmd
:=
m
.
RemoveOrgUserCommand
{
OrgId
:
ac1
.
OrgId
,
UserId
:
ac2
.
Id
,
ShouldDeleteOrphanedUser
:
true
}
err
=
RemoveOrgUser
(
&
remCmd
)
So
(
err
,
ShouldBeNil
)
So
(
remCmd
.
UserWasDeleted
,
ShouldBeTrue
)
err
=
GetSignedInUser
(
&
m
.
GetSignedInUserQuery
{
UserId
:
ac2
.
Id
})
So
(
err
,
ShouldEqual
,
m
.
ErrUserNotFound
)
})
Convey
(
"Cannot delete last admin org user"
,
func
()
{
cmd
:=
m
.
RemoveOrgUserCommand
{
OrgId
:
ac1
.
OrgId
,
UserId
:
ac1
.
Id
}
err
:=
RemoveOrgUser
(
&
cmd
)
...
...
pkg/services/sqlstore/org_users.go
View file @
a69013c8
...
...
@@ -157,6 +157,12 @@ func RemoveOrgUser(cmd *m.RemoveOrgUserCommand) error {
}
}
// validate that after delete there is at least one user with admin role in org
if
err
:=
validateOneAdminLeftInOrg
(
cmd
.
OrgId
,
sess
);
err
!=
nil
{
return
err
}
// check user other orgs and update user current org
var
userOrgs
[]
*
m
.
UserOrgDTO
sess
.
Table
(
"org_user"
)
sess
.
Join
(
"INNER"
,
"org"
,
"org_user.org_id=org.id"
)
...
...
@@ -168,22 +174,31 @@ func RemoveOrgUser(cmd *m.RemoveOrgUserCommand) error {
return
err
}
hasCurrentOrgSet
:=
false
for
_
,
userOrg
:=
range
userOrgs
{
if
user
.
OrgId
==
userOrg
.
OrgId
{
hasCurrentOrgSet
=
true
break
if
len
(
userOrgs
)
>
0
{
hasCurrentOrgSet
:=
false
for
_
,
userOrg
:=
range
userOrgs
{
if
user
.
OrgId
==
userOrg
.
OrgId
{
hasCurrentOrgSet
=
true
break
}
}
}
if
!
hasCurrentOrgSet
&&
len
(
userOrgs
)
>
0
{
err
=
setUsingOrgInTransaction
(
sess
,
user
.
Id
,
userOrgs
[
0
]
.
OrgId
)
if
err
!=
nil
{
if
!
hasCurrentOrgSet
{
err
=
setUsingOrgInTransaction
(
sess
,
user
.
Id
,
userOrgs
[
0
]
.
OrgId
)
if
err
!=
nil
{
return
err
}
}
}
else
if
cmd
.
ShouldDeleteOrphanedUser
{
// no other orgs, delete the full user
if
err
:=
deleteUserInTransaction
(
sess
,
&
m
.
DeleteUserCommand
{
UserId
:
user
.
Id
});
err
!=
nil
{
return
err
}
cmd
.
UserWasDeleted
=
true
}
return
validateOneAdminLeftInOrg
(
cmd
.
OrgId
,
sess
)
return
nil
})
}
...
...
pkg/services/sqlstore/user.go
View file @
a69013c8
...
...
@@ -445,25 +445,29 @@ func SearchUsers(query *m.SearchUsersQuery) error {
func
DeleteUser
(
cmd
*
m
.
DeleteUserCommand
)
error
{
return
inTransaction
(
func
(
sess
*
DBSession
)
error
{
deletes
:=
[]
string
{
"DELETE FROM star WHERE user_id = ?"
,
"DELETE FROM "
+
dialect
.
Quote
(
"user"
)
+
" WHERE id = ?"
,
"DELETE FROM org_user WHERE user_id = ?"
,
"DELETE FROM dashboard_acl WHERE user_id = ?"
,
"DELETE FROM preferences WHERE user_id = ?"
,
"DELETE FROM team_member WHERE user_id = ?"
,
"DELETE FROM user_auth WHERE user_id = ?"
,
}
return
deleteUserInTransaction
(
sess
,
cmd
)
})
}
for
_
,
sql
:=
range
deletes
{
_
,
err
:=
sess
.
Exec
(
sql
,
cmd
.
UserId
)
if
err
!=
nil
{
return
err
}
func
deleteUserInTransaction
(
sess
*
DBSession
,
cmd
*
m
.
DeleteUserCommand
)
error
{
deletes
:=
[]
string
{
"DELETE FROM star WHERE user_id = ?"
,
"DELETE FROM "
+
dialect
.
Quote
(
"user"
)
+
" WHERE id = ?"
,
"DELETE FROM org_user WHERE user_id = ?"
,
"DELETE FROM dashboard_acl WHERE user_id = ?"
,
"DELETE FROM preferences WHERE user_id = ?"
,
"DELETE FROM team_member WHERE user_id = ?"
,
"DELETE FROM user_auth WHERE user_id = ?"
,
}
for
_
,
sql
:=
range
deletes
{
_
,
err
:=
sess
.
Exec
(
sql
,
cmd
.
UserId
)
if
err
!=
nil
{
return
err
}
}
return
nil
})
return
nil
}
func
UpdateUserPermissions
(
cmd
*
m
.
UpdateUserPermissionsCommand
)
error
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment