Java源码示例:io.vertx.reactivex.core.MultiMap

示例1
@Test
public void shouldAuthenticateClient() throws Exception {
    Client client = mock(Client.class);
    when(client.getClientId()).thenReturn("my-client-id");
    when(client.getClientSecret()).thenReturn("my-client-secret");

    HttpServerRequest httpServerRequest = mock(HttpServerRequest.class);
    VertxHttpHeaders vertxHttpHeaders = new VertxHttpHeaders();
    vertxHttpHeaders.add(HttpHeaders.AUTHORIZATION, "Basic bXktY2xpZW50LWlkOm15LWNsaWVudC1zZWNyZXQ=");
    when(httpServerRequest.headers()).thenReturn(MultiMap.newInstance(vertxHttpHeaders));

    CountDownLatch latch = new CountDownLatch(1);
    authProvider.handle(client, httpServerRequest, clientAsyncResult -> {
        latch.countDown();
        Assert.assertNotNull(clientAsyncResult);
        Assert.assertNotNull(clientAsyncResult.result());
    });

    assertTrue(latch.await(10, TimeUnit.SECONDS));
}
 
示例2
@Test
public void shouldNotAuthenticateClient_badClientSecret() throws Exception {
    Client client = mock(Client.class);
    when(client.getClientId()).thenReturn("my-client-id");
    when(client.getClientSecret()).thenReturn("my-client-secret");

    HttpServerRequest httpServerRequest = mock(HttpServerRequest.class);
    VertxHttpHeaders vertxHttpHeaders = new VertxHttpHeaders();
    vertxHttpHeaders.add(HttpHeaders.AUTHORIZATION, "Basic bXktY2xpZW50LWlkOm15LW90aGVyLWNsaWVudC1zZWNyZXQ=");
    when(httpServerRequest.headers()).thenReturn(MultiMap.newInstance(vertxHttpHeaders));

    CountDownLatch latch = new CountDownLatch(1);
    authProvider.handle(client, httpServerRequest, userAsyncResult -> {
        latch.countDown();
        Assert.assertNotNull(userAsyncResult);
        Assert.assertTrue(userAsyncResult.failed());
        Assert.assertTrue(userAsyncResult.cause() instanceof InvalidClientException);
    });

    assertTrue(latch.await(10, TimeUnit.SECONDS));
}
 
示例3
@Override
public Map<String, Set<String>> getRequestParameters() {
	MultiMap params = serverRequest.params();

	Map<String, Set<String>> map = new HashMap<>();
	for (String name : params.names()) {
		HashSet<String> set = new HashSet<>(params.getAll(name));
		map.put(name, set);
	}
	return map;
}
 
示例4
@Override
public Single<Boolean> isValid(String token) {

    if (!this.isEnabled()) {
        logger.debug("ReCaptchaService is disabled");
        return Single.just(true);
    }

    logger.debug("ReCaptchaService is enabled");

    if (token == null || "".equals(token.trim())) {
        logger.debug("Recaptcha token is empty");
        return Single.just(false);
    }

    return client.post(URI.create(serviceUrl).toString())
            .rxSendForm(MultiMap.caseInsensitiveMultiMap().set("secret", secretKey).set("response", token))
            .map(buffer -> {
                Map res = objectMapper.readValue(buffer.bodyAsString(), Map.class);

                Boolean success = (Boolean) res.getOrDefault("success", false);
                Double score = (Double) res.getOrDefault("score", 0.0d);

                logger.debug("ReCaptchaService success: {} score: {}", success, score);

                // Result should be successful and score above 0.5.
                return (success && score >= minScore);
            })
            .onErrorResumeNext(throwable -> {
                logger.error("An error occurred when trying to validate ReCaptcha token.", throwable);
                return Single.just(false);
            });
}
 
