2323
2424import java .nio .charset .Charset ;
2525import java .security .MessageDigest ;
26+ import java .util .Map ;
2627import java .util .concurrent .ThreadLocalRandom ;
2728
2829import static java .nio .charset .StandardCharsets .*;
@@ -60,6 +61,10 @@ public class Realm {
6061 private final String ntlmDomain ;
6162 private final boolean useAbsoluteURI ;
6263 private final boolean omitQuery ;
64+ private final Map <String , String > customLoginConfig ;
65+ private final String servicePrincipalName ;
66+ private final boolean useCanonicalHostname ;
67+ private final String loginContextName ;
6368
6469 private Realm (AuthScheme scheme ,
6570 String principal ,
@@ -78,11 +83,15 @@ private Realm(AuthScheme scheme,
7883 String ntlmDomain ,
7984 String ntlmHost ,
8085 boolean useAbsoluteURI ,
81- boolean omitQuery ) {
86+ boolean omitQuery ,
87+ String servicePrincipalName ,
88+ boolean useCanonicalHostname ,
89+ Map <String , String > customLoginConfig ,
90+ String loginContextName ) {
8291
8392 this .scheme = assertNotNull (scheme , "scheme" );
84- this .principal = assertNotNull ( principal , "principal" ) ;
85- this .password = assertNotNull ( password , "password" ) ;
93+ this .principal = principal ;
94+ this .password = password ;
8695 this .realmName = realmName ;
8796 this .nonce = nonce ;
8897 this .algorithm = algorithm ;
@@ -98,6 +107,10 @@ private Realm(AuthScheme scheme,
98107 this .ntlmHost = ntlmHost ;
99108 this .useAbsoluteURI = useAbsoluteURI ;
100109 this .omitQuery = omitQuery ;
110+ this .servicePrincipalName = servicePrincipalName ;
111+ this .useCanonicalHostname = useCanonicalHostname ;
112+ this .customLoginConfig = customLoginConfig ;
113+ this .loginContextName = loginContextName ;
101114 }
102115
103116 public String getPrincipal () {
@@ -187,12 +200,48 @@ public boolean isOmitQuery() {
187200 return omitQuery ;
188201 }
189202
203+ public Map <String , String > getCustomLoginConfig () {
204+ return customLoginConfig ;
205+ }
206+
207+ public String getServicePrincipalName () {
208+ return servicePrincipalName ;
209+ }
210+
211+ public boolean isUseCanonicalHostname () {
212+ return useCanonicalHostname ;
213+ }
214+
215+ public String getLoginContextName () {
216+ return loginContextName ;
217+ }
218+
190219 @ Override
191220 public String toString () {
192- return "Realm{" + "principal='" + principal + '\'' + ", scheme=" + scheme + ", realmName='" + realmName + '\''
193- + ", nonce='" + nonce + '\'' + ", algorithm='" + algorithm + '\'' + ", response='" + response + '\''
194- + ", qop='" + qop + '\'' + ", nc='" + nc + '\'' + ", cnonce='" + cnonce + '\'' + ", uri='" + uri + '\''
195- + ", useAbsoluteURI='" + useAbsoluteURI + '\'' + ", omitQuery='" + omitQuery + '\'' + '}' ;
221+ return "Realm{" +
222+ "principal='" + principal + '\'' +
223+ ", password='" + password + '\'' +
224+ ", scheme=" + scheme +
225+ ", realmName='" + realmName + '\'' +
226+ ", nonce='" + nonce + '\'' +
227+ ", algorithm='" + algorithm + '\'' +
228+ ", response='" + response + '\'' +
229+ ", opaque='" + opaque + '\'' +
230+ ", qop='" + qop + '\'' +
231+ ", nc='" + nc + '\'' +
232+ ", cnonce='" + cnonce + '\'' +
233+ ", uri=" + uri +
234+ ", usePreemptiveAuth=" + usePreemptiveAuth +
235+ ", charset=" + charset +
236+ ", ntlmHost='" + ntlmHost + '\'' +
237+ ", ntlmDomain='" + ntlmDomain + '\'' +
238+ ", useAbsoluteURI=" + useAbsoluteURI +
239+ ", omitQuery=" + omitQuery +
240+ ", customLoginConfig=" + customLoginConfig +
241+ ", servicePrincipalName='" + servicePrincipalName + '\'' +
242+ ", useCanonicalHostname=" + useCanonicalHostname +
243+ ", loginContextName='" + loginContextName + '\'' +
244+ '}' ;
196245 }
197246
198247 public enum AuthScheme {
@@ -223,6 +272,18 @@ public static class Builder {
223272 private String ntlmHost = "localhost" ;
224273 private boolean useAbsoluteURI = false ;
225274 private boolean omitQuery ;
275+ /**
276+ * Kerberos/Spnego properties
277+ */
278+ private Map <String , String > customLoginConfig ;
279+ private String servicePrincipalName ;
280+ private boolean useCanonicalHostname ;
281+ private String loginContextName ;
282+
283+ public Builder () {
284+ this .principal = null ;
285+ this .password = null ;
286+ }
226287
227288 public Builder (String principal , String password ) {
228289 this .principal = principal ;
@@ -311,6 +372,26 @@ public Builder setCharset(Charset charset) {
311372 return this ;
312373 }
313374
375+ public Builder setCustomLoginConfig (Map <String , String > customLoginConfig ) {
376+ this .customLoginConfig = customLoginConfig ;
377+ return this ;
378+ }
379+
380+ public Builder setServicePrincipalName (String servicePrincipalName ) {
381+ this .servicePrincipalName = servicePrincipalName ;
382+ return this ;
383+ }
384+
385+ public Builder setUseCanonicalHostname (boolean useCanonicalHostname ) {
386+ this .useCanonicalHostname = useCanonicalHostname ;
387+ return this ;
388+ }
389+
390+ public Builder setLoginContextName (String loginContextName ) {
391+ this .loginContextName = loginContextName ;
392+ return this ;
393+ }
394+
314395 private String parseRawQop (String rawQop ) {
315396 String [] rawServerSupportedQops = rawQop .split ("," );
316397 String [] serverSupportedQops = new String [rawServerSupportedQops .length ];
@@ -501,7 +582,11 @@ public Realm build() {
501582 ntlmDomain ,
502583 ntlmHost ,
503584 useAbsoluteURI ,
504- omitQuery );
585+ omitQuery ,
586+ servicePrincipalName ,
587+ useCanonicalHostname ,
588+ customLoginConfig ,
589+ loginContextName );
505590 }
506591 }
507592}
0 commit comments