1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $RCSfile$
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software.
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smack.packet;
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.util.StringUtils;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Authentication packet, which can be used to login to a XMPP server as well
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * as discover login information from the server.
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Authentication extends IQ {
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String username = null;
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String password = null;
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String digest = null;
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String resource = null;
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Create a new authentication packet. By default, the packet will be in
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * "set" mode in order to perform an actual authentication with the server.
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * In order to send a "get" request to get the available authentication
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * modes back from the server, change the type of the IQ packet to "get":
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p/>
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * <p><tt>setType(IQ.Type.GET);</tt>
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public Authentication() {
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        setType(IQ.Type.SET);
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the username, or <tt>null</tt> if the username hasn't been sent.
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the username.
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getUsername() {
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return username;
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the username.
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param username the username.
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setUsername(String username) {
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.username = username;
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the plain text password or <tt>null</tt> if the password hasn't
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * been set.
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the password.
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getPassword() {
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return password;
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the plain text password.
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param password the password.
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setPassword(String password) {
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.password = password;
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the password digest or <tt>null</tt> if the digest hasn't
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * been set. Password digests offer a more secure alternative for
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * authentication compared to plain text. The digest is the hex-encoded
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * SHA-1 hash of the connection ID plus the user's password. If the
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * digest and password are set, digest authentication will be used. If
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * only one value is set, the respective authentication mode will be used.
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the digest of the user's password.
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getDigest() {
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return digest;
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the digest value using a connection ID and password. Password
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * digests offer a more secure alternative for authentication compared to
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * plain text. The digest is the hex-encoded SHA-1 hash of the connection ID
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * plus the user's password. If the digest and password are set, digest
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * authentication will be used. If only one value is set, the respective
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * authentication mode will be used.
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param connectionID the connection ID.
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param password     the password.
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @see org.jivesoftware.smack.Connection#getConnectionID()
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setDigest(String connectionID, String password) {
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.digest = StringUtils.hash(connectionID + password);
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the digest value directly. Password digests offer a more secure
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * alternative for authentication compared to plain text. The digest is
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * the hex-encoded SHA-1 hash of the connection ID plus the user's password.
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * If the digest and password are set, digest authentication will be used.
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * If only one value is set, the respective authentication mode will be used.
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param digest the digest, which is the SHA-1 hash of the connection ID
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *               the user's password, encoded as hex.
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @see org.jivesoftware.smack.Connection#getConnectionID()
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setDigest(String digest) {
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.digest = digest;
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Returns the resource or <tt>null</tt> if the resource hasn't been set.
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @return the resource.
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getResource() {
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return resource;
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Sets the resource.
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     *
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * @param resource the resource.
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public void setResource(String resource) {
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.resource = resource;
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getChildElementXML() {
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        StringBuilder buf = new StringBuilder();
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("<query xmlns=\"jabber:iq:auth\">");
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (username != null) {
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (username.equals("")) {
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<username/>");
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else {
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<username>").append(username).append("</username>");
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (digest != null) {
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (digest.equals("")) {
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<digest/>");
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else {
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<digest>").append(digest).append("</digest>");
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (password != null && digest == null) {
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (password.equals("")) {
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<password/>");
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else {
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<password>").append(StringUtils.escapeForXML(password)).append("</password>");
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (resource != null) {
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            if (resource.equals("")) {
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<resource/>");
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            else {
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                buf.append("<resource>").append(resource).append("</resource>");
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("</query>");
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return buf.toString();
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
187