Skip to content

Commit 134cfef

Browse files
authored
Merge pull request #2 from JavaWebStack/dev
Release 1.0.1
2 parents 7778c20 + 1d6819c commit 134cfef

File tree

12 files changed

+164
-38
lines changed

12 files changed

+164
-38
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
target
22
dependency-reduced-pom.xml
33
.idea
4-
*.iml
4+
*.iml
5+
.env

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ JWS Utilties
1616
<dependency>
1717
<groupId>org.javawebstack</groupId>
1818
<artifactId>web-utils</artifactId>
19-
<version>1.0.0</version>
19+
<version>1.0.1</version>
2020
</dependency>
2121
```

pom.xml

+3-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<properties>
88
<maven.compiler.source>8</maven.compiler.source>
99
<maven.compiler.target>8</maven.compiler.target>
10-
<buildVersion>1.0.0-SNAPSHOT</buildVersion>
10+
<buildVersion>1.0.1-SNAPSHOT</buildVersion>
1111
</properties>
1212

1313
<groupId>org.javawebstack</groupId>
@@ -44,22 +44,17 @@
4444
<dependency>
4545
<groupId>org.javawebstack</groupId>
4646
<artifactId>orm</artifactId>
47-
<version>1.0.1</version>
47+
<version>1.0.2</version>
4848
</dependency>
4949
<dependency>
5050
<groupId>org.javawebstack</groupId>
5151
<artifactId>http-server</artifactId>
52-
<version>1.0.1</version>
53-
</dependency>
54-
<dependency>
55-
<groupId>com.github.javafaker</groupId>
56-
<artifactId>javafaker</artifactId>
5752
<version>1.0.2</version>
5853
</dependency>
5954
<dependency>
6055
<groupId>org.junit.jupiter</groupId>
6156
<artifactId>junit-jupiter-engine</artifactId>
62-
<version>5.8.1</version>
57+
<version>5.9.0</version>
6358
<scope>test</scope>
6459
</dependency>
6560
</dependencies>

src/main/java/org/javawebstack/webutils/config/Config.java

+41-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
package org.javawebstack.webutils.config;
22

3+
import org.javawebstack.abstractdata.AbstractElement;
4+
import org.javawebstack.abstractdata.AbstractObject;
5+
36
import java.util.*;
7+
import java.util.function.Function;
8+
import java.util.stream.Collectors;
9+
import java.util.stream.Stream;
410

511
public class Config {
612

@@ -11,42 +17,41 @@ public Config set(String path, String key, String value) {
1117
return set(prefix + key.toLowerCase(Locale.ROOT), value);
1218
}
1319

14-
public Config add(String path, Map<String, String> data, Map<String, String> mapping) {
20+
public Config add(String path, Map<String, String> data, Function<String, String> mapping) {
1521
data.forEach((key, value) -> {
16-
if(mapping != null && mapping.containsKey(key))
17-
key = mapping.get(key);
18-
set(path, key, value);
22+
key = mapping.apply(key);
23+
if(key != null)
24+
set(path, key, value);
1925
});
2026
return this;
2127
}
2228

23-
public Config add(Map<String, String> data, Map<String, String> mapping) {
24-
return add(null, data, null);
29+
public Config add(Map<String, String> data, Function<String, String> mapping) {
30+
return add(null, data, mapping);
2531
}
2632

2733
public Config add(String path, Map<String, String> data) {
28-
return add(path, data, null);
34+
return add(path, data, k -> k);
2935
}
3036

3137
public Config add(Map<String, String> data) {
32-
return add(null, data, null);
38+
return add(null, data, k -> k);
3339
}
3440

35-
public Config add(String path, EnvFile envFile, Map<String, String> mapping) {
41+
public Config add(String path, EnvFile envFile, Function<String, String> mapping) {
3642
return add(path, envFile.getValues(), mapping);
3743
}
3844

3945
public Config add(String path, EnvFile envFile) {
40-
return add(path, envFile, null);
46+
return add(path, envFile, k -> k);
4147
}
4248

43-
public Config add(EnvFile envFile, Map<String, String> mapping) {
49+
public Config add(EnvFile envFile, Function<String, String> mapping) {
4450
return add(null, envFile, mapping);
45-
4651
}
4752

4853
public Config add(EnvFile envFile) {
49-
return add(null, envFile, null);
54+
return add(null, envFile, k -> k);
5055
}
5156

5257
public Config set(String key, String value) {
@@ -64,6 +69,21 @@ public String get(String key) {
6469
return get(key, null);
6570
}
6671

72+
public AbstractObject getObject(String key) {
73+
String prefix = key.length() > 0 ? (key + ".") : "";
74+
Set<String> s = config.keySet().stream().filter(k -> k.startsWith(prefix)).collect(Collectors.toSet());
75+
if(s.size() == 0)
76+
return null;
77+
return AbstractElement.fromTree(s.stream().collect(Collectors.toMap(k -> k.substring(prefix.length()).split("\\."), config::get))).object();
78+
}
79+
80+
public Config set(String key, AbstractObject object) {
81+
String prefix = key.length() > 0 ? (key + ".") : "";
82+
config.keySet().stream().filter(k -> k.startsWith(prefix)).forEach(config::remove);
83+
object.toTree().forEach((k, v) -> config.put(prefix + String.join(".", k), v.toString()));
84+
return this;
85+
}
86+
6787
public int getInt(String key, int defaultValue) {
6888
String value = get(key);
6989
if (value == null)
@@ -88,4 +108,12 @@ public boolean has(String key) {
88108
return config.containsKey(key);
89109
}
90110

111+
public Set<String> keys() {
112+
return config.keySet();
113+
}
114+
115+
public static String basicEnvMapping(String k) {
116+
return k.toLowerCase(Locale.ROOT).replace("_", ".");
117+
}
118+
91119
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.javawebstack.webutils.config;
2+
3+
import java.util.Locale;
4+
import java.util.function.Function;
5+
6+
public class EnvAssocMapping implements Function<String, String> {
7+
8+
private final String prefix;
9+
private final Function<String, String> subMapping;
10+
11+
public EnvAssocMapping(String prefix, Function<String, String> subMapping) {
12+
this.prefix = prefix;
13+
this.subMapping = subMapping;
14+
}
15+
16+
public String apply(String s) {
17+
if(!s.startsWith(prefix+ "_"))
18+
return null;
19+
String[] spl = s.substring(prefix.length() + 1).split("_", 2);
20+
if(spl.length != 2)
21+
return null;
22+
String sk = subMapping.apply(spl[1]);
23+
if(sk == null)
24+
return null;
25+
return prefix.toLowerCase(Locale.ROOT) + "." + spl[0].toLowerCase(Locale.ROOT) + "." + sk;
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.javawebstack.webutils.config;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.function.Function;
6+
7+
public class Mapping implements Function<String, String> {
8+
9+
private final Map<String, String> mapping = new HashMap<>();
10+
private boolean failIfNotFound = false;
11+
12+
public Mapping failIfNotFound(boolean failIfNotFound) {
13+
this.failIfNotFound = failIfNotFound;
14+
return this;
15+
}
16+
17+
public Mapping map(String from, String to) {
18+
mapping.put(from, to);
19+
return this;
20+
}
21+
22+
public String apply(String s) {
23+
return mapping.getOrDefault(s, failIfNotFound ? null : s);
24+
}
25+
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.javawebstack.webutils.config;
2+
3+
import java.util.function.Function;
4+
5+
public class MappingPipeline implements Function<String, String> {
6+
7+
private final Function<String, String>[] pipeline;
8+
9+
public MappingPipeline(Function<String, String>... pipeline) {
10+
this.pipeline = pipeline;
11+
}
12+
13+
public String apply(String s) {
14+
String k = s;
15+
for(Function<String, String> mapping : pipeline)
16+
k = mapping.apply(k);
17+
return k == null ? s : k;
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.javawebstack.webutils.config;
2+
3+
import java.util.function.Function;
4+
5+
public class MappingTryout implements Function<String, String> {
6+
7+
private final Function<String, String>[] tryout;
8+
private boolean failIfEqual = true;
9+
10+
public MappingTryout(Function<String, String>... tryout) {
11+
this.tryout = tryout;
12+
}
13+
14+
public MappingTryout failIfEqual(boolean failIfEqual) {
15+
this.failIfEqual = failIfEqual;
16+
return this;
17+
}
18+
19+
public String apply(String s) {
20+
for(Function<String, String> mapping : tryout) {
21+
String k = mapping.apply(s);
22+
if(k != null && (!failIfEqual || !k.equals(s)))
23+
return k;
24+
}
25+
return null;
26+
}
27+
28+
}

src/main/java/org/javawebstack/webutils/crypt/Crypt.java

+11-12
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package org.javawebstack.webutils.crypt;
22

3-
import com.google.gson.Gson;
4-
import com.google.gson.GsonBuilder;
5-
import com.google.gson.JsonObject;
3+
import org.javawebstack.abstractdata.AbstractElement;
4+
import org.javawebstack.abstractdata.AbstractObject;
65

76
import javax.crypto.*;
87
import javax.crypto.spec.IvParameterSpec;
@@ -84,11 +83,11 @@ public String encrypt(byte[] data) {
8483
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
8584
byte[] value = cipher.doFinal(data);
8685
byte[] mac = mac(Base64.getEncoder().encode(iv), Base64.getEncoder().encode(value));
87-
Map<String, String> cryptData = new HashMap<>();
88-
cryptData.put("iv", new String(Base64.getEncoder().encode(iv)));
89-
cryptData.put("value", new String(Base64.getEncoder().encode(value)));
90-
cryptData.put("mac", toHex(mac));
91-
return new String(Base64.getEncoder().encode(new GsonBuilder().disableHtmlEscaping().create().toJson(cryptData).getBytes(StandardCharsets.UTF_8)));
86+
AbstractObject cryptData = new AbstractObject();
87+
cryptData.set("iv", new String(Base64.getEncoder().encode(iv)));
88+
cryptData.set("value", new String(Base64.getEncoder().encode(value)));
89+
cryptData.set("mac", toHex(mac));
90+
return new String(Base64.getEncoder().encode(cryptData.toJsonString().getBytes(StandardCharsets.UTF_8)));
9291
} catch (IllegalBlockSizeException | BadPaddingException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException ex) {
9392
throw new SecurityException(ex.getMessage());
9493
}
@@ -120,11 +119,11 @@ public String decryptString(String data) {
120119

121120
public byte[] decrypt(String data) {
122121
try {
123-
JsonObject json = new Gson().fromJson(new String(Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8), JsonObject.class);
124-
if (!toHex(mac(json.get("iv").getAsString().getBytes(StandardCharsets.UTF_8), json.get("value").getAsString().getBytes(StandardCharsets.UTF_8))).equals(json.get("mac").getAsString()))
122+
AbstractObject json = AbstractElement.fromJson(new String(Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8)).object();
123+
if (!toHex(mac(json.string("iv").getBytes(StandardCharsets.UTF_8), json.string("value").getBytes(StandardCharsets.UTF_8))).equals(json.string("mac")))
125124
throw new SecurityException("Invalid MAC");
126-
byte[] iv = Base64.getDecoder().decode(json.get("iv").getAsString().getBytes(StandardCharsets.UTF_8));
127-
byte[] value = Base64.getDecoder().decode(json.get("value").getAsString().getBytes(StandardCharsets.UTF_8));
125+
byte[] iv = Base64.getDecoder().decode(json.string("iv").getBytes(StandardCharsets.UTF_8));
126+
byte[] value = Base64.getDecoder().decode(json.string("value").getBytes(StandardCharsets.UTF_8));
128127
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
129128
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
130129
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

src/main/java/org/javawebstack/webutils/middleware/CORSPolicy.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.javawebstack.webutils.middleware;
22

33
import org.javawebstack.httpserver.Exchange;
4+
import org.javawebstack.httpserver.HTTPMethod;
45
import org.javawebstack.httpserver.handler.RequestInterceptor;
5-
import org.javawebstack.httpserver.helper.HttpMethod;
66

77
public class CORSPolicy implements RequestInterceptor {
88
private final String allowedOrigin;
@@ -13,7 +13,7 @@ public CORSPolicy(String allowedOrigin) {
1313

1414
public boolean intercept(Exchange exchange) {
1515
exchange.header("Access-Control-Allow-Origin", allowedOrigin);
16-
if (exchange.getMethod() == HttpMethod.OPTIONS) {
16+
if (exchange.getMethod() == HTTPMethod.OPTIONS) {
1717
exchange.header("Access-Control-Allow-Headers", "*");
1818
exchange.header("Access-Control-Allow-Methods", "*");
1919
return true;

src/main/java/org/javawebstack/webutils/middleware/MultipartPolicy.java

+2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ public MultipartPolicy(String location) {
1212
}
1313

1414
public boolean intercept(Exchange exchange) {
15+
/*
1516
if (location != null)
1617
exchange.enableMultipart(location);
18+
*/
1719
return false;
1820
}
1921

src/main/java/org/javawebstack/webutils/middlewares/RateLimitMiddleware.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public RateLimitMiddleware(long millis){
2424
}
2525

2626
public Object handle(Exchange exchange) {
27-
String ip = exchange.rawRequest().getRemoteAddr();
27+
String ip = exchange.socket().getRemoteAddress();
2828
if (exchange.header("X-Forwarded-For") != null)
2929
ip = exchange.header("X-Forwarded-For");
3030
RateLimit rateLimit = null;

0 commit comments

Comments
 (0)