package com.twilio.jwt.client;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.twilio.jwt.Jwt;
import com.twilio.jwt.JwtEncodingException;
import io.jsonwebtoken.SignatureAlgorithm;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* JWT builder for Client Capabilities.
*/
public class ClientCapability extends Jwt {
private final List<Scope> scopes;
private ClientCapability(Builder b) {
super(
SignatureAlgorithm.HS256,
b.authToken,
b.accountSid,
new Date(new Date().getTime() + b.ttl * 1000)
);
this.scopes = b.scopes;
}
@Override
public Map<String, Object> getHeaders() {
Map<String, Object> headers = new HashMap<>();
headers.put("alg", "HS256");
return headers;
}
@Override
public Map<String, Object> getClaims() {
Map<String, Object> payload = new HashMap<>();
try {
List<String> scopes = new ArrayList<>();
for (Scope scope : this.scopes) {
scopes.add(scope.getPayload());
}
payload.put("scope", Joiner.on(' ').join(scopes));
} catch (UnsupportedEncodingException e) {
throw new JwtEncodingException(e);
}
return payload;
}
/** Builder used to construct a Client Capability. */
public static class Builder {
private String accountSid;
private String authToken;
private int ttl = 3600;
private List<Scope> scopes = Lists.newArrayList();
/**
* Create a new builder for a Client Capability.
*
* @param accountSid account to use
* @param authToken auth token
*/
public Builder(String accountSid, String authToken) {
this.accountSid = accountSid;
this.authToken = authToken;
}
public Builder ttl(int ttl) {
this.ttl = ttl;
return this;
}
public Builder scopes(Collection<Scope> scopes) {
this.scopes.addAll(scopes);
return this;
}
public ClientCapability build() {
return new ClientCapability(this);
}
}
}