Commit dd8cfb0f authored by Sonia Zorba's avatar Sonia Zorba
Browse files

Handled invited registration automatically if first login happens

parent 609cb6b5
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -165,7 +165,7 @@
            <plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.4</version>
                <version>0.8.6</version>
                <executions>
                <executions>
                    <execution>
                    <execution>
                        <goals>
                        <goals>
+2 −2
Original line number Original line Diff line number Diff line
@@ -82,9 +82,9 @@ public class HomePageController {
    @GetMapping(value = "/", produces = MediaType.TEXT_HTML_VALUE)
    @GetMapping(value = "/", produces = MediaType.TEXT_HTML_VALUE)
    public String index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    public String index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        Optional<InvitedRegistration> optReg = invitedRegistrationManager.completeInvitedRegistrationIfNecessary();
        Optional<List<InvitedRegistration>> optReg = invitedRegistrationManager.completeInvitedRegistrationIfNecessary();
        if (optReg.isPresent()) {
        if (optReg.isPresent()) {
            request.setAttribute("invited-registration", optReg.get());
            request.setAttribute("invited-registrations", optReg.get());
            return "/registration-completed";
            return "/registration-completed";
        }
        }


+13 −9
Original line number Original line Diff line number Diff line
@@ -5,6 +5,8 @@ import it.inaf.ia2.gms.persistence.model.InvitedRegistration;
import it.inaf.ia2.gms.service.GroupNameService;
import it.inaf.ia2.gms.service.GroupNameService;
import java.io.IOException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.Scanner;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponse;
@@ -32,7 +34,7 @@ public class InvitedRegistrationController {


        String html = getFileContent("invited-registration.html")
        String html = getFileContent("invited-registration.html")
                .replace("#EMAIL#", invitedRegistration.getEmail())
                .replace("#EMAIL#", invitedRegistration.getEmail())
                .replace("#GROUPS#", getGroupsList(invitedRegistration))
                .replace("#GROUPS#", getGroupsList(Collections.singletonList(invitedRegistration)))
                .replace("#HOME#", request.getContextPath());
                .replace("#HOME#", request.getContextPath());


        response.getOutputStream().print(html);
        response.getOutputStream().print(html);
@@ -43,14 +45,14 @@ public class InvitedRegistrationController {


        response.setContentType("text/html;charset=UTF-8");
        response.setContentType("text/html;charset=UTF-8");


        InvitedRegistration invitedRegistration = (InvitedRegistration) request.getAttribute("invited-registration");
        List<InvitedRegistration> invitedRegistrations = (List<InvitedRegistration>) request.getAttribute("invited-registrations");
        if (invitedRegistration == null) {
        if (invitedRegistrations == null) {
            // redirect to home
            // redirect to home
            String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
            String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
            response.sendRedirect(baseUrl);
            response.sendRedirect(baseUrl);
        } else {
        } else {
            String html = getFileContent("registration-completed.html")
            String html = getFileContent("registration-completed.html")
                    .replace("#GROUPS#", getGroupsList(invitedRegistration))
                    .replace("#GROUPS#", getGroupsList(invitedRegistrations))
                    .replace("#HOME#", request.getContextPath());
                    .replace("#HOME#", request.getContextPath());


            response.getOutputStream().print(html);
            response.getOutputStream().print(html);
@@ -70,12 +72,14 @@ public class InvitedRegistrationController {
        }
        }
    }
    }


    private String getGroupsList(InvitedRegistration invitedRegistration) {
    private String getGroupsList(List<InvitedRegistration> invitedRegistrations) {
        String groups = "<ul>";
        String groups = "<ul>";
        for (InvitedRegistration invitedRegistration : invitedRegistrations) {
            for (String groupName : groupNameService.getGroupsNamesFromIdentifiers(
            for (String groupName : groupNameService.getGroupsNamesFromIdentifiers(
                    invitedRegistration.getGroupsPermissions().keySet())) {
                    invitedRegistration.getGroupsPermissions().keySet())) {
                groups += "<li>" + groupName + "</li>";
                groups += "<li>" + groupName + "</li>";
            }
            }
        }
        groups += "</ul>";
        groups += "</ul>";
        return groups;
        return groups;
    }
    }
+31 −8
Original line number Original line Diff line number Diff line
@@ -12,6 +12,7 @@ import it.inaf.ia2.gms.model.response.UserPermission;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.GroupsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.PermissionsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.InvitedRegistration;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.persistence.model.PermissionEntity;
import it.inaf.ia2.gms.service.GroupNameService;
import it.inaf.ia2.gms.service.GroupNameService;
import it.inaf.ia2.gms.service.GroupsService;
import it.inaf.ia2.gms.service.GroupsService;
@@ -277,6 +278,28 @@ public class JWTWebServiceController {
        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
    }
    }


    @GetMapping(value = "/check-invited-registration", produces = MediaType.TEXT_PLAIN_VALUE)
    public void completeInvitedRegistrationIfNecessary(Principal principal, HttpServletResponse response) throws IOException {

        String userId = principal.getName();

        Set<String> groupIds = new HashSet<>();
        for (InvitedRegistration invitedRegistration : invitedRegistrationManager.completeInvitedRegistrationIfNecessary(userId)) {
            groupIds.addAll(invitedRegistration.getGroupsPermissions().keySet());
        }
        List<GroupEntity> groups = groupsDAO.findGroupsByIds(groupIds);

        if (!groups.isEmpty()) {
            List<String> names = groupNameService.getGroupsNames(groups);
            try ( PrintWriter pw = new PrintWriter(response.getOutputStream())) {

                for (String name : names) {
                    pw.println(name);
                }
            }
        }
    }

    @PostMapping(value = "/invited-registration", produces = MediaType.TEXT_PLAIN_VALUE)
    @PostMapping(value = "/invited-registration", produces = MediaType.TEXT_PLAIN_VALUE)
    public void addInvitedRegistration(@RequestParam("token_hash") String tokenHash, @RequestParam("email") String email,
    public void addInvitedRegistration(@RequestParam("token_hash") String tokenHash, @RequestParam("email") String email,
            @RequestParam("groups") String groupNamesAndPermissionsParam, HttpServletResponse response) {
            @RequestParam("groups") String groupNamesAndPermissionsParam, HttpServletResponse response) {
+60 −20
Original line number Original line Diff line number Diff line
package it.inaf.ia2.gms.manager;
package it.inaf.ia2.gms.manager;


import it.inaf.ia2.gms.authn.SessionData;
import it.inaf.ia2.gms.exception.BadRequestException;
import it.inaf.ia2.gms.exception.BadRequestException;
import it.inaf.ia2.gms.exception.NotFoundException;
import it.inaf.ia2.gms.exception.NotFoundException;
import it.inaf.ia2.gms.exception.UnauthorizedException;
import it.inaf.ia2.gms.exception.UnauthorizedException;
@@ -12,6 +13,7 @@ import it.inaf.ia2.gms.persistence.MembershipsDAO;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.GroupEntity;
import it.inaf.ia2.gms.persistence.model.InvitedRegistration;
import it.inaf.ia2.gms.persistence.model.InvitedRegistration;
import it.inaf.ia2.gms.persistence.model.MembershipEntity;
import it.inaf.ia2.gms.persistence.model.MembershipEntity;
import it.inaf.ia2.gms.rap.RapClient;
import it.inaf.ia2.gms.service.PermissionsService;
import it.inaf.ia2.gms.service.PermissionsService;
import java.nio.charset.StandardCharsets;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.MessageDigest;
@@ -23,6 +25,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map;
import java.util.Optional;
import java.util.Optional;
import java.util.UUID;
import java.util.UUID;
import java.util.stream.Collectors;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.stereotype.Service;
@@ -48,9 +51,15 @@ public class InvitedRegistrationManager extends UserAwareComponent {
    private InvitedRegistrationDAO invitedRegistrationDAO;
    private InvitedRegistrationDAO invitedRegistrationDAO;


    @Autowired
    @Autowired
    private LoggingDAO loggingDAO;
    private RapClient rapClient;

    @Autowired
    private SessionData sessionData;


    @Autowired
    @Autowired
    private LoggingDAO loggingDAO;

    @Autowired(required = false)
    private HttpSession httpSession;
    private HttpSession httpSession;


    public void addInvitedRegistration(String tokenHash, String email, Map<GroupEntity, Permission> groupsPermissions) {
    public void addInvitedRegistration(String tokenHash, String email, Map<GroupEntity, Permission> groupsPermissions) {
@@ -93,12 +102,48 @@ public class InvitedRegistrationManager extends UserAwareComponent {
        }
        }
    }
    }


    public Optional<InvitedRegistration> completeInvitedRegistrationIfNecessary() {
    public Optional<List<InvitedRegistration>> completeInvitedRegistrationIfNecessary() {

        List<InvitedRegistration> invitedRegistrations = completeInvitedRegistrationIfNecessary(sessionData.getUserId());

        InvitedRegistration invitedRegistrationFromToken = (InvitedRegistration) httpSession.getAttribute(INVITED_REGISTRATION);

        if (invitedRegistrationFromToken != null) {

            boolean alreadyDone = invitedRegistrations.stream().map(reg -> reg.getId())
                    .anyMatch(id -> id.equals(invitedRegistrationFromToken.getId()));

            if (!alreadyDone) {
                completeInvitedRegistration(invitedRegistrationFromToken);
                invitedRegistrations.add(invitedRegistrationFromToken);
            }
            httpSession.removeAttribute(INVITED_REGISTRATION);
        }

        return Optional.ofNullable(invitedRegistrations.isEmpty() ? null : invitedRegistrations);
    }

    /**
     * This method can be called from web service, since it doesn't rely on
     * session.
     */
    public List<InvitedRegistration> completeInvitedRegistrationIfNecessary(String userId) {

        List<InvitedRegistration> invitedRegistrations = new ArrayList<>();

        List<String> emailAddresses = rapClient.getUser(userId).getIdentities().stream()
                .map(identity -> identity.getEmail())
                .collect(Collectors.toList());


        InvitedRegistration invitedRegistration = (InvitedRegistration) httpSession.getAttribute(INVITED_REGISTRATION);
        for (InvitedRegistration invitedRegistration : invitedRegistrationDAO.getInvitedRegistrationsFromEmailAddresses(emailAddresses)) {
            completeInvitedRegistration(invitedRegistration);
            invitedRegistrations.add(invitedRegistration);
        }


        if (invitedRegistration != null) {
        return invitedRegistrations;
    }


    private void completeInvitedRegistration(InvitedRegistration invitedRegistration) {
        for (Map.Entry<String, Permission> entry : invitedRegistration.getGroupsPermissions().entrySet()) {
        for (Map.Entry<String, Permission> entry : invitedRegistration.getGroupsPermissions().entrySet()) {
            String groupId = entry.getKey();
            String groupId = entry.getKey();
            String userId = getCurrentUserId();
            String userId = getCurrentUserId();
@@ -117,11 +162,6 @@ public class InvitedRegistrationManager extends UserAwareComponent {
        // FIXME (workaround): separated update for user and done in order to use triggers
        // FIXME (workaround): separated update for user and done in order to use triggers
        invitedRegistrationDAO.setRegistrationUser(invitedRegistration);
        invitedRegistrationDAO.setRegistrationUser(invitedRegistration);
        invitedRegistrationDAO.setRegistrationDone(invitedRegistration);
        invitedRegistrationDAO.setRegistrationDone(invitedRegistration);

            httpSession.removeAttribute(INVITED_REGISTRATION);
        }

        return Optional.ofNullable(invitedRegistration);
    }
    }


    public List<InvitedRegistrationItem> getInvitedRegistrationsForGroup(GroupEntity group) {
    public List<InvitedRegistrationItem> getInvitedRegistrationsForGroup(GroupEntity group) {
Loading