2 * Copyright (c) 2010-2021 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.mielecloud.internal.config.servlet;
15 import java.io.IOException;
16 import java.util.Optional;
18 import javax.servlet.http.HttpServletRequest;
19 import javax.servlet.http.HttpServletResponse;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
24 * Servlet showing the pair account page.
26 * @author Björn Lange - Initial Contribution
29 public final class PairAccountServlet extends AbstractShowPageServlet {
30 private static final long serialVersionUID = 6565378471951635420L;
32 public static final String CLIENT_ID_PARAMETER_NAME = "clientId";
33 public static final String CLIENT_SECRET_PARAMETER_NAME = "clientSecret";
35 public static final String MISSING_CLIENT_ID_PARAMETER_NAME = "missingClientId";
36 public static final String MISSING_CLIENT_SECRET_PARAMETER_NAME = "missingClientSecret";
37 public static final String MISSING_BRIDGE_ID_PARAMETER_NAME = "missingBridgeId";
38 public static final String MISSING_EMAIL_PARAMETER_NAME = "missingEmail";
39 public static final String MALFORMED_BRIDGE_ID_PARAMETER_NAME = "malformedBridgeId";
40 public static final String MALFORMED_EMAIL_PARAMETER_NAME = "malformedEmail";
41 public static final String FAILED_TO_DERIVE_REDIRECT_URL_PARAMETER_NAME = "failedToDeriveRedirectUrl";
42 public static final String ONGOING_AUTHORIZATION_IN_STEP1_EXPIRES_IN_MINUTES_PARAMETER_NAME = "ongoingAuthorizationInStep1ExpiresInMinutes";
43 public static final String ONGOING_AUTHORIZATION_UNKNOWN_EXPIRY_TIME = "unknown";
44 public static final String NO_ONGOING_AUTHORIZATION_IN_STEP2_PARAMETER_NAME = "noOngoingAuthorizationInStep2";
45 public static final String MISSING_REQUEST_URL_PARAMETER_NAME = "missingRequestUrl";
47 private static final String PAIR_ACCOUNT_SKELETON = "pairing.html";
49 private static final String CLIENT_ID_PLACEHOLDER = "<!-- CLIENT ID -->";
50 private static final String CLIENT_SECRET_PLACEHOLDER = "<!-- CLIENT SECRET -->";
51 private static final String ERROR_MESSAGE_PLACEHOLDER = "<!-- ERROR MESSAGE -->";
54 * Creates a new {@link PairAccountServlet}.
56 * @param resourceLoader Loader for resources.
58 public PairAccountServlet(ResourceLoader resourceLoader) {
59 super(resourceLoader);
63 protected String handleGetRequest(HttpServletRequest request, HttpServletResponse response)
64 throws MieleHttpException, IOException {
65 String skeleton = getResourceLoader().loadResourceAsString(PAIR_ACCOUNT_SKELETON);
66 skeleton = renderClientIdAndClientSecret(request, skeleton);
67 skeleton = renderErrorMessage(request, skeleton);
71 private String renderClientIdAndClientSecret(HttpServletRequest request, String skeleton) {
72 String prefilledClientId = Optional.ofNullable(request.getParameter(CLIENT_ID_PARAMETER_NAME)).orElse("");
73 String prefilledClientSecret = Optional.ofNullable(request.getParameter(CLIENT_SECRET_PARAMETER_NAME))
75 return skeleton.replace(CLIENT_ID_PLACEHOLDER, prefilledClientId).replace(CLIENT_SECRET_PLACEHOLDER,
76 prefilledClientSecret);
79 private String renderErrorMessage(HttpServletRequest request, String skeleton) {
80 if (ServletUtil.isParameterEnabled(request, MISSING_CLIENT_ID_PARAMETER_NAME)) {
81 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
82 "<div class=\"alert alert-danger\" role=\"alert\">Missing client ID.</div>");
83 } else if (ServletUtil.isParameterEnabled(request, MISSING_CLIENT_SECRET_PARAMETER_NAME)) {
84 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
86 "<div class=\"alert alert-danger\" role=\"alert\">Missing client secret.</div>");
87 } else if (ServletUtil.isParameterEnabled(request, MISSING_BRIDGE_ID_PARAMETER_NAME)) {
88 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
89 "<div class=\"alert alert-danger\" role=\"alert\">Missing bridge ID.</div>");
90 } else if (ServletUtil.isParameterEnabled(request, MISSING_EMAIL_PARAMETER_NAME)) {
91 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
92 "<div class=\"alert alert-danger\" role=\"alert\">Missing e-mail address.</div>");
93 } else if (ServletUtil.isParameterEnabled(request, MALFORMED_BRIDGE_ID_PARAMETER_NAME)) {
94 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
95 "<div class=\"alert alert-danger\" role=\"alert\">Malformed bridge ID. A bridge ID may only contain letters, numbers, '-' and '_'!</div>");
96 } else if (ServletUtil.isParameterEnabled(request, MALFORMED_EMAIL_PARAMETER_NAME)) {
97 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
98 "<div class=\"alert alert-danger\" role=\"alert\">Malformed e-mail address.</div>");
99 } else if (ServletUtil.isParameterEnabled(request, FAILED_TO_DERIVE_REDIRECT_URL_PARAMETER_NAME)) {
100 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
101 "<div class=\"alert alert-danger\" role=\"alert\">Failed to derive redirect URL.</div>");
102 } else if (ServletUtil.isParameterPresent(request,
103 ONGOING_AUTHORIZATION_IN_STEP1_EXPIRES_IN_MINUTES_PARAMETER_NAME)) {
104 String minutesUntilExpiry = request
105 .getParameter(ONGOING_AUTHORIZATION_IN_STEP1_EXPIRES_IN_MINUTES_PARAMETER_NAME);
106 if (ONGOING_AUTHORIZATION_UNKNOWN_EXPIRY_TIME.equals(minutesUntilExpiry)) {
107 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
108 "<div class=\"alert alert-danger\" role=\"alert\">There is an authorization ongoing at the moment. Please complete that authorization prior to starting a new one or try again later.</div>");
110 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
111 "<div class=\"alert alert-danger\" role=\"alert\">There is an authorization ongoing at the moment. Please complete that authorization prior to starting a new one or try again in "
112 + minutesUntilExpiry + " minutes.</div>");
114 } else if (ServletUtil.isParameterEnabled(request, NO_ONGOING_AUTHORIZATION_IN_STEP2_PARAMETER_NAME)) {
115 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
116 "<div class=\"alert alert-danger\" role=\"alert\">Failed to start auhtorization process. Are you trying to perform multiple authorizations at the same time?</div>");
117 } else if (ServletUtil.isParameterEnabled(request, MISSING_REQUEST_URL_PARAMETER_NAME)) {
118 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER,
119 "<div class=\"alert alert-danger\" role=\"alert\">Missing request URL. Please try again.</div>");
121 return skeleton.replace(ERROR_MESSAGE_PLACEHOLDER, "");