示例5
@Override
public void handle(RoutingContext context) {
    HttpServerRequest req = context.request();
    if (req.method() != HttpMethod.POST) {
        context.fail(405); // Must be a POST
    } else {
        if (!req.isExpectMultipart()) {
            throw new IllegalStateException("Form body not parsed - do you forget to include a BodyHandler?");
        }
        // check required parameters
        MultiMap params = req.formAttributes();
        Optional<String> missingParameter = requiredParams.stream().filter(param -> {
            String paramValue = params.get(param);
            if (paramValue == null) {
                logger.warn("No {} provided in form - did you forget to include a BodyHandler?", param);
                return true;
            }
            return false;
        }).findFirst();

        if (missingParameter.isPresent()) {
            redirectToPage(context, Collections.singletonMap(ERROR_PARAM, "missing_required_parameters"));
        } else {
            context.next();
        }
    }

}
 
示例6
private void saveEnrollment(RoutingContext routingContext) {
    MultiMap params = routingContext.request().formAttributes();
    final Boolean acceptEnrollment = Boolean.valueOf(params.get("user_mfa_enrollment"));
    final String factorId = params.get("factorId");
    final String sharedSecret = params.get("sharedSecret");
    if (factorId == null) {
        logger.warn("No factor id in form - did you forget to include factor id value ?");
        routingContext.fail(400);
        return;
    }
    if (sharedSecret == null) {
        logger.warn("No shared secret in form - did you forget to include shared secret value ?");
        routingContext.fail(400);
        return;
    }
    // manage enrolled factors
    // if user has skipped the enrollment process, continue
    final String returnURL = routingContext.session().get(FormLoginHandler.DEFAULT_RETURN_URL_PARAM);
    if (!acceptEnrollment) {
        routingContext.session().put(MFA_SKIPPED_KEY, true);
        doRedirect(routingContext.response(), returnURL);
        return;
    }
    // save enrolled factor for the current user and continue
    EnrolledFactor enrolledFactor = new EnrolledFactor();
    enrolledFactor.setFactorId(factorId);
    enrolledFactor.setSecurity(new EnrolledFactorSecurity(FactorSecurityType.SHARED_SECRET, sharedSecret));
    enrolledFactor.setCreatedAt(new Date());
    enrolledFactor.setUpdatedAt(enrolledFactor.getCreatedAt());
    routingContext.session().put(ENROLLED_FACTOR_KEY, enrolledFactor);
    doRedirect(routingContext.response(), returnURL);
}
 
示例7
private User convert(MultiMap params) {
    User user = new User();
    user.setUsername(params.get("username"));
    user.setFirstName(params.get("firstName"));
    user.setLastName(params.get("lastName"));
    user.setEmail(params.get("email"));
    user.setPassword(params.get("password"));
    user.setClient(params.get("client_id"));

    return user;


}
 
示例8
private void parseRequestParameters(RoutingContext context) {
    // invalid_request if the request is missing a required parameter, includes an
    // invalid parameter value, includes a parameter more than once, or is otherwise malformed.
    MultiMap requestParameters = context.request().params();
    Set<String> requestParametersNames = requestParameters.names();
    requestParametersNames.forEach(requestParameterName -> {
        List<String> requestParameterValue = requestParameters.getAll(requestParameterName);
        if (requestParameterValue.size() > 1) {
            throw new InvalidRequestException("Parameter [" + requestParameterName + "] is included more than once");
        }
    });
}
 
示例9
private void parseRequestParameters(RoutingContext context) {
    // invalid_request if the request is missing a required parameter, includes an
    // invalid parameter value, includes a parameter more than once, or is otherwise malformed.
    MultiMap requestParameters = context.request().params();
    Set<String> requestParametersNames = requestParameters.names();
    requestParametersNames.forEach(requestParameterName -> {
        List<String> requestParameterValue = requestParameters.getAll(requestParameterName);
        if (requestParameterValue.size() > 1) {
            throw new InvalidRequestException("Parameter [" + requestParameterName + "] is included more than once");
        }
    });
}
 
