1 /*
2 * Conditions Of Use
3 *
4 * This software was developed by employees of the National Institute of
5 * Standards and Technology (NIST), an agency of the Federal Government.
6 * Pursuant to title 15 Untied States Code Section 105, works of NIST
7 * employees are not subject to copyright protection in the United States
8 * and are considered to be in the public domain.  As a result, a formal
9 * license is not needed to use the software.
10 *
11 * This software is provided by NIST as a service and is expressly
12 * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
13 * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
14 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
15 * AND DATA ACCURACY.  NIST does not warrant or make any representations
16 * regarding the use of the software or the results thereof, including but
17 * not limited to the correctness, accuracy, reliability or usefulness of
18 * the software.
19 *
20 * Permission to use this software is contingent upon your acceptance
21 * of the terms of this agreement.
22 *
23 */
24 /*****************************************************************************
25  * Product of NIST/ITL Advanced Networking Technologies Division (ANTD).     *
26 ******************************************************************************/
27 package gov.nist.javax.sip.header;
28 
29 import gov.nist.core.*;
30 import gov.nist.javax.sip.header.ims.ParameterNamesIms;
31 
32 import java.text.ParseException;
33  /*
34  * 2005/06/12: geir.hedemark@telio.no: Changed behaviour of qop parameter in
35  *           Authorization header - removed quoting of string according to
36  *          RFC3261, BNF element "message-qop" (as opposed to "qop-options",
37  *           which is quoted.
38  */
39 
40 /**
41  * The generic AuthenticationHeader
42  *
43  * @author Olivier Deruelle
44  * @author M. Ranganathan <br/>
45  * @since 1.1
46  * @version 1.2 $Revision: 1.13 $ $Date: 2009/10/18 13:46:32 $
47  *
48  *
49  */
50 public abstract class AuthenticationHeader extends ParametersHeader {
51 
52     public static final String DOMAIN = ParameterNames.DOMAIN;
53 
54     public static final String REALM = ParameterNames.REALM;
55 
56     public static final String OPAQUE = ParameterNames.OPAQUE;
57 
58     public static final String ALGORITHM = ParameterNames.ALGORITHM;
59 
60     public static final String QOP = ParameterNames.QOP;
61 
62     public static final String STALE = ParameterNames.STALE;
63 
64     public static final String SIGNATURE = ParameterNames.SIGNATURE;
65 
66     public static final String RESPONSE = ParameterNames.RESPONSE;
67 
68     public static final String SIGNED_BY = ParameterNames.SIGNED_BY;
69 
70     public static final String NC = ParameterNames.NC;
71 
72     public static final String URI = ParameterNames.URI;
73 
74     public static final String USERNAME = ParameterNames.USERNAME;
75 
76     public static final String CNONCE = ParameterNames.CNONCE;
77 
78     public static final String NONCE = ParameterNames.NONCE;
79 
80     public static final String IK = ParameterNamesIms.IK;
81     public static final String CK = ParameterNamesIms.CK;
82     public static final String INTEGRITY_PROTECTED = ParameterNamesIms.INTEGRITY_PROTECTED;
83 
84     protected String scheme;
85 
AuthenticationHeader(String name)86     public AuthenticationHeader(String name) {
87         super(name);
88         parameters.setSeparator(Separators.COMMA); // oddball
89         this.scheme = ParameterNames.DIGEST;
90     }
91 
AuthenticationHeader()92     public AuthenticationHeader() {
93         super();
94         parameters.setSeparator(Separators.COMMA);
95     }
96 
97     /**
98      * set the specified parameter. Bug reported by Dominic Sparks.
99      *
100      * @param name --
101      *            name of the parameter
102      * @param value --
103      *            value of the parameter.
104      */
setParameter(String name, String value)105     public void setParameter(String name, String value) throws ParseException {
106         NameValue nv = super.parameters.getNameValue(name.toLowerCase());
107         if (nv == null) {
108             nv = new NameValue(name, value);
109             if (name.equalsIgnoreCase(ParameterNames.QOP)
110                     || name.equalsIgnoreCase(ParameterNames.REALM)
111                     || name.equalsIgnoreCase(ParameterNames.CNONCE)
112                     || name.equalsIgnoreCase(ParameterNames.NONCE)
113                     || name.equalsIgnoreCase(ParameterNames.USERNAME)
114                     || name.equalsIgnoreCase(ParameterNames.DOMAIN)
115                     || name.equalsIgnoreCase(ParameterNames.OPAQUE)
116                     || name.equalsIgnoreCase(ParameterNames.NEXT_NONCE)
117                     || name.equalsIgnoreCase(ParameterNames.URI)
118                     || name.equalsIgnoreCase(ParameterNames.RESPONSE )
119                     ||name.equalsIgnoreCase(ParameterNamesIms.IK)
120                     || name.equalsIgnoreCase(ParameterNamesIms.CK)
121                     || name.equalsIgnoreCase(ParameterNamesIms.INTEGRITY_PROTECTED)) {
122                 if (((this instanceof Authorization) || (this instanceof ProxyAuthorization))
123                         && name.equalsIgnoreCase(ParameterNames.QOP)) {
124                     // NOP, QOP not quoted in authorization headers
125                 } else {
126                     nv.setQuotedValue();
127                 }
128                 if (value == null)
129                     throw new NullPointerException("null value");
130                 if (value.startsWith(Separators.DOUBLE_QUOTE))
131                     throw new ParseException(value
132                             + " : Unexpected DOUBLE_QUOTE", 0);
133             }
134             super.setParameter(nv);
135         } else
136             nv.setValueAsObject(value);
137 
138     }
139 
140     /**
141      * This is only used for the parser interface.
142      *
143      * @param challenge --
144      *            the challenge from which the parameters are extracted.
145      */
setChallenge(Challenge challenge)146     public void setChallenge(Challenge challenge) {
147         this.scheme = challenge.scheme;
148         super.parameters = challenge.authParams;
149     }
150 
151     /**
152      * Encode in canonical form.
153      *
154      * @return canonical string.
155      */
encodeBody()156     public String encodeBody() {
157         this.parameters.setSeparator(Separators.COMMA);
158         return this.scheme + SP + parameters.encode();
159     }
160 
161     /**
162      * Sets the scheme of the challenge information for this
163      * AuthenticationHeaderHeader. For example, Digest.
164      *
165      * @param scheme -
166      *            the new string value that identifies the challenge information
167      *            scheme.
168      */
setScheme(String scheme)169     public void setScheme(String scheme) {
170         this.scheme = scheme;
171     }
172 
173     /**
174      * Returns the scheme of the challenge information for this
175      * AuthenticationHeaderHeader.
176      *
177      * @return the string value of the challenge information.
178      */
getScheme()179     public String getScheme() {
180         return scheme;
181     }
182 
183     /**
184      * Sets the Realm of the WWWAuthenicateHeader to the <var>realm</var>
185      * parameter value. Realm strings MUST be globally unique. It is RECOMMENDED
186      * that a realm string contain a hostname or domain name. Realm strings
187      * SHOULD present a human-readable identifier that can be rendered to a
188      * user.
189      *
190      * @param realm
191      *            the new Realm String of this WWWAuthenicateHeader.
192      * @throws ParseException
193      *             which signals that an error has been reached unexpectedly
194      *             while parsing the realm.
195      */
setRealm(String realm)196     public void setRealm(String realm) throws ParseException {
197         if (realm == null)
198             throw new NullPointerException(
199                     "JAIN-SIP Exception, "
200                             + " AuthenticationHeader, setRealm(), The realm parameter is null");
201         setParameter(ParameterNames.REALM, realm);
202     }
203 
204     /**
205      * Returns the Realm value of this WWWAuthenicateHeader. This convenience
206      * method returns only the realm of the complete Challenge.
207      *
208      * @return the String representing the Realm information, null if value is
209      *         not set.
210      * @since v1.1
211      */
getRealm()212     public String getRealm() {
213         return getParameter(ParameterNames.REALM);
214     }
215 
216     /**
217      * Sets the Nonce of the WWWAuthenicateHeader to the <var>nonce</var>
218      * parameter value.
219      *
220      * @param nonce -
221      *            the new nonce String of this WWWAuthenicateHeader.
222      * @throws ParseException
223      *             which signals that an error has been reached unexpectedly
224      *             while parsing the nonce value.
225      * @since v1.1
226      */
setNonce(String nonce)227     public void setNonce(String nonce) throws ParseException {
228         if (nonce == null)
229             throw new NullPointerException(
230                     "JAIN-SIP Exception, "
231                             + " AuthenticationHeader, setNonce(), The nonce parameter is null");
232         setParameter(NONCE, nonce);
233     }
234 
235     /**
236      * Returns the Nonce value of this WWWAuthenicateHeader.
237      *
238      * @return the String representing the nonce information, null if value is
239      *         not set.
240      * @since v1.1
241      */
getNonce()242     public String getNonce() {
243         return getParameter(ParameterNames.NONCE);
244     }
245 
246     /**
247      * Sets the URI of the WWWAuthenicateHeader to the <var>uri</var> parameter
248      * value.
249      *
250      * @param uri -
251      *            the new URI of this AuthenicationHeader.
252      * @since v1.1
253      *
254      * Note that since 1.2 this is no longer applicable to the WWW-Authenticate
255      * and Proxy-Authenticate headers
256      */
setURI(javax.sip.address.URI uri)257     public void setURI(javax.sip.address.URI uri) {
258         if (uri != null) {
259             NameValue nv = new NameValue(ParameterNames.URI, uri);
260             nv.setQuotedValue();
261             super.parameters.set(nv);
262         } else {
263             throw new NullPointerException("Null URI");
264         }
265     }
266 
267     /**
268      * Returns the URI value of this WWWAuthenicateHeader, for example
269      * DigestURI.
270      *
271      * @return the URI representing the URI information, null if value is not
272      *         set.
273      * @since v1.1
274      *
275      * Note that since 1.2 this is no longer applicable to the WWW-Authenticate
276      * and Proxy-Authenticate headers
277      */
getURI()278     public javax.sip.address.URI getURI() {
279         return getParameterAsURI(ParameterNames.URI);
280     }
281 
282     /**
283      * Sets the Algorithm of the WWWAuthenicateHeader to the new <var>algorithm</var>
284      * parameter value.
285      *
286      * @param algorithm -
287      *            the new algorithm String of this WWWAuthenicateHeader.
288      * @throws ParseException
289      *             which signals that an error has been reached unexpectedly
290      *             while parsing the algorithm value.
291      * @since v1.1
292      */
setAlgorithm(String algorithm)293     public void setAlgorithm(String algorithm) throws ParseException {
294         if (algorithm == null)
295             throw new NullPointerException("null arg");
296         setParameter(ParameterNames.ALGORITHM, algorithm);
297     }
298 
299     /**
300      * Returns the Algorithm value of this WWWAuthenicateHeader.
301      *
302      * @return the String representing the Algorithm information, null if the
303      *         value is not set.
304      * @since v1.1
305      */
getAlgorithm()306     public String getAlgorithm() {
307         return getParameter(ParameterNames.ALGORITHM);
308     }
309 
310     /**
311      * Sets the Qop value of the WWWAuthenicateHeader to the new <var>qop</var>
312      * parameter value.
313      *
314      * @param qop -
315      *            the new Qop string of this WWWAuthenicateHeader.
316      * @throws ParseException
317      *             which signals that an error has been reached unexpectedly
318      *             while parsing the Qop value.
319      * @since v1.1
320      */
setQop(String qop)321     public void setQop(String qop) throws ParseException {
322         if (qop == null)
323             throw new NullPointerException("null arg");
324         setParameter(ParameterNames.QOP, qop);
325     }
326 
327     /**
328      * Returns the Qop value of this WWWAuthenicateHeader.
329      *
330      * @return the string representing the Qop information, null if the value is
331      *         not set.
332      * @since v1.1
333      */
getQop()334     public String getQop() {
335         return getParameter(ParameterNames.QOP);
336     }
337 
338     /**
339      * Sets the Opaque value of the WWWAuthenicateHeader to the new <var>opaque</var>
340      * parameter value.
341      *
342      * @param opaque -
343      *            the new Opaque string of this WWWAuthenicateHeader.
344      * @throws ParseException
345      *             which signals that an error has been reached unexpectedly
346      *             while parsing the opaque value.
347      * @since v1.1
348      */
setOpaque(String opaque)349     public void setOpaque(String opaque) throws ParseException {
350         if (opaque == null)
351             throw new NullPointerException("null arg");
352         setParameter(ParameterNames.OPAQUE, opaque);
353     }
354 
355     /**
356      * Returns the Opaque value of this WWWAuthenicateHeader.
357      *
358      * @return the String representing the Opaque information, null if the value
359      *         is not set.
360      * @since v1.1
361      */
getOpaque()362     public String getOpaque() {
363         return getParameter(ParameterNames.OPAQUE);
364     }
365 
366     /**
367      * Sets the Domain of the WWWAuthenicateHeader to the <var>domain</var>
368      * parameter value.
369      *
370      * @param domain -
371      *            the new Domain string of this WWWAuthenicateHeader.
372      * @throws ParseException
373      *             which signals that an error has been reached unexpectedly
374      *             while parsing the domain.
375      * @since v1.1
376      */
setDomain(String domain)377     public void setDomain(String domain) throws ParseException {
378         if (domain == null)
379             throw new NullPointerException("null arg");
380         setParameter(ParameterNames.DOMAIN, domain);
381     }
382 
383     /**
384      * Returns the Domain value of this WWWAuthenicateHeader.
385      *
386      * @return the String representing the Domain information, null if value is
387      *         not set.
388      * @since v1.1
389      */
getDomain()390     public String getDomain() {
391         return getParameter(ParameterNames.DOMAIN);
392     }
393 
394     /**
395      * Sets the value of the stale parameter of the WWWAuthenicateHeader to the
396      * <var>stale</var> parameter value.
397      *
398      * @param stale -
399      *            the Boolean.valueOf value of the stale parameter.
400      * @since v1.1
401      */
setStale(boolean stale)402     public void setStale(boolean stale) {
403         setParameter(new NameValue(ParameterNames.STALE, Boolean.valueOf(stale)));
404     }
405 
406     /**
407      * Returns the boolean value of the state paramater of this
408      * WWWAuthenicateHeader.
409      *
410      * @return the boolean representing if the challenge is stale.
411      * @since v1.1
412      */
isStale()413     public boolean isStale() {
414         return this.getParameterAsBoolean(ParameterNames.STALE);
415     }
416 
417     /**
418      * Set the CNonce.
419      *
420      * @param cnonce --
421      *            a nonce string.
422      */
setCNonce(String cnonce)423     public void setCNonce(String cnonce) throws ParseException {
424         this.setParameter(ParameterNames.CNONCE, cnonce);
425     }
426 
427     /**
428      * Get the CNonce.
429      *
430      * @return the cnonce value.
431      */
getCNonce()432     public String getCNonce() {
433         return getParameter(ParameterNames.CNONCE);
434     }
435 
getNonceCount()436     public int getNonceCount() {
437         return this.getParameterAsHexInt(ParameterNames.NC);
438 
439     }
440 
441     /**
442      * Set the nonce count pakrameter. Bug fix sent in by Andreas Bystr�m
443      */
444 
setNonceCount(int param)445     public void setNonceCount(int param) throws java.text.ParseException {
446         if (param < 0)
447             throw new ParseException("bad value", 0);
448 
449         String nc = Integer.toHexString(param);
450 
451         String base = "00000000";
452         nc = base.substring(0, 8 - nc.length()) + nc;
453         this.setParameter(ParameterNames.NC, nc);
454 
455     }
456 
457     /**
458      * Get the RESPONSE value (or null if it does not exist).
459      *
460      * @return String response parameter value.
461      */
getResponse()462     public String getResponse() {
463         return (String) getParameterValue(ParameterNames.RESPONSE);
464     }
465 
466     /**
467      * Set the Response.
468      *
469      * @param response
470      *            to set.
471      */
setResponse(String response)472     public void setResponse(String response) throws ParseException {
473         if (response == null)
474             throw new NullPointerException("Null parameter");
475         // Bug fix from Andreas Bystr�m
476         this.setParameter(RESPONSE, response);
477     }
478 
479     /**
480      * Returns the Username value of this AuthorizationHeader. This convenience
481      * method returns only the username of the complete Response.
482      *
483      * @return the String representing the Username information, null if value
484      *         is not set.
485      *
486      *
487      *
488      */
getUsername()489     public String getUsername() {
490         return (String) getParameter(ParameterNames.USERNAME);
491     }
492 
493     /**
494      * Sets the Username of the AuthorizationHeader to the <var>username</var>
495      * parameter value.
496      *
497      * @param username
498      *            the new Username String of this AuthorizationHeader.
499      *
500      * @throws ParseException
501      *             which signals that an error has been reached
502      *
503      * unexpectedly while parsing the username.
504      *
505      *
506      *
507      */
setUsername(String username)508     public void setUsername(String username) throws ParseException {
509         this.setParameter(ParameterNames.USERNAME, username);
510     }
511 
setIK(String ik)512     public void setIK(String ik) throws ParseException {
513         if (ik == null)
514             throw new NullPointerException(
515                 "JAIN-SIP Exception, "
516                     + " AuthenticationHeader, setIk(), The auth-param IK parameter is null");
517         setParameter(IK, ik);
518     }
519 
getIK()520     public String getIK() {
521         return getParameter(ParameterNamesIms.IK);
522     }
523 
setCK(String ck)524     public void setCK(String ck) throws ParseException {
525         if (ck == null)
526             throw new NullPointerException(
527                 "JAIN-SIP Exception, "
528                     + " AuthenticationHeader, setCk(), The auth-param CK parameter is null");
529         setParameter(CK, ck);
530     }
531 
getCK()532     public String getCK() {
533         return getParameter(ParameterNamesIms.CK);
534     }
535 
536 
setIntegrityProtected(String integrityProtected)537     public void setIntegrityProtected(String integrityProtected) throws ParseException
538     {
539         if (integrityProtected == null)
540             throw new NullPointerException(
541                 "JAIN-SIP Exception, "
542                     + " AuthenticationHeader, setIntegrityProtected(), The integrity-protected parameter is null");
543 
544         setParameter(INTEGRITY_PROTECTED, integrityProtected);
545     }
546 
547 
548 
getIntegrityProtected()549     public String getIntegrityProtected() {
550         return getParameter(ParameterNamesIms.INTEGRITY_PROTECTED);
551     }
552 
553 }
554