@Override protected LeaseSet locked_buildNewLeaseSet() { LeaseSet ls = _context.netDb().lookupLeaseSetLocally(_aliasOf.getSettings().getDestination()); if (ls == null) return null; // copy everything so it isn't corrupted LeaseSet rv = new LeaseSet(); for (int i = 0; i < ls.getLeaseCount(); i++) { Lease old = ls.getLease(i); Lease lease = new Lease(); lease.setEndDate(old.getEndDate()); lease.setTunnelId(old.getTunnelId()); lease.setGateway(old.getGateway()); rv.addLease(lease); } return rv; }
/** has this lease already expired? */ public boolean isExpired() { return isExpired(0); }
@Test public void failsWriteWithNullTunnelId() throws Exception{ Lease lease = new Lease(); lease.setEndDate(new Date(1000*60*2)); byte h[] = new byte[Hash.HASH_LENGTH]; lease.setGateway(new Hash(h)); lease.setTunnelId(null); exception.expect(DataFormatException.class); exception.expectMessage("Not enough data to write out a Lease"); lease.writeBytes(new ByteArrayOutputStream()); }
@Override public boolean equals(Object object) { if (object == this) return true; if ((object == null) || !(object instanceof Lease)) return false; Lease lse = (Lease) object; return DataHelper.eq(_end, lse.getEndDate()) && DataHelper.eq(_tunnelId, lse.getTunnelId()) && DataHelper.eq(_gateway, lse.getGateway()); }
@Test public void testNullEquals() throws Exception{ Lease lease = new Lease(); lease.setEndDate(new Date(1000*60*2)); byte h[] = new byte[Hash.HASH_LENGTH]; lease.setGateway(new Hash(h)); lease.setTunnelId(null); assertFalse(lease.equals(null)); } }
if (_lease != null) { if (!_lease.isExpired(Router.CLOCK_FUDGE_FACTOR / 4)) { if (_lease.getTunnelId().equals(lease.getTunnelId()) && _lease.getGateway().equals(lease.getGateway())) { if (_log.shouldLog(Log.INFO)) _log.info(getJobId() + ": Found in cache - lease for " + _toString); if (!lease.isExpired(Router.CLOCK_FUDGE_FACTOR / 4)) leases.add(lease); if (!lease.isExpired(Router.CLOCK_FUDGE_FACTOR)) leases.add(lease); RouterInfo ri = getContext().netDb().lookupRouterInfoLocally(l.getGateway()); if (ri == null || ri.getCapabilities().indexOf(Router.CAPABILITY_UNREACHABLE) < 0) { _lease = l; _log.warn(getJobId() + ": Skipping unreachable gateway " + l.getGateway() + " for " + _toString);
@Override protected void doReadMessage(InputStream in, int size) throws I2CPMessageException, IOException { try { if (_sessionId != null) throw new IllegalStateException(); _sessionId = new SessionId(); _sessionId.readBytes(in); int numTunnels = (int) DataHelper.readLong(in, 1); for (int i = 0; i < numTunnels; i++) { Lease lease = new Lease(); lease.readBytes(in); _endpoints.add(lease); } } catch (DataFormatException dfe) { throw new I2CPMessageException("Unable to load the message data", dfe); } }
current.getType() != DatabaseEntry.KEY_TYPE_META_LS2) { for (int i = 0; i < leases; i++) { if (! current.getLease(i).getTunnelId().equals(set.getLease(i).getTunnelId())) break; if (! current.getLease(i).getGateway().equals(set.getLease(i).getGateway())) break; if (i == leases - 1) {
public DataStructure createStructureToRead() { return new Lease(); }
@Override protected byte[] doWriteMessage() throws I2CPMessageException, IOException { if (_sessionId == null) throw new I2CPMessageException("No data"); ByteArrayOutputStream os = new ByteArrayOutputStream(256); try { _sessionId.writeBytes(os); DataHelper.writeLong(os, 1, _endpoints.size()); for (int i = 0; i < _endpoints.size(); i++) { _endpoints.get(i).writeBytes(os); } } catch (DataFormatException dfe) { throw new I2CPMessageException("Error writing out the message data", dfe); } return os.toByteArray(); }
public int compare(Lease l, Lease r) { return r.getEndDate().compareTo(l.getEndDate()); } }
/** * @throws IllegalStateException if already signed */ public void addLease(Lease lease) { if (lease == null) throw new IllegalArgumentException("erm, null lease"); if (lease.getGateway() == null) throw new IllegalArgumentException("erm, lease has no gateway"); if (getType() != KEY_TYPE_META_LS2 && lease.getTunnelId() == null) throw new IllegalArgumentException("erm, lease has no tunnel"); if (_signature != null) throw new IllegalStateException(); if (_leases.size() >= MAX_LEASES) throw new IllegalArgumentException("Too many leases - max is " + MAX_LEASES); _leases.add(lease); long expire = lease.getEndDate().getTime(); if (expire < _firstExpiration) _firstExpiration = expire; if (expire > _lastExpiration) _lastExpiration = expire; }
_log.debug(getJobId() + ": Sending msg out " + _outTunnel.getSendTunnelId(0) + " to " + _toString + " at " + _lease.getTunnelId() + " on " + _lease.getGateway());
@Test public void testAddLeaseInvalid() { // create test subject LeaseSet subj = new LeaseSet(); // try to add completely invalid lease(ie. no data) exception.expect(IllegalArgumentException.class); exception.expectMessage("erm, lease has no gateway"); subj.addLease(new Lease()); } }
/** * Without sig. This does NOT validate the signature */ @Override protected void writeBytesWithoutSig(OutputStream out) throws DataFormatException, IOException { if (_destination == null) throw new DataFormatException("Not enough data to write out a LeaseSet"); // LS2 header writeHeader(out); // Meta LS2 part if (_options != null && !_options.isEmpty()) { DataHelper.writeProperties(out, _options); } else { DataHelper.writeLong(out, 2, 0); } out.write(_leases.size()); for (Lease lease : _leases) { lease.writeBytes(out); } // revocations out.write(0); }
ByteArrayOutputStream baos = new ByteArrayOutputStream(datalen); for (int i = 0; i < size; i++) { _leases.get(i).getGateway().writeBytes(baos); _leases.get(i).getTunnelId().writeBytes(baos); _decryptedLeases = new ArrayList<Lease>(size - 1); for (int i = 0; i < size-1; i++) { Lease l = new Lease(); Hash h = new Hash(); h.readBytes(bais); l.setGateway(h); TunnelId t = new TunnelId(); t.readBytes(bais); l.setTunnelId(t); l.setEndDate(_leases.get(i).getEndDate()); _decryptedLeases.add(l);
public DataStructure createDataStructure() throws DataFormatException { Lease lease = new Lease(); lease.setEndDate(new Date(1000*60*2)); byte h[] = new byte[Hash.HASH_LENGTH]; lease.setGateway(new Hash(h)); StructureTest tst = new TunnelIdTest(); lease.setTunnelId((TunnelId)tst.createDataStructure()); return lease; } public DataStructure createStructureToRead() { return new Lease(); }
getContext().tunnelDispatcher().dispatchOutbound(_msg, _outTunnel.getSendTunnelId(0), _lease.getTunnelId(), _lease.getGateway()); long dispatchSendTime = getContext().clock().now() - before;
/** without sig! */ protected byte[] getBytes() { if (_byteified != null) return _byteified; if ((_destination == null) || (_encryptionKey == null) || (_signingKey == null)) return null; int len = size(); ByteArrayOutputStream out = new ByteArrayOutputStream(len); try { _destination.writeBytes(out); _encryptionKey.writeBytes(out); _signingKey.writeBytes(out); out.write((byte) _leases.size()); for (Lease lease : _leases) { lease.writeBytes(out); } } catch (IOException ioe) { return null; } catch (DataFormatException dfe) { return null; } byte rv[] = out.toByteArray(); // if we are floodfill and this was published to us if (_receivedAsPublished) _byteified = rv; return rv; }