44import invite .exception .NotFoundException ;
55import invite .exception .UserRestrictionException ;
66import invite .model .APIToken ;
7+ import invite .model .Authority ;
78import invite .model .User ;
89import invite .repository .APITokenRepository ;
910import invite .security .UserPermissions ;
2122
2223import java .util .List ;
2324import java .util .Map ;
25+ import java .util .Objects ;
2426
2527import static invite .SwaggerOpenIdConfig .API_TOKENS_SCHEME_NAME ;
2628import static invite .SwaggerOpenIdConfig .OPEN_ID_SCHEME_NAME ;
@@ -44,16 +46,18 @@ public APITokenController(APITokenRepository apiTokenRepository) {
4446 @ GetMapping ("" )
4547 public ResponseEntity <List <APIToken >> apiTokensByInstitution (@ Parameter (hidden = true ) User user ) {
4648 LOG .debug (String .format ("GET /tokens for user %s" , user .getEduPersonPrincipalName ()));
47- UserPermissions .assertInstitutionAdmin (user );
48- List <APIToken > apiTokens = user .isSuperUser () ? apiTokenRepository .findAll () : apiTokenRepository .findByOrganizationGUID (user .getOrganizationGUID ());
49+ UserPermissions .assertAuthority (user , Authority .INVITER );
50+ List <APIToken > apiTokens = user .isSuperUser () ? apiTokenRepository .findAll () :
51+ user .isInstitutionAdmin () ? apiTokenRepository .findByOrganizationGUID (user .getOrganizationGUID ()) :
52+ apiTokenRepository .findByOwner (user );
4953 return ResponseEntity .ok (apiTokens );
5054 }
5155
5256 @ GetMapping ("generate-token" )
5357 public ResponseEntity <Map <String , String >> generateToken (@ Parameter (hidden = true ) User user ,
5458 @ Parameter (hidden = true ) HttpServletRequest request ) {
5559 LOG .debug (String .format ("GET /tokens/generateToken for user %s" , user .getEduPersonPrincipalName ()));
56- UserPermissions .assertInstitutionAdmin (user );
60+ UserPermissions .assertAuthority (user , Authority . INVITER );
5761 String token = HashGenerator .generateToken ();
5862 request .getSession ().setAttribute (TOKEN_KEY , token );
5963 return ResponseEntity .ok (Map .of ("token" , token ));
@@ -64,28 +68,37 @@ public ResponseEntity<APIToken> create(@Validated @RequestBody APIToken apiToken
6468 @ Parameter (hidden = true ) User user ,
6569 @ Parameter (hidden = true ) HttpServletRequest request ) {
6670 LOG .debug (String .format ("POST /tokens/create for user %s" , user .getEduPersonPrincipalName ()));
67- UserPermissions .assertInstitutionAdmin (user );
71+ UserPermissions .assertAuthority (user , Authority . INVITER );
6872 String token = (String ) request .getSession ().getAttribute (TOKEN_KEY );
6973 if (!StringUtils .hasText (token )) {
7074 throw new UserRestrictionException ();
7175 }
72- APIToken apiToken = new APIToken (
73- user .getOrganizationGUID (),
74- HashGenerator .hashToken (token ),
75- user .isSuperUser (),
76- apiTokenRequest .getDescription ());
77- return ResponseEntity .ok (apiTokenRepository .save (apiToken ));
76+ APIToken apiToken ;
77+ if (user .isSuperUser () || user .isInstitutionAdmin ()) {
78+ apiToken = new APIToken (
79+ user .getOrganizationGUID (),
80+ HashGenerator .hashToken (token ),
81+ user .isSuperUser (),
82+ apiTokenRequest .getDescription ());
83+ } else {
84+ apiToken = new APIToken (HashGenerator .hashToken (token ), apiTokenRequest .getDescription (), user );
85+ }
86+ apiToken = apiTokenRepository .save (apiToken );
87+ return ResponseEntity .ok (apiToken );
7888 }
7989
8090 @ DeleteMapping ("/{id}" )
8191 public ResponseEntity <Void > deleteToken (@ PathVariable ("id" ) Long id , @ Parameter (hidden = true ) User user ) {
82- LOG .debug (String .format ("DETELE /tokens/deleteToken with id %s for user %s" , id .toString (), user .getEduPersonPrincipalName ()));
83- UserPermissions .assertInstitutionAdmin (user );
92+ LOG .debug (String .format ("DELETE /tokens/deleteToken with id %s for user %s" , id .toString (), user .getEduPersonPrincipalName ()));
93+ UserPermissions .assertAuthority (user , Authority . INVITER );
8494 APIToken apiToken = apiTokenRepository .findById (id ).orElseThrow (() -> new NotFoundException ("API token not found" ));
8595 if (apiToken .isSuperUserToken () && !user .isSuperUser ()) {
8696 throw new UserRestrictionException ();
8797 }
88- if (!user .isSuperUser () && !apiToken .getOrganizationGUID ().equals (user .getOrganizationGUID ())) {
98+ if (user .isInstitutionAdmin () && !apiToken .getOrganizationGUID ().equals (user .getOrganizationGUID ())) {
99+ throw new UserRestrictionException ();
100+ }
101+ if (!user .isSuperUser () && !user .isInstitutionAdmin () && !Objects .equals (user .getId (), apiToken .getOwner ().getId ())) {
89102 throw new UserRestrictionException ();
90103 }
91104 apiTokenRepository .delete (apiToken );
0 commit comments