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    
019    package net.sourceforge.spnego;
020    
021    import java.security.Principal;
022    
023    import javax.security.auth.kerberos.KerberosPrincipal;
024    
025    import org.ietf.jgss.GSSCredential;
026    
027    /**
028     * This class encapsulates a KerberosPrincipal.
029     * 
030     * <p>This class also has a reference to the client's/requester's 
031     * delegated credential (if any). See the {@link DelegateServletRequest} 
032     * documentation for more details.</p>
033     * 
034     * <p>Also, see the delegation examples at 
035     * <a href="http://spnego.sourceforge.net" target="_blank">http://spnego.sourceforge.net</a>
036     * </p>
037     * 
038     * @author Darwin V. Felix
039     *
040     */
041    public final class SpnegoPrincipal implements Principal {
042    
043        private final transient KerberosPrincipal kerberosPrincipal;
044        
045        private final transient GSSCredential delegatedCred;
046        
047        /**
048         * Constructs a SpnegoPrincipal from the provided String input.
049         * 
050         * @param name the principal name
051         */
052        public SpnegoPrincipal(final String name) {
053            this.kerberosPrincipal = new KerberosPrincipal(name);
054            this.delegatedCred = null;
055        }
056        
057        /**
058         * Constructs a SpnegoPrincipal from the provided String input 
059         * and name type input.
060         * 
061         * @param name the principal name
062         * @param nameType the name type of the principal
063         */
064        public SpnegoPrincipal(final String name, final int nameType) {
065            this.kerberosPrincipal = new KerberosPrincipal(name, nameType);
066            this.delegatedCred = null;
067        }
068    
069        /**
070         * Constructs a SpnegoPrincipal from the provided String input 
071         * and name type input.
072         * 
073         * @param name the principal name
074         * @param nameType the name type of the principal
075         * @param delegCred this principal's delegated credential (if any)
076         */
077        public SpnegoPrincipal(final String name, final int nameType
078            , final GSSCredential delegCred) {
079            
080            this.kerberosPrincipal = new KerberosPrincipal(name, nameType);
081            this.delegatedCred = delegCred;
082        }
083        
084        /**
085         * Returns this Principal's delegated credential or null.
086         * 
087         * @return Principal's delegated credential or null.
088         */
089        public GSSCredential getDelegatedCredential() {
090            return this.delegatedCred;
091        }
092        
093        @Override
094        public String getName() {
095            return this.kerberosPrincipal.getName();
096        }
097        
098        /**
099         * Returns the name type of the KerberosPrincipal.
100         * 
101         * @return name type of the KerberosPrincipal
102         */
103        public int getNameType() {
104            return this.kerberosPrincipal.getNameType();
105        }
106        
107        /**
108         * Returns the realm component of this Kerberos principal.
109         * 
110         * @return realm component of this Kerberos principal
111         */
112        public String getRealm() {
113            return this.kerberosPrincipal.getRealm();
114        }
115        
116        @Override
117        public int hashCode() {
118            return this.kerberosPrincipal.hashCode();
119        }
120        
121        @Override
122        public String toString() {
123            return this.kerberosPrincipal.toString();
124        }
125    }