diff --git a/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/AbstractAuthPageServlet.java b/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/AbstractAuthPageServlet.java index 0511074be5a..217ec69629d 100644 --- a/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/AbstractAuthPageServlet.java +++ b/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/AbstractAuthPageServlet.java @@ -21,6 +21,8 @@ import java.time.Instant; import java.util.HashMap; import java.util.Map; +import java.util.ResourceBundle; +import java.util.ResourceBundle.Control; import java.util.UUID; import javax.servlet.http.HttpServlet; @@ -34,6 +36,7 @@ import org.openhab.core.auth.User; import org.openhab.core.auth.UserRegistry; import org.openhab.core.auth.UsernamePasswordCredentials; +import org.openhab.core.i18n.LocaleProvider; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Reference; import org.osgi.service.http.HttpService; @@ -51,11 +54,14 @@ public abstract class AbstractAuthPageServlet extends HttpServlet { protected static final long serialVersionUID = 5340598701104679840L; + private static final String MESSAGES_BUNDLE_NAME = "messages"; + private final Logger logger = LoggerFactory.getLogger(AbstractAuthPageServlet.class); protected HttpService httpService; protected UserRegistry userRegistry; protected AuthenticationProvider authProvider; + protected LocaleProvider localeProvider; protected @Nullable Instant lastAuthenticationFailure; protected int authenticationFailureCount = 0; @@ -64,10 +70,12 @@ public abstract class AbstractAuthPageServlet extends HttpServlet { protected String pageTemplate; public AbstractAuthPageServlet(BundleContext bundleContext, @Reference HttpService httpService, - @Reference UserRegistry userRegistry, @Reference AuthenticationProvider authProvider) { + @Reference UserRegistry userRegistry, @Reference AuthenticationProvider authProvider, + @Reference LocaleProvider localeProvider) { this.httpService = httpService; this.userRegistry = userRegistry; this.authProvider = authProvider; + this.localeProvider = localeProvider; pageTemplate = ""; URL resource = bundleContext.getBundle().getResource("pages/authorize.html"); @@ -80,6 +88,23 @@ public AbstractAuthPageServlet(BundleContext bundleContext, @Reference HttpServi } } + protected String getPageTemplate() { + String template = pageTemplate; + for (String[] replace : new String[][] { // + { "{usernamePlaceholder}", "auth.placeholder.username" }, + { "{passwordPlaceholder}", "auth.placeholder.password" }, + { "{newPasswordPlaceholder}", "auth.placeholder.newpassword" }, + { "{repeatPasswordPlaceholder}", "auth.placeholder.repeatpassword" }, + { "{tokenNamePlaceholder}", "auth.placeholder.tokenname" }, + { "{tokenScopePlaceholder}", "auth.placeholder.tokenscope" }, + { "{returnButtonLabel}", "auth.button.return" } // + }) { + template = template.replace(replace[0], getLocalizedMessage(replace[1])); + } + + return template; + } + protected abstract String getPageBody(Map params, String message, boolean hideForm); protected abstract String getFormFields(Map params); @@ -123,7 +148,13 @@ protected void processFailedLogin(HttpServletResponse resp, Map%s access to %s:", scope, clientId); + message = String.format(getLocalizedMessage("auth.login.prompt"), scope, clientId); } resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().append(getPageBody(params, message, false)); @@ -153,8 +154,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S // first verify the password confirmation and bail out if necessary if (!params.containsKey("password_repeat") || !password.equals(params.get("password_repeat")[0])) { resp.setContentType("text/html;charset=UTF-8"); - // TODO: i18n - resp.getWriter().append(getPageBody(params, "Passwords don't match, please try again.", false)); + resp.getWriter() + .append(getPageBody(params, getLocalizedMessage("auth.password.confirm.fail"), false)); resp.getWriter().close(); return; } @@ -202,9 +203,9 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S @Override protected String getPageBody(Map params, String message, boolean hideForm) { - String responseBody = pageTemplate.replace("{form_fields}", getFormFields(params)); + String responseBody = getPageTemplate().replace("{form_fields}", getFormFields(params)); String repeatPasswordFieldType = isSignupMode() ? "password" : "hidden"; - String buttonLabel = isSignupMode() ? "Create Account" : "Sign In"; // TODO: i18n + String buttonLabel = getLocalizedMessage(isSignupMode() ? "auth.button.createaccount" : "auth.button.signin"); responseBody = responseBody.replace("{message}", message); responseBody = responseBody.replace("{formAction}", "/auth"); responseBody = responseBody.replace("{formClass}", "show"); diff --git a/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/ChangePasswordPageServlet.java b/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/ChangePasswordPageServlet.java index fdefbb80800..fa0dcfdd766 100644 --- a/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/ChangePasswordPageServlet.java +++ b/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/ChangePasswordPageServlet.java @@ -25,6 +25,7 @@ import org.openhab.core.auth.ManagedUser; import org.openhab.core.auth.User; import org.openhab.core.auth.UserRegistry; +import org.openhab.core.i18n.LocaleProvider; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -51,8 +52,9 @@ public class ChangePasswordPageServlet extends AbstractAuthPageServlet { @Activate public ChangePasswordPageServlet(BundleContext bundleContext, @Reference HttpService httpService, - @Reference UserRegistry userRegistry, @Reference AuthenticationProvider authProvider) { - super(bundleContext, httpService, userRegistry, authProvider); + @Reference UserRegistry userRegistry, @Reference AuthenticationProvider authProvider, + @Reference LocaleProvider localeProvider) { + super(bundleContext, httpService, userRegistry, authProvider, localeProvider); try { httpService.registerServlet("/changePassword", this, null, null); } catch (NamespaceException | ServletException e) { @@ -102,8 +104,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S if (!params.containsKey("password_repeat") || !newPassword.equals(params.get("password_repeat")[0])) { resp.setContentType("text/html;charset=UTF-8"); - // TODO: i18n - resp.getWriter().append(getPageBody(params, "Passwords don't match, please try again.", false)); + resp.getWriter().append(getPageBody(params, getLocalizedMessage("auth.password.confirm.fail"), false)); resp.getWriter().close(); return; } @@ -117,7 +118,7 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S } resp.setContentType("text/html;charset=UTF-8"); - resp.getWriter().append(getResultPageBody(params, "Password changed.")); // TODO: i18n + resp.getWriter().append(getResultPageBody(params, getLocalizedMessage("auth.changepassword.success"))); resp.getWriter().close(); } catch (AuthenticationException e) { processFailedLogin(resp, params, e.getMessage()); @@ -126,8 +127,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S @Override protected String getPageBody(Map params, String message, boolean hideForm) { - String responseBody = pageTemplate.replace("{form_fields}", getFormFields(params)); - String buttonLabel = "Change Password"; // TODO: i18n + String responseBody = getPageTemplate().replace("{form_fields}", getFormFields(params)); + String buttonLabel = getLocalizedMessage("auth.button.changepassword"); responseBody = responseBody.replace("{message}", message); responseBody = responseBody.replace("{formAction}", "/changePassword"); responseBody = responseBody.replace("{formClass}", hideForm ? "hide" : "show"); @@ -141,7 +142,7 @@ protected String getPageBody(Map params, String message, boole } protected String getResultPageBody(Map params, String message) { - String responseBody = pageTemplate.replace("{form_fields}", ""); + String responseBody = getPageTemplate().replace("{form_fields}", ""); responseBody = responseBody.replace("{message}", message); responseBody = responseBody.replace("{formAction}", "/changePassword"); responseBody = responseBody.replace("{formClass}", "hide"); diff --git a/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/CreateAPITokenPageServlet.java b/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/CreateAPITokenPageServlet.java index 2a470ef8449..cbb4266b75c 100644 --- a/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/CreateAPITokenPageServlet.java +++ b/bundles/org.opensmarthouse.core.io.http.auth/src/main/java/org/openhab/core/io/http/auth/internal/CreateAPITokenPageServlet.java @@ -25,6 +25,7 @@ import org.openhab.core.auth.ManagedUser; import org.openhab.core.auth.User; import org.openhab.core.auth.UserRegistry; +import org.openhab.core.i18n.LocaleProvider; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -51,8 +52,9 @@ public class CreateAPITokenPageServlet extends AbstractAuthPageServlet { @Activate public CreateAPITokenPageServlet(BundleContext bundleContext, @Reference HttpService httpService, - @Reference UserRegistry userRegistry, @Reference AuthenticationProvider authProvider) { - super(bundleContext, httpService, userRegistry, authProvider); + @Reference UserRegistry userRegistry, @Reference AuthenticationProvider authProvider, + @Reference LocaleProvider localeProvider) { + super(bundleContext, httpService, userRegistry, authProvider, localeProvider); try { httpService.registerServlet("/createApiToken", this, null, null); } catch (NamespaceException | ServletException e) { @@ -65,9 +67,8 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se Map params = req.getParameterMap(); try { - String message = "Create a new API token to authorize external services."; + String message = getLocalizedMessage("auth.createapitoken.prompt"); - // TODO: i18n resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().append(getPageBody(params, message, false)); resp.getWriter().close(); @@ -112,18 +113,16 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S if (((ManagedUser) user).getApiTokens().stream() .anyMatch(apiToken -> apiToken.getName().equals(tokenName))) { resp.setContentType("text/html;charset=UTF-8"); - // TODO: i18n resp.getWriter().append( - getPageBody(params, "A token with the same name already exists, please try again.", false)); + getPageBody(params, getLocalizedMessage("auth.createapitoken.name.unique.fail"), false)); resp.getWriter().close(); return; } if (!tokenName.matches("[a-zA-Z0-9]*")) { resp.setContentType("text/html;charset=UTF-8"); - // TODO: i18n resp.getWriter().append( - getPageBody(params, "Invalid token name, please use alphanumeric characters only.", false)); + getPageBody(params, getLocalizedMessage("auth.createapitoken.name.format.fail"), false)); resp.getWriter().close(); return; } @@ -132,11 +131,12 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S throw new AuthenticationException("User is not managed"); } - // TODO: i18n - String resultMessage = "New token created:

" + newApiToken + ""; - resultMessage += "

Please copy it now, it will not be shown again."; + String resultMessage = getLocalizedMessage("auth.createapitoken.success") + "

" + + newApiToken + ""; + resultMessage += "

" + getLocalizedMessage("auth.createapitoken.success.footer") + + ""; resp.setContentType("text/html;charset=UTF-8"); - resp.getWriter().append(getResultPageBody(params, resultMessage)); // TODO: i18n + resp.getWriter().append(getResultPageBody(params, resultMessage)); resp.getWriter().close(); } catch (AuthenticationException e) { processFailedLogin(resp, params, e.getMessage()); @@ -145,8 +145,8 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S @Override protected String getPageBody(Map params, String message, boolean hideForm) { - String responseBody = pageTemplate.replace("{form_fields}", getFormFields(params)); - String buttonLabel = "Create API Token"; // TODO: i18n + String responseBody = getPageTemplate().replace("{form_fields}", getFormFields(params)); + String buttonLabel = getLocalizedMessage("auth.button.createapitoken"); responseBody = responseBody.replace("{message}", message); responseBody = responseBody.replace("{formAction}", "/createApiToken"); responseBody = responseBody.replace("{formClass}", hideForm ? "hide" : "show"); @@ -160,7 +160,7 @@ protected String getPageBody(Map params, String message, boole } protected String getResultPageBody(Map params, String message) { - String responseBody = pageTemplate.replace("{form_fields}", ""); + String responseBody = getPageTemplate().replace("{form_fields}", ""); responseBody = responseBody.replace("{message}", message); responseBody = responseBody.replace("{formAction}", "/createApiToken"); responseBody = responseBody.replace("{formClass}", "hide");