Skip to content

Commit 94b7a5a

Browse files
committed
Fixes #555
New RoleRequest class for creating new Roles
1 parent a020e25 commit 94b7a5a

4 files changed

Lines changed: 42 additions & 25 deletions

File tree

server/src/main/java/invite/api/RoleController.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package invite.api;
22

33
import invite.config.Config;
4-
import invite.exception.InvalidInputException;
54
import invite.exception.NotFoundException;
65
import invite.exception.UserRestrictionException;
76
import invite.logging.AccessLogger;
@@ -149,18 +148,20 @@ public ResponseEntity<List<Role>> rolesPerApplicationId(@PathVariable("manageId"
149148

150149

151150
@PostMapping("")
152-
public ResponseEntity<Role> newRole(@Validated @RequestBody Role role,
151+
public ResponseEntity<Role> newRole(@Validated @RequestBody RoleRequest roleRequest,
153152
@Parameter(hidden = true) User user) {
154153
LOG.debug(String.format("POST /roles/ for user %s", user.getEduPersonPrincipalName()));
155-
if (role.getId() != null) {
156-
throw new InvalidInputException("Role id must be null for new Role");
157-
}
158154
UserPermissions.assertAuthority(user, Authority.INSTITUTION_ADMIN);
159155
//For super_users we allow an organization GUID from the input form
156+
Role role = new Role(roleRequest);
160157
if (InstitutionAdmin.isInstitutionAdmin(user)) {
161158
role.setOrganizationGUID(user.getOrganizationGUID());
159+
} else if (user.isSuperUser()) {
160+
role.setOrganizationGUID(roleRequest.getOrganizationGUID());
161+
} else {
162+
role.setOrganizationGUID(null);
162163
}
163-
role.setShortName(GroupURN.sanitizeRoleShortName(role.getShortName()));
164+
role.setShortName(GroupURN.sanitizeRoleShortName(roleRequest.getName()));
164165
role.setIdentifier(UUID.randomUUID().toString());
165166
role.setUrn(GroupURN.urnFromRole(this.groupUrnPrefix, role));
166167

@@ -171,7 +172,7 @@ public ResponseEntity<Role> newRole(@Validated @RequestBody Role role,
171172

172173
@PutMapping("")
173174
@Retryable(
174-
retryFor = { SQLTransactionRollbackException.class },
175+
retryFor = {SQLTransactionRollbackException.class},
175176
maxAttempts = 3,
176177
backoff = @Backoff(delay = 1000)
177178
)

server/src/main/java/invite/internal/InternalInviteController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ public ResponseEntity<Role> role(@PathVariable("id") Long id,
129129
content = {@Content(examples = {@ExampleObject(value = """
130130
{
131131
"name": "Required role name",
132-
"shortName": "Required short name - may be copy of name",
133132
"description": "Required role description",
134133
"defaultExpiryDays": 365,
135134
"inviterDisplayName": "Free format field used in the invitation emails for this role (can be email address)"
@@ -209,11 +208,12 @@ public ResponseEntity<Role> role(@PathVariable("id") Long id,
209208
}
210209
"""
211210
)})})})
212-
public ResponseEntity<Role> newRole(@Validated @RequestBody Role role,
211+
public ResponseEntity<Role> newRole(@Validated @RequestBody RoleRequest roleRequest,
213212
@Parameter(hidden = true) @AuthenticationPrincipal RemoteUser remoteUser) {
213+
Role role = new Role(roleRequest);
214214
role.setRemoteApiUser(remoteUser.getName());
215215

216-
role.setShortName(GroupURN.sanitizeRoleShortName(role.getShortName()));
216+
role.setShortName(GroupURN.sanitizeRoleShortName(role.getName()));
217217
role.setIdentifier(UUID.randomUUID().toString());
218218

219219
LOG.debug(String.format("New role '%s' by user %s", role.getName(), remoteUser.getName()));

server/src/main/java/invite/model/Role.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,20 @@ public Role(@NotNull String name,
125125
this.identifier = UUID.randomUUID().toString();
126126
}
127127

128+
public Role(RoleRequest roleRequest) {
129+
this.name = roleRequest.getName();
130+
this.description = roleRequest.getDescription();
131+
this.defaultExpiryDays = roleRequest.getDefaultExpiryDays();
132+
this.enforceEmailEquality = roleRequest.isEnforceEmailEquality();
133+
this.eduIDOnly = roleRequest.isEduIDOnly();
134+
this.blockExpiryDate = roleRequest.isBlockExpiryDate();
135+
this.overrideSettingsAllowed = roleRequest.isOverrideSettingsAllowed();
136+
this.organizationGUID = roleRequest.getOrganizationGUID();
137+
this.inviterDisplayName = roleRequest.getInviterDisplayName();
138+
this.applicationUsages = roleRequest.getApplicationUsages();
139+
140+
}
141+
128142
@Transient
129143
@JsonIgnore
130144
public List<String> applicationIdentifiers() {

server/src/test/java/invite/api/RoleControllerTest.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44
import invite.AccessCookieFilter;
55
import invite.DefaultPage;
66
import invite.manage.EntityType;
7-
import invite.model.Application;
8-
import invite.model.ApplicationUsage;
9-
import invite.model.RemoteProvisionedGroup;
10-
import invite.model.Role;
7+
import invite.model.*;
118
import io.restassured.common.mapper.TypeRef;
129
import io.restassured.http.ContentType;
1310
import org.junit.jupiter.api.Test;
@@ -28,8 +25,7 @@ void createBySuperUser() throws Exception {
2825
//Because the user is changed and provisionings are queried
2926
stubForManageProvisioning(List.of());
3027
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", SUPER_SUB);
31-
Role role = new Role("New", "New desc", application("1", EntityType.SAML20_SP), 365, false, false);
32-
role.setOrganizationGUID("ad93daef-0911-e511-80d0-005056956c1a");
28+
RoleRequest roleRequest = new RoleRequest("New", "New desc", 365, false, false, false, true, "ad93daef-0911-e511-80d0-005056956c1a", "From me", application("1", EntityType.SAML20_SP));
3329

3430
super.stubForManagerProvidersByIdIn(EntityType.SAML20_SP, List.of("1"));
3531
super.stubForManageProvisioning(List.of("1"));
@@ -41,12 +37,12 @@ void createBySuperUser() throws Exception {
4137
.accept(ContentType.JSON)
4238
.header(accessCookieFilter.csrfToken().getHeaderName(), accessCookieFilter.csrfToken().getToken())
4339
.contentType(ContentType.JSON)
44-
.body(role)
40+
.body(roleRequest)
4541
.post("/api/v1/roles")
4642
.as(Map.class);
4743
assertNotNull(result.get("id"));
4844
Role roleFromDB = roleRepository.findById(Long.valueOf((Integer) result.get("id"))).get();
49-
assertEquals(role.getOrganizationGUID(), roleFromDB.getOrganizationGUID());
45+
assertEquals(roleRequest.getOrganizationGUID(), roleFromDB.getOrganizationGUID());
5046
}
5147

5248
@Test
@@ -55,8 +51,9 @@ void createByInstitutionAdmin() throws Exception {
5551
stubForManageProvidersAllowedByIdP(ORGANISATION_GUID);
5652
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", INSTITUTION_ADMIN_SUB);
5753

58-
Role role = new Role("New", "New desc", application("1", EntityType.SAML20_SP), 365, false, false);
59-
role.setOrganizationGUID(UUID.randomUUID().toString());
54+
RoleRequest roleRequest = new RoleRequest("New", "New desc", 365,
55+
false, false, false, true,
56+
UUID.randomUUID().toString(), "From me", application("1", EntityType.SAML20_SP));
6057

6158
super.stubForManagerProvidersByIdIn(EntityType.SAML20_SP, List.of("1"));
6259
super.stubForManageProvisioning(List.of("1"));
@@ -68,7 +65,7 @@ void createByInstitutionAdmin() throws Exception {
6865
.accept(ContentType.JSON)
6966
.header(accessCookieFilter.csrfToken().getHeaderName(), accessCookieFilter.csrfToken().getToken())
7067
.contentType(ContentType.JSON)
71-
.body(role)
68+
.body(roleRequest)
7269
.post("/api/v1/roles")
7370
.as(Map.class);
7471
assertNotNull(result.get("id"));
@@ -81,15 +78,18 @@ void createInvalidApplicationUsages() throws Exception {
8178
//Because the user is changed and provisionings are queried
8279
stubForManageProvisioning(List.of());
8380
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", SUPER_SUB);
84-
Role role = new Role("New", "New desc", Set.of(), 365, false, false);
81+
RoleRequest roleRequest = new RoleRequest("New", "New desc", 365,
82+
false, false, false, true,
83+
null, "From me", Set.of());
84+
8585

8686
given()
8787
.when()
8888
.filter(accessCookieFilter.cookieFilter())
8989
.accept(ContentType.JSON)
9090
.header(accessCookieFilter.csrfToken().getHeaderName(), accessCookieFilter.csrfToken().getToken())
9191
.contentType(ContentType.JSON)
92-
.body(role)
92+
.body(roleRequest)
9393
.post("/api/v1/roles")
9494
.then()
9595
.statusCode(400);
@@ -102,15 +102,17 @@ void createInvalidApplicationLandingPage() throws Exception {
102102
AccessCookieFilter accessCookieFilter = openIDConnectFlow("/api/v1/users/login", SUPER_SUB);
103103
Set<ApplicationUsage> applicationUsages = application("1", EntityType.SAML20_SP);
104104
applicationUsages.iterator().next().setLandingPage("nope");
105-
Role role = new Role("New", "New desc", applicationUsages, 365, false, false);
105+
RoleRequest roleRequest = new RoleRequest("New", "New desc", 365,
106+
false, false, false, true,
107+
null, "From me", applicationUsages);
106108

107109
given()
108110
.when()
109111
.filter(accessCookieFilter.cookieFilter())
110112
.accept(ContentType.JSON)
111113
.header(accessCookieFilter.csrfToken().getHeaderName(), accessCookieFilter.csrfToken().getToken())
112114
.contentType(ContentType.JSON)
113-
.body(role)
115+
.body(roleRequest)
114116
.post("/api/v1/roles")
115117
.then()
116118
.statusCode(400);

0 commit comments

Comments
 (0)