示例10
@Test
public void shouldCreateRequest_additionalParameters() {
    List<Map.Entry<String, String>> entries = new ArrayList<>();
    entries.add(new Parameter<>(Parameters.CLIENT_ID, "client-id"));
    entries.add(new Parameter<>(Parameters.SCOPE, "scope"));
    entries.add(new Parameter<>(Parameters.GRANT_TYPE, "grant_type"));
    entries.add(new Parameter<>("custom", "additional-parameter"));

    io.vertx.core.MultiMap multiMap = mock(io.vertx.core.MultiMap.class);
    when(multiMap.entries()).thenReturn(entries);

    MultiMap rxMultiMap = mock(MultiMap.class);
    when(rxMultiMap.getDelegate()).thenReturn(multiMap);

    io.vertx.core.http.HttpServerRequest httpServerRequest = mock(io.vertx.core.http.HttpServerRequest.class);
    when(httpServerRequest.method()).thenReturn(HttpMethod.POST);

    HttpServerRequest rxHttpServerRequest = mock(HttpServerRequest.class);
    when(rxHttpServerRequest.params()).thenReturn(rxMultiMap);
    when(rxHttpServerRequest.params().get(Parameters.CLIENT_ID)).thenReturn("client-id");
    when(rxHttpServerRequest.params().get(Parameters.SCOPE)).thenReturn("scope");
    when(rxHttpServerRequest.params().get(Parameters.GRANT_TYPE)).thenReturn("grant_type");
    when(rxHttpServerRequest.params().entries()).thenReturn(entries);
    when(rxHttpServerRequest.getDelegate()).thenReturn(httpServerRequest);

    TokenRequest tokenRequest = tokenRequestFactory.create(rxHttpServerRequest);

    Assert.assertNotNull(tokenRequest);
    Assert.assertEquals("client-id", tokenRequest.getClientId());
    Assert.assertTrue(tokenRequest.getAdditionalParameters().size() == 1 && tokenRequest.getAdditionalParameters().containsKey("custom"));
}
 
示例11
@Test
public void shouldCreateRequest_additionalParameters() {
    List<Map.Entry<String, String>> entries = new ArrayList<>();
    entries.add(new Parameter<>(Parameters.CLIENT_ID, "client-id"));
    entries.add(new Parameter<>(Parameters.SCOPE, "scope"));
    entries.add(new Parameter<>("custom", "additional-parameter"));

    io.vertx.core.MultiMap multiMap = mock(io.vertx.core.MultiMap.class);
    when(multiMap.entries()).thenReturn(entries);

    MultiMap rxMultiMap = mock(MultiMap.class);
    when(rxMultiMap.getDelegate()).thenReturn(multiMap);

    io.vertx.core.http.HttpServerRequest httpServerRequest = mock(io.vertx.core.http.HttpServerRequest.class);
    when(httpServerRequest.method()).thenReturn(HttpMethod.POST);

    HttpServerRequest rxHttpServerRequest = mock(HttpServerRequest.class);
    when(rxHttpServerRequest.params()).thenReturn(rxMultiMap);
    when(rxHttpServerRequest.params().get(Parameters.CLIENT_ID)).thenReturn("client-id");
    when(rxHttpServerRequest.params().get(Parameters.SCOPE)).thenReturn("scope");
    when(rxHttpServerRequest.params().entries()).thenReturn(entries);
    when(rxHttpServerRequest.getDelegate()).thenReturn(httpServerRequest);

    AuthorizationRequest authorizationRequest = authorizationRequestFactory.create(rxHttpServerRequest);

    Assert.assertNotNull(authorizationRequest);
    Assert.assertEquals("client-id", authorizationRequest.getClientId());
    Assert.assertTrue(authorizationRequest.getAdditionalParameters().size() == 1 && authorizationRequest.getAdditionalParameters().containsKey("custom"));
}
 
