protected UnsName initializeWithDsl(Binder binder) { unsName = binder.getString(NAME_FIELD_NAME, null); unsDescription = binder.getString(DESCRIPTION_FIELD_NAME, null); unsURL = binder.getString(URL_FIELD_NAME, null); ArrayList<?> entries = binder.getArray(ENTRIES_FIELD_NAME); for (Object entry: entries) { Binder b; if (entry.getClass().getName().endsWith("Binder")) b = (Binder) entry; else b = new Binder((Map) entry); UnsRecord unsRecord = new UnsRecord().initializeWithDsl(b); unsRecords.add(unsRecord); } return this; }
@Override public Binder onUpdated(MutableEnvironment me) { ZonedDateTime expiresAt = calcExpiresAt(); Map<String, UnsName> newNames = storedNames.stream().collect(Collectors.toMap(UnsName::getUnsName, un -> un)); me.nameRecords().forEach( nameRecord -> { UnsName unsName = newNames.get(nameRecord.getName()); if(unsName != null && unsName.getUnsRecords().size() == nameRecord.getEntries().size() && unsName.getUnsRecords().stream().allMatch(unsRecord -> nameRecord.getEntries().stream().anyMatch(nameRecordEntry -> unsRecord.equalsTo(nameRecordEntry)))) { me.setNameRecordExpiresAt(nameRecord,expiresAt); newNames.remove(nameRecord.getName()); } else { me.destroyNameRecord(nameRecord); } }); newNames.values().forEach(sn -> me.createNameRecord(sn,expiresAt)); return Binder.fromKeysValues("status", "ok"); }
public NNameRecord(@NonNull UnsName unsName, @NonNull ZonedDateTime expiresAt) { name = unsName.getUnsName(); nameReduced = unsName.getUnsReducedName(); description = unsName.getUnsDescription(); url = unsName.getUnsURL(); this.expiresAt = expiresAt; unsName.getUnsRecords().forEach(unsRecord -> { String longAddress = null; String shortAddress = null; for (KeyAddress keyAddress : unsRecord.getAddresses()) { if (keyAddress.isLong()) longAddress = keyAddress.toString(); else shortAddress = keyAddress.toString(); } entries.add(new NNameRecordEntry(unsRecord.getOrigin(), shortAddress, longAddress)); }); }
unsName.setUnsName("test_from_dsl" + Instant.now().getEpochSecond()); unsName.setUnsReducedName("test_from_dsl" + Instant.now().getEpochSecond()); unsName.addUnsRecord(new UnsRecord(randomPrivKey.getPublicKey()));
UnsRecord unsRecord = new UnsRecord(randomPrivKey1.getPublicKey()); unsName.addUnsRecord(unsRecord); uns.addUnsName(unsName); UnsName unsName2 = new UnsName(name2, "test description", "http://test.com"); unsName2.setUnsReducedName(name2); UnsRecord unsRecord2 = new UnsRecord(randomPrivKey2.getPublicKey()); unsName2.addUnsRecord(unsRecord2); uns.addUnsName(unsName2); UnsName unsName3 = new UnsName(name, "test description", "http://test.com"); unsName3.setUnsReducedName(name); UnsRecord unsRecord3 = new UnsRecord(randomPrivKey3.getPublicKey()); unsName3.addUnsRecord(unsRecord3); uns.addUnsName(unsName3); KeyAddress long1 = unsRecord.getAddresses().get(0).isLong() ? unsRecord.getAddresses().get(0) : unsRecord.getAddresses().get(1); KeyAddress long3 = unsRecord3.getAddresses().get(0).isLong() ? unsRecord3.getAddresses().get(0) : unsRecord3.getAddresses().get(1);
UnsRecord unsRecord1 = new UnsRecord(randomPrivateKey1.getPublicKey()); UnsRecord unsRecord2 = new UnsRecord(nameContract.getId()); unsName.addUnsRecord(unsRecord1); unsName.addUnsRecord(unsRecord2); unsName = new UnsName("testbusyorigin"+Instant.now().getEpochSecond(), "testbusyorigin description", "http://testbusyorigin.com"); unsName.setUnsReducedName("testbusyorigin"+Instant.now().getEpochSecond()); unsRecord1 = new UnsRecord(randomPrivateKey2.getPublicKey()); unsRecord2 = new UnsRecord(nameContract.getId()); unsName.addUnsRecord(unsRecord1); unsName.addUnsRecord(unsRecord2); assertErrorsContainsSubstr(irPayload.errors, "origin '"+unsRecord2.getOrigin().toBase64String()+"' is not available"); assertEquals(ItemState.APPROVED, node.waitItem(payingParcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.UNDEFINED, node.waitItem(uns2.getNew().get(0).getId(), 8000).state);
smartContract.seal(); UnsRecord record1 = new UnsRecord(contract.getId()); UnsRecord record2 = new UnsRecord(privateKey.getPublicKey()); assertTrue(nnr2.getEntries().stream().anyMatch(nre -> unsName.getUnsRecords().stream().anyMatch(ur -> ur.equalsTo(nre)))); assertEquals(nnr2.getEntries().size(),unsName.getRecordsCount()); assertEquals(nnr2.getName(),unsName.getUnsName());
private List<HashId> getOriginsToCheck() { Set<HashId> origins = new HashSet<>(); for (UnsName unsName : storedNames) for (UnsRecord unsRecord : unsName.getUnsRecords()) if (unsRecord.getOrigin() != null) origins.add(unsRecord.getOrigin()); for (Approvable revoked : getRevokingItems()) removeRevokedOrigins(revoked, origins); return new ArrayList<>(origins); }
private List<String> getAddressesToCheck() { Set<String> addresses = new HashSet<>(); for (UnsName unsName : storedNames) for (UnsRecord unsRecord : unsName.getUnsRecords()) for (KeyAddress keyAddress : unsRecord.getAddresses()) addresses.add(keyAddress.toString()); for (Approvable revoked : getRevokingItems()) removeRevokedAddresses(revoked, addresses); return new ArrayList<>(addresses); }
public int findUnsRecordByOrigin(HashId origin) { for (int i = 0; i < unsRecords.size(); i++) if (unsRecords.get(i).isMatchingOrigin(origin)) return i; return -1; }
public int findUnsRecordByAddress(KeyAddress address) { for (int i = 0; i < unsRecords.size(); i++) if (unsRecords.get(i).isMatchingAddress(address)) return i; return -1; }
public int findUnsRecordByKey(AbstractKey key) { for (int i = 0; i < unsRecords.size(); i++) if (unsRecords.get(i).isMatchingKey(key)) return i; return -1; }
unsNameToRemove.setUnsReducedName("remove"+Instant.now().getEpochSecond()); UnsRecord unsRecordToChange = new UnsRecord(randomPrivKey1.getPublicKey()); UnsRecord unsRecordToAdd = new UnsRecord(randomPrivKey2.getPublicKey()); UnsRecord unsRecordToRemove = new UnsRecord(randomPrivKey3.getPublicKey()); unsNameToRemove.addUnsRecord(new UnsRecord(referencesContract1.getId())); unsNameToAdd.addUnsRecord(new UnsRecord(referencesContract2.getId())); for(int i = 0; i < unsNameToChangeCopy.getUnsRecords().size();i++) { UnsRecord unsRecord = unsNameToChangeCopy.getUnsRecord(i); if(unsRecord.getAddresses().equals(unsRecordToRemove.getAddresses())) { unsNameToChangeCopy.getUnsRecords().remove(i); i--; if(unsRecord.getAddresses().equals(unsRecordToChange.getAddresses())) { unsRecord.getAddresses().clear(); unsRecord.getAddresses().add(randomPrivKey4.getPublicKey().getShortAddress()); continue;
private void removeRevokedOrigins(Approvable approvable, Set<HashId> set) { if (approvable instanceof UnsContract) { UnsContract unsContract = (UnsContract) approvable; for (UnsName unsName : unsContract.storedNames) for (UnsRecord unsRecord : unsName.getUnsRecords()) if (unsRecord.getOrigin() != null) set.remove(unsRecord.getOrigin()); } for (Approvable revoked : approvable.getRevokingItems()) removeRevokedOrigins(revoked, set); }
private void removeRevokedAddresses(Approvable approvable, Set<String> set) { if (approvable instanceof UnsContract) { UnsContract unsContract = (UnsContract) approvable; for (UnsName unsName : unsContract.storedNames) for (UnsRecord unsRecord : unsName.getUnsRecords()) for (KeyAddress keyAddress : unsRecord.getAddresses()) set.remove(keyAddress.toString()); } for (Approvable revoked : approvable.getRevokingItems()) removeRevokedAddresses(revoked, set); }
UnsRecord unsRecord = new UnsRecord(randomPrivKey1.getPublicKey()); unsName.addUnsRecord(unsRecord); uns.addUnsName(unsName); UnsRecord unsRecord2 = new UnsRecord(randomPrivKey2.getPublicKey()); unsName2.addUnsRecord(unsRecord2); uns2.addUnsName(unsName2); UnsRecord unsRecord3 = new UnsRecord(randomPrivKey3.getPublicKey()); unsName3.addUnsRecord(unsRecord3); uns3.addUnsName(unsName3); UnsName unsName2_1 = new UnsName(name+"2", "test description", "http://test.com"); unsName2_1.setUnsReducedName(name+"2"); UnsRecord unsRecord2_1 = new UnsRecord(randomPrivKey4.getPublicKey()); unsName2_1.addUnsRecord(unsRecord2_1); uns2.addUnsName(unsName2_1);
UnsRecord unsRecord1 = new UnsRecord(randomPrivateKey.getPublicKey()); UnsRecord unsRecord2 = new UnsRecord(nameContract1.getId()); unsName.addUnsRecord(unsRecord1); unsName.addUnsRecord(unsRecord2); unsRecord1 = new UnsRecord(randomPrivateKey.getPublicKey()); unsRecord2 = new UnsRecord(nameContract2.getId()); unsName.addUnsRecord(unsRecord1); unsName.addUnsRecord(unsRecord2); assertErrorsContainsSubstr(irPayload.errors, "address '"+unsRecord1.getAddresses().get(0)+"' is not available"); assertErrorsContainsSubstr(irPayload.errors, "address '"+unsRecord1.getAddresses().get(1)+"' is not available"); assertEquals(ItemState.APPROVED, node.waitItem(payingParcel.getPayment().getContract().getId(), 8000).state); assertEquals(ItemState.UNDEFINED, node.waitItem(uns2.getNew().get(0).getId(), 8000).state);
if(unsRecord.getOrigin() != null) { if(!unsRecord.getAddresses().isEmpty()) { addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + " referencing to origin AND addresses. Should be either origin or addresses"); return false; if(!isOriginReferenceExists(unsRecord.getOrigin())) { addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + " referencing to origin " + unsRecord.getOrigin().toString() + " but no corresponding reference is found"); return false; .filter(contract -> contract.getId().equals(unsRecord.getOrigin()) || contract.getOrigin() != null && contract.getOrigin().equals(unsRecord.getOrigin())) .collect(Collectors.toList()); addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + " referencing to origin " + unsRecord.getOrigin().toString() + " but no corresponding referenced contract is found"); return false; addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + " referencing to origin " + unsRecord.getOrigin().toString() + ". UNS1 contract should be also signed by this contract issuer key."); return false; if(unsRecord.getAddresses().isEmpty()) { addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + " is missing both addresses and origin."); return false; if (unsRecord.getAddresses().size() > 2) addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + ": Addresses list should not be contains more 2 addresses"); if ((unsRecord.getAddresses().size() == 2) && unsRecord.getAddresses().get(0).isLong() == unsRecord.getAddresses().get(1).isLong()) addError(Errors.FAILED_CHECK, NAMES_FIELD_NAME, "name " + n.getUnsName() + ": Addresses list may only contain one short and one long addresses");