Skip to content

Commit ba6370d

Browse files
committed
internally process obs-fold, add tag
1 parent 4f45d1a commit ba6370d

File tree

4 files changed

+144
-31
lines changed

4 files changed

+144
-31
lines changed

src/main/java/io/bspk/httpsig/ComponentProvider.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import org.greenbytes.http.sfv.StringItem;
1212
import org.greenbytes.http.sfv.Type;
1313

14+
import com.google.common.base.Strings;
15+
1416
/**
1517
* @author jricher
1618
*
@@ -37,9 +39,15 @@ static String combineFieldValues(List<String> fields) {
3739
if (fields == null) {
3840
return null;
3941
} else {
40-
return fields.stream()
42+
String val = fields.stream()
4143
.map(String::strip)
44+
.map(v -> {
45+
// replace obs-fold if it's in there
46+
return v.replaceAll("[\\s\\t]*\\r\\n[\\s\\t]*", " ");
47+
})
4248
.collect(Collectors.joining(", "));
49+
50+
return Strings.emptyToNull(val);
4351
}
4452
}
4553

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package io.bspk.httpsig;
2+
3+
/**
4+
* @author jricher
5+
*
6+
*/
7+
public abstract class RequestComponentProviderAdapter implements ComponentProvider {
8+
9+
@Override
10+
public String getStatus() {
11+
throw new IllegalArgumentException("Derived component not supported");
12+
}
13+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package io.bspk.httpsig;
2+
3+
import org.greenbytes.http.sfv.StringItem;
4+
5+
/**
6+
* @author jricher
7+
*
8+
*/
9+
public abstract class ResponseComponentProviderAdapter implements ComponentProvider {
10+
11+
private ComponentProvider requestComponentProvider;
12+
13+
public void setRequestComponentProvider(ComponentProvider requestComponentProvider) {
14+
this.requestComponentProvider = requestComponentProvider;
15+
}
16+
17+
18+
public ComponentProvider getRequestComponentProvider() {
19+
return requestComponentProvider;
20+
}
21+
22+
@Override
23+
public String getMethod() {
24+
throw new IllegalArgumentException("Derived component not supported");
25+
}
26+
27+
@Override
28+
public String getAuthority() {
29+
throw new IllegalArgumentException("Derived component not supported");
30+
}
31+
32+
@Override
33+
public String getScheme() {
34+
throw new IllegalArgumentException("Derived component not supported");
35+
}
36+
37+
@Override
38+
public String getTargetUri() {
39+
throw new IllegalArgumentException("Derived component not supported");
40+
}
41+
42+
@Override
43+
public String getRequestTarget() {
44+
throw new IllegalArgumentException("Derived component not supported");
45+
}
46+
47+
@Override
48+
public String getPath() {
49+
throw new IllegalArgumentException("Derived component not supported");
50+
}
51+
52+
@Override
53+
public String getQuery() {
54+
throw new IllegalArgumentException("Derived component not supported");
55+
}
56+
57+
@Override
58+
public String getQueryParams(String name) {
59+
throw new IllegalArgumentException("Derived component not supported");
60+
}
61+
62+
@Override
63+
public String getComponentValue(StringItem componentIdentifier) {
64+
if (componentIdentifier.getParams().containsKey("req")) {
65+
if (getRequestComponentProvider() != null) {
66+
return getRequestComponentProvider().getComponentValue(componentIdentifier);
67+
} else {
68+
throw new IllegalArgumentException("Request component not supported");
69+
}
70+
}
71+
return ComponentProvider.super.getComponentValue(componentIdentifier);
72+
}
73+
74+
}

src/main/java/io/bspk/httpsig/SignatureParameters.java

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
*/
2424
public class SignatureParameters {
2525

26+
private static final String ALG = "alg";
27+
private static final String CREATED = "created";
28+
private static final String EXPIRES = "expires";
29+
private static final String KEYID = "keyid";
30+
private static final String NONCE = "nonce";
31+
private static final String TAG = "tag";
32+
2633
private List<StringItem> componentIdentifiers = new ArrayList<>();
2734

2835
// this preserves insertion order
@@ -62,74 +69,83 @@ public SignatureParameters setParameters(Map<String, Object> parameters) {
6269
* @return the alg
6370
*/
6471
public HttpSigAlgorithm getAlg() {
65-
return (HttpSigAlgorithm) getParameters().get("alg");
72+
return (HttpSigAlgorithm) getParameters().get(ALG);
6673
}
6774

6875
/**
6976
* @param alg the alg to set
7077
*/
7178
public SignatureParameters setAlg(HttpSigAlgorithm alg) {
72-
getParameters().put("alg", alg);
79+
getParameters().put(ALG, alg);
7380
return this;
7481
}
7582

7683
/**
7784
* @return the created
7885
*/
7986
public Instant getCreated() {
80-
return (Instant) getParameters().get("created");
87+
return (Instant) getParameters().get(CREATED);
8188
}
8289

8390
/**
8491
* @param created the created to set
8592
*/
8693
public SignatureParameters setCreated(Instant created) {
87-
getParameters().put("created", created);
94+
getParameters().put(CREATED, created);
8895
return this;
8996
}
9097

9198
/**
9299
* @return the expires
93100
*/
94101
public Instant getExpires() {
95-
return (Instant) getParameters().get("expires");
102+
return (Instant) getParameters().get(EXPIRES);
96103
}
97104

98105
/**
99106
* @param expires the expires to set
100107
*/
101108
public SignatureParameters setExpires(Instant expires) {
102-
getParameters().put("expires", expires);
109+
getParameters().put(EXPIRES, expires);
103110
return this;
104111
}
105112

106113
/**
107114
* @return the keyid
108115
*/
109116
public String getKeyid() {
110-
return (String) getParameters().get("keyid");
117+
return (String) getParameters().get(KEYID);
111118
}
112119

113120
/**
114121
* @param keyid the keyid to set
115122
*/
116123
public SignatureParameters setKeyid(String keyid) {
117-
getParameters().put("keyid", keyid);
124+
getParameters().put(KEYID, keyid);
118125
return this;
119126
}
120127

121128
/**
122129
* @return the nonce
123130
*/
124131
public String getNonce() {
125-
return (String) getParameters().get("nonce");
132+
return (String) getParameters().get(NONCE);
126133
}
127134

128135
/**
129136
* @param nonce the nonce to set
130137
*/
131138
public SignatureParameters setNonce(String nonce) {
132-
getParameters().put("nonce", nonce);
139+
getParameters().put(NONCE, nonce);
140+
return this;
141+
}
142+
143+
public String getTag() {
144+
return (String) getParameters().get(TAG);
145+
}
146+
147+
public SignatureParameters setTag(String tag) {
148+
getParameters().put(TAG, tag);
133149
return this;
134150
}
135151

@@ -150,19 +166,19 @@ public InnerList toComponentValue() {
150166

151167
// preserve order
152168
for (String paramName : getParameters().keySet()) {
153-
if (paramName.equals("alg")) {
169+
if (paramName.equals(ALG)) {
154170
HttpSigAlgorithm alg = getAlg();
155171
if (alg.getExplicitAlg() != null) {
156-
params.put("alg", alg.getExplicitAlg());
172+
params.put(ALG, alg.getExplicitAlg());
157173
}
158-
} else if (paramName.equals("created")) {
159-
params.put("created", getCreated().getEpochSecond());
160-
} else if (paramName.equals("expires")) {
161-
params.put("expires", getExpires().getEpochSecond());
162-
} else if (paramName.equals("keyid")) {
163-
params.put("keyid", getKeyid());
164-
} else if (paramName.equals("nonce")) {
165-
params.put("nonce", getNonce());
174+
} else if (paramName.equals(CREATED)) {
175+
params.put(CREATED, getCreated().getEpochSecond());
176+
} else if (paramName.equals(EXPIRES)) {
177+
params.put(EXPIRES, getExpires().getEpochSecond());
178+
} else if (paramName.equals(KEYID)) {
179+
params.put(KEYID, getKeyid());
180+
} else if (paramName.equals(NONCE)) {
181+
params.put(NONCE, getNonce());
166182
} else {
167183
params.put(paramName, getParameters().get(paramName));
168184
}
@@ -230,18 +246,20 @@ public static SignatureParameters fromDictionaryEntry(Dictionary signatureInput,
230246
.collect(Collectors.toList()));
231247

232248
for (String key : coveredComponents.getParams().keySet()) {
233-
if (key.equals("alg")) {
234-
params.setAlg(HttpSigAlgorithm.of(((StringItem)coveredComponents.getParams().get("alg")).get()));
235-
} else if (key.equals("created")) {
249+
if (key.equals(ALG)) {
250+
params.setAlg(HttpSigAlgorithm.of(((StringItem)coveredComponents.getParams().get(ALG)).get()));
251+
} else if (key.equals(CREATED)) {
236252
params.setCreated(
237-
Instant.ofEpochSecond(((NumberItem<?>)coveredComponents.getParams().get("created")).getAsLong()));
238-
} else if (key.equals("expires")) {
253+
Instant.ofEpochSecond(((NumberItem<?>)coveredComponents.getParams().get(CREATED)).getAsLong()));
254+
} else if (key.equals(EXPIRES)) {
239255
params.setCreated(
240-
Instant.ofEpochSecond(((NumberItem<?>)coveredComponents.getParams().get("expires")).getAsLong()));
241-
} else if (key.equals("keyid")) {
242-
params.setKeyid(((StringItem)coveredComponents.getParams().get("keyid")).get());
243-
} else if (key.equals("nonce")) {
244-
params.setNonce(((StringItem)coveredComponents.getParams().get("nonce")).get());
256+
Instant.ofEpochSecond(((NumberItem<?>)coveredComponents.getParams().get(EXPIRES)).getAsLong()));
257+
} else if (key.equals(KEYID)) {
258+
params.setKeyid(((StringItem)coveredComponents.getParams().get(KEYID)).get());
259+
} else if (key.equals(NONCE)) {
260+
params.setNonce(((StringItem)coveredComponents.getParams().get(NONCE)).get());
261+
} else if (key.equals(TAG)) {
262+
params.setTag(((StringItem)coveredComponents.getParams().get(TAG)).get());
245263
} else {
246264
params.getParameters().put(key, coveredComponents.getParams().get(key).serialize()); // store the serialized version
247265
}

0 commit comments

Comments
 (0)