11package access .api ;
22
3- import access .exception .InvalidInputException ;
43import access .exception .NotAllowedException ;
54import access .exception .NotFoundException ;
65import access .jira .JiraClient ;
76import access .jira .JiraIssue ;
8- import access .manage .ChangeRequest ;
7+ import access .mail .MailBox ;
8+ import access .manage .DashBoardConnectionOption ;
99import access .manage .Manage ;
10- import access .manage .PathUpdateType ;
11- import access .manage .RequestType ;
1210import access .model .*;
1311import access .repository .OrganizationRepository ;
1412import access .repository .UserRepository ;
1513import io .swagger .v3 .oas .annotations .security .SecurityRequirement ;
16- import lombok .SneakyThrows ;
1714import org .apache .commons .logging .Log ;
1815import org .apache .commons .logging .LogFactory ;
1916import org .springframework .http .HttpStatus ;
2017import org .springframework .http .MediaType ;
2118import org .springframework .http .ResponseEntity ;
2219import org .springframework .transaction .annotation .Transactional ;
23- import org .springframework .util .CollectionUtils ;
24- import org .springframework .util .StringUtils ;
2520import org .springframework .validation .annotation .Validated ;
26- import org .springframework .web .bind .annotation .*;
21+ import org .springframework .web .bind .annotation .PutMapping ;
22+ import org .springframework .web .bind .annotation .RequestBody ;
23+ import org .springframework .web .bind .annotation .RequestMapping ;
24+ import org .springframework .web .bind .annotation .RestController ;
2725
28- import java .time .Instant ;
29- import java .util .Collections ;
3026import java .util .List ;
3127import java .util .Map ;
3228
3329import static access .SwaggerOpenIdConfig .API_TOKENS_SCHEME_NAME ;
3430import static access .SwaggerOpenIdConfig .OPEN_ID_SCHEME_NAME ;
35- import static access .api .Results .deleteResult ;
36- import static access .manage .ManageData .getData ;
37- import static access .manage .ManageData .getMetaDataFields ;
31+ import static access .manage .ManageData .*;
3832
3933@ RestController
4034@ RequestMapping (value = {"/api/v1/idp" }, produces = MediaType .APPLICATION_JSON_VALUE )
@@ -49,15 +43,18 @@ public class IdentityProviderController implements UserAccessRights {
4943 private final OrganizationRepository organizationRepository ;
5044 private final Manage manage ;
5145 private final JiraClient jiraClient ;
46+ private final MailBox mailBox ;
5247
5348 public IdentityProviderController (UserRepository userRepository ,
5449 OrganizationRepository organizationRepository ,
5550 Manage manage ,
56- JiraClient jiraClient ) {
51+ JiraClient jiraClient ,
52+ MailBox mailBox ) {
5753 this .userRepository = userRepository ;
5854 this .organizationRepository = organizationRepository ;
5955 this .manage = manage ;
6056 this .jiraClient = jiraClient ;
57+ this .mailBox = mailBox ;
6158 }
6259
6360 @ PutMapping ({"/connect" })
@@ -74,6 +71,7 @@ public ResponseEntity<Map<String, Object>> connect(User user, @RequestBody @Vali
7471 .orElseThrow (() -> new NotFoundException ("Organization with manageIdentifier not found: " + idpManageIdentifier ));
7572
7673 User userFromDB = reinitializeUser (user , userRepository );
74+ //See https://github.com/OpenConext/OpenConext-access/wiki/Service-Connect-Flow
7775 boolean memberRequest = !userFromDB .isSuperUser ();
7876 if (memberRequest ) {
7977 OrganizationMembership organizationMembership = getOrganizationMembership (userFromDB , organization , Authority .GUEST )
@@ -83,19 +81,40 @@ public ResponseEntity<Map<String, Object>> connect(User user, @RequestBody @Vali
8381 }
8482 if (memberRequest ) {
8583 //The only action is to email the institution admin of the organization, with a deep link to App
86- // TODO send email
84+ List <User > admins = organization .getOrganizationMemberships ().stream ()
85+ .filter (membership -> membership .getAuthority ().equals (Authority .ADMIN ))
86+ .map (membership -> membership .getUser ())
87+ .toList ();
88+ if (admins .isEmpty ()) {
89+ //Edge case, send the mail to the superusers instead
90+ admins = userRepository .findBySuperUser (true );
91+ }
92+ String deeplink = String .format ("/application-detail/%s/%s" ,
93+ serviceProvider .get ("type" ),
94+ serviceProvider .get ("id" ));
95+ mailBox .sendConnectionRequest (userFromDB , admins , organization , getProviderName (serviceProvider ),
96+ connectionRequest .getMessage (), deeplink );
8797 return Results .createResult ();
8898 }
8999 //Now check if the connection can be made automatically
90100 Map <String , Object > spMetaDataFields = getMetaDataFields (getData (serviceProvider ));
91- String connectOption = (String ) spMetaDataFields .getOrDefault ("coin:dashboard_connect_option" , "connect_with_interaction" );
101+ DashBoardConnectionOption connectOption = DashBoardConnectionOption
102+ .fromValue ((String ) spMetaDataFields .getOrDefault ("coin:dashboard_connect_option" , "connect_with_interaction" ));
92103 String idpInstitutionGUID = (String ) getMetaDataFields (getData (identityProvider )).get ("coin:institution_guid" );
93104
94105 boolean idpAndSpShareInstitution = spMetaDataFields .getOrDefault ("coin:institution_guid" , "nope" )
95106 .equals (idpInstitutionGUID );
96- boolean connectWithoutInteraction = idpAndSpShareInstitution || !connectOption .equals ("connect_with_interaction" );
107+ boolean connectWithoutInteraction = idpAndSpShareInstitution || !connectOption .equals (DashBoardConnectionOption . connectWithInteraction );
97108 if (connectWithoutInteraction ) {
98109 manage .connectWithoutInteraction (identityProvider , serviceProvider , userFromDB );
110+ if (connectOption .equals (DashBoardConnectionOption .connectWithoutInteractionWithEmail )) {
111+ mailBox .sendNewConnectionCreated (
112+ userFromDB ,
113+ contactPersons (serviceProvider ),
114+ getProviderName (identityProvider ),
115+ getProviderName (serviceProvider ),
116+ (String ) getData (serviceProvider ).get ("entityid" ));
117+ }
99118 return Results .createResult ();
100119 }
101120
0 commit comments