Skip to content

Commit 11e3194

Browse files
committed
Add charset rule
1 parent 90f472d commit 11e3194

File tree

3 files changed

+83
-12
lines changed

3 files changed

+83
-12
lines changed

pom.xml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,8 @@
4444
<dependency>
4545
<groupId>org.javawebstack</groupId>
4646
<artifactId>abstract-data</artifactId>
47-
<version>1.0.4</version>
47+
<version>1.0.6</version>
4848
</dependency>
49-
<!--- Temporary fix for transitive vulnerabilities -->
50-
<dependency>
51-
<groupId>org.yaml</groupId>
52-
<artifactId>snakeyaml</artifactId>
53-
<version>1.33</version>
54-
</dependency>
55-
<!--- ============================================ -->
5649
<dependency>
5750
<groupId>com.sun.mail</groupId>
5851
<artifactId>javax.mail</artifactId>

src/main/java/org/javawebstack/validator/Validator.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import org.javawebstack.abstractdata.AbstractArray;
44
import org.javawebstack.abstractdata.AbstractElement;
5-
import org.javawebstack.abstractdata.AbstractMapper;
65
import org.javawebstack.abstractdata.AbstractNull;
6+
import org.javawebstack.abstractdata.mapper.Mapper;
77
import org.javawebstack.abstractdata.mapper.MapperTypeSpec;
88
import org.javawebstack.validator.rule.*;
99

@@ -45,6 +45,7 @@ public class Validator {
4545
registerRuleType("email", EmailRule.Validator.class, EmailRule.class);
4646
registerRuleType("regex", RegexRule.Validator.class, RegexRule.class);
4747
registerRuleType("uuid", UUIDRule.Validator.class, UUIDRule.class);
48+
registerRuleType("charset", CharsetRule.Validator.class, CharsetRule.class);
4849
}
4950

5051
private final Map<String[], ValidationConfig> rules = new HashMap<>();
@@ -121,16 +122,16 @@ public static Validator getValidator(Class<?> type) {
121122
return validator;
122123
}
123124

124-
public static <T> T map(ValidationContext context, Class<T> type, AbstractElement element, AbstractMapper mapper) {
125+
public static <T> T map(ValidationContext context, Class<T> type, AbstractElement element, Mapper mapper) {
125126
Validator validator = getValidator(type);
126127
ValidationResult result = validator.validate(context, element);
127128
if (!result.isValid())
128129
throw new ValidationException(result);
129-
return mapper.fromAbstract(element, type);
130+
return mapper.map(element, type);
130131
}
131132

132133
public static <T> T map(ValidationContext context, Class<T> type, AbstractElement element) {
133-
return map(context, type, element, new AbstractMapper());
134+
return map(context, type, element, new Mapper());
134135
}
135136

136137
public Validator rule(String[] key, ValidationRule... rules) {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.javawebstack.validator.rule;
2+
3+
import org.javawebstack.abstractdata.AbstractElement;
4+
import org.javawebstack.validator.ValidationContext;
5+
6+
import java.lang.annotation.ElementType;
7+
import java.lang.annotation.Retention;
8+
import java.lang.annotation.RetentionPolicy;
9+
import java.lang.annotation.Target;
10+
import java.lang.reflect.Field;
11+
import java.util.Locale;
12+
13+
@Target(ElementType.FIELD)
14+
@Retention(RetentionPolicy.RUNTIME)
15+
public @interface CharsetRule {
16+
17+
String value() default "";
18+
boolean upper() default false;
19+
boolean lower() default false;
20+
boolean numeric() default false;
21+
boolean accents() default false;
22+
23+
class Validator implements ValidationRule {
24+
25+
private static final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
26+
private static final String ACCENTS = "äëïöüéàèùâêîôûç";
27+
28+
private final String charset;
29+
30+
public Validator(CharsetRule rule) {
31+
this(makeCharset(rule));
32+
}
33+
34+
public Validator(String charset) {
35+
this.charset = charset;
36+
}
37+
38+
public Validator(String[] params) {
39+
this(params.length > 0 ? params[0] : "");
40+
}
41+
42+
public String validate(ValidationContext context, Field field, AbstractElement value) {
43+
if (value == null || value.isNull())
44+
return null;
45+
if (!value.isPrimitive())
46+
return "Not a string value";
47+
char[] chars = value.string().toCharArray();
48+
for(int i=0; i<chars.length; i++) {
49+
char c = chars[i];
50+
if(!charset.contains(String.valueOf(c))) {
51+
return String.format("Forbidden character '%c' at position %d", c, i);
52+
}
53+
}
54+
return null;
55+
}
56+
57+
private static String makeCharset(CharsetRule rule) {
58+
StringBuilder sb = new StringBuilder(rule.value());
59+
if(rule.lower()) {
60+
sb.append(ALPHA);
61+
if(rule.accents())
62+
sb.append(ACCENTS);
63+
}
64+
if(rule.upper()) {
65+
sb.append(ALPHA.toUpperCase(Locale.ROOT));
66+
if(rule.accents())
67+
sb.append(ACCENTS.toUpperCase(Locale.ROOT));
68+
}
69+
if(rule.numeric()) {
70+
sb.append("1234567890");
71+
}
72+
return sb.toString();
73+
}
74+
75+
}
76+
77+
}

0 commit comments

Comments
 (0)