blob: a58cf270bc530b561bb72c0217fbd7f35ce6c934 [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.access;
import io.v.v23.context.VContext;
import io.v.v23.security.Authorizer;
import io.v.v23.security.BlessingPattern;
import io.v.v23.security.Call;
import io.v.v23.verror.VException;
import java.util.List;
/**
* A wrapper around WireAccessList, providing additional functionality.
*/
public class AccessList extends WireAccessList implements Authorizer {
private static final long serialVersionUID = 1L;
private final long nativePtr;
private native long nativeCreate() throws VException;
private native boolean nativeIncludes(long nativePtr, String[] blessings) throws VException;
private native void nativeAuthorize(long nativePtr, VContext context, Call call);
private native void nativeFinalize(long nativePtr);
/**
* Creates a new {@link AccessList} object.
*
* @param in blessings that should be allowed
* @param notIn blessings that should be denied
*/
public AccessList(List<BlessingPattern> in, List<String> notIn) {
super(in, notIn);
try {
this.nativePtr = nativeCreate();
} catch (VException e) {
throw new RuntimeException("Couldn't create native AccessList", e);
}
}
AccessList(WireAccessList wire) {
this(wire.getIn(), wire.getNotIn());
}
/**
* Returns {@code true} iff the access list grants access to a principal that presents
* these blessings.
*
* @param blessings blessings we are getting access for
* @return true iff the ACL grants access to a principal that presents these
* blessings
*/
public boolean includes(String... blessings) {
try {
return nativeIncludes(this.nativePtr, blessings);
} catch (VException e) {
throw new RuntimeException("Couldn't test for access list inclusion", e);
}
}
/**
* Authorizes only if the remote blessings are included in the access list.
*
* @param context vanadium context
* @param call the call being authorized
* @throws VException if the request is not authorized
*/
@Override
public void authorize(VContext context, Call call) throws VException {
nativeAuthorize(this.nativePtr, context, call);
}
@Override
protected void finalize() {
nativeFinalize(this.nativePtr);
}
}