Skip to content
GitLab
Explore
Sign in
IA2
GMS
Compare revisions
5a8ed6cd3d66f4e79f5407605bc8a56552491f66 to 2f085290160bde9ab4e2d82b7a95eb063145fb74
Commits on Source (2)
isMemberOf bugfix
· 27bf0c93
Sonia Zorba
authored
Mar 26, 2021
27bf0c93
Group with dot in name escape bugfix
· 2f085290
Sonia Zorba
authored
Mar 26, 2021
2f085290
Hide whitespace changes
Inline
Side-by-side
gms/src/main/java/it/inaf/ia2/gms/controller/JWTWebServiceController.java
View file @
2f085290
...
...
@@ -110,31 +110,31 @@ public class JWTWebServiceController {
@GetMapping
(
value
=
{
"/ws/jwt/search/**"
,
"/vo/search/**"
},
produces
=
MediaType
.
TEXT_PLAIN_VALUE
)
public
void
isMemberOf
(
HttpServletRequest
request
,
HttpServletResponse
response
)
throws
IOException
{
String
group
=
getGroupFromRequest
(
request
,
"/ws/jwt/search/"
,
"/vo/search/"
);
List
<
String
>
groupNames
=
groupNameService
.
extractGroupNames
(
group
);
boolean
isMember
=
membershipManager
.
isCurrentUserMemberOf
(
"ROOT"
);
if
(!
isMember
)
{
String
parentPath
=
""
;
// starting from ROOT
for
(
String
groupName
:
groupNames
)
{
Optional
<
GroupEntity
>
optionalGroup
=
groupsDAO
.
findGroupByParentAndName
(
parentPath
,
groupName
);
if
(
optionalGroup
.
isPresent
())
{
GroupEntity
groupEntity
=
optionalGroup
.
get
();
parentPath
=
groupEntity
.
getPath
();
isMember
=
membershipManager
.
isCurrentUserMemberOf
(
groupEntity
.
getId
());
if
(
isMember
)
{
break
;
}
}
else
{
break
;
String
groupNamesString
=
getGroupFromRequest
(
request
,
"/ws/jwt/search/"
,
"/vo/search/"
);
List
<
String
>
groupNames
=
groupNameService
.
extractGroupNames
(
groupNamesString
);
GroupEntity
group
=
null
;
String
parentPath
=
""
;
// starting from ROOT
for
(
String
groupName
:
groupNames
)
{
Optional
<
GroupEntity
>
optionalGroup
=
groupsDAO
.
findGroupByParentAndName
(
parentPath
,
groupName
);
if
(
optionalGroup
.
isPresent
())
{
GroupEntity
groupEntity
=
optionalGroup
.
get
();
parentPath
=
groupEntity
.
getPath
();
boolean
isMember
=
membershipManager
.
isCurrentUserMemberOf
(
groupEntity
.
getId
());
if
(
isMember
)
{
group
=
groupEntity
;
}
}
else
{
group
=
null
;
break
;
}
}
if
(
isMember
)
{
if
(
group
!=
null
)
{
try
(
PrintWriter
pw
=
new
PrintWriter
(
response
.
getOutputStream
()))
{
pw
.
println
(
group
);
pw
.
println
(
group
NameService
.
getCompleteName
(
groupNames
)
);
}
}
// else: empty response (as defined by GMS standard)
...
...
@@ -261,7 +261,7 @@ public class JWTWebServiceController {
if
(
userId
.
isPresent
())
{
try
(
PrintWriter
pw
=
new
PrintWriter
(
response
.
getOutputStream
()))
{
for
(
UserPermission
userPermission
:
searchService
.
getUserPermission
(
groupEntity
,
userId
.
get
(),
permissionsManager
.
getCurrentUserPermissions
(
groupEntity
)))
{
String
group
=
String
.
join
(
"."
,
userPermission
.
getGroupCompleteName
());
String
group
=
groupNameService
.
getCompleteName
(
userPermission
.
getGroupCompleteName
());
pw
.
println
(
group
+
" "
+
userPermission
.
getPermission
());
}
}
...
...
gms/src/main/java/it/inaf/ia2/gms/controller/PermissionsController.java
View file @
2f085290
...
...
@@ -125,7 +125,7 @@ public class PermissionsController {
if
(
userId
.
isPresent
())
{
try
(
PrintWriter
pw
=
new
PrintWriter
(
response
.
getOutputStream
()))
{
for
(
UserPermission
userPermission
:
searchService
.
getUserPermission
(
groupEntity
,
userId
.
get
(),
permissionsManager
.
getCurrentUserPermissions
(
groupEntity
)))
{
String
group
=
String
.
join
(
"."
,
userPermission
.
getGroupCompleteName
());
String
group
=
groupNameService
.
getCompleteName
(
userPermission
.
getGroupCompleteName
());
pw
.
println
(
group
+
" "
+
userPermission
.
getPermission
());
}
}
...
...
gms/src/main/java/it/inaf/ia2/gms/persistence/MembershipsDAO.java
View file @
2f085290
...
...
@@ -120,18 +120,22 @@ public class MembershipsDAO {
public
boolean
isMemberOf
(
String
userId
,
String
groupId
)
{
String
sql
=
"SELECT COUNT(*) FROM gms_membership "
+
" WHERE user_id = ? AND group_id = ?"
;
String
sql
=
"SELECT COUNT(*)\n"
+
"FROM gms_membership m\n"
+
"JOIN gms_group g ON g.id = m.group_id\n"
+
"JOIN gms_group gs ON g.path @> gs.path\n"
+
"WHERE gs.id = ?\n"
+
"AND m.user_id = ?"
;
return
jdbcTemplate
.
query
(
conn
->
{
PreparedStatement
ps
=
conn
.
prepareStatement
(
sql
);
ps
.
setString
(
1
,
user
Id
);
ps
.
setString
(
2
,
group
Id
);
ps
.
setString
(
1
,
group
Id
);
ps
.
setString
(
2
,
user
Id
);
return
ps
;
},
resultSet
->
{
resultSet
.
next
();
int
count
=
resultSet
.
getInt
(
1
);
return
count
==
1
;
return
count
>
0
;
});
}
...
...
gms/src/main/java/it/inaf/ia2/gms/service/GroupNameService.java
View file @
2f085290
...
...
@@ -83,7 +83,9 @@ public class GroupNameService {
}
private
List
<
String
>
splitNames
(
String
completeGroupName
)
{
return
Arrays
.
asList
(
completeGroupName
.
split
(
"(?<!\\\\)\\."
));
return
Arrays
.
stream
(
completeGroupName
.
split
(
"(?<!\\\\)\\."
))
.
map
(
name
->
name
.
replace
(
"\\."
,
"."
))
.
collect
(
Collectors
.
toList
());
}
public
String
getShortGroupName
(
String
completeGroupName
,
Optional
<
String
>
groupPrefix
)
{
...
...
@@ -157,6 +159,12 @@ public class GroupNameService {
return
names
;
}
public
String
getCompleteName
(
List
<
String
>
names
)
{
return
String
.
join
(
"."
,
names
.
stream
()
.
map
(
n
->
n
.
replace
(
"."
,
"\\."
))
.
collect
(
Collectors
.
toList
()));
}
private
GroupEntity
getRoot
()
{
return
groupsDAO
.
findGroupById
(
"ROOT"
)
.
orElseThrow
(()
->
new
IllegalStateException
(
"Missing root group"
));
...
...
gms/src/test/java/it/inaf/ia2/gms/controller/JWTWebServiceControllerTest.java
View file @
2f085290
...
...
@@ -115,11 +115,15 @@ public class JWTWebServiceControllerTest {
when
(
membershipManager
.
isCurrentUserMemberOf
(
eq
(
group3
.
getId
()))).
thenReturn
(
true
);
String
group
=
"group
\\
.1.subgroup.subsubgroup"
;
String
group
=
"group
%5C
.1.subgroup.subsubgroup"
;
mockMvc
.
perform
(
get
(
"/
ws/jwt
/search/"
+
group
).
principal
(
principal
))
mockMvc
.
perform
(
get
(
"/
vo
/search/"
+
group
).
principal
(
principal
))
.
andExpect
(
status
().
isOk
())
.
andExpect
(
content
().
string
(
group
+
"\n"
));
.
andExpect
(
content
().
string
(
"group\\.1.subgroup.subsubgroup\n"
));
mockMvc
.
perform
(
get
(
"/vo/search/"
+
group
+
"/inexistent"
).
principal
(
principal
))
.
andExpect
(
status
().
isOk
())
.
andExpect
(
content
().
string
(
""
));
}
@Test
...
...
gms/src/test/java/it/inaf/ia2/gms/controller/PermissionsControllerTest.java
View file @
2f085290
...
...
@@ -7,11 +7,14 @@ import it.inaf.ia2.gms.manager.PermissionsManager;
import
it.inaf.ia2.gms.model.Permission
;
import
it.inaf.ia2.gms.model.RapUserPermission
;
import
it.inaf.ia2.gms.model.request.AddPermissionRequest
;
import
it.inaf.ia2.gms.model.response.UserPermission
;
import
it.inaf.ia2.gms.persistence.GroupsDAO
;
import
it.inaf.ia2.gms.persistence.model.GroupEntity
;
import
it.inaf.ia2.gms.persistence.model.PermissionEntity
;
import
it.inaf.ia2.gms.service.GroupNameService
;
import
it.inaf.ia2.gms.service.SearchService
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Optional
;
import
static
org
.
hamcrest
.
CoreMatchers
.
is
;
...
...
@@ -45,6 +48,9 @@ public class PermissionsControllerTest {
@Mock
private
PermissionsManager
permissionsManager
;
@Mock
private
SearchService
searchService
;
@Mock
private
GroupsDAO
groupsDAO
;
...
...
@@ -137,6 +143,26 @@ public class PermissionsControllerTest {
.
andExpect
(
content
().
string
(
"rap_user ADMIN\n"
));
}
@Test
public
void
testGetUserPermissions
()
throws
Exception
{
when
(
groupsDAO
.
findGroupByParentAndName
(
""
,
"people"
)).
thenReturn
(
Optional
.
of
(
getPeopleGroup
()));
when
(
groupsDAO
.
findGroupByParentAndName
(
"people_id"
,
"name.surname"
)).
thenReturn
(
Optional
.
of
(
getNameSurnameGroup
()));
List
<
UserPermission
>
permissions
=
new
ArrayList
<>();
UserPermission
up
=
new
UserPermission
();
up
.
setGroupCompleteName
(
Arrays
.
asList
(
"people"
,
"name.surname"
));
up
.
setPermission
(
Permission
.
VIEW_MEMBERS
);
permissions
.
add
(
up
);
when
(
searchService
.
getUserPermission
(
any
(),
any
(),
any
())).
thenReturn
(
permissions
);
mockMvc
.
perform
(
get
(
"/permission?group=people.name\\.surname&user_id=id"
).
principal
(
getPrincipal
())
.
accept
(
MediaType
.
TEXT_PLAIN
))
.
andExpect
(
status
().
isOk
())
.
andExpect
(
content
().
string
(
"people.name\\.surname VIEW_MEMBERS\n"
));
}
@Test
public
void
testAddPermission
()
throws
Exception
{
...
...
gms/src/test/java/it/inaf/ia2/gms/persistence/MembershipsDAOTest.java
View file @
2f085290
...
...
@@ -37,8 +37,8 @@ public class MembershipsDAOTest {
@Test
public
void
testAddAndRemoveMembers
()
{
groupsDAO
.
createGroup
(
groupEntity
(
"A"
));
groupsDAO
.
createGroup
(
groupEntity
(
"B"
));
groupsDAO
.
createGroup
(
groupEntity
(
"A"
,
"A"
));
groupsDAO
.
createGroup
(
groupEntity
(
"B"
,
"B"
));
assertTrue
(
membershipsDAO
.
findByGroup
(
"A"
).
isEmpty
());
...
...
@@ -72,11 +72,48 @@ public class MembershipsDAOTest {
membershipsDAO
.
deleteAllGroupsMembership
(
new
ArrayList
<>());
}
private
GroupEntity
groupEntity
(
String
groupId
)
{
@Test
public
void
testIsMemberOfRecursive
()
{
groupsDAO
.
createGroup
(
groupEntity
(
"ROOT"
,
""
));
groupsDAO
.
createGroup
(
groupEntity
(
"A"
,
"A"
));
groupsDAO
.
createGroup
(
groupEntity
(
"E"
,
"A.E"
));
groupsDAO
.
createGroup
(
groupEntity
(
"F"
,
"A.E.F"
));
groupsDAO
.
createGroup
(
groupEntity
(
"B"
,
"B"
));
groupsDAO
.
createGroup
(
groupEntity
(
"C"
,
"B.C"
));
groupsDAO
.
createGroup
(
groupEntity
(
"D"
,
"B.C.D"
));
membershipsDAO
.
addMember
(
membershipEntity
(
USER_1
,
"F"
));
membershipsDAO
.
addMember
(
membershipEntity
(
USER_1
,
"C"
));
assertFalse
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"ROOT"
));
assertFalse
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"A"
));
assertFalse
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"B"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"C"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"D"
));
assertFalse
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"E"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"F"
));
membershipsDAO
.
addMember
(
membershipEntity
(
USER_1
,
"ROOT"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"ROOT"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"A"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"B"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"C"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"D"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"E"
));
assertTrue
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"F"
));
assertFalse
(
membershipsDAO
.
isMemberOf
(
USER_1
,
"inexistent-id"
));
}
private
GroupEntity
groupEntity
(
String
groupId
,
String
groupPath
)
{
GroupEntity
groupEntity
=
new
GroupEntity
();
groupEntity
.
setId
(
groupId
);
groupEntity
.
setName
(
groupId
);
groupEntity
.
setPath
(
group
Id
);
groupEntity
.
setPath
(
group
Path
);
groupEntity
.
setLeaf
(
false
);
return
groupEntity
;
}
...
...
gms/src/test/java/it/inaf/ia2/gms/service/GroupNameServiceTest.java
View file @
2f085290
...
...
@@ -50,7 +50,7 @@ public class GroupNameServiceTest {
assertEquals
(
1
,
names
.
size
());
assertEquals
(
2
,
names
.
get
(
"def"
).
size
());
assertEquals
(
"Parent_group"
,
names
.
get
(
"def"
).
get
(
0
));
assertEquals
(
"Child
\\
.withDot"
,
names
.
get
(
"def"
).
get
(
1
));
assertEquals
(
"Child.withDot"
,
names
.
get
(
"def"
).
get
(
1
));
}
@Test
...
...