示例12
private void verifyCode(RoutingContext routingContext) {
    io.gravitee.am.model.User endUser = ((io.gravitee.am.gateway.handler.common.vertx.web.auth.user.User) routingContext.user().getDelegate()).getUser();
    MultiMap params = routingContext.request().formAttributes();
    final String code = params.get("code");
    final String factorId = params.get("factorId");
    if (code == null) {
        logger.warn("No code in form - did you forget to include code value ?");
        routingContext.fail(400);
        return;
    }
    if (factorId == null) {
        logger.warn("No factor id in form - did you forget to include factor id value ?");
        routingContext.fail(400);
        return;
    }
    FactorProvider factorProvider = factorManager.get(factorId);
    EnrolledFactor enrolledFactor = getEnrolledFactor(routingContext, factorId, endUser);
    final String sharedSecret = enrolledFactor.getSecurity().getValue();
    verify(factorProvider, code, sharedSecret, h -> {
        if (h.failed()) {
            handleException(routingContext);
            return;
        }
        // save enrolled factor if needed and redirect to the original url
        final String returnURL = routingContext.session().get(FormLoginHandler.DEFAULT_RETURN_URL_PARAM);
        if (routingContext.session().get(ENROLLED_FACTOR_KEY) != null) {
            saveFactor(endUser.getId(), enrolledFactor, fh -> {
                if (fh.failed()) {
                    logger.error("An error occurs while saving enrolled factor for the current user", fh.cause());
                    handleException(routingContext);
                    return;
                }
                // clean session
                routingContext.session().remove(ENROLLED_FACTOR_KEY);
                // update user strong auth status
                routingContext.session().put(STRONG_AUTH_COMPLETED, true);
                doRedirect(routingContext.request().response(), returnURL);
            });
        } else {
            // update user strong auth status
            routingContext.session().put(STRONG_AUTH_COMPLETED, true);
            doRedirect(routingContext.request().response(), returnURL);
        }
    });
}
 
示例13
@Override
public void handle(RoutingContext context) {
    // retrieve the client in context
    Client client = context.get("client");

    // create the user
    MultiMap params = context.request().formAttributes();
    User user = convert(params);

    // register the user
    register(client, user, getAuthenticatedUser(context), h -> {
        // prepare response
        Map<String, String> queryParams = new HashMap<>();
        // add client_id parameter for future use
        if (client != null) {
            queryParams.put(Parameters.CLIENT_ID, client.getClientId());
        }

        // if failure, return to the register page with an error
        if (h.failed()) {
            if (h.cause() instanceof InvalidUserException) {
                queryParams.put(WARNING_PARAM, "invalid_user_information");
            } else if (h.cause() instanceof EmailFormatInvalidException) {
                queryParams.put(WARNING_PARAM, "invalid_email");
            } else {
                LOGGER.error("An error occurs while ending user registration", h.cause());
                queryParams.put(ERROR_PARAM, "registration_failed");
            }
            redirectToPage(context, queryParams, h.cause());
            return;
        }

        // handle response
        RegistrationResponse registrationResponse = h.result();
        // if auto login option is enabled add the user to the session
        if (registrationResponse.isAutoLogin()) {
            context.setUser(io.vertx.reactivex.ext.auth.User.newInstance(new io.gravitee.am.gateway.handler.common.vertx.web.auth.user.User(registrationResponse.getUser())));
        }
        // no redirect uri has been set, redirect to the default page
        if (registrationResponse.getRedirectUri() == null || registrationResponse.getRedirectUri().isEmpty()) {
            queryParams.put(SUCCESS_PARAM, "registration_succeed");
            redirectToPage(context, queryParams);
            return;
        }
        // else, redirect to the custom redirect_uri
        context.response()
                .putHeader(HttpHeaders.LOCATION, registrationResponse.getRedirectUri())
                .setStatusCode(302)
                .end();
    });
}
 
