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>