public JSApiRoleLink(String newRoleName, String existingRoleName) { roleLink = new RoleLink(newRoleName, existingRoleName); }
/** * Create a default empty new contract using a provided key as issuer and owner and sealer. Default expiration is * set to 90 days. * <p> * This constructor adds key as sealing signature so it is ready to {@link #seal()} just after construction, thought * it is necessary to put real data to it first. It is allowed to change owner, expiration and data fields after * creation (but before sealing). * <p> * Change owner permission is added by default * @param key is {@link PrivateKey} for creating roles "issuer", "owner", "creator" and sign contract */ public Contract(PrivateKey key) { this(); // default expiration date setExpiresAt(ZonedDateTime.now().plusDays(90)); // issuer role is a key for a new contract setIssuerKeys(key.getPublicKey()); // issuer is owner, link roles registerRole(new RoleLink("owner", "issuer")); registerRole(new RoleLink("creator", "issuer")); RoleLink roleLink = new RoleLink("@change_ower_role","owner"); roleLink.setContract(this); // owner can change permission addPermission(new ChangeOwnerPermission(roleLink)); // issuer should sign addSignerKey(key); }
/** * Get role as string. * * @return string with data of role */ @Override public String toString() { if (getContract() != null) { final Role role = getRole(); return "RoleLink<" + getName() + "->" + roleName + ":" + ((role == null) ? "null" : role.toString()) + ">"; } else { return "RoleLink<" + getName() + "->" + roleName + ":" + "not connected>"; } }
@Test public void serialize() throws Exception { RoleLink r1 = new RoleLink("name", "target"); r1.addRequiredReference("ref", Role.RequiredMode.ALL_OF); Binder s = DefaultBiMapper.serialize(r1); RoleLink r2 = DefaultBiMapper.deserialize(s); assertEquals(r1, r2); assertEquals(r1.getName(), r2.getName()); }
@Test public void equals() throws Exception { RoleLink r1 = new RoleLink("name", "target"); RoleLink r2 = new RoleLink("name", "target1"); RoleLink r3 = new RoleLink("name1", "target"); assertTrue(r1.equalsIgnoreName(r3)); assertFalse(r1.equalsIgnoreName(r2)); assertFalse(r2.equalsIgnoreName(r3)); assertNotEquals(r1, r3); assertNotEquals(r1, r2); assertNotEquals(r2, r3); }
@Test public void resolve() throws Exception { Contract c = new Contract(); SimpleRole s1 = new SimpleRole("owner"); c.registerRole(s1); RoleLink r1 = new RoleLink("lover", "owner"); c.registerRole(r1); RoleLink r2 = r1.linkAs("mucker"); assertSame(s1, s1.resolve()); assertSame(s1, r1.resolve()); assertSame(s1, r2.resolve()); }
/** * Get set of all keys in linked role. * * @return set of public keys (see {@link PublicKey}) */ @Override @Deprecated public Set<PublicKey> getKeys() { final Role role = resolve(); return (role == null) ? null : role.getKeys(); }
c.traceErrors(); assertTrue(c.check()); assertEquals(c, ((RoleLink) c.getPermissions().getFirst("change_owner").getRole()).getContract()); Role cOwner = c.getOwner(); assertTrue (cOwner.isAllowedForKeys(new HashSet<>(Do.listOf(ownerKey1)))); assertEquals(c, ((RoleLink) c.getPermissions().getFirst("change_owner").getRole()).getContract()); assertEquals(c.getOwner(), ((RoleLink) c.getPermissions().getFirst("change_owner").getRole()).getRole()); assertEquals(c2, ((RoleLink) c2.getPermissions().getFirst("change_owner").getRole()).getContract()); assertEquals(c, ((RoleLink) c.getPermissions().getFirst("change_owner").getRole()).getContract()); c2.setOwnerKey(ownerKey3); assertNotEquals(c.getOwner(), c2.getOwner()); assertEquals(c.getOwner(), ((RoleLink) c.getPermissions().getFirst("change_owner").getRole()).getRole());
/** * Return the resolved role. A resolved role may be a {@link RoleLink} itself, or null (if a link is incorrect). * * @return {@link Role} */ @Override public <T extends Role> T resolve() { int maxDepth = 40; for (Role r = this; maxDepth > 0; maxDepth--) { if (r instanceof RoleLink) { r = ((RoleLink) r).getRole(); if (r == null) return null; } else return (T) r; } return null; // throw new IllegalStateException("RoleLink depth exceeded, possible circular references"); }
/** * Initializes linked role from dsl. * * @param serializedRole is {@link Binder} from dsl with data of linked role */ @Override public void initWithDsl(Binder serializedRole) { roleName = serializedRole.getStringOrThrow("target"); if (getName().equals(roleName)) throw new IllegalArgumentException("RoleLink: name and target name are equals: " + roleName); }
/** * Return the resolved role taken from a bound contract. A resolved role may be a {@link RoleLink} itself, or null * (if a link is incorrect). * * @return {@link Role} */ @Nullable public Role getRole() { return getContract().getRole(roleName); }
/** * If this role has public keys, they will be replaced with {@link AnonymousId}. */ @Override public void anonymize() { final Role role = resolve(); if (role != null) role.anonymize(); }
/** * A role has exactly same set of keys as in the supplied role. It does not check the logic, * only that list of all keys is exactly same. * <p> * To check that the role can be performed by some other role, use {@link #isAllowedForKeys(Set)}. * * @param otherRole is {@link Role} for checking by keys * @return true if equals */ @Override @Deprecated public boolean equalKeys(Role otherRole) { final Role role = getRole(); return (role == null) ? false : role.equalKeys(otherRole); }
@Override public Binder serialize(BiSerializer s) { return super.serialize(s).putAll( "name", getName(), "target_name", roleName ); }
/** * Create alias role to this one using {@link RoleLink}. If this role has attached to some contract, this method * also registers new role in the same contract. * * @param roleName new role name * * @return linked {@link RoleLink} */ public RoleLink linkAs(String roleName) { RoleLink newRole = new RoleLink(roleName, name); if (contract != null) contract.registerRole(newRole); return newRole; }
contract.registerRole(new RoleLink("owner", "issuer")); contract.registerRole(new RoleLink("creator", "issuer")); RoleLink roleLink = new RoleLink("@change_owner_role","owner"); roleLink.setContract(contract); contract.addPermission(new ChangeOwnerPermission(roleLink)); contract.addSignerKeys(privateKeys);
/** * Get set of all key records in linked role. * * @return set of key records (see {@link KeyRecord}) */ @Override @Deprecated public Set<KeyRecord> getKeyRecords() { return resolve().getKeyRecords(); }
public boolean containReference(String name) { if(requiredAllReferences.contains(name) || requiredAnyReferences.contains(name)) return true; if(this instanceof RoleLink) { return ((RoleLink)this).getRole().containReference(name); } if(this instanceof ListRole) { return ((ListRole)this).getRoles().stream().anyMatch(r -> r.containReference(name)); } return false; }
static Contract createSimpleContract(PrivateKey key) { Contract result = new Contract(); // default expiration date result.setExpiresAt(ZonedDateTime.now().plusDays(90)); // issuer role is a key for a new contract result.setIssuerKeys(key.getPublicKey().getShortAddress()); // issuer is owner, link roles result.registerRole(new RoleLink("owner", "issuer")); result.registerRole(new RoleLink("creator", "issuer")); return result; }