public void addPermission(JSApiPermission permission) { this.currentContract.addPermission(permission.extractPermission(new JSApiAccessor())); }
/** * Collect all permissions and create links to roles or new roles as appropriate */ private void scanDslPermissions() { definition.getBinderOrThrow("permissions").forEach((name, params) -> { // this complex logic is needed to process both yaml-imported structures // and regular serialized data in the same place if (params instanceof Object[]) for (Object x : (Object[]) params) loadDslPermission(name, x); else if (params instanceof List) for (Object x : (List) params) loadDslPermission(name, x); else if (params instanceof Permission) addPermission((Permission) params); else loadDslPermission(name, params); }); }
public void deserializeWith(Binder data, BiDeserializer d) { registerRole(d.deserialize(data.getBinderOrThrow("issuer"))); createdAt = data.getZonedDateTimeOrThrow("created_at"); expiresAt = data.getZonedDateTime("expires_at", null); extendedType = data.getString("extended_type", null); this.data = d.deserialize(data.getBinder("data", Binder.EMPTY)); references = d.deserialize(data.getList("references", null)); Map<String, Permission> perms = d.deserialize(data.getOrThrow("permissions")); perms.forEach((id, perm) -> { perm.setId(id); addPermission(perm); }); }
@Test public void goodRevokeAnother() throws Exception { Contract c1 = new Contract(ownerKey1); RoleLink rl = new RoleLink("@revoke", "owner"); rl.setContract(c1); c1.addPermission(new RevokePermission(rl)); c1.seal(); Contract c2 = new Contract(ownerKey2); c2.seal(); Assert.assertTrue(c2.check()); Contract c3 = c2.createRevision(ownerKey2); //to prevent "state is identical" c3.setOwnerKeys(ownerKey3); c3.addSignerKey(ownerKey1); c3.addRevokingItems(c1); c3.seal(); assertTrue(c3.check()); }
@Test public void modifyExpiresAtAllowed() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field_to_be_changed", "value1"); ModifyDataPermission modifyDataPermission = new ModifyDataPermission(contract.getRole("owner"), new Binder()); modifyDataPermission.addField("/expires_at", null); contract.addPermission(modifyDataPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.setExpiresAt(ZonedDateTime.now().plusDays(1)); changed.seal(); changed.check(); assertTrue(changed.isOk()); }
@Test public void modifyExpiresAtDeclined() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field_to_be_changed", "value1"); ModifyDataPermission modifyDataPermission = new ModifyDataPermission(contract.getRole("owner"), new Binder()); modifyDataPermission.addField("expires_at", null); contract.addPermission(modifyDataPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.setExpiresAt(ZonedDateTime.now().plusDays(1)); changed.seal(); changed.check(); assertTrue(!changed.isOk()); }
@Test public void badRevokeAnother() throws Exception { Contract c1 = new Contract(ownerKey1); RoleLink rl = new RoleLink("@revoke", "owner"); rl.setContract(c1); c1.addPermission(new RevokePermission(rl)); c1.seal(); Contract c2 = new Contract(ownerKey2); c2.seal(); Assert.assertTrue(c2.check()); Contract c3 = c2.createRevision(ownerKey2); //to prevent "state is identical" c3.setOwnerKeys(ownerKey3); c3.addRevokingItems(c1); c3.seal(); assertFalse(c3.check()); }
@Test public void defaultParameters() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33.000000000000000001"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of("field_name", "field1")); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "33.000000000000000002"); changed.seal(); changed.check(); assertTrue(changed.isOk()); }
@Test public void modifyDataDeclined() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field_to_be_changed", "value1"); ModifyDataPermission modifyDataPermission = new ModifyDataPermission(contract.getRole("owner"), new Binder()); contract.addPermission(modifyDataPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field_to_be_changed", "value2"); changed.seal(); changed.check(); assertTrue(!changed.isOk()); }
@Test public void modifyDataAllowed() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field_to_be_changed", "value1"); ModifyDataPermission modifyDataPermission = new ModifyDataPermission(contract.getRole("owner"), new Binder()); modifyDataPermission.addField("field_to_be_changed", null); contract.addPermission(modifyDataPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field_to_be_changed", "value2"); changed.seal(); changed.check(); assertTrue(changed.isOk()); }
@Test public void lessMinValueDeclined() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33.000000000000000012"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", "33.000000000000000008", "max_value", "34", "min_step", "-0.000000000000000005", "max_step", "0.000000000000000005" ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "33.000000000000000007"); changed.seal(); changed.check(); assertFalse(changed.isOk()); }
@Test public void changeAllowedStr() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", 33, "max_value", 34, "min_step", 1, "max_step", 1 ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "34"); changed.seal(); changed.check(); assertTrue(changed.isOk()); }
@Test public void changeDeclinedStr() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", 33, "max_value", 36, "min_step", 1, "max_step", 2 ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "36"); changed.seal(); changed.check(); assertFalse(changed.isOk()); }
@Test public void greaterMaxValueDeclined() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33.000000000000000012"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", "33.000000000000000008", "max_value", "33.000000000000000016", "min_step", "-0.000000000000000005", "max_step", "0.000000000000000005" ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "33.000000000000000017"); changed.seal(); changed.check(); assertFalse(changed.isOk()); }
@Test public void changeAllowed() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", 33); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", 33, "max_value", 34, "min_step", 1, "max_step", 1 ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", 34); changed.seal(); changed.check(); assertTrue(changed.isOk()); }
@Test public void changeAllowedStrDecimal() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33.000000000000000001"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", "33", "max_value", "34", "min_step", "0.000000000000000001", "max_step", "0.000000000000000001" ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "33.000000000000000002"); changed.seal(); changed.check(); assertTrue(changed.isOk()); }
@Test public void changeDeclinedStrDecimal() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", "33.000000000000000001"); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", "33", "max_value", "36", "min_step", "0.000000000000000001", "max_step", "0.000000000000000002" ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", "33.000000000000000004"); changed.seal(); changed.check(); assertFalse(changed.isOk()); }
@Test public void changeDeclined() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); contract.getStateData().put("field1", 33); ChangeNumberPermission changeNumberPermission = new ChangeNumberPermission(contract.getRole("owner"), Binder.of( "field_name", "field1", "min_value", 33, "max_value", 36, "min_step", 1, "max_step", 2 ) ); contract.addPermission(changeNumberPermission); contract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); changed.getStateData().set("field1", 36); changed.seal(); changed.check(); assertFalse(changed.isOk()); }
@Test public void modifyReferencesDeclined() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); ModifyDataPermission modifyDataPermission = new ModifyDataPermission(contract.getRole("owner"),new Binder()); modifyDataPermission.addField("references", null); contract.addPermission(modifyDataPermission); contract.seal(); Contract referencedContract = new Contract(TestKeys.privateKey(1)); referencedContract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); Reference ref = new Reference(referencedContract); ref.addMatchingItem(referencedContract); ref.type = Reference.TYPE_EXISTING_STATE; changed.addReference(ref); changed.seal(); changed.check(); assertTrue(!changed.isOk()); }
@Test public void modifyReferencesAllowed() throws Exception { Contract contract = new Contract(TestKeys.privateKey(0)); ModifyDataPermission modifyDataPermission = new ModifyDataPermission(contract.getRole("owner"),new Binder()); modifyDataPermission.addField("/references", null); contract.addPermission(modifyDataPermission); contract.seal(); Contract referencedContract = new Contract(TestKeys.privateKey(1)); referencedContract.seal(); Contract changed = contract.createRevision(); changed.addSignerKey(TestKeys.privateKey(0)); Reference ref = new Reference(referencedContract); ref.type = Reference.TYPE_EXISTING_STATE; ref.addMatchingItem(referencedContract); changed.addReference(ref); changed.seal(); changed.check(); changed.traceErrors(); assertTrue(changed.isOk()); }