This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new ef0b10c  [OPENMEETINGS-2561] captcha is configurable
ef0b10c is described below

commit ef0b10c24cece3fa398c9d0cb7de56a31a063016
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Wed Jan 27 14:14:20 2021 +0700

    [OPENMEETINGS-2561] captcha is configurable
---
 .../openmeetings/core/remote/BaseMockedTest.java   |  2 +-
 .../apache/openmeetings/db/dao/label/LabelDao.java | 31 ++++++---
 .../openmeetings/db/entity/label/OmLanguage.java   | 55 ++++++++++++++-
 .../apache/openmeetings/web/common/Captcha.html    |  2 +-
 .../apache/openmeetings/web/common/Captcha.java    | 20 ++++--
 .../src/main/webapp/languages/languages.xml        | 78 +++++++++++-----------
 6 files changed, 131 insertions(+), 57 deletions(-)

diff --git 
a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
 
b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
index 3565a64..6001045 100644
--- 
a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
+++ 
b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
@@ -99,7 +99,7 @@ public class BaseMockedTest {
                        streamMock.when(() -> 
AbstractStream.createRecorderEndpoint(any(MediaPipeline.class), anyString(), 
any(MediaProfileSpecType.class))).thenReturn(mock(RecorderEndpoint.class));
                        streamMock.when(() -> 
AbstractStream.createPlayerEndpoint(any(MediaPipeline.class), 
anyString())).thenReturn(mock(PlayerEndpoint.class));
 
-                       labelMock.when(() -> 
LabelDao.getLanguage(any(Long.class))).thenReturn(new 
OmLanguage(Locale.ENGLISH));
+                       labelMock.when(() -> 
LabelDao.getLanguage(any(Long.class))).thenReturn(new OmLanguage(1L, 
Locale.ENGLISH));
                        appHelpMock.when(() -> 
ApplicationHelper.ensureApplication(any(Long.class))).thenReturn(mock(IApplication.class));
                        task.run();
                }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
