public Void run() throws GSSException { NegotiationContext negContext = exchange.getAttachment(NegotiationContext.ATTACHMENT_KEY); if (negContext == null) { negContext = new NegotiationContext(); exchange.putAttachment(NegotiationContext.ATTACHMENT_KEY, negContext); // Also cache it on the connection for future calls. exchange.getConnection().putAttachment(NegotiationContext.ATTACHMENT_KEY, negContext); } GSSContext gssContext = negContext.getGssContext(); if (gssContext == null) { GSSManager manager = GSSManager.getInstance(); gssContext = manager.createContext((GSSCredential) null); negContext.setGssContext(gssContext); } byte[] respToken = gssContext.acceptSecContext( challenge.array(), challenge.arrayOffset(), challenge.limit()); negContext.setResponseToken(respToken); if (negContext.isEstablished()) { result.setResult( new AuthenticationResult( negContext.getPrincipal(), AuthenticationOutcome.AUTHENTICATED)); } else { // This isn't a failure but as the context is not established another round trip with the // client is needed. result.setResult( new AuthenticationResult( negContext.getPrincipal(), AuthenticationOutcome.NOT_AUTHENTICATED)); } return null; }