blob: 865804b8de8c198fbbff46fe952fb580f767b379 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.v23.security;
import com.google.common.collect.ImmutableMap;
import org.joda.time.DateTime;
import java.util.Map;
import io.v.v23.context.VContext;
import io.v.v23.vdl.VdlValue;
/**
* Container for {@link Call} creation parameters. Here is an example of a simple
* call creation:
* <p><blockquote><pre>
* Call call = VSecurity.newCall(new CallParams()
* .withLocalPrincipal(VSecurity.newPrincipal())
* .withMethodName("test")
* .withTimestamp(DateTime.now());
* </pre></blockquote><p>
* {@link CallParams} form a tree where derived params are children of the params from which they
* were derived. Children inherit all the properties of their parent except for the property being
* replaced (the principal/method/timestamp in the example above).
*/
public class CallParams {
final CallParams parent;
private DateTime timestamp;
private String method;
private VdlValue[] methodTags;
private String suffix;
private Map<String, Discharge> localDischarges;
private Map<String, Discharge> remoteDischarges;
private String localEndpoint;
private String remoteEndpoint;
private VPrincipal principal;
private Blessings localBlessings;
private Blessings remoteBlessings;
private io.v.v23.context.VContext context;
/**
* Creates a new (and empty) {@link CallParams} object.
*/
public CallParams() {
this.parent = null;
}
private CallParams(CallParams parent) {
this.parent = parent;
}
/**
* Returns a child of the current params with the given timestamp attached.
*
* @param time timestamp
* @return a child of the current params with the given timestamp attached
*/
public CallParams withTimestamp(DateTime time) {
CallParams ret = new CallParams(this);
ret.timestamp = time;
return ret;
}
/**
* Returns a child of the current params with the given method name attached.
*
* @param method method name
* @return a child of the current params with the given method name attached
*/
public CallParams withMethod(String method) {
CallParams ret = new CallParams(this);
ret.method = method;
return ret;
}
/**
* Returns a child of the current params with the given method tags attached.
*
* @param tags method tags
* @return a child of the current params with the given method tags attached
*/
public CallParams withMethodTags(VdlValue... tags) {
CallParams ret = new CallParams(this);
ret.methodTags = tags;
return ret;
}
/**
* Returns a child of the current params with the given vanadium name suffix attached.
*
* @param suffix vanadium name suffix
* @return a child of the current params with the given vanadium name suffix attached
*/
public CallParams withSuffix(String suffix) {
CallParams ret = new CallParams(this);
ret.suffix = suffix;
return ret;
}
/**
* Returns a child of the current params with the given local discharges.
*/
public CallParams withLocalDischarges(Map<String, Discharge> localDischarges) {
CallParams ret = new CallParams(this);
ret.localDischarges = ImmutableMap.copyOf(localDischarges);
return ret;
}
/**
* Returns a child of the current params with the given remote discharges.
*/
public CallParams withRemoteDischarges(Map<String, Discharge> remoteDischarges) {
CallParams ret = new CallParams(this);
ret.remoteDischarges = ImmutableMap.copyOf(remoteDischarges);
return ret;
}
/**
* Returns a child of the current params with the given local endpoint attached.
*
* @param endpoint local endpoint
* @return a child of the current params with the given local endpoint attached
*/
public CallParams withLocalEndpoint(String endpoint) {
CallParams ret = new CallParams(this);
ret.localEndpoint = endpoint;
return ret;
}
/**
* Returns a child of the current params with the given remote endpoint attached.
*
* @param endpoint remote endpoint
* @return a child of the current params with the given remote endpoint attached
*/
public CallParams withRemoteEndpoint(String endpoint) {
CallParams ret = new CallParams(this);
ret.remoteEndpoint = endpoint;
return ret;
}
/**
* Returns a child of the current params with the given local principal attached.
*
* @param principal local principal
* @return a child of the current params with the given local principal attached
*/
public CallParams withLocalPrincipal(VPrincipal principal) {
CallParams ret = new CallParams(this);
ret.principal = principal;
return ret;
}
/**
* Returns a child of the current params with the given local blessings attached.
*
* @param blessings local blessings
* @return a child of the current params with the given local blessings attached
*/
public CallParams withLocalBlessings(Blessings blessings) {
CallParams ret = new CallParams(this);
ret.localBlessings = blessings;
return ret;
}
/**
* Returns a child of the current params with the given remote blessings attached.
*
* @param blessings remote blessings
* @return a child of the current params with the given remote blessings attached
*/
public CallParams withRemoteBlessings(Blessings blessings) {
CallParams ret = new CallParams(this);
ret.remoteBlessings = blessings;
return ret;
}
/**
* Returns a child of the current params with the given Vanadium context attached.
*
* @param context Vanadium context
* @return a child of the current params with the given Vanadium context attached
*/
public CallParams withContext(VContext context) {
CallParams ret = new CallParams(this);
ret.context = context;
return ret;
}
/**
* Returns a timestamp attached to the params, or {@code null} if no timestamp is attached.
*/
public DateTime getTimestamp() {
if (this.timestamp != null) return this.timestamp;
if (this.parent != null) return this.parent.getTimestamp();
return null;
}
/**
* Returns a method name attached to the params, or {@code null} if no method name is attached.
*/
public String getMethod() {
if (this.method != null) return this.method;
if (this.parent != null) return this.parent.getMethod();
return null;
}
/**
* Returns method tags attached to the params, or {@code null} if no method tags are attached.
*/
public VdlValue[] getMethodTags() {
if (this.methodTags != null) return this.methodTags;
if (this.parent != null) return this.parent.getMethodTags();
return null;
}
/**
* Returns a name suffix attached to the params, or {@code null} if no name suffix is
* attached.
*/
public String getSuffix() {
if (this.suffix != null) return this.suffix;
if (this.parent != null) return this.parent.getSuffix();
return null;
}
/**
* Returns the discharges for third-party caveats presented by the local end of the call. It
* maps a third-party caveat identifier to the corresponding discharge.
*/
public Map<String, Discharge> getLocalDischarges() {
return localDischarges;
}
/**
* Returns the discharges for third-party caveats presented by the remote end of the call. It
* maps a third-party caveat identifier to the corresponding discharge.
*/
public Map<String, Discharge> getRemoteDischarges() {
return remoteDischarges;
}
/**
* Returns a local endpoint attached to the params, or {@code null} if no local endpoint is
* attached.
*/
public String getLocalEndpoint() {
if (this.localEndpoint != null) return this.localEndpoint;
if (this.parent != null) return this.parent.getLocalEndpoint();
return null;
}
/**
* Returns a remote endpoint attached to the params, or {@code null} if no remote endpoint
* is attached.
*/
public String getRemoteEndpoint() {
if (this.remoteEndpoint != null) return this.remoteEndpoint;
if (this.parent != null) return this.parent.getRemoteEndpoint();
return null;
}
/**
* Returns a local principal attached to the params, or {@code null} if no local principal is
* attached.
*/
public VPrincipal getLocalPrincipal() {
if (this.principal != null) return this.principal;
if (this.parent != null) return this.parent.getLocalPrincipal();
return null;
}
/**
* Returns local blessings attached to the params, or {@code null} if no local blessings are
* attached.
*/
public Blessings getLocalBlessings() {
if (this.localBlessings != null) return this.localBlessings;
if (this.parent != null) return this.parent.getLocalBlessings();
return null;
}
/**
* Returns remote blessings attached to the params, or {@code null} if no remote blessings are
* attached.
*/
public Blessings getRemoteBlessings() {
if (this.remoteBlessings != null) return this.remoteBlessings;
if (this.parent != null) return this.parent.getRemoteBlessings();
return null;
}
/**
* Returns Vanadium context attached to the params, or {@code null} if no Vanadium context is
* attached.
*/
public VContext getContext() {
if (this.context != null) return this.context;
if (this.parent != null) return this.parent.getContext();
return null;
}
}