diff --git a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java index b663d008d55a00c4ff5ed43b17e860ebda281cfc..a609a07474944d787abb25d353fb5e7bc3d73b53 100644 --- a/src/main/java/org/codelibs/fess/taglib/FessFunctions.java +++ b/src/main/java/org/codelibs/fess/taglib/FessFunctions.java @@ -74,6 +74,9 @@ public class FessFunctions { private static final String PDF_DATE = "pdf_date"; + private static final Pattern EMAIL_ADDRESS_PATTERN = Pattern.compile("[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}", + Pattern.CASE_INSENSITIVE); + private static LoadingCache<String, Long> resourceHashCache = CacheBuilder.newBuilder().maximumSize(1000) .expireAfterWrite(10, TimeUnit.MINUTES).build(new CacheLoader<String, Long>() { @Override @@ -419,4 +422,11 @@ public class FessFunctions { .map(user -> user.hasRoles(roles) || user.hasRoles(ComponentUtil.getFessConfig().getAuthenticationAdminRolesAsArray())) .orElse(false); } + + public static String maskEmail(final String value) { + if (value == null) { + return StringUtil.EMPTY; + } + return EMAIL_ADDRESS_PATTERN.matcher(value).replaceAll("******@****.***"); + } } diff --git a/src/main/webapp/WEB-INF/fe.tld b/src/main/webapp/WEB-INF/fe.tld index 561a578481fee4ca9010f3a93df9258f0de3b9f0..e8c7bb6591684f1fcae833c1dfa46854ecbe108a 100644 --- a/src/main/webapp/WEB-INF/fe.tld +++ b/src/main/webapp/WEB-INF/fe.tld @@ -258,6 +258,14 @@ <example>${fe:formatCode("L", "prettyprint", doc.mimetype, doc.content_description)}</example> </function> + <function> + <description>Mask e-mail address.</description> + <name>maskEmail</name> + <function-class>org.codelibs.fess.taglib.FessFunctions</function-class> + <function-signature>java.lang.String maskEmail(java.lang.String)</function-signature> + <example>${fe:maskEmail(doc.content_description)}</example> + </function> + <function> <description>Get a message from properties files.</description> <name>message</name> diff --git a/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java b/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java index be5a45afd2c72067d26261c272d928a700959592..acc01d3f0153efe6cd93744b7466b41828ec01b9 100644 --- a/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java +++ b/src/test/java/org/codelibs/fess/taglib/FessFunctionsTest.java @@ -115,6 +115,33 @@ public class FessFunctionsTest extends UnitFessTestCase { code = "aaa\nL10:\nL11:ccc"; value = FessFunctions.formatCode("L", "prettyprint", "text/plain", code); assertEquals("<pre class=\"prettyprint linenums:10\">\nccc</pre>", value); + } + + public void test_maskEmail() { + String value; + + value = FessFunctions.maskEmail(null); + assertEquals("", value); + + value = FessFunctions.maskEmail(""); + assertEquals("", value); + + value = FessFunctions.maskEmail("aaa bbb ccc"); + assertEquals("aaa bbb ccc", value); + + value = FessFunctions.maskEmail("aaa@bbb.ccc"); + assertEquals("******@****.***", value); + + value = FessFunctions.maskEmail("111.aaa@bbb.ccc"); + assertEquals("******@****.***", value); + + value = FessFunctions.maskEmail("111 aaa+@bbb.ccc 222"); + assertEquals("111 ******@****.*** 222", value); + + value = FessFunctions.maskEmail("あaaa@bbb.ccc1"); + assertEquals("あ******@****.***1", value); + value = FessFunctions.maskEmail("<aaa@bbb.ccc>"); + assertEquals("<******@****.***>", value); } }