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

com.kerb4j.client.SpnegoContext Maven / Gradle / Ivy

package com.kerb4j.client;

import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSException;
import org.ietf.jgss.GSSName;

import javax.security.auth.Subject;
import java.io.Closeable;
import java.io.IOException;
import java.security.PrivilegedActionException;
import java.security.PrivilegedExceptionAction;
import java.util.Base64;

public class SpnegoContext implements Closeable {

    private static final byte[] EMPTY_BYTE = new byte[0];

    private final SpnegoClient spnegoClient;
    private final GSSContext gssContext; // TODO: how it should be renewed ?

    public SpnegoContext(SpnegoClient spnegoClient, GSSContext gssContext) {
        this.spnegoClient = spnegoClient;
        this.gssContext = gssContext;
    }

    public void requestCredentialsDelegation() throws GSSException {
        gssContext.requestCredDeleg(true);
    }

    public byte[] createToken() throws PrivilegedActionException {
        return Subject.doAs(spnegoClient.getSubject(), (PrivilegedExceptionAction) () ->
                gssContext.initSecContext(EMPTY_BYTE, 0, 0)
        );
    }

    public String createTokenAsAuthroizationHeader() throws PrivilegedActionException {
        return "Negotiate " + Base64.getEncoder().encodeToString(createToken());
    }

    public void processMutualAuthorization(byte[] data, int offset, int length) throws PrivilegedActionException {
        Subject.doAs(spnegoClient.getSubject(), (PrivilegedExceptionAction) () ->
                gssContext.initSecContext(data, offset, length)
        );
    }

    public byte[] acceptToken(byte[] token) throws GSSException {
        return this.gssContext.acceptSecContext(token, 0, token.length);
    }

    //

    public GSSName getSrcName() throws GSSException {
        return gssContext.getSrcName();
    }

    public GSSContext getGSSContext() {
        return gssContext;
    }


    public boolean isEstablished() {
        return gssContext.isEstablished();
    }

    public void close() throws IOException {
        try {
            gssContext.dispose();
        } catch (GSSException e) {
            throw new IOException(e);
        }
    }



}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy