All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.subethamail.smtp.internal.proxy.ProxyProtocolV1V2Handler Maven / Gradle / Ivy

Go to download

A fork of a fork (!) of SubEtha, an easy-to-use server-side SMTP library for Java.

The newest version!
package org.subethamail.smtp.internal.proxy;

import static org.subethamail.smtp.internal.util.HexUtils.toHex;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.subethamail.smtp.server.Session;

/**
 * Implements {@link ProxyHandler} both for PROXY
 * protocol V1 textual and V2 binary.
 *
 * @author Diego Salvi
 */
public class ProxyProtocolV1V2Handler implements ProxyHandler {

    private final static Logger log = LoggerFactory.getLogger(ProxyProtocolV1V2Handler.class);

    /** Standard instance */
    public static final ProxyProtocolV1V2Handler INSTANCE =
            new ProxyProtocolV1V2Handler(ProxyProtocolV1Handler.INSTANCE, ProxyProtocolV2Handler.INSTANCE);

    ProxyProtocolV1Handler v1;
    ProxyProtocolV2Handler v2;

    public ProxyProtocolV1V2Handler(ProxyProtocolV1Handler v1, ProxyProtocolV2Handler v2) {
        this.v1 = v1;
        this.v2 = v2;
    }

    @Override
    public ProxyResult handle(InputStream in, OutputStream out, Session session) throws IOException {

        // Max bytes to peek from stream to check for PROXY protocol header prefix
        int maxPrefixSize = Math.max(ProxyProtocolV1Handler.prefixSize(), ProxyProtocolV2Handler.prefixSize());

        // Do NOT close this buffer or will close wrapped IO
        BufferedInputStream buffered = new BufferedInputStream(in, maxPrefixSize);

        // Setup a read ahead limit. We'll use this stream to parse PROXY headers if a right prefix has been detected
        buffered.mark(maxPrefixSize);

        byte[] prefix = new byte[maxPrefixSize];
        int read = buffered.read(prefix, 0, maxPrefixSize);


        if (v1.isValidPrefix(prefix)) {
            log.debug("(session {}) Detected PROXY protocol v1 prefix", session.getSessionId());
            buffered.reset();
            return v1.handle(buffered, out, session);
        }

        if (v2.isValidPrefix(prefix)) {
            log.debug("(session {}) Detected PROXY protocol v2 prefix", session.getSessionId());
            buffered.reset();
            return v2.handle(buffered, out, session);
        }

        String prefixHex = toHex(prefix, 0, read);
        log.error("(session {}) Invalid PROXY protocol v1 or v2 prefix {}", session.getSessionId(), prefixHex);
        throw new IOException("Invalid PROXY protocol v1 or v2 prefix " + prefixHex);

    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy