001/** 
002 * Copyright (C) 2009 "Darwin V. Felix" <darwinfelix@users.sourceforge.net>
003 * 
004 * This library is free software; you can redistribute it and/or
005 * modify it under the terms of the GNU Lesser General Public
006 * License as published by the Free Software Foundation; either
007 * version 2.1 of the License, or (at your option) any later version.
008 * 
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
012 * Lesser General Public License for more details.
013 * 
014 * You should have received a copy of the GNU Lesser General Public
015 * License along with this library; if not, write to the Free Software
016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017 */
018
019package net.sourceforge.spnego;
020
021import net.sourceforge.spnego.SpnegoHttpFilter.Constants;
022
023/**
024 * Example schemes are "Negotiate" and "Basic". 
025 * 
026 * <p>See examples and tutorials at 
027 * <a href="http://spnego.sourceforge.net" target="_blank">http://spnego.sourceforge.net</a>
028 * </p>
029 * 
030 * @author Darwin V. Felix
031 *
032 */
033final class SpnegoAuthScheme {
034    
035    /** Zero length byte array. */
036    private static final transient byte[] EMPTY_BYTE_ARRAY = new byte[0];
037
038    /** HTTP (Request) "Authorization" Header scheme. */ 
039    private final transient String scheme;
040
041    /** HTTP (Request) scheme token. */
042    private final transient String token;
043    
044    /** true if Basic Auth scheme. */
045    private final transient boolean basicScheme;
046    
047    /** true if Negotiate scheme. */
048    private final transient boolean negotiateScheme;
049    
050    /** true if NTLM token. */
051    private final transient boolean ntlm;
052
053    /**
054     * 
055     * @param authScheme 
056     * @param authToken 
057     */
058    SpnegoAuthScheme(final String authScheme, final String authToken) {
059        this.scheme = authScheme;
060        this.token = authToken;
061        
062        if (null == authToken || authToken.isEmpty()) {
063            this.ntlm = false;
064        } else {
065            this.ntlm = authToken.startsWith(SpnegoHttpFilter.Constants.NTLM_PROLOG);
066        }
067        
068        this.negotiateScheme = Constants.NEGOTIATE_HEADER.equalsIgnoreCase(authScheme);
069        this.basicScheme = Constants.BASIC_HEADER.equalsIgnoreCase(authScheme);
070    }
071    
072    /**
073     * Returns true if this SpnegoAuthScheme is of type "Basic".
074     * 
075     * @return true if Basic Auth scheme
076     */
077    boolean isBasicScheme() {
078        return this.basicScheme;
079    }
080    
081    /**
082     * Returns true if this SpnegoAuthScheme is of type "Negotiate".
083     * 
084     * @return true if Negotiate scheme
085     */
086    boolean isNegotiateScheme() {
087        return this.negotiateScheme;
088    }
089    /**
090     * Returns true if NTLM.
091     * 
092     * @return true if Servlet Filter received NTLM token
093     */
094    boolean isNtlmToken() {
095        return this.ntlm;
096    }
097
098    /**
099     * Returns HTTP Authorization scheme.
100     * 
101     * @return "Negotiate" or "Basic"
102     */
103    String getScheme() {
104        return this.scheme;
105    }
106
107    /**
108     * Returns a copy of byte[].
109     * 
110     * @return copy of token
111     */
112    byte[] getToken() {
113        return (null == this.token) ? EMPTY_BYTE_ARRAY : Base64.decode(this.token);
114    }
115}