Search in sources :

Example 6 with SessionConfig

use of net.i2p.data.i2cp.SessionConfig in project i2p.i2p by i2p.

the class ClientManager method shouldPublishLeaseSet.

/**
 *  @return true if we don't know about this destination at all
 */
public boolean shouldPublishLeaseSet(Hash destHash) {
    if (destHash == null)
        return true;
    ClientConnectionRunner runner = getRunner(destHash);
    if (runner == null)
        return true;
    SessionConfig config = runner.getConfig(destHash);
    if (config == null)
        return true;
    return !Boolean.parseBoolean(config.getOptions().getProperty(ClientManagerFacade.PROP_CLIENT_ONLY));
}
Also used : SessionConfig(net.i2p.data.i2cp.SessionConfig)

Example 7 with SessionConfig

use of net.i2p.data.i2cp.SessionConfig in project i2p.i2p by i2p.

the class ClientMessageEventListener method handleCreateLeaseSet.

/**
 * override for testing
 */
protected void handleCreateLeaseSet(CreateLeaseSetMessage message) {
    if ((message.getLeaseSet() == null) || (message.getPrivateKey() == null) || (message.getSigningPrivateKey() == null)) {
        if (_log.shouldLog(Log.ERROR))
            _log.error("Null lease set granted: " + message);
        _runner.disconnectClient("Invalid CreateLeaseSetMessage");
        return;
    }
    SessionId id = message.getSessionId();
    SessionConfig cfg = _runner.getConfig(id);
    if (cfg == null) {
        List<SessionId> current = _runner.getSessionIds();
        String msg = "CreateLeaseSet invalid session: " + id + " current: " + current;
        if (_log.shouldLog(Log.ERROR))
            _log.error(msg);
        _runner.disconnectClient(msg);
        return;
    }
    Destination dest = cfg.getDestination();
    Destination ndest = message.getLeaseSet().getDestination();
    if (!dest.equals(ndest)) {
        if (_log.shouldLog(Log.ERROR))
            _log.error("Different destination in LS");
        _runner.disconnectClient("Different destination in LS");
        return;
    }
    LeaseSetKeys keys = _context.keyManager().getKeys(dest);
    if (keys == null || !message.getPrivateKey().equals(keys.getDecryptionKey())) {
        // Verify and register crypto keys if new or if changed
        // Private crypto key should never change, and if it does,
        // one of the checks below will fail
        PublicKey pk;
        try {
            pk = message.getPrivateKey().toPublic();
        } catch (IllegalArgumentException iae) {
            if (_log.shouldLog(Log.ERROR))
                _log.error("Bad private key in LS");
            _runner.disconnectClient("Bad private key in LS");
            return;
        }
        if (!pk.equals(message.getLeaseSet().getEncryptionKey())) {
            if (_log.shouldLog(Log.ERROR))
                _log.error("Private/public crypto key mismatch in LS");
            _runner.disconnectClient("Private/public crypto key mismatch in LS");
            return;
        }
        // just register new SPK, don't verify, unused
        _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
    } else if (!message.getSigningPrivateKey().equals(keys.getRevocationKey())) {
        // just register new SPK, don't verify, unused
        _context.keyManager().registerKeys(dest, message.getSigningPrivateKey(), message.getPrivateKey());
    }
    try {
        _context.netDb().publish(message.getLeaseSet());
    } catch (IllegalArgumentException iae) {
        if (_log.shouldLog(Log.ERROR))
            _log.error("Invalid leaseset from client", iae);
        _runner.disconnectClient("Invalid leaseset: " + iae);
        return;
    }
    if (_log.shouldLog(Log.INFO))
        _log.info("New lease set granted for destination " + dest);
    // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs)
    _runner.leaseSetCreated(message.getLeaseSet());
}
Also used : Destination(net.i2p.data.Destination) PublicKey(net.i2p.data.PublicKey) SessionConfig(net.i2p.data.i2cp.SessionConfig) LeaseSetKeys(net.i2p.router.LeaseSetKeys) SessionId(net.i2p.data.i2cp.SessionId)

Example 8 with SessionConfig

use of net.i2p.data.i2cp.SessionConfig in project i2p.i2p by i2p.

the class ClientMessageEventListener method handleReconfigureSession.

/**
 * Message's Session ID ignored. This doesn't support removing previously set options.
 * Nor do we bother with message.getSessionConfig().verifySignature() ... should we?
 * Nor is the Date checked.
 *
 * Note that this does NOT update the few options handled in
 * ClientConnectionRunner.sessionEstablished(). Those can't be changed later.
 *
 * Defaults in SessionConfig options are, in general, NOT honored.
 * In-JVM client side must promote defaults to the primary map.
 */
private void handleReconfigureSession(ReconfigureSessionMessage message) {
    SessionId id = message.getSessionId();
    SessionConfig cfg = _runner.getConfig(id);
    if (cfg == null) {
        List<SessionId> current = _runner.getSessionIds();
        String msg = "ReconfigureSession invalid session: " + id + " current: " + current;
        if (_log.shouldLog(Log.ERROR))
            _log.error(msg);
        // sendStatusMessage(id, SessionStatusMessage.STATUS_INVALID);
        _runner.disconnectClient(msg);
        return;
    }
    if (_log.shouldLog(Log.INFO))
        _log.info("Updating options - old: " + cfg + " new: " + message.getSessionConfig());
    if (!message.getSessionConfig().getDestination().equals(cfg.getDestination())) {
        _log.error("Dest mismatch");
        sendStatusMessage(id, SessionStatusMessage.STATUS_INVALID);
        _runner.stopRunning();
        return;
    }
    Hash dest = cfg.getDestination().calculateHash();
    cfg.getOptions().putAll(message.getSessionConfig().getOptions());
    ClientTunnelSettings settings = new ClientTunnelSettings(dest);
    Properties props = new Properties();
    props.putAll(cfg.getOptions());
    settings.readFromProperties(props);
    _context.tunnelManager().setInboundSettings(dest, settings.getInboundSettings());
    _context.tunnelManager().setOutboundSettings(dest, settings.getOutboundSettings());
    sendStatusMessage(id, SessionStatusMessage.STATUS_UPDATED);
}
Also used : ClientTunnelSettings(net.i2p.router.ClientTunnelSettings) SessionConfig(net.i2p.data.i2cp.SessionConfig) Hash(net.i2p.data.Hash) Properties(java.util.Properties) SessionId(net.i2p.data.i2cp.SessionId)

Aggregations

SessionConfig (net.i2p.data.i2cp.SessionConfig)8 SessionId (net.i2p.data.i2cp.SessionId)5 Properties (java.util.Properties)3 I2PSessionException (net.i2p.client.I2PSessionException)2 DataFormatException (net.i2p.data.DataFormatException)2 Destination (net.i2p.data.Destination)2 ClientTunnelSettings (net.i2p.router.ClientTunnelSettings)2 SigType (net.i2p.crypto.SigType)1 Hash (net.i2p.data.Hash)1 PublicKey (net.i2p.data.PublicKey)1 CreateSessionMessage (net.i2p.data.i2cp.CreateSessionMessage)1 I2CPMessageException (net.i2p.data.i2cp.I2CPMessageException)1 MessageId (net.i2p.data.i2cp.MessageId)1 MessageStatusMessage (net.i2p.data.i2cp.MessageStatusMessage)1 ReconfigureSessionMessage (net.i2p.data.i2cp.ReconfigureSessionMessage)1 ClientMessage (net.i2p.router.ClientMessage)1 Job (net.i2p.router.Job)1 LeaseSetKeys (net.i2p.router.LeaseSetKeys)1