1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 #include "mozilla/ModuleUtils.h"
6 #include "nsAuth.h"
7 
8 //-----------------------------------------------------------------------------
9 
10 #define NS_HTTPNEGOTIATEAUTH_CID                   \
11 { /* 75c80fd0-accb-432c-af59-ec60668c3990 */       \
12   0x75c80fd0,                                      \
13   0xaccb,                                          \
14   0x432c,                                          \
15   {0xaf, 0x59, 0xec, 0x60, 0x66, 0x8c, 0x39, 0x90} \
16 }
17 
18 #include "nsHttpNegotiateAuth.h"
NS_GENERIC_FACTORY_CONSTRUCTOR(nsHttpNegotiateAuth)19 NS_GENERIC_FACTORY_CONSTRUCTOR(nsHttpNegotiateAuth)
20 //-----------------------------------------------------------------------------
21 
22 #define NS_NEGOTIATEAUTH_CID                       \
23 { /* 96ec4163-efc8-407a-8735-007fb26be4e8 */       \
24   0x96ec4163,                                      \
25   0xefc8,                                          \
26   0x407a,                                          \
27   {0x87, 0x35, 0x00, 0x7f, 0xb2, 0x6b, 0xe4, 0xe8} \
28 }
29 #define NS_GSSAUTH_CID                             \
30 { /* dc8e21a0-03e4-11da-8cd6-0800200c9a66 */       \
31   0xdc8e21a0,                                      \
32   0x03e4,                                          \
33   0x11da,                                          \
34   {0x8c, 0xd6, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66} \
35 }
36 
37 #include "nsAuthGSSAPI.h"
38 
39 #if defined( USE_SSPI )
40 #include "nsAuthSSPI.h"
41 
42 static nsresult
43 nsSysNTLMAuthConstructor(nsISupports *outer, REFNSIID iid, void **result)
44 {
45   if (outer)
46     return NS_ERROR_NO_AGGREGATION;
47 
48   nsAuthSSPI *auth = new nsAuthSSPI(PACKAGE_TYPE_NTLM);
49   if (!auth)
50     return NS_ERROR_OUT_OF_MEMORY;
51 
52   NS_ADDREF(auth);
53   nsresult rv = auth->QueryInterface(iid, result);
54   NS_RELEASE(auth);
55   return rv;
56 }
57 
58 static nsresult
nsKerbSSPIAuthConstructor(nsISupports * outer,REFNSIID iid,void ** result)59 nsKerbSSPIAuthConstructor(nsISupports *outer, REFNSIID iid, void **result)
60 {
61   if (outer)
62     return NS_ERROR_NO_AGGREGATION;
63 
64   nsAuthSSPI *auth = new nsAuthSSPI(PACKAGE_TYPE_KERBEROS);
65   if (!auth)
66     return NS_ERROR_OUT_OF_MEMORY;
67 
68   NS_ADDREF(auth);
69   nsresult rv = auth->QueryInterface(iid, result);
70   NS_RELEASE(auth);
71   return rv;
72 }
73 
74 #define NS_SYSNTLMAUTH_CID                         \
75 { /* dc195987-6e9a-47bc-b1fd-ab895d398833 */       \
76   0xdc195987,                                      \
77   0x6e9a,                                          \
78   0x47bc,                                          \
79   {0xb1, 0xfd, 0xab, 0x89, 0x5d, 0x39, 0x88, 0x33} \
80 }
81 
82 #define NS_NEGOTIATEAUTHSSPI_CID                   \
83 { /* 78d3b0c0-0241-11da-8cd6-0800200c9a66 */       \
84   0x78d3b0c0,                                      \
85   0x0241,                                          \
86   0x11da,                                          \
87   {0x8c, 0xd6, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66} \
88 }
89 
90 #define NS_KERBAUTHSSPI_CID                        \
91 { /* 8c3a0e20-03e5-11da-8cd6-0800200c9a66 */       \
92   0x8c3a0e20,                                      \
93   0x03e5,                                          \
94   0x11da,                                          \
95   {0x8c, 0xd6, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66} \
96 }
97 
98 #else
99 
100 #define NS_SAMBANTLMAUTH_CID                       \
101 { /* bc54f001-6eb0-4e32-9f49-7e064d8e70ef */       \
102   0xbc54f001,                                      \
103   0x6eb0,                                          \
104   0x4e32,                                          \
105   {0x9f, 0x49, 0x7e, 0x06, 0x4d, 0x8e, 0x70, 0xef} \
106 }
107 
108 #include "nsAuthSambaNTLM.h"
109 static nsresult
110 nsSambaNTLMAuthConstructor(nsISupports *outer, REFNSIID iid, void **result)
111 {
112   if (outer)
113     return NS_ERROR_NO_AGGREGATION;
114 
115   RefPtr<nsAuthSambaNTLM> auth = new nsAuthSambaNTLM();
116   if (!auth)
117     return NS_ERROR_OUT_OF_MEMORY;
118 
119   nsresult rv = auth->SpawnNTLMAuthHelper();
120   if (NS_FAILED(rv)) {
121     // Failure here probably means that cached credentials were not available
122     return rv;
123   }
124 
125   return auth->QueryInterface(iid, result);
126 }
127 
128 #endif
129 
130 static nsresult
nsKerbGSSAPIAuthConstructor(nsISupports * outer,REFNSIID iid,void ** result)131 nsKerbGSSAPIAuthConstructor(nsISupports *outer, REFNSIID iid, void **result)
132 {
133   if (outer)
134     return NS_ERROR_NO_AGGREGATION;
135 
136   nsAuthGSSAPI *auth = new nsAuthGSSAPI(PACKAGE_TYPE_KERBEROS);
137   if (!auth)
138     return NS_ERROR_OUT_OF_MEMORY;
139 
140   NS_ADDREF(auth);
141   nsresult rv = auth->QueryInterface(iid, result);
142   NS_RELEASE(auth);
143   return rv;
144 }
145 
146 static nsresult
nsGSSAPIAuthConstructor(nsISupports * outer,REFNSIID iid,void ** result)147 nsGSSAPIAuthConstructor(nsISupports *outer, REFNSIID iid, void **result)
148 {
149   if (outer)
150     return NS_ERROR_NO_AGGREGATION;
151 
152   nsAuthGSSAPI *auth = new nsAuthGSSAPI(PACKAGE_TYPE_NEGOTIATE);
153   if (!auth)
154     return NS_ERROR_OUT_OF_MEMORY;
155 
156   NS_ADDREF(auth);
157   nsresult rv = auth->QueryInterface(iid, result);
158   NS_RELEASE(auth);
159   return rv;
160 }
161 
162 
163 #if defined( USE_SSPI )
164 NS_GENERIC_FACTORY_CONSTRUCTOR(nsAuthSSPI)
165 #endif
166 
167 #define NS_AUTHSASL_CID                            \
168 { /* 815e42e0-72cc-480f-934b-148e33c228a6 */       \
169   0x815e42e0,                                      \
170   0x72cc,                                          \
171   0x480f,                                          \
172   {0x93, 0x4b, 0x14, 0x8e, 0x33, 0xc2, 0x28, 0xa6} \
173 }
174 
175 #include "nsAuthSASL.h"
176 NS_GENERIC_FACTORY_CONSTRUCTOR(nsAuthSASL)
177 
178 NS_DEFINE_NAMED_CID(NS_GSSAUTH_CID);
179 NS_DEFINE_NAMED_CID(NS_NEGOTIATEAUTH_CID);
180 #if defined( USE_SSPI )
181 NS_DEFINE_NAMED_CID(NS_NEGOTIATEAUTHSSPI_CID);
182 NS_DEFINE_NAMED_CID(NS_KERBAUTHSSPI_CID);
183 NS_DEFINE_NAMED_CID(NS_SYSNTLMAUTH_CID);
184 #else
185 NS_DEFINE_NAMED_CID(NS_SAMBANTLMAUTH_CID);
186 #endif
187 NS_DEFINE_NAMED_CID(NS_HTTPNEGOTIATEAUTH_CID);
188 NS_DEFINE_NAMED_CID(NS_AUTHSASL_CID);
189 
190 
191 static const mozilla::Module::CIDEntry kAuthCIDs[] = {
192   { &kNS_GSSAUTH_CID, false, nullptr, nsKerbGSSAPIAuthConstructor },
193   { &kNS_NEGOTIATEAUTH_CID, false, nullptr, nsGSSAPIAuthConstructor },
194 #if defined( USE_SSPI )
195   { &kNS_NEGOTIATEAUTHSSPI_CID, false, nullptr, nsAuthSSPIConstructor },
196   { &kNS_KERBAUTHSSPI_CID, false, nullptr, nsKerbSSPIAuthConstructor },
197   { &kNS_SYSNTLMAUTH_CID, false, nullptr, nsSysNTLMAuthConstructor },
198 #else
199   { &kNS_SAMBANTLMAUTH_CID, false, nullptr, nsSambaNTLMAuthConstructor },
200 #endif
201   { &kNS_HTTPNEGOTIATEAUTH_CID, false, nullptr, nsHttpNegotiateAuthConstructor },
202   { &kNS_AUTHSASL_CID, false, nullptr, nsAuthSASLConstructor },
203   { nullptr }
204 };
205 
206 static const mozilla::Module::ContractIDEntry kAuthContracts[] = {
207   { NS_AUTH_MODULE_CONTRACTID_PREFIX "kerb-gss", &kNS_GSSAUTH_CID },
208   { NS_AUTH_MODULE_CONTRACTID_PREFIX "negotiate-gss", &kNS_NEGOTIATEAUTH_CID },
209 #if defined( USE_SSPI )
210   { NS_AUTH_MODULE_CONTRACTID_PREFIX "negotiate-sspi", &kNS_NEGOTIATEAUTHSSPI_CID },
211   { NS_AUTH_MODULE_CONTRACTID_PREFIX "kerb-sspi", &kNS_KERBAUTHSSPI_CID },
212   { NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm", &kNS_SYSNTLMAUTH_CID },
213 #else
214   { NS_AUTH_MODULE_CONTRACTID_PREFIX "sys-ntlm", &kNS_SAMBANTLMAUTH_CID },
215 #endif
216   { NS_HTTP_AUTHENTICATOR_CONTRACTID_PREFIX "negotiate", &kNS_HTTPNEGOTIATEAUTH_CID },
217   { NS_AUTH_MODULE_CONTRACTID_PREFIX "sasl-gssapi", &kNS_AUTHSASL_CID },
218   { nullptr }
219 };
220 
221 //-----------------------------------------------------------------------------
222 mozilla::LazyLogModule gNegotiateLog("negotiateauth");
223 
224 // setup nspr logging ...
225 static nsresult
InitNegotiateAuth()226 InitNegotiateAuth()
227 {
228   return NS_OK;
229 }
230 
231 static void
DestroyNegotiateAuth()232 DestroyNegotiateAuth()
233 {
234   nsAuthGSSAPI::Shutdown();
235 }
236 
237 static const mozilla::Module kAuthModule = {
238   mozilla::Module::kVersion,
239   kAuthCIDs,
240   kAuthContracts,
241   nullptr,
242   nullptr,
243   InitNegotiateAuth,
244   DestroyNegotiateAuth
245 };
246 
247 NSMODULE_DEFN(nsAuthModule) = &kAuthModule;
248