index 2e808fe..71c9f85 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
@@ -74,7 +74,7 @@ public class LabelDao implements 
IDataProviderDao<StringLabel>{
        private static final String KEY_ATTR = "key";
        public static final String APP_RESOURCES_PREFIX = "Application";
        public static final String APP_RESOURCES_SUFFIX = ".properties.xml";
-       private static final OmLanguage LNG_ENGLISH = new 
OmLanguage(Locale.ENGLISH);
+       private static final OmLanguage LNG_ENGLISH = new OmLanguage(1L, 
Locale.ENGLISH);
        private static final LinkedHashMap<Long, OmLanguage> languages = new 
LinkedHashMap<>();
        private static final ConcurrentHashMap<Locale, List<StringLabel>> 
labelCache = new ConcurrentHashMap<>();
        private static final Set<String> keys = new HashSet<>();
@@ -84,7 +84,12 @@ public class LabelDao implements 
IDataProviderDao<StringLabel>{
                Document d = XmlExport.createDocument();
                Element r = XmlExport.createRoot(d, "language");
                for (Entry<Long, OmLanguage> e : languages.entrySet()) {
-                       r.addElement("lang").addAttribute("id", "" + 
e.getKey()).addAttribute("code", e.getValue().getLocale().toLanguageTag());
+                       r.addElement("lang")
+                               .addAttribute("id", "" + e.getKey())
+                               .addAttribute("code", 
e.getValue().getLocale().toLanguageTag())
+                               .addAttribute("tip", e.getValue().getTip())
+                               .addAttribute("rangeStart", "" + 
e.getValue().getRangeStart())
+                               .addAttribute("rangeStart", "" + 
e.getValue().getRangeEnd());
                }
                XmlExport.toXml(getLangFile(), d);
        }
@@ -94,7 +99,7 @@ public class LabelDao implements 
IDataProviderDao<StringLabel>{
                for (Entry<Long, OmLanguage> e : languages.entrySet()) {
                        id = e.getKey();
                }
-               languages.put(id + 1, new OmLanguage(l));
+               languages.put(id + 1, new OmLanguage(id + 1, l));
                storeLanguages();
                labelCache.put(l, new ArrayList<>());
        }
@@ -121,7 +126,11 @@ public class LabelDao implements 
IDataProviderDao<StringLabel>{
                                if (id == 3L) {
                                        continue;
                                }
-                               languages.put(id, new 
OmLanguage(Locale.forLanguageTag(code)));
+                               languages.put(id, new OmLanguage(id, 
Locale.forLanguageTag(code))
+                                               
.setTip(item.attributeValue("tip"))
+                                               
.setRangeStart(Optional.ofNullable(item.attributeValue("rangeStart")).map(s -> 
s.charAt(0)).orElse('A'))
+                                               
.setRangeEnd(Optional.ofNullable(item.attributeValue("rangeEnd")).map(s -> 
s.charAt(0)).orElse('Z'))
+                                       );
                        }
                } catch (Exception e) {
                        log.error("Error while building language map");
@@ -215,11 +224,17 @@ public class LabelDao implements 
IDataProviderDao<StringLabel>{
                return getLanguage(id).getLocale();
        }
 
+       public static OmLanguage getOmLanguage(Locale loc, Long def) {
+               Optional<OmLanguage> lang = languages.entrySet().stream()
+                               .map(Entry::getValue)
+                               .filter(l -> l.getLocale().equals(loc)
+                                               || 
Locale.forLanguageTag(l.getLocale().getCountry()).equals(loc))
+                               .findFirst();
+               return lang.orElse(getLanguage(def));
+       }
+
        public static Long getLanguage(Locale loc, Long def) {
-               Optional<Long> lang = languages.entrySet().stream()
-                               .filter(e -> 
e.getValue().getLocale().equals(loc))
-                               .map(Entry::getKey).findFirst();
-               return lang.isPresent() ? lang.get() : def;
+               return getOmLanguage(loc, def).getId();
        }
 
        public static Set<Entry<Long, Locale>> getLanguages() {
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java
index 165e552..9ce28f1 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/label/OmLanguage.java
@@ -25,14 +25,23 @@ import org.apache.openmeetings.db.util.FormatHelper;
 
 public class OmLanguage implements Serializable {
        private static final long serialVersionUID = 1L;
+       private final long id;
        private final Locale locale;
        private final boolean rtl;
+       private String tip;
+       private char rangeStart;
+       private char rangeEnd;
 
-       public OmLanguage(Locale locale) {
+       public OmLanguage(Long id, Locale locale) {
+               this.id = id;
                this.locale = locale;
                this.rtl = FormatHelper.isRtlLanguage(locale.toLanguageTag());
        }
 
+       public long getId() {
+               return id;
+       }
+
        public Locale getLocale() {
                return locale;
        }
@@ -40,4 +49,48 @@ public class OmLanguage implements Serializable {
        public boolean isRtl() {
                return rtl;
        }
+
+       public String getTip() {
+               return tip;
+       }
+
+       public OmLanguage setTip(String tip) {
+               this.tip = tip;
+               return this;
+       }
+
+       public char getRangeStart() {
+               return rangeStart;
+       }
+
+       public OmLanguage setRangeStart(char rangeStart) {
+               this.rangeStart = rangeStart;
+               return this;
+       }
+
+       public char getRangeEnd() {
+               return rangeEnd;
+       }
+
+       public OmLanguage setRangeEnd(char rangeEnd) {
+               this.rangeEnd = rangeEnd;
+               return this;
+       }
+
+       @Override
+       public String toString() {
+               StringBuilder builder = new StringBuilder();
+               builder.append("OmLanguage [id=");
+               builder.append(id);
+               builder.append(", locale=");
+               builder.append(locale);
+               builder.append(", rtl=");
+               builder.append(rtl);
+               builder.append(", rangeStart=");
+               builder.append(rangeStart);
+               builder.append(", rangeEnd=");
+               builder.append(rangeEnd);
+               builder.append("]");
+               return builder.toString();
+       }
 }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
index 83fb55d..dd18d1e 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.html
@@ -21,7 +21,7 @@
 <!DOCTYPE html>
 <html xmlns:wicket="http://wicket.apache.org";>
 <wicket:panel>
-       <input type="text" wicket:id="captchaText" 
wicket:message="placeholder:captcha.text,title:captcha.text" 
class="captcha-text"/><br/>
+       <input type="text" wicket:id="captchaText" 
wicket:message="title:captcha.text" class="captcha-text"/><br/>
        <img wicket:id="captcha" class="captcha-img"/>
        <button wicket:id="refresh" 
wicket:message="alt:lbl.refresh,title:lbl.refresh"></button>
 </wicket:panel>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
index 953bfde..eec5dac 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/Captcha.java
@@ -18,10 +18,14 @@
  */
 package org.apache.openmeetings.web.common;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
 
 import java.security.SecureRandom;
 
+import org.apache.openmeetings.db.dao.label.LabelDao;
+import org.apache.openmeetings.db.entity.label.OmLanguage;
+import org.apache.openmeetings.web.app.WebSession;
+import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
 import org.apache.wicket.extensions.markup.html.captcha.CaptchaImageResource;
@@ -41,6 +45,7 @@ import 
de.agilecoders.wicket.extensions.markup.html.bootstrap.icon.FontAwesome5I
 
 public class Captcha extends Panel {
        private static final long serialVersionUID = 1L;
+       private OmLanguage lang;
        private String randomText;
        private final CaptchaImageResource captchaImageResource = new 
CaptchaImageResource() {
                private static final long serialVersionUID = 1L;
@@ -59,25 +64,26 @@ public class Captcha extends Panel {
 
                private String randomString(int min, int max) {
                        int num = randomInt(min, max);
-                       byte[] b = new byte[num];
+                       char[] b = new char[num];
                        for (int i = 0; i < num; ++i) {
-                               b[i] = (byte)randomInt('a', 'z');
+                               b[i] = (char)randomInt(lang.getRangeStart(), 
lang.getRangeEnd());
                        }
-                       return new String(b, UTF_8);
+                       return new String(b);
                }
        };
-       private final Image captcha = new Image("captcha", 
captchaImageResource);
+       private Image captcha = new Image("captcha", captchaImageResource);
        private final RequiredTextField<String> captchaText = new 
RequiredTextField<>("captchaText", Model.of(""));
 
        public Captcha(String id) {
                super(id);
                setOutputMarkupId(true);
-               add(captcha.setOutputMarkupId(true));
        }
 
        @Override
        protected void onInitialize() {
                super.onInitialize();
+               lang = LabelDao.getOmLanguage(WebSession.get().getLocale(), 
getDefaultLang());
+               add(captcha.setOutputMarkupId(true));
                add(captchaText.setLabel(new 
ResourceModel("captcha.text")).add(new IValidator<String>() {
                        private static final long serialVersionUID = 1L;
 
@@ -87,7 +93,7 @@ public class Captcha extends Panel {
                                        validatable.error(new 
ValidationError(getString("bad.captcha.text")));
                                }
                        }
-               }).setOutputMarkupId(true));
+               
}).setOutputMarkupId(true).add(AttributeModifier.append("placeholder", 
lang.getTip())));
                add(new BootstrapAjaxLink<>("refresh", Model.of(""), 
Buttons.Type.Outline_Info, new ResourceModel("lbl.refresh")) {
                        private static final long serialVersionUID = 1L;
 
diff --git a/openmeetings-web/src/main/webapp/languages/languages.xml 
b/openmeetings-web/src/main/webapp/languages/languages.xml
index b5d62e7..b3704e6 100644
--- a/openmeetings-web/src/main/webapp/languages/languages.xml
+++ b/openmeetings-web/src/main/webapp/languages/languages.xml
@@ -19,43 +19,43 @@
 
 -->
 <language xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
-       <lang id="1" code="en">english</lang>
-       <lang id="2" code="de">deutsch</lang>
-       <lang id="3" code="de-StudIP">deutsch (studIP)</lang>
-       <lang id="4" code="fr">french</lang>
-       <lang id="5" code="it">italian</lang>
-       <lang id="6" code="pt">portugues</lang>
-       <lang id="7" code="pt-br">portugues brazil</lang>
-       <lang id="8" code="es">spanish</lang>
-       <lang id="9" code="ru">russian</lang>
-       <lang id="10" code="sv">swedish</lang>
-       <lang id="11" code="zh-CN">chinese simplified</lang>
-       <lang id="12" code="zh-TW">chinese traditional</lang>
-       <lang id="13" code="ko">korean</lang>
-       <lang id="14" code="ar">arabic</lang>
-       <lang id="15" code="ja">japanese</lang>
-       <lang id="16" code="in">indonesian</lang>
-       <lang id="17" code="hu">hungarian</lang>
-       <lang id="18" code="tr">turkish</lang>
-       <lang id="19" code="uk">ukrainian</lang>
-       <lang id="20" code="th">thai</lang>
-       <lang id="21" code="fa">persian</lang>
-       <lang id="22" code="cs">czech</lang>
-       <lang id="23" code="gl">galician</lang>
-       <lang id="24" code="fi">finnish</lang>
-       <lang id="25" code="pl">polish</lang>
-       <lang id="26" code="el">greek</lang>
-       <lang id="27" code="nl">dutch</lang>
-       <lang id="28" code="iw">hebrew</lang>
-       <lang id="29" code="ca">catalan</lang>
-       <lang id="30" code="bg">bulgarian</lang>
-       <lang id="31" code="da">danish</lang>
-       <lang id="32" code="sk">slovak</lang>
-       <lang id="33" code="bn">bengali</lang>
-       <lang id="34" code="hi">hindi</lang>
-       <lang id="35" code="ta">tamil</lang>
-       <lang id="36" code="lo">lao</lang>
-       <lang id="37" code="ku">kurdish</lang>
-       <lang id="38" code="tk">turkmen</lang>
-       <lang id="39" code="ur">urdu</lang>
+       <lang id="1" code="en" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">english</lang>
+       <lang id="2" code="de" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">deutsch</lang>
+       <lang id="3" code="de-StudIP" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">deutsch (studIP)</lang>
+       <lang id="4" code="fr" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">french</lang>
+       <lang id="5" code="it" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">italian</lang>
+       <lang id="6" code="pt" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">portugues</lang>
+       <lang id="7" code="pt-br" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">portugues brazil</lang>
+       <lang id="8" code="es" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">spanish</lang>
+       <lang id="9" code="ru" tip="Только заглавные русские буквы А-Я" 
rangeStart="А" rangeEnd="Я">russian</lang>
+       <lang id="10" code="sv" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">swedish</lang>
+       <lang id="11" code="zh-CN" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">chinese simplified</lang>
+       <lang id="12" code="zh-TW" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">chinese traditional</lang>
+       <lang id="13" code="ko" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">korean</lang>
+       <lang id="14" code="ar" tip="Only capital Latin latters A-Z" 
rangeStart="ا" rangeEnd="غ">arabic</lang>
+       <lang id="15" code="ja" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">japanese</lang>
+       <lang id="16" code="in" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">indonesian</lang>
+       <lang id="17" code="hu" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">hungarian</lang>
+       <lang id="18" code="tr" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">turkish</lang>
+       <lang id="19" code="uk" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">ukrainian</lang>
+       <lang id="20" code="th" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">thai</lang>
+       <lang id="21" code="fa" tip="Only capital Latin latters A-Z" 
rangeStart="ا" rangeEnd="غ">persian</lang>
+       <lang id="22" code="cs" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">czech</lang>
+       <lang id="23" code="gl" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">galician</lang>
+       <lang id="24" code="fi" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">finnish</lang>
+       <lang id="25" code="pl" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">polish</lang>
+       <lang id="26" code="el" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">greek</lang>
+       <lang id="27" code="nl" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">dutch</lang>
+       <lang id="28" code="iw" tip="Only capital Latin latters A-Z" 
rangeStart="א" rangeEnd="ת">hebrew</lang>
+       <lang id="29" code="ca" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">catalan</lang>
+       <lang id="30" code="bg" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">bulgarian</lang>
+       <lang id="31" code="da" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">danish</lang>
+       <lang id="32" code="sk" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">slovak</lang>
+       <lang id="33" code="bn" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">bengali</lang>
+       <lang id="34" code="hi" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">hindi</lang>
+       <lang id="35" code="ta" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">tamil</lang>
+       <lang id="36" code="lo" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">lao</lang>
+       <lang id="37" code="ku" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">kurdish</lang>
+       <lang id="38" code="tk" tip="Only capital Latin latters A-Z" 
rangeStart="A" rangeEnd="Z">turkmen</lang>
+       <lang id="39" code="ur" tip="Only capital Latin latters A-Z" 
rangeStart="ا" rangeEnd="غ">urdu</lang>
 </language>

Reply via email to