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