@@ -1,7 +1,6 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Copyright (c) 2007 D. Richard Hipp
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* ** Copyright (c) 2007 D. Richard Hipp
3 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
4 3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This program is free software; you can redistribute it and/or
5 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** modify it under the terms of the Simplified BSD License (also
6 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** known as the "2-Clause License" or "FreeBSD License".)
7 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -19,10 +18,23 @@
19 18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
20 19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
21 20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "http.h"
22 21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <assert.h>
23 22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef _WIN32
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #include <io.h>
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef isatty
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define isatty(d) _isatty(d)
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef fileno
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define fileno(s) _fileno(s)
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Keep track of HTTP Basic Authorization failures */
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fSeenHttpAuth = 0;
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24 36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
25 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Construct the "login" card with the client credentials.
26 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
27 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** login LOGIN NONCE SIGNATURE
28 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -96,16 +108,15 @@
96 108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
97 109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "POST %s%sxfer/xfer HTTP/1.0\r\n", g.urlPath, zSep);
98 110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlProxyAuth ){
99 111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Proxy-Authorization: %s\r\n", g.urlProxyAuth);
100 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlPasswd && g.urlUser && g.fUseHttpAuth ){
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zCredentials = mprintf("%s:%s", g.urlUser, g.urlPasswd);
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.zHttpAuth && g.zHttpAuth[0] ){
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zCredentials = g.zHttpAuth;
103 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zEncoded = encode64(zCredentials, -1);
104 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Authorization: Basic %s\r\n", zEncoded);
105 117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zEncoded);
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_free(zCredentials);
107 118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
108 119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Host: %s\r\n", g.urlHostname);
109 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "User-Agent: %s\r\n", get_user_agent());
110 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlIsSsh ) blob_appendf(pHdr, "X-Fossil-Transport: SSH\r\n");
111 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.fHttpTrace ){
@@ -113,10 +124,69 @@
113 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
114 125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Content-Type: application/x-fossil\r\n");
115 126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Content-Length: %d\r\n\r\n", blob_size(pPayload));
117 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use Fossil credentials for HTTP Basic Authorization prompt
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int use_fossil_creds_for_httpauth_prompt(void){
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPrompt = mprintf(
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "\nBasic Authorization over %s required to continue.\n"
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "Use Fossil username and password (y/N)? ",
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.urlIsHttps==1 ? "encrypted HTTPS" : "unencrypted HTTP");
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_user(zPrompt, &x);
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c = blob_str(&x)[0];
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&x);
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zPrompt);
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return ( c=='y' || c=='Y' );
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Prompt to save HTTP Basic Authorization information
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int save_httpauth_prompt(void){
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (g.urlFlags & URL_REMEMBER)==0 ) return;
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_user("Remember Basic Authorization credentials (Y/n)? ", &x);
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c = blob_str(&x)[0];
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&x);
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return ( c!='n' && c!='N' );
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Get the HTTP Basic Authorization credentials from the user
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** when 401 is received.
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *prompt_for_httpauth_creds(void){
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zUser;
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPw;
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zHttpAuth = 0;
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isatty(fileno(stdin)) ) return 0;
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if ( use_fossil_creds_for_httpauth_prompt() ){
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.urlUser && g.urlPasswd ){
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zHttpAuth = mprintf("%s:%s", g.urlUser, g.urlPasswd);
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prompt_user("Basic Authorization user: ", &x);
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUser = mprintf("%b", &x);
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPw = prompt_for_user_password(zUser);
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zHttpAuth = mprintf("%s:%s", zUser, zPw);
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&x);
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zUser);
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zPw);
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( save_httpauth_prompt() ){
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_set("http-auth", obscure(zHttpAuth), 0);
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return zHttpAuth;
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
118 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
120 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Sign the content in pSend, compress it, and send it to the server
121 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** via HTTP or HTTPS. Get a reply, uncompress the reply, and store the reply
122 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in pRecv. pRecv is assumed to be uninitialized when
@@ -200,22 +270,34 @@
200 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( (zLine = transport_receive_line(GLOBAL_URL()))!=0 && zLine[0]!=0 ){
201 271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* printf("[%s]\n", zLine); fflush(stdout); */
202 272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fossil_strnicmp(zLine, "http/1.", 7)==0 ){
203 273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sscanf(zLine, "HTTP/1.%d %d", &iHttpVersion, &rc)!=2 ) goto write_err;
204 274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==401 ){
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.urlIsHttps || g.fUseHttpAuth ){
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* set g.fUseHttpAuth to avoid loop when doing HTTPS */
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.fUseHttpAuth = 1;
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- transport_close(GLOBAL_URL());
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( --maxRedirect == 0 ){
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("http authorization limit exceeded");
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_close(GLOBAL_URL());
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( --maxRedirect == 0 ){
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal("http authorization limit exceeded");
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.zHttpAuth==0 ){
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.zHttpAuth = prompt_for_httpauth_creds();
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.zHttpAuth && g.zHttpAuth[0] ){
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fSeenHttpAuth ){
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(g.zHttpAuth);
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.zHttpAuth = 0;
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fSeenHttpAuth = 0;
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fSeenHttpAuth = 1;
211 289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
212 290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return http_exchange(pSend, pReply, useLogin, maxRedirect);
213 291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_warning(
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "Authorization over unencrypted HTTP requested; "
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "use --httpauth if appropriate.");
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_warning("HTTP Basic Authorization failed.");
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.zHttpAuth ){
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(g.zHttpAuth);
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.zHttpAuth = 0;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_close(GLOBAL_URL());
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return http_exchange(pSend, pReply, useLogin, maxRedirect);
217 299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
218 300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
219 301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=200 && rc!=302 ){
220 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
221 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=7; zLine[ii] && zLine[ii]!=' '; ii++){}
222 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!