@@ -52,18 +52,21 @@
52 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Construct the "login" card with the client credentials.
53 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
54 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** login LOGIN NONCE SIGNATURE
55 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
56 56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The LOGIN is the user id of the client. NONCE is the sha1 checksum
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of all payload that follows the login card. Randomness for the NONCE
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** must be provided in the payload (in xfer.c). SIGNATURE is the sha1
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** checksum of the nonce followed by the user password.
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of all payload that follows the login card. Randomness for the
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** NONCE must be provided in the payload (in xfer.c) (e.g. by
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** appending a timestamp or random bytes as a comment line to the
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** payload). SIGNATURE is the sha1 checksum of the nonce followed by
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the fossil-hashed version of the user's password.
60 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Write the constructed login card into pLogin. pLogin is initialized
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** by this routine.
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write the constructed login card into pLogin. The result does not
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** have an EOL added to it because which type of EOL it needs has to
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be determined later. pLogin is initialized by this routine.
63 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void http_build_login_card(Blob *pPayload, Blob *pLogin){
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void http_build_login_card(Blob * const pPayload, Blob * const pLogin){
65 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob nonce; /* The nonce */
66 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zLogin; /* The user login name */
67 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zPw; /* The user password */
68 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob pw; /* The nonce with user password appended */
69 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sig; /* The signature field */
@@ -128,16 +131,17 @@
128 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
129 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
130 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
131 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Construct an appropriate HTTP request header. Write the header
132 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** into pHdr. This routine initializes the pHdr blob. pPayload is
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the complete payload (including the login card) already compressed.
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the complete payload (including the login card if pLogin is NULL or
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** empty) already compressed.
134 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
135 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void http_build_header(
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob *pLogin, /* Login card or NULL */
137 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pPayload, /* the payload that will be sent */
138 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pHdr, /* construct the header here */
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob *pLogin, /* Login card header value or NULL */
139 143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zAltMimetype /* Alternative mimetype */
140 144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
141 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nPayload = pPayload ? blob_size(pPayload) : 0;
142 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
143 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(pHdr);
@@ -154,11 +158,11 @@
154 158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zEncoded);
155 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
156 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Host: %s\r\n", g.url.hostname);
157 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "User-Agent: %s\r\n", get_user_agent());
158 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.url.isSsh ) blob_appendf(pHdr, "X-Fossil-Transport: SSH\r\n");
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLogin ){
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pLogin && blob_size(pLogin) ){
160 164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "X-Fossil-Xfer-Login: %b\r\n", pLogin);
161 165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
162 166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPayload ){
163 167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zAltMimetype ){
164 168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(pHdr, "Content-Type: %s\r\n", zAltMimetype);
@@ -468,42 +472,49 @@
468 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&login);
469 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( blob_size(pSend)==0 ){
470 474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&payload);
471 475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
472 476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( mHttpFlags & HTTP_USE_LOGIN ) http_build_login_card(pSend, &login);
473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define TEST_LOGIN_HEADER 0 /* temporary dev/test/debug crutch */
474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if TEST_LOGIN_HEADER
475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fHttpTrace || (mHttpFlags & HTTP_NOCOMPRESS)!=0 ){
476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*blob_append(&payload, blob_buffer(pSend), blob_size(pSend));*/
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&payload);
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_swap(pSend, &payload);
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_compress(pSend, &payload);
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 0
478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fprintf(stderr, "# g.syncInfo.bLoginCardHeader=%d login card=%s\n",
479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ g.syncInfo.bLoginCardHeader,
480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_size(&login) ? blob_str(&login) : "<empty>");
481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.syncInfo.bLoginCardHeader ) {
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Send the login card as an HTTP header. */
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.fHttpTrace || (mHttpFlags & HTTP_NOCOMPRESS)!=0 ){
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if 1
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*blob_append(&payload, blob_buffer(pSend), blob_size(pSend));*/
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&payload, blob_buffer(pSend), blob_size(pSend));
482 488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( blob_size(&login) ){
484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append_char(&login, '\n');
485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fHttpTrace || (mHttpFlags & HTTP_NOCOMPRESS)!=0 ){
487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- payload = login;
488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- login = empty_blob/*transfer ownership*/;
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(&payload, blob_buffer(pSend), blob_size(pSend));
489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This could save memory but looks like it would break in a
490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** couple of cases in the loop below where pSend is referenced
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for HTTP 401 and redirects. */
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&payload);
493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_swap(pSend, &payload);
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_compress(pSend, &payload);
497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
490 498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_compress2(&login, pSend, &payload);
492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&login);
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Prepend the login card (if set) to the payload */
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( blob_size(&login) ){
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append_char(&login, '\n');
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.fHttpTrace || (mHttpFlags & HTTP_NOCOMPRESS)!=0 ){
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ payload = login;
505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ login = empty_blob/*transfer ownership*/;
506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&payload, blob_buffer(pSend), blob_size(pSend));
507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_compress2(&login, pSend, &payload);
509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&login);
510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
493 511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
495 512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
496 513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
497 514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Construct the HTTP request header */
498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !TEST_LOGIN_HEADER
499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- http_build_header(0, &payload, &hdr, zAltMimetype);
500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- http_build_header(blob_size(&login) ? &login : 0,
502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &payload, &hdr, zAltMimetype);
503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&login);
504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ http_build_header(&payload, &hdr, &login, zAltMimetype);
505 516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
506 517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* When tracing, write the transmitted HTTP message both to standard
507 518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** output and into a file. The file can then be used to drive the
508 519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** server-side like this:
509 520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
510 521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!