1 /*
2 * ====================================================================
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 * ====================================================================
20 *
21 * This software consists of voluntary contributions made by many
22 * individuals on behalf of the Apache Software Foundation. For more
23 * information on the Apache Software Foundation, please see
24 * <http://www.apache.org/>.
25 *
26 */
27 package org.apache.hc.client5.http.auth;
28
29 import java.util.Queue;
30
31 import org.apache.hc.core5.util.Args;
32
33 /**
34 * This class represents the actual state of authentication handshake including the current {@link AuthScheme}
35 * used for request authorization as well as a collection of backup authentication options if available.
36 *
37 * @since 4.5
38 */
39 public class AuthExchange {
40
41 // This only tracks the server state. In particular, even if the state is SUCCESS,
42 // the authentication may still fail if the challenge sent with a response cannot
43 // be validated locally in case of a mutual authentication.
44 public enum State {
45
46 UNCHALLENGED, CHALLENGED, HANDSHAKE, FAILURE, SUCCESS
47
48 }
49
50 private State state;
51 private AuthScheme authScheme;
52 private Queue<AuthScheme> authOptions;
53 private String pathPrefix;
54
55 public AuthExchange() {
56 super();
57 this.state = State.UNCHALLENGED;
58 }
59
60 public void reset() {
61 this.state = State.UNCHALLENGED;
62 this.authOptions = null;
63 this.authScheme = null;
64 this.pathPrefix = null;
65 }
66
67 public State getState() {
68 return this.state;
69 }
70
71 public void setState(final State state) {
72 this.state = state != null ? state : State.UNCHALLENGED;
73 }
74
75 /**
76 * Returns actual {@link AuthScheme}. May be null.
77 */
78 public AuthScheme getAuthScheme() {
79 return this.authScheme;
80 }
81
82 /**
83 * Returns {@code true} if the actual authentication scheme is connection based.
84 */
85 public boolean isConnectionBased() {
86 return this.authScheme != null && this.authScheme.isConnectionBased();
87 }
88
89 /**
90 * @since 5.2
91 */
92 public String getPathPrefix() {
93 return pathPrefix;
94 }
95
96 /**
97 * @since 5.2
98 */
99 public void setPathPrefix(final String pathPrefix) {
100 this.pathPrefix = pathPrefix;
101 }
102
103 /**
104 * Resets the auth state with {@link AuthScheme} and clears auth options.
105 *
106 * @param authScheme auth scheme. May not be null.
107 */
108 public void select(final AuthScheme authScheme) {
109 Args.notNull(authScheme, "Auth scheme");
110 this.authScheme = authScheme;
111 this.authOptions = null;
112 }
113
114 /**
115 * Returns available auth options. May be null.
116 */
117 public Queue<AuthScheme> getAuthOptions() {
118 return this.authOptions;
119 }
120
121 /**
122 * Updates the auth state with a queue of auth options.
123 *
124 * @param authOptions a queue of auth options. May not be null or empty.
125 */
126 public void setOptions(final Queue<AuthScheme> authOptions) {
127 Args.notEmpty(authOptions, "Queue of auth options");
128 this.authOptions = authOptions;
129 }
130
131 @Override
132 public String toString() {
133 final StringBuilder buffer = new StringBuilder();
134 buffer.append("[").append(this.state);
135 if (this.authScheme != null) {
136 buffer.append(" ").append(this.authScheme);
137 }
138 buffer.append("]");
139 return buffer.toString();
140 }
141
142 }