blob: 6db4d7b5308a1084f8457f03b83201243c5ec89c [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 io.v.v23.verror.VException;
/**
* A wrapper around {@link WireBlessingPattern}, providing additional functionality.
*/
public class BlessingPattern extends WireBlessingPattern {
private static final long serialVersionUID = 1L;
private static native long nativeCreate(String value) throws VException;
private final long nativePtr;
private native boolean nativeIsMatchedBy(long nativePtr, String[] blessings) throws VException;
private native boolean nativeIsValid(long nativePtr);
private native BlessingPattern nativeMakeNonExtendable(long nativePtr) throws VException;
private native void nativeFinalize(long nativePtr);
/**
* Constructs a new {@link BlessingPattern} from the provided string.
*
* @param value blessing pattern string
*/
public BlessingPattern(String value) {
super(value);
try {
this.nativePtr = nativeCreate(value);
} catch (VException e) {
throw new RuntimeException("Couldn't create native BlessingPattern", e);
}
}
BlessingPattern(WireBlessingPattern wire) {
this(wire.getValue());
}
private BlessingPattern(long nativePtr, String value) {
super(value);
this.nativePtr = nativePtr;
}
/**
* Returns {@code true} iff one of the presented blessings matches this pattern as per
* the rules described in documentation for the {@link WireBlessingPattern} type.
*
* @param blessings blessings compared against this pattern
*/
public boolean isMatchedBy(String... blessings) {
try {
return nativeIsMatchedBy(nativePtr, blessings);
} catch (VException e) {
throw new RuntimeException("Couldn't check blessings match", e);
}
}
/**
* Returns {@code true} iff this pattern is well formed, i.e., does not contain any character
* sequences that will cause the {@link BlessingPattern} to never match any valid blessings.
*/
public boolean isValid() {
return nativeIsValid(nativePtr);
}
/**
* Returns a new pattern that is not matched by any extension of the blessing represented
* by this pattern.
*
* For example:
* <p><blockquote><pre>
* BlessingPattern onlyAlice =
* new BlessingPattern("google/alice")).makeNonExtendable();
* onlyAlice.isMatchedBy("google"); // returns true
* onlyAlice.isMatchedBy("google/alice"); // returns true
* onlyAlice.isMatchedBy("google/alice/bob"); // returns false
* </pre></blockquote><p>
*
* @return a pattern that is not matched by any extension of the blessings that are
* matched by this pattern
*/
public BlessingPattern makeNonExtendable() {
try {
return nativeMakeNonExtendable(nativePtr);
} catch (VException e) {
throw new RuntimeException("Couldn't make blessing pattern non-extendable", e);
}
}
private long nativePtr() {
return nativePtr;
}
@Override
protected void finalize() {
nativeFinalize(nativePtr);
}
}