1 // copy of code from apache-httpclient 4.5.13 package org.apache.http.impl.auth
2 // changes:
3 // - package name, this header, imports
4 // - fix minor errors/typos
5 // - allow class to be extended and flags to be customized (increase many things' visibility to protected and make class non-final)
6 // - expose Type3 message (public) so keys can be gathered
7 // - expose encryption methods
8 // - make flags injectable to Type1 message
9
10 /*
11 * ====================================================================
12 * Licensed to the Apache Software Foundation (ASF) under one
13 * or more contributor license agreements. See the NOTICE file
14 * distributed with this work for additional information
15 * regarding copyright ownership. The ASF licenses this file
16 * to you under the Apache License, Version 2.0 (the
17 * "License");
18 /*-
19 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
20 * WinRM Java Client
21 * ჻჻჻჻჻჻
22 * Copyright 2023 - 2024 Metricshub
23 * ჻჻჻჻჻჻
24 * Licensed under the Apache License, Version 2.0 (the "License");
25 * you may not use this file except in compliance with the License.
26 * You may obtain a copy of the License at
27 *
28 * http://www.apache.org/licenses/LICENSE-2.0
29 *
30 * Unless required by applicable law or agreed to in writing, software
31 * distributed under the License is distributed on an "AS IS" BASIS,
32 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
33 * See the License for the specific language governing permissions and
34 * limitations under the License.
35 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
36 */
37 package org.metricshub.winrm.service.client.auth.ntlm;
38
39 import org.apache.http.impl.auth.NTLMEngineException;
40
41 /**
42 * Provides an implementation for NTLMv1, NTLMv2, and NTLM2 Session forms of the NTLM
43 * authentication protocol.
44 *
45 * Code from io.cloudsoft.winrm4j.client.ntlm.forks.httpclient.NTLMEngineImpl
46 * release 0.12.3 @link https://github.com/cloudsoft/winrm4j
47 * io.cloudsoft.winrm4j.client.ntlm.forks.httpclient is a fork of apache-httpclient 4.5.13
48 */
49 class NTLMEngineImpl implements NTLMEngine {
50
51 /** Strip dot suffix from a name */
52 private static String stripDotSuffix(final String value) {
53 if (value == null) {
54 return null;
55 }
56 final int index = value.indexOf('.');
57 if (index != -1) {
58 return value.substring(0, index);
59 }
60 return value;
61 }
62
63 /** Convert host to standard form */
64 static String convertHost(final String host) {
65 return stripDotSuffix(host);
66 }
67
68 /** Convert domain to standard form */
69 static String convertDomain(final String domain) {
70 return stripDotSuffix(domain);
71 }
72
73 @Override
74 public String generateType1Msg(final String domain, final String workstation) throws NTLMEngineException {
75 return new Type1Message(null, null, getDefaultFlags()).getResponse();
76 }
77
78 // function overriden in NtlmMasqAsSpnegoScheme
79 Integer getDefaultFlags() {
80 return Type1Message.getDefaultFlags();
81 }
82
83 @Override
84 public String generateType3Msg(
85 final String username,
86 final String password,
87 final String domain,
88 final String workstation,
89 final String challenge
90 ) throws NTLMEngineException {
91 return generateType3MsgObject(username, password, domain, workstation, challenge).getResponse();
92 }
93
94 @Override
95 public Type3Message generateType3MsgObject(
96 final String username,
97 final String password,
98 final String domain,
99 final String workstation,
100 final String challenge
101 ) throws NTLMEngineException {
102 final Type2Message t2m = new Type2Message(challenge);
103 return new Type3Message(
104 domain,
105 workstation,
106 username,
107 password,
108 t2m.getChallenge(),
109 t2m.getFlags(),
110 t2m.getTarget(),
111 t2m.getTargetInfo()
112 );
113 }
114 }