001: /*
002: * Copyright 2005-2007 Noelios Consulting.
003: *
004: * The contents of this file are subject to the terms of the Common Development
005: * and Distribution License (the "License"). You may not use this file except in
006: * compliance with the License.
007: *
008: * You can obtain a copy of the license at
009: * http://www.opensource.org/licenses/cddl1.txt See the License for the specific
010: * language governing permissions and limitations under the License.
011: *
012: * When distributing Covered Code, include this CDDL HEADER in each file and
013: * include the License file at http://www.opensource.org/licenses/cddl1.txt If
014: * applicable, add the following below this CDDL HEADER, with the fields
015: * enclosed by brackets "[]" replaced with your own identifying information:
016: * Portions Copyright [yyyy] [name of copyright owner]
017: */
018:
019: package org.restlet.data;
020:
021: import org.restlet.util.Engine;
022:
023: /**
024: * Authentication response sent by client to an origin server.
025: *
026: * @author Jerome Louvel (contact@noelios.com)
027: */
028: public final class ChallengeResponse {
029: /** The challenge scheme. */
030: private ChallengeScheme scheme;
031:
032: /** The user identifier, such as a login name or an access key. */
033: private String identifier;
034:
035: /** The user secret, such as a password or a secret key. */
036: private char[] secret;
037:
038: /** The raw credentials for custom challenge schemes. */
039: private String credentials;
040:
041: /**
042: * Constructor.
043: *
044: * @param scheme
045: * The challenge scheme.
046: * @param credentials
047: * The raw credentials for custom challenge schemes.
048: */
049: public ChallengeResponse(final ChallengeScheme scheme,
050: final String credentials) {
051: this .scheme = scheme;
052: this .credentials = credentials;
053: this .identifier = null;
054: this .secret = null;
055: }
056:
057: /**
058: * Constructor.
059: *
060: * @param scheme
061: * The challenge scheme.
062: * @param identifier
063: * The user identifier, such as a login name or an access key.
064: * @param secret
065: * The user secret, such as a password or a secret key.
066: */
067: public ChallengeResponse(final ChallengeScheme scheme,
068: final String identifier, String secret) {
069: this .scheme = scheme;
070: this .credentials = null;
071: this .identifier = identifier;
072: this .secret = (secret != null) ? secret.toCharArray() : null;
073: }
074:
075: /**
076: * Constructor.
077: *
078: * @param scheme
079: * The challenge scheme.
080: * @param identifier
081: * The user identifier, such as a login name or an access key.
082: * @param secret
083: * The user secret, such as a password or a secret key.
084: */
085: public ChallengeResponse(final ChallengeScheme scheme,
086: final String identifier, char[] secret) {
087: this .scheme = scheme;
088: this .credentials = null;
089: this .identifier = identifier;
090: this .secret = secret;
091: }
092:
093: /** {@inheritDoc} */
094: @Override
095: public boolean equals(Object obj) {
096: boolean result = (obj == this );
097:
098: // if obj == this no need to go further
099: if (!result) {
100: // if obj isn't a challenge request or is null don't evaluate
101: // further
102: if ((obj instanceof ChallengeResponse) && obj != null) {
103: ChallengeResponse that = (ChallengeResponse) obj;
104:
105: if (getCredentials() != null) {
106: result = getCredentials().equals(
107: that.getCredentials());
108: } else {
109: result = (that.getCredentials() == null);
110: }
111:
112: if (result) {
113: if (getIdentifier() != null) {
114: result = getIdentifier().equals(
115: that.getIdentifier());
116: } else {
117: result = (that.getIdentifier() == null);
118: }
119:
120: if (result) {
121: if (getScheme() != null) {
122: result = getScheme().equals(
123: that.getScheme());
124: } else {
125: result = (that.getScheme() == null);
126: }
127:
128: if (result) {
129: if (getSecret() == null
130: || that.getSecret() == null) {
131: // check if both are null
132: result = (getSecret() == that
133: .getSecret());
134: } else {
135: if (getSecret().length == that
136: .getSecret().length) {
137: boolean equals = true;
138: for (int i = 0; i < getSecret().length
139: && equals; i++) {
140: equals = (getSecret()[i] == that
141: .getSecret()[i]);
142: }
143: result = equals;
144: }
145: }
146: }
147: }
148: }
149: }
150: }
151:
152: return result;
153: }
154:
155: /**
156: * Returns the credentials.
157: *
158: * @return The credentials.
159: */
160: public String getCredentials() {
161: return this .credentials;
162: }
163:
164: /**
165: * Returns the user identifier, such as a login name or an access key.
166: *
167: * @return The user identifier, such as a login name or an access key.
168: */
169: public String getIdentifier() {
170: return this .identifier;
171: }
172:
173: /**
174: * Returns the scheme used.
175: *
176: * @return The scheme used.
177: */
178: public ChallengeScheme getScheme() {
179: return this .scheme;
180: }
181:
182: /**
183: * Returns the user secret, such as a password or a secret key.
184: *
185: * @return The user secret, such as a password or a secret key.
186: */
187: public char[] getSecret() {
188: return this .secret;
189: }
190:
191: /** {@inheritDoc} */
192: @Override
193: public int hashCode() {
194: return Engine.hashCode(getScheme(), getIdentifier(),
195: (getSecret() == null) ? null : new String(getSecret()),
196: getCredentials());
197: }
198:
199: /**
200: * Sets the credentials.
201: *
202: * @param credentials
203: * The credentials.
204: */
205: public void setCredentials(String credentials) {
206: this .credentials = credentials;
207: }
208:
209: /**
210: * Sets the user identifier, such as a login name or an access key.
211: *
212: * @param identifier
213: * The user identifier, such as a login name or an access key.
214: */
215: public void setIdentifier(String identifier) {
216: this .identifier = identifier;
217: }
218:
219: /**
220: * Sets the scheme used.
221: *
222: * @param scheme
223: * The scheme used.
224: */
225: public void setScheme(ChallengeScheme scheme) {
226: this .scheme = scheme;
227: }
228:
229: /**
230: * Sets the user secret, such as a password or a secret key.
231: *
232: * @param secret
233: * The user secret, such as a password or a secret key.
234: */
235: public void setSecret(String secret) {
236: this .secret = (secret == null) ? null : secret.toCharArray();
237: }
238:
239: /**
240: * Sets the user secret, such as a password or a secret key.
241: *
242: * @param secret
243: * The user secret, such as a password or a secret key.
244: */
245: public void setSecret(char[] secret) {
246: this.secret = secret;
247: }
248:
249: }
|