示例14
@Override
public void handle(RoutingContext routingContext) {
    final HttpServerRequest request = routingContext.request();
    final Session session = routingContext.session();
    final Client client = routingContext.get(CLIENT_CONTEXT_KEY);
    final io.gravitee.am.model.User user = ((User) routingContext.user().getDelegate()).getUser();
    final Set<String> requestedConsent = session.get(REQUESTED_CONSENT_CONTEXT_KEY);
    final AuthorizationRequest authorizationRequest = session.get(OAuth2Constants.AUTHORIZATION_REQUEST);

    // get user consent
    MultiMap params = routingContext.request().formAttributes();
    Map<String, String> userConsent = params.entries().stream()
            .filter(entry -> entry.getKey().startsWith(SCOPE_PREFIX))
            .collect(Collectors.toMap(scopeEntry -> scopeEntry.getKey(), scopeEntry -> params.get(USER_OAUTH_APPROVAL)));

    // compute user consent that have been approved / denied
    Set<String> approvedConsent = new HashSet<>();
    List<ScopeApproval> approvals = new ArrayList<>();
    for (String requestedScope : requestedConsent) {
        String approvalParameter = requestedScope;
        String value = userConsent.get(SCOPE_PREFIX + approvalParameter);
        value = value == null ? "" : value.toLowerCase();
        if ("true".equals(value) || value.startsWith("approve")) {
            approvedConsent.add(requestedScope);
            approvals.add(new ScopeApproval(authorizationRequest.transactionId(), user.getId(), client.getClientId(), domain.getId(),
                    requestedScope, ScopeApproval.ApprovalStatus.APPROVED));
        }
        else {
            approvals.add(new ScopeApproval(authorizationRequest.transactionId(), user.getId(), client.getClientId(), domain.getId(),
                    requestedScope, ScopeApproval.ApprovalStatus.DENIED));
        }
    }

    // save consent
    saveConsent(request, user, client, approvals, h -> {
        if (h.failed()) {
            routingContext.fail(h.cause());
            return;
        }

        boolean approved = (approvedConsent.isEmpty() && !requestedConsent.isEmpty()) ? false : true;
        authorizationRequest.setApproved(approved);
        authorizationRequest.setScopes(approvedConsent);
        authorizationRequest.setConsents(h.result());
        session.put(USER_CONSENT_COMPLETED_CONTEXT_KEY, true);
        routingContext.next();
    });
}
 
示例15
private Single<HttpResponse<Buffer>> processRequest(TemplateEngine templateEngine,
                                                    String httpURI,
                                                    HttpMethod httpMethod,
                                                    List<HttpHeader> httpHeaders,
                                                    String httpBody) {
    // prepare request
    final String evaluatedHttpURI = templateEngine.getValue(httpURI, String.class);
    final HttpRequest<Buffer> httpRequest = client.requestAbs(httpMethod, evaluatedHttpURI);

    // set headers
    if (httpHeaders != null) {
        httpHeaders.forEach(header -> {
            String extValue = templateEngine.getValue(header.getValue(), String.class);
            httpRequest.putHeader(header.getName(), extValue);
        });
    }

    // set body
    Single<HttpResponse<Buffer>> responseHandler;
    if (httpBody != null && !httpBody.isEmpty()) {
        String bodyRequest = templateEngine.getValue(httpBody, String.class);
        if (!httpRequest.headers().contains(HttpHeaders.CONTENT_TYPE)) {
            httpRequest.putHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(bodyRequest.length()));
            responseHandler = httpRequest.rxSendBuffer(Buffer.buffer(bodyRequest));
        } else {
            String contentTypeHeader = httpRequest.headers().get(HttpHeaders.CONTENT_TYPE);
            switch (contentTypeHeader) {
                case(MediaType.APPLICATION_JSON):
                    responseHandler = httpRequest.rxSendJsonObject(new JsonObject(bodyRequest));
                    break;
                case(MediaType.APPLICATION_FORM_URLENCODED):
                    Map<String, String> queryParameters = format(bodyRequest);
                    MultiMap multiMap = MultiMap.caseInsensitiveMultiMap();
                    multiMap.setAll(queryParameters);
                    responseHandler = httpRequest.rxSendForm(multiMap);
                    break;
                default:
                    httpRequest.putHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(bodyRequest.length()));
                    responseHandler = httpRequest.rxSendBuffer(Buffer.buffer(bodyRequest));
            }
        }
    } else {
        responseHandler = httpRequest.rxSend();
    }
    return responseHandler;
}