0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20 Simplified BSD
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32 known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22 -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63 or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73 ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 or fitness for
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68 pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72 or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68 mation:.** drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20 @hwaci.com.**
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69 http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e ** This file con
0260: 74 61 69 6e 73 20 63 6f 64 65 20 74 6f 20 69 6d tains code to im
0270: 70 6c 65 6d 65 6e 74 20 74 68 65 20 66 69 6c 65 plement the file
0280: 20 74 72 61 6e 73 66 65 72 20 70 72 6f 74 6f 63 transfer protoc
0290: 6f 6c 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 ol..*/.#include
02a0: 22 63 6f 6e 66 69 67 2e 68 22 0a 23 69 6e 63 6c "config.h".#incl
02b0: 75 64 65 20 22 78 66 65 72 2e 68 22 0a 0a 23 69 ude "xfer.h"..#i
02c0: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a nclude <time.h>.
02d0: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e ./*.** Maximum n
02e0: 75 6d 62 65 72 20 6f 66 20 48 54 54 50 20 72 65 umber of HTTP re
02f0: 64 69 72 65 63 74 73 20 74 68 61 74 20 61 6e 79 directs that any
0300: 20 68 74 74 70 5f 65 78 63 68 61 6e 67 65 28 29 http_exchange()
0310: 20 63 61 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 66 6f call will.** fo
0320: 6c 6c 6f 77 20 62 65 66 6f 72 65 20 74 68 72 6f llow before thro
0330: 77 69 6e 67 20 61 20 66 61 74 61 6c 20 65 72 72 wing a fatal err
0340: 6f 72 2e 20 4d 6f 73 74 20 62 72 6f 77 73 65 72 or. Most browser
0350: 73 20 75 73 65 20 61 20 6c 69 6d 69 74 20 6f 66 s use a limit of
0360: 20 32 30 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 20..*/.#define
0370: 4d 41 58 5f 52 45 44 49 52 45 43 54 53 20 32 30 MAX_REDIRECTS 20
0380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 73 74 72 ../*.** This str
0390: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 ucture holds inf
03a0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 ormation about t
03b0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 he current state
03c0: 20 6f 66 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 of either.** a
03d0: 63 6c 69 65 6e 74 20 6f 72 20 61 20 73 65 72 76 client or a serv
03e0: 65 72 20 74 68 61 74 20 69 73 20 70 61 72 74 69 er that is parti
03f0: 63 69 70 61 74 69 6e 67 20 69 6e 20 78 66 65 72 cipating in xfer
0400: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 ..*/.typedef str
0410: 75 63 74 20 58 66 65 72 20 58 66 65 72 3b 0a 73 uct Xfer Xfer;.s
0420: 74 72 75 63 74 20 58 66 65 72 20 7b 0a 20 20 42 truct Xfer {. B
0430: 6c 6f 62 20 2a 70 49 6e 3b 20 20 20 20 20 20 20 lob *pIn;
0440: 20 20 20 2f 2a 20 49 6e 70 75 74 20 74 65 78 74 /* Input text
0450: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 from the other
0460: 73 69 64 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a side */. Blob *
0470: 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20 2f 2a pOut; /*
0480: 20 43 6f 6d 70 6f 73 65 20 6f 75 72 20 72 65 70 Compose our rep
0490: 6c 79 20 68 65 72 65 20 2a 2f 0a 20 20 42 6c 6f ly here */. Blo
04a0: 62 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 b line;
04b0: 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 /* The current
04c0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 2a 2f line of input */
04d0: 0a 20 20 42 6c 6f 62 20 61 54 6f 6b 65 6e 5b 36 . Blob aToken[6
04e0: 5d 3b 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 69 ]; /* Tokeni
04f0: 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c zed version of l
0500: 69 6e 65 20 2a 2f 0a 20 20 42 6c 6f 62 20 65 72 ine */. Blob er
0510: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 r; /*
0520: 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 Error message te
0530: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b xt */. int nTok
0540: 65 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e en; /* N
0550: 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 umber of tokens
0560: 69 6e 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 in line */. int
0570: 20 6e 49 47 6f 74 53 65 6e 74 3b 20 20 20 20 20 nIGotSent;
0580: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 69 /* Number of "i
0590: 67 6f 74 22 20 63 61 72 64 73 20 73 65 6e 74 20 got" cards sent
05a0: 2a 2f 0a 20 20 69 6e 74 20 6e 47 69 6d 6d 65 53 */. int nGimmeS
05b0: 65 6e 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 ent; /* Numb
05c0: 65 72 20 6f 66 20 67 69 6d 6d 65 20 63 61 72 64 er of gimme card
05d0: 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 s sent */. int
05e0: 6e 46 69 6c 65 53 65 6e 74 3b 20 20 20 20 20 20 nFileSent;
05f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69 6c /* Number of fil
0600: 65 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 es sent */. int
0610: 20 6e 44 65 6c 74 61 53 65 6e 74 3b 20 20 20 20 nDeltaSent;
0620: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 65 /* Number of de
0630: 6c 74 61 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69 ltas sent */. i
0640: 6e 74 20 6e 46 69 6c 65 52 63 76 64 3b 20 20 20 nt nFileRcvd;
0650: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
0660: 66 69 6c 65 73 20 72 65 63 65 69 76 65 64 20 2a files received *
0670: 2f 0a 20 20 69 6e 74 20 6e 44 65 6c 74 61 52 63 /. int nDeltaRc
0680: 76 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 vd; /* Numbe
0690: 72 20 6f 66 20 64 65 6c 74 61 73 20 72 65 63 65 r of deltas rece
06a0: 69 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 ived */. int nD
06b0: 61 6e 67 6c 69 6e 67 46 69 6c 65 3b 20 20 2f 2a anglingFile; /*
06c0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 6e 67 6c Number of dangl
06d0: 69 6e 67 20 64 65 6c 74 61 73 20 72 65 63 65 69 ing deltas recei
06e0: 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 53 ved */. int mxS
06f0: 65 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 end; /*
0700: 53 74 6f 70 20 73 65 6e 64 69 6e 67 20 22 66 69 Stop sending "fi
0710: 6c 65 22 20 77 68 65 6e 20 70 4f 75 74 20 72 65 le" when pOut re
0720: 61 63 68 65 73 20 74 68 69 73 20 73 69 7a 65 20 aches this size
0730: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 79 6e 63 3b */. int resync;
0740: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 /* Send
0750: 20 69 67 6f 74 20 63 61 72 64 73 20 66 6f 72 20 igot cards for
0760: 61 6c 6c 20 68 6f 6c 64 69 6e 67 73 20 2a 2f 0a all holdings */.
0770: 20 20 75 38 20 73 79 6e 63 50 72 69 76 61 74 65 u8 syncPrivate
0780: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f ; /* True to
0790: 20 65 6e 61 62 6c 65 20 73 79 6e 63 69 6e 67 20 enable syncing
07a0: 70 72 69 76 61 74 65 20 63 6f 6e 74 65 6e 74 20 private content
07b0: 2a 2f 0a 20 20 75 38 20 6e 65 78 74 49 73 50 72 */. u8 nextIsPr
07c0: 69 76 61 74 65 3b 20 20 20 2f 2a 20 49 66 20 74 ivate; /* If t
07d0: 72 75 65 2c 20 6e 65 78 74 20 22 66 69 6c 65 22 rue, next "file"
07e0: 20 72 65 63 65 69 76 65 64 20 69 73 20 61 20 70 received is a p
07f0: 72 69 76 61 74 65 20 2a 2f 0a 20 20 74 69 6d 65 rivate */. time
0800: 5f 74 20 6d 61 78 54 69 6d 65 3b 20 20 20 20 20 _t maxTime;
0810: 2f 2a 20 54 69 6d 65 20 77 68 65 6e 20 74 68 69 /* Time when thi
0820: 73 20 74 72 61 6e 73 66 65 72 20 73 68 6f 75 6c s transfer shoul
0830: 64 20 62 65 20 66 69 6e 69 73 68 65 64 20 2a 2f d be finished */
0840: 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 .};.../*.** The
0850: 69 6e 70 75 74 20 62 6c 6f 62 20 63 6f 6e 74 61 input blob conta
0860: 69 6e 73 20 61 20 55 55 49 44 2e 20 20 43 6f 6e ins a UUID. Con
0870: 76 65 72 74 20 69 74 20 69 6e 74 6f 20 61 20 72 vert it into a r
0880: 65 63 6f 72 64 20 49 44 2e 0a 2a 2a 20 43 72 65 ecord ID..** Cre
0890: 61 74 65 20 61 20 70 68 61 6e 74 6f 6d 20 72 65 ate a phantom re
08a0: 63 6f 72 64 20 69 66 20 6e 6f 20 70 72 69 6f 72 cord if no prior
08b0: 20 72 65 63 6f 72 64 20 65 78 69 73 74 73 20 61 record exists a
08c0: 6e 64 0a 2a 2a 20 70 68 61 6e 74 6f 6d 69 7a 65 nd.** phantomize
08d0: 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 is true..**.**
08e0: 43 6f 6d 70 61 72 65 20 74 6f 20 75 75 69 64 5f Compare to uuid_
08f0: 74 6f 5f 72 69 64 28 29 2e 20 20 54 68 69 73 20 to_rid(). This
0900: 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 61 20 routine takes a
0910: 62 6c 6f 62 20 61 72 67 75 6d 65 6e 74 0a 2a 2a blob argument.**
0920: 20 61 6e 64 20 64 6f 65 73 20 6c 65 73 73 20 65 and does less e
0930: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 2e 0a 2a rror checking..*
0940: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 69 64 /.static int rid
0950: 5f 66 72 6f 6d 5f 75 75 69 64 28 42 6c 6f 62 20 _from_uuid(Blob
0960: 2a 70 55 75 69 64 2c 20 69 6e 74 20 70 68 61 6e *pUuid, int phan
0970: 74 6f 6d 69 7a 65 2c 20 69 6e 74 20 69 73 50 72 tomize, int isPr
0980: 69 76 61 74 65 29 7b 0a 20 20 73 74 61 74 69 63 ivate){. static
0990: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 72 Stmt q;. int r
09a0: 69 64 3b 0a 0a 20 20 64 62 5f 73 74 61 74 69 63 id;.. db_static
09b0: 5f 70 72 65 70 61 72 65 28 26 71 2c 20 22 53 45 _prepare(&q, "SE
09c0: 4c 45 43 54 20 72 69 64 20 46 52 4f 4d 20 62 6c LECT rid FROM bl
09d0: 6f 62 20 57 48 45 52 45 20 75 75 69 64 3d 3a 75 ob WHERE uuid=:u
09e0: 75 69 64 22 29 3b 0a 20 20 64 62 5f 62 69 6e 64 uid");. db_bind
09f0: 5f 73 74 72 28 26 71 2c 20 22 3a 75 75 69 64 22 _str(&q, ":uuid"
0a00: 2c 20 70 55 75 69 64 29 3b 0a 20 20 69 66 28 20 , pUuid);. if(
0a10: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c db_step(&q)==SQL
0a20: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 ITE_ROW ){. r
0a30: 69 64 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 69 id = db_column_i
0a40: 6e 74 28 26 71 2c 20 30 29 3b 0a 20 20 7d 65 6c nt(&q, 0);. }el
0a50: 73 65 7b 0a 20 20 20 20 72 69 64 20 3d 20 30 3b se{. rid = 0;
0a60: 0a 20 20 7d 0a 20 20 64 62 5f 72 65 73 65 74 28 . }. db_reset(
0a70: 26 71 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d &q);. if( rid==
0a80: 30 20 26 26 20 70 68 61 6e 74 6f 6d 69 7a 65 20 0 && phantomize
0a90: 29 7b 0a 20 20 20 20 72 69 64 20 3d 20 63 6f 6e ){. rid = con
0aa0: 74 65 6e 74 5f 6e 65 77 28 62 6c 6f 62 5f 73 74 tent_new(blob_st
0ab0: 72 28 70 55 75 69 64 29 2c 20 69 73 50 72 69 76 r(pUuid), isPriv
0ac0: 61 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 ate);. }. retu
0ad0: 72 6e 20 72 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a rn rid;.}../*.**
0ae0: 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 Remember that t
0af0: 68 65 20 6f 74 68 65 72 20 73 69 64 65 20 6f 66 he other side of
0b00: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 the connection
0b10: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 63 6f already has a co
0b20: 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c py.** of the fil
0b30: 65 20 72 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 e rid..*/.static
0b40: 20 76 6f 69 64 20 72 65 6d 6f 74 65 5f 68 61 73 void remote_has
0b50: 28 69 6e 74 20 72 69 64 29 7b 0a 20 20 69 66 28 (int rid){. if(
0b60: 20 72 69 64 20 29 7b 0a 20 20 20 20 73 74 61 74 rid ){. stat
0b70: 69 63 20 53 74 6d 74 20 71 3b 0a 20 20 20 20 64 ic Stmt q;. d
0b80: 62 5f 73 74 61 74 69 63 5f 70 72 65 70 61 72 65 b_static_prepare
0b90: 28 26 71 2c 20 22 49 4e 53 45 52 54 20 4f 52 20 (&q, "INSERT OR
0ba0: 49 47 4e 4f 52 45 20 49 4e 54 4f 20 6f 6e 72 65 IGNORE INTO onre
0bb0: 6d 6f 74 65 20 56 41 4c 55 45 53 28 3a 72 29 22 mote VALUES(:r)"
0bc0: 29 3b 0a 20 20 20 20 64 62 5f 62 69 6e 64 5f 69 );. db_bind_i
0bd0: 6e 74 28 26 71 2c 20 22 3a 72 22 2c 20 72 69 64 nt(&q, ":r", rid
0be0: 29 3b 0a 20 20 20 20 64 62 5f 73 74 65 70 28 26 );. db_step(&
0bf0: 71 29 3b 0a 20 20 20 20 64 62 5f 72 65 73 65 74 q);. db_reset
0c00: 28 26 71 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a (&q);. }.}../*.
0c10: 2a 2a 20 54 68 65 20 61 54 6f 6b 65 6e 5b 30 2e ** The aToken[0.
0c20: 2e 6e 54 6f 6b 65 6e 2d 31 5d 20 62 6c 6f 62 20 .nToken-1] blob
0c30: 61 72 72 61 79 20 69 73 20 61 20 70 61 72 73 65 array is a parse
0c40: 20 6f 66 20 61 20 22 66 69 6c 65 22 20 6c 69 6e of a "file" lin
0c50: 65 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 20 54 e.** message. T
0c60: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 69 his routine fini
0c70: 73 68 65 73 20 70 61 72 73 69 6e 67 20 74 68 61 shes parsing tha
0c80: 74 20 6d 65 73 73 61 67 65 20 61 6e 64 20 64 6f t message and do
0c90: 65 73 0a 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 es.** a record i
0ca0: 6e 73 65 72 74 20 6f 66 20 74 68 65 20 66 69 6c nsert of the fil
0cb0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c e..**.** The fil
0cc0: 65 20 6c 69 6e 65 20 69 73 20 69 6e 20 6f 6e 65 e line is in one
0cd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
0ce0: 67 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a g two forms:.**.
0cf0: 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 55 55 49 ** file UUI
0d00: 44 20 53 49 5a 45 20 5c 6e 20 43 4f 4e 54 45 4e D SIZE \n CONTEN
0d10: 54 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 55 T.** file U
0d20: 55 49 44 20 44 45 4c 54 41 53 52 43 20 53 49 5a UID DELTASRC SIZ
0d30: 45 20 5c 6e 20 43 4f 4e 54 45 4e 54 0a 2a 2a 0a E \n CONTENT.**.
0d40: 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 69 ** The content i
0d50: 73 20 53 49 5a 45 20 62 79 74 65 73 20 69 6d 6d s SIZE bytes imm
0d60: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 ediately followi
0d70: 6e 67 20 74 68 65 20 6e 65 77 6c 69 6e 65 2e 0a ng the newline..
0d80: 2a 2a 20 49 66 20 44 45 4c 54 41 53 52 43 20 65 ** If DELTASRC e
0d90: 78 69 73 74 73 2c 20 74 68 65 6e 20 74 68 65 20 xists, then the
0da0: 43 4f 4e 54 45 4e 54 20 69 73 20 61 20 64 65 6c CONTENT is a del
0db0: 74 61 20 61 67 61 69 6e 73 74 20 74 68 65 0a 2a ta against the.*
0dc0: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 45 4c * content of DEL
0dd0: 54 41 53 52 43 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 TASRC..**.** If
0de0: 61 6e 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 any error occurs
0df0: 2c 20 77 72 69 74 65 20 61 20 6d 65 73 73 61 67 , write a messag
0e00: 65 20 69 6e 74 6f 20 70 45 72 72 20 77 68 69 63 e into pErr whic
0e10: 68 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a h has already.**
0e20: 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 be initialized
0e30: 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 to an empty stri
0e40: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 72 ng..**.** Any ar
0e50: 74 69 66 61 63 74 20 73 75 63 63 65 73 73 66 75 tifact successfu
0e60: 6c 6c 79 20 72 65 63 65 69 76 65 64 20 62 79 20 lly received by
0e70: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
0e80: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 0a 2a 2a considered to.**
0e90: 20 62 65 20 70 75 62 6c 69 63 20 61 6e 64 20 69 be public and i
0ea0: 73 20 74 68 65 72 65 66 6f 72 65 20 72 65 6d 6f s therefore remo
0eb0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 22 70 72 ved from the "pr
0ec0: 69 76 61 74 65 22 20 74 61 62 6c 65 2e 0a 2a 2f ivate" table..*/
0ed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 66 65 .static void xfe
0ee0: 72 5f 61 63 63 65 70 74 5f 66 69 6c 65 28 0a 20 r_accept_file(.
0ef0: 20 58 66 65 72 20 2a 70 58 66 65 72 2c 0a 20 20 Xfer *pXfer,.
0f00: 69 6e 74 20 63 6c 6f 6e 65 46 6c 61 67 2c 0a 20 int cloneFlag,.
0f10: 20 63 68 61 72 20 2a 2a 70 7a 55 75 69 64 4c 69 char **pzUuidLi
0f20: 73 74 2c 0a 20 20 69 6e 74 20 2a 70 6e 55 75 69 st,. int *pnUui
0f30: 64 4c 69 73 74 0a 29 7b 0a 20 20 69 6e 74 20 6e dList.){. int n
0f40: 3b 0a 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 69 ;. int rid;. i
0f50: 6e 74 20 73 72 63 69 64 20 3d 20 30 3b 0a 20 20 nt srcid = 0;.
0f60: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 2c 20 68 61 Blob content, ha
0f70: 73 68 3b 0a 20 20 69 6e 74 20 69 73 50 72 69 76 sh;. int isPriv
0f80: 3b 0a 0a 20 20 69 73 50 72 69 76 20 3d 20 70 58 ;.. isPriv = pX
0f90: 66 65 72 2d 3e 6e 65 78 74 49 73 50 72 69 76 61 fer->nextIsPriva
0fa0: 74 65 3b 0a 20 20 70 58 66 65 72 2d 3e 6e 65 78 te;. pXfer->nex
0fb0: 74 49 73 50 72 69 76 61 74 65 20 3d 20 30 3b 0a tIsPrivate = 0;.
0fc0: 20 20 69 66 28 20 70 58 66 65 72 2d 3e 6e 54 6f if( pXfer->nTo
0fd0: 6b 65 6e 3c 33 0a 20 20 20 7c 7c 20 70 58 66 65 ken<3. || pXfe
0fe0: 72 2d 3e 6e 54 6f 6b 65 6e 3e 34 0a 20 20 20 7c r->nToken>4. |
0ff0: 7c 20 21 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 | !blob_is_uuid(
1000: 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 &pXfer->aToken[1
1010: 5d 29 0a 20 20 20 7c 7c 20 21 62 6c 6f 62 5f 69 ]). || !blob_i
1020: 73 5f 69 6e 74 28 26 70 58 66 65 72 2d 3e 61 54 s_int(&pXfer->aT
1030: 6f 6b 65 6e 5b 70 58 66 65 72 2d 3e 6e 54 6f 6b oken[pXfer->nTok
1040: 65 6e 2d 31 5d 2c 20 26 6e 29 0a 20 20 20 7c 7c en-1], &n). ||
1050: 20 6e 3c 30 0a 20 20 20 7c 7c 20 28 70 58 66 65 n<0. || (pXfe
1060: 72 2d 3e 6e 54 6f 6b 65 6e 3d 3d 34 20 26 26 20 r->nToken==4 &&
1070: 21 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 26 70 !blob_is_uuid(&p
1080: 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 32 5d 29 Xfer->aToken[2])
1090: 29 0a 20 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f ). ){. blob_
10a0: 61 70 70 65 6e 64 66 28 26 70 58 66 65 72 2d 3e appendf(&pXfer->
10b0: 65 72 72 2c 20 22 6d 61 6c 66 6f 72 6d 65 64 20 err, "malformed
10c0: 66 69 6c 65 20 6c 69 6e 65 22 29 3b 0a 20 20 20 file line");.
10d0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 62 return;. }. b
10e0: 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6e 74 65 6e lob_zero(&conten
10f0: 74 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 t);. blob_zero(
1100: 26 68 61 73 68 29 3b 0a 20 20 62 6c 6f 62 5f 65 &hash);. blob_e
1110: 78 74 72 61 63 74 28 70 58 66 65 72 2d 3e 70 49 xtract(pXfer->pI
1120: 6e 2c 20 6e 2c 20 26 63 6f 6e 74 65 6e 74 29 3b n, n, &content);
1130: 0a 20 20 69 66 28 20 21 63 6c 6f 6e 65 46 6c 61 . if( !cloneFla
1140: 67 20 26 26 20 75 75 69 64 5f 69 73 5f 73 68 75 g && uuid_is_shu
1150: 6e 6e 65 64 28 62 6c 6f 62 5f 73 74 72 28 26 70 nned(blob_str(&p
1160: 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 5d 29 Xfer->aToken[1])
1170: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f ) ){. /* Igno
1180: 72 65 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 re files that ha
1190: 76 65 20 62 65 65 6e 20 73 68 75 6e 6e 65 64 20 ve been shunned
11a0: 2a 2f 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 */. blob_rese
11b0: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 t(&content);.
11c0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 return;. }. i
11d0: 66 28 20 69 73 50 72 69 76 20 26 26 20 21 67 2e f( isPriv && !g.
11e0: 70 65 72 6d 2e 50 72 69 76 61 74 65 20 29 7b 0a perm.Private ){.
11f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 63 /* Do not ac
1200: 63 65 70 74 20 70 72 69 76 61 74 65 20 66 69 6c cept private fil
1210: 65 73 20 69 66 20 6e 6f 74 20 61 75 74 68 6f 72 es if not author
1220: 69 7a 65 64 20 2a 2f 0a 20 20 20 20 62 6c 6f 62 ized */. blob
1230: 5f 72 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 _reset(&content)
1240: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 ;. return;.
1250: 7d 0a 20 20 69 66 28 20 63 6c 6f 6e 65 46 6c 61 }. if( cloneFla
1260: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 70 58 66 g ){. if( pXf
1270: 65 72 2d 3e 6e 54 6f 6b 65 6e 3d 3d 34 20 29 7b er->nToken==4 ){
1280: 0a 20 20 20 20 20 20 73 72 63 69 64 20 3d 20 72 . srcid = r
1290: 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 26 70 58 id_from_uuid(&pX
12a0: 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 32 5d 2c 20 fer->aToken[2],
12b0: 31 2c 20 69 73 50 72 69 76 29 3b 0a 20 20 20 20 1, isPriv);.
12c0: 20 20 70 58 66 65 72 2d 3e 6e 44 65 6c 74 61 52 pXfer->nDeltaR
12d0: 63 76 64 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 cvd++;. }else
12e0: 7b 0a 20 20 20 20 20 20 73 72 63 69 64 20 3d 20 {. srcid =
12f0: 30 3b 0a 20 20 20 20 20 20 70 58 66 65 72 2d 3e 0;. pXfer->
1300: 6e 46 69 6c 65 52 63 76 64 2b 2b 3b 0a 20 20 20 nFileRcvd++;.
1310: 20 7d 0a 20 20 20 20 72 69 64 20 3d 20 63 6f 6e }. rid = con
1320: 74 65 6e 74 5f 70 75 74 5f 65 78 28 26 63 6f 6e tent_put_ex(&con
1330: 74 65 6e 74 2c 20 62 6c 6f 62 5f 73 74 72 28 26 tent, blob_str(&
1340: 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 5d pXfer->aToken[1]
1350: 29 2c 20 73 72 63 69 64 2c 0a 20 20 20 20 20 20 ), srcid,.
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1370: 20 20 20 30 2c 20 69 73 50 72 69 76 29 3b 0a 20 0, isPriv);.
1380: 20 20 20 54 68 5f 41 70 70 65 6e 64 54 6f 4c 69 Th_AppendToLi
1390: 73 74 28 70 7a 55 75 69 64 4c 69 73 74 2c 20 70 st(pzUuidList, p
13a0: 6e 55 75 69 64 4c 69 73 74 2c 20 62 6c 6f 62 5f nUuidList, blob_
13b0: 73 74 72 28 26 70 58 66 65 72 2d 3e 61 54 6f 6b str(&pXfer->aTok
13c0: 65 6e 5b 31 5d 29 2c 0a 20 20 20 20 20 20 20 20 en[1]),.
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 blob
13e0: 5f 73 69 7a 65 28 26 70 58 66 65 72 2d 3e 61 54 _size(&pXfer->aT
13f0: 6f 6b 65 6e 5b 31 5d 29 29 3b 0a 20 20 20 20 72 oken[1]));. r
1400: 65 6d 6f 74 65 5f 68 61 73 28 72 69 64 29 3b 0a emote_has(rid);.
1410: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 blob_reset(&
1420: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 72 65 content);. re
1430: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 turn;. }. if(
1440: 70 58 66 65 72 2d 3e 6e 54 6f 6b 65 6e 3d 3d 34 pXfer->nToken==4
1450: 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 73 72 63 ){. Blob src
1460: 2c 20 6e 65 78 74 3b 0a 20 20 20 20 73 72 63 69 , next;. srci
1470: 64 20 3d 20 72 69 64 5f 66 72 6f 6d 5f 75 75 69 d = rid_from_uui
1480: 64 28 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e d(&pXfer->aToken
1490: 5b 32 5d 2c 20 31 2c 20 69 73 50 72 69 76 29 3b [2], 1, isPriv);
14a0: 0a 20 20 20 20 69 66 28 20 63 6f 6e 74 65 6e 74 . if( content
14b0: 5f 67 65 74 28 73 72 63 69 64 2c 20 26 73 72 63 _get(srcid, &src
14c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 69 )==0 ){. ri
14d0: 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 75 74 5f d = content_put_
14e0: 65 78 28 26 63 6f 6e 74 65 6e 74 2c 20 62 6c 6f ex(&content, blo
14f0: 62 5f 73 74 72 28 26 70 58 66 65 72 2d 3e 61 54 b_str(&pXfer->aT
1500: 6f 6b 65 6e 5b 31 5d 29 2c 20 73 72 63 69 64 2c oken[1]), srcid,
1510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1520: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 0, i
1530: 73 50 72 69 76 29 3b 0a 20 20 20 20 20 20 54 68 sPriv);. Th
1540: 5f 41 70 70 65 6e 64 54 6f 4c 69 73 74 28 70 7a _AppendToList(pz
1550: 55 75 69 64 4c 69 73 74 2c 20 70 6e 55 75 69 64 UuidList, pnUuid
1560: 4c 69 73 74 2c 20 62 6c 6f 62 5f 73 74 72 28 26 List, blob_str(&
1570: 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 5d pXfer->aToken[1]
1580: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
1590: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 blob_si
15a0: 7a 65 28 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 ze(&pXfer->aToke
15b0: 6e 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 70 58 n[1]));. pX
15c0: 66 65 72 2d 3e 6e 44 61 6e 67 6c 69 6e 67 46 69 fer->nDanglingFi
15d0: 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 64 62 5f 6d le++;. db_m
15e0: 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c 45 54 ulti_exec("DELET
15f0: 45 20 46 52 4f 4d 20 70 68 61 6e 74 6f 6d 20 57 E FROM phantom W
1600: 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 HERE rid=%d", ri
1610: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 d);. if( !i
1620: 73 50 72 69 76 20 29 20 63 6f 6e 74 65 6e 74 5f sPriv ) content_
1630: 6d 61 6b 65 5f 70 75 62 6c 69 63 28 72 69 64 29 make_public(rid)
1640: 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 ;. blob_res
1650: 65 74 28 26 73 72 63 29 3b 0a 20 20 20 20 20 20 et(&src);.
1660: 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e 74 blob_reset(&cont
1670: 65 6e 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ent);. retu
1680: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 58 rn;. }. pX
1690: 66 65 72 2d 3e 6e 44 65 6c 74 61 52 63 76 64 2b fer->nDeltaRcvd+
16a0: 2b 3b 0a 20 20 20 20 62 6c 6f 62 5f 64 65 6c 74 +;. blob_delt
16b0: 61 5f 61 70 70 6c 79 28 26 73 72 63 2c 20 26 63 a_apply(&src, &c
16c0: 6f 6e 74 65 6e 74 2c 20 26 6e 65 78 74 29 3b 0a ontent, &next);.
16d0: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 blob_reset(&
16e0: 73 72 63 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 src);. blob_r
16f0: 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a eset(&content);.
1700: 20 20 20 20 63 6f 6e 74 65 6e 74 20 3d 20 6e 65 content = ne
1710: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 xt;. }else{.
1720: 20 70 58 66 65 72 2d 3e 6e 46 69 6c 65 52 63 76 pXfer->nFileRcv
1730: 64 2b 2b 3b 0a 20 20 7d 0a 20 20 73 68 61 31 73 d++;. }. sha1s
1740: 75 6d 5f 62 6c 6f 62 28 26 63 6f 6e 74 65 6e 74 um_blob(&content
1750: 2c 20 26 68 61 73 68 29 3b 0a 20 20 69 66 28 20 , &hash);. if(
1760: 21 62 6c 6f 62 5f 65 71 5f 73 74 72 28 26 70 58 !blob_eq_str(&pX
1770: 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 fer->aToken[1],
1780: 62 6c 6f 62 5f 73 74 72 28 26 68 61 73 68 29 2c blob_str(&hash),
1790: 20 2d 31 29 20 29 7b 0a 20 20 20 20 62 6c 6f 62 -1) ){. blob
17a0: 5f 61 70 70 65 6e 64 66 28 26 70 58 66 65 72 2d _appendf(&pXfer-
17b0: 3e 65 72 72 2c 20 22 63 6f 6e 74 65 6e 74 20 64 >err, "content d
17c0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 73 68 oes not match sh
17d0: 61 31 20 68 61 73 68 22 29 3b 0a 20 20 7d 0a 20 a1 hash");. }.
17e0: 20 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f 70 rid = content_p
17f0: 75 74 5f 65 78 28 26 63 6f 6e 74 65 6e 74 2c 20 ut_ex(&content,
1800: 62 6c 6f 62 5f 73 74 72 28 26 68 61 73 68 29 2c blob_str(&hash),
1810: 20 30 2c 20 30 2c 20 69 73 50 72 69 76 29 3b 0a 0, 0, isPriv);.
1820: 20 20 54 68 5f 41 70 70 65 6e 64 54 6f 4c 69 73 Th_AppendToLis
1830: 74 28 70 7a 55 75 69 64 4c 69 73 74 2c 20 70 6e t(pzUuidList, pn
1840: 55 75 69 64 4c 69 73 74 2c 20 62 6c 6f 62 5f 73 UuidList, blob_s
1850: 74 72 28 26 68 61 73 68 29 2c 20 62 6c 6f 62 5f tr(&hash), blob_
1860: 73 69 7a 65 28 26 68 61 73 68 29 29 3b 0a 20 20 size(&hash));.
1870: 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 61 73 68 blob_reset(&hash
1880: 29 3b 0a 20 20 69 66 28 20 72 69 64 3d 3d 30 20 );. if( rid==0
1890: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 ){. blob_appe
18a0: 6e 64 66 28 26 70 58 66 65 72 2d 3e 65 72 72 2c ndf(&pXfer->err,
18b0: 20 22 25 73 22 2c 20 67 2e 7a 45 72 72 4d 73 67 "%s", g.zErrMsg
18c0: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 );. blob_rese
18d0: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d t(&content);. }
18e0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 21 69 else{. if( !i
18f0: 73 50 72 69 76 20 29 20 63 6f 6e 74 65 6e 74 5f sPriv ) content_
1900: 6d 61 6b 65 5f 70 75 62 6c 69 63 28 72 69 64 29 make_public(rid)
1910: 3b 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 ;. manifest_c
1920: 72 6f 73 73 6c 69 6e 6b 28 72 69 64 2c 20 26 63 rosslink(rid, &c
1930: 6f 6e 74 65 6e 74 2c 20 4d 43 5f 4e 4f 4e 45 29 ontent, MC_NONE)
1940: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
1950: 62 6c 6f 62 5f 69 73 5f 72 65 73 65 74 28 26 63 blob_is_reset(&c
1960: 6f 6e 74 65 6e 74 29 20 29 3b 0a 20 20 72 65 6d ontent) );. rem
1970: 6f 74 65 5f 68 61 73 28 72 69 64 29 3b 0a 7d 0a ote_has(rid);.}.
1980: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 54 6f 6b 65 ./*.** The aToke
1990: 6e 5b 30 2e 2e 6e 54 6f 6b 65 6e 2d 31 5d 20 62 n[0..nToken-1] b
19a0: 6c 6f 62 20 61 72 72 61 79 20 69 73 20 61 20 70 lob array is a p
19b0: 61 72 73 65 20 6f 66 20 61 20 22 63 66 69 6c 65 arse of a "cfile
19c0: 22 20 6c 69 6e 65 0a 2a 2a 20 6d 65 73 73 61 67 " line.** messag
19d0: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 e. This routine
19e0: 20 66 69 6e 69 73 68 65 73 20 70 61 72 73 69 6e finishes parsin
19f0: 67 20 74 68 61 74 20 6d 65 73 73 61 67 65 20 61 g that message a
1a00: 6e 64 20 64 6f 65 73 0a 2a 2a 20 61 20 72 65 63 nd does.** a rec
1a10: 6f 72 64 20 69 6e 73 65 72 74 20 6f 66 20 74 68 ord insert of th
1a20: 65 20 66 69 6c 65 2e 20 20 54 68 65 20 64 69 66 e file. The dif
1a30: 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 ference between
1a40: 22 66 69 6c 65 22 20 61 6e 64 0a 2a 2a 20 22 63 "file" and.** "c
1a50: 66 69 6c 65 22 20 69 73 20 74 68 61 74 20 77 69 file" is that wi
1a60: 74 68 20 22 63 66 69 6c 65 22 20 74 68 65 20 63 th "cfile" the c
1a70: 6f 6e 74 65 6e 74 20 69 73 20 61 6c 72 65 61 64 ontent is alread
1a80: 79 20 63 6f 6d 70 72 65 73 73 65 64 2e 0a 2a 2a y compressed..**
1a90: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 6c 69 6e .** The file lin
1aa0: 65 20 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 e is in one of t
1ab0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f he following two
1ac0: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 forms:.**.**
1ad0: 20 20 20 63 66 69 6c 65 20 55 55 49 44 20 55 53 cfile UUID US
1ae0: 49 5a 45 20 43 53 49 5a 45 20 5c 6e 20 43 4f 4e IZE CSIZE \n CON
1af0: 54 45 4e 54 0a 2a 2a 20 20 20 20 20 20 63 66 69 TENT.** cfi
1b00: 6c 65 20 55 55 49 44 20 44 45 4c 54 41 53 52 43 le UUID DELTASRC
1b10: 20 55 53 49 5a 45 20 43 53 49 5a 45 20 5c 6e 20 USIZE CSIZE \n
1b20: 43 4f 4e 54 45 4e 54 0a 2a 2a 0a 2a 2a 20 54 68 CONTENT.**.** Th
1b30: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 43 53 49 e content is CSI
1b40: 5a 45 20 62 79 74 65 73 20 69 6d 6d 65 64 69 61 ZE bytes immedia
1b50: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 tely following t
1b60: 68 65 20 6e 65 77 6c 69 6e 65 2e 0a 2a 2a 20 49 he newline..** I
1b70: 66 20 44 45 4c 54 41 53 52 43 20 65 78 69 73 74 f DELTASRC exist
1b80: 73 2c 20 74 68 65 6e 20 74 68 65 20 43 4f 4e 54 s, then the CONT
1b90: 45 4e 54 20 69 73 20 61 20 64 65 6c 74 61 20 61 ENT is a delta a
1ba0: 67 61 69 6e 73 74 20 74 68 65 0a 2a 2a 20 63 6f gainst the.** co
1bb0: 6e 74 65 6e 74 20 6f 66 20 44 45 4c 54 41 53 52 ntent of DELTASR
1bc0: 43 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 C..**.** The ori
1bd0: 67 69 6e 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 ginal size of th
1be0: 65 20 55 55 49 44 20 61 72 74 69 66 61 63 74 20 e UUID artifact
1bf0: 69 73 20 55 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 is USIZE..**.**
1c00: 49 66 20 61 6e 79 20 65 72 72 6f 72 20 6f 63 63 If any error occ
1c10: 75 72 73 2c 20 77 72 69 74 65 20 61 20 6d 65 73 urs, write a mes
1c20: 73 61 67 65 20 69 6e 74 6f 20 70 45 72 72 20 77 sage into pErr w
1c30: 68 69 63 68 20 68 61 73 20 61 6c 72 65 61 64 79 hich has already
1c40: 0a 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a .** be initializ
1c50: 65 64 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 ed to an empty s
1c60: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 tring..**.** Any
1c70: 20 61 72 74 69 66 61 63 74 20 73 75 63 63 65 73 artifact succes
1c80: 73 66 75 6c 6c 79 20 72 65 63 65 69 76 65 64 20 sfully received
1c90: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 by this routine
1ca0: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f is considered to
1cb0: 0a 2a 2a 20 62 65 20 70 75 62 6c 69 63 20 61 6e .** be public an
1cc0: 64 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 72 d is therefore r
1cd0: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 emoved from the
1ce0: 22 70 72 69 76 61 74 65 22 20 74 61 62 6c 65 2e "private" table.
1cf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
1d00: 78 66 65 72 5f 61 63 63 65 70 74 5f 63 6f 6d 70 xfer_accept_comp
1d10: 72 65 73 73 65 64 5f 66 69 6c 65 28 0a 20 20 58 ressed_file(. X
1d20: 66 65 72 20 2a 70 58 66 65 72 2c 0a 20 20 63 68 fer *pXfer,. ch
1d30: 61 72 20 2a 2a 70 7a 55 75 69 64 4c 69 73 74 2c ar **pzUuidList,
1d40: 0a 20 20 69 6e 74 20 2a 70 6e 55 75 69 64 4c 69 . int *pnUuidLi
1d50: 73 74 0a 29 7b 0a 20 20 69 6e 74 20 73 7a 43 3b st.){. int szC;
1d60: 20 20 20 2f 2a 20 43 53 49 5a 45 20 2a 2f 0a 20 /* CSIZE */.
1d70: 20 69 6e 74 20 73 7a 55 3b 20 20 20 2f 2a 20 55 int szU; /* U
1d80: 53 49 5a 45 20 2a 2f 0a 20 20 69 6e 74 20 72 69 SIZE */. int ri
1d90: 64 3b 0a 20 20 69 6e 74 20 73 72 63 69 64 20 3d d;. int srcid =
1da0: 20 30 3b 0a 20 20 42 6c 6f 62 20 63 6f 6e 74 65 0;. Blob conte
1db0: 6e 74 3b 0a 20 20 69 6e 74 20 69 73 50 72 69 76 nt;. int isPriv
1dc0: 3b 0a 0a 20 20 69 73 50 72 69 76 20 3d 20 70 58 ;.. isPriv = pX
1dd0: 66 65 72 2d 3e 6e 65 78 74 49 73 50 72 69 76 61 fer->nextIsPriva
1de0: 74 65 3b 0a 20 20 70 58 66 65 72 2d 3e 6e 65 78 te;. pXfer->nex
1df0: 74 49 73 50 72 69 76 61 74 65 20 3d 20 30 3b 0a tIsPrivate = 0;.
1e00: 20 20 69 66 28 20 70 58 66 65 72 2d 3e 6e 54 6f if( pXfer->nTo
1e10: 6b 65 6e 3c 34 0a 20 20 20 7c 7c 20 70 58 66 65 ken<4. || pXfe
1e20: 72 2d 3e 6e 54 6f 6b 65 6e 3e 35 0a 20 20 20 7c r->nToken>5. |
1e30: 7c 20 21 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 | !blob_is_uuid(
1e40: 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 &pXfer->aToken[1
1e50: 5d 29 0a 20 20 20 7c 7c 20 21 62 6c 6f 62 5f 69 ]). || !blob_i
1e60: 73 5f 69 6e 74 28 26 70 58 66 65 72 2d 3e 61 54 s_int(&pXfer->aT
1e70: 6f 6b 65 6e 5b 70 58 66 65 72 2d 3e 6e 54 6f 6b oken[pXfer->nTok
1e80: 65 6e 2d 32 5d 2c 20 26 73 7a 55 29 0a 20 20 20 en-2], &szU).
1e90: 7c 7c 20 21 62 6c 6f 62 5f 69 73 5f 69 6e 74 28 || !blob_is_int(
1ea0: 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 70 &pXfer->aToken[p
1eb0: 58 66 65 72 2d 3e 6e 54 6f 6b 65 6e 2d 31 5d 2c Xfer->nToken-1],
1ec0: 20 26 73 7a 43 29 0a 20 20 20 7c 7c 20 73 7a 43 &szC). || szC
1ed0: 3c 30 20 7c 7c 20 73 7a 55 3c 30 0a 20 20 20 7c <0 || szU<0. |
1ee0: 7c 20 28 70 58 66 65 72 2d 3e 6e 54 6f 6b 65 6e | (pXfer->nToken
1ef0: 3d 3d 35 20 26 26 20 21 62 6c 6f 62 5f 69 73 5f ==5 && !blob_is_
1f00: 75 75 69 64 28 26 70 58 66 65 72 2d 3e 61 54 6f uuid(&pXfer->aTo
1f10: 6b 65 6e 5b 32 5d 29 29 0a 20 20 29 7b 0a 20 20 ken[2])). ){.
1f20: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 blob_appendf(&
1f30: 70 58 66 65 72 2d 3e 65 72 72 2c 20 22 6d 61 6c pXfer->err, "mal
1f40: 66 6f 72 6d 65 64 20 63 66 69 6c 65 20 6c 69 6e formed cfile lin
1f50: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b e");. return;
1f60: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 50 72 69 . }. if( isPri
1f70: 76 20 26 26 20 21 67 2e 70 65 72 6d 2e 50 72 69 v && !g.perm.Pri
1f80: 76 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 44 vate ){. /* D
1f90: 6f 20 6e 6f 74 20 61 63 63 65 70 74 20 70 72 69 o not accept pri
1fa0: 76 61 74 65 20 66 69 6c 65 73 20 69 66 20 6e 6f vate files if no
1fb0: 74 20 61 75 74 68 6f 72 69 7a 65 64 20 2a 2f 0a t authorized */.
1fc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a return;. }.
1fd0: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6e blob_zero(&con
1fe0: 74 65 6e 74 29 3b 0a 20 20 62 6c 6f 62 5f 65 78 tent);. blob_ex
1ff0: 74 72 61 63 74 28 70 58 66 65 72 2d 3e 70 49 6e tract(pXfer->pIn
2000: 2c 20 73 7a 43 2c 20 26 63 6f 6e 74 65 6e 74 29 , szC, &content)
2010: 3b 0a 20 20 69 66 28 20 75 75 69 64 5f 69 73 5f ;. if( uuid_is_
2020: 73 68 75 6e 6e 65 64 28 62 6c 6f 62 5f 73 74 72 shunned(blob_str
2030: 28 26 70 58 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b (&pXfer->aToken[
2040: 31 5d 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 49 1])) ){. /* I
2050: 67 6e 6f 72 65 20 66 69 6c 65 73 20 74 68 61 74 gnore files that
2060: 20 68 61 76 65 20 62 65 65 6e 20 73 68 75 6e 6e have been shunn
2070: 65 64 20 2a 2f 0a 20 20 20 20 62 6c 6f 62 5f 72 ed */. blob_r
2080: 65 73 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a eset(&content);.
2090: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a return;. }.
20a0: 20 20 69 66 28 20 70 58 66 65 72 2d 3e 6e 54 6f if( pXfer->nTo
20b0: 6b 65 6e 3d 3d 35 20 29 7b 0a 20 20 20 20 73 72 ken==5 ){. sr
20c0: 63 69 64 20 3d 20 72 69 64 5f 66 72 6f 6d 5f 75 cid = rid_from_u
20d0: 75 69 64 28 26 70 58 66 65 72 2d 3e 61 54 6f 6b uid(&pXfer->aTok
20e0: 65 6e 5b 32 5d 2c 20 31 2c 20 69 73 50 72 69 76 en[2], 1, isPriv
20f0: 29 3b 0a 20 20 20 20 70 58 66 65 72 2d 3e 6e 44 );. pXfer->nD
2100: 65 6c 74 61 52 63 76 64 2b 2b 3b 0a 20 20 7d 65 eltaRcvd++;. }e
2110: 6c 73 65 7b 0a 20 20 20 20 73 72 63 69 64 20 3d lse{. srcid =
2120: 20 30 3b 0a 20 20 20 20 70 58 66 65 72 2d 3e 6e 0;. pXfer->n
2130: 46 69 6c 65 52 63 76 64 2b 2b 3b 0a 20 20 7d 0a FileRcvd++;. }.
2140: 20 20 72 69 64 20 3d 20 63 6f 6e 74 65 6e 74 5f rid = content_
2150: 70 75 74 5f 65 78 28 26 63 6f 6e 74 65 6e 74 2c put_ex(&content,
2160: 20 62 6c 6f 62 5f 73 74 72 28 26 70 58 66 65 72 blob_str(&pXfer
2170: 2d 3e 61 54 6f 6b 65 6e 5b 31 5d 29 2c 20 73 72 ->aToken[1]), sr
2180: 63 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 cid,.
2190: 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 2c szC,
21a0: 20 69 73 50 72 69 76 29 3b 0a 20 20 54 68 5f 41 isPriv);. Th_A
21b0: 70 70 65 6e 64 54 6f 4c 69 73 74 28 70 7a 55 75 ppendToList(pzUu
21c0: 69 64 4c 69 73 74 2c 20 70 6e 55 75 69 64 4c 69 idList, pnUuidLi
21d0: 73 74 2c 20 62 6c 6f 62 5f 73 74 72 28 26 70 58 st, blob_str(&pX
21e0: 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 5d 29 2c fer->aToken[1]),
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2200: 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26 70 58 blob_size(&pX
2210: 66 65 72 2d 3e 61 54 6f 6b 65 6e 5b 31 5d 29 29 fer->aToken[1]))
2220: 3b 0a 20 20 72 65 6d 6f 74 65 5f 68 61 73 28 72 ;. remote_has(r
2230: 69 64 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 id);. blob_rese
2240: 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 7d 0a 0a t(&content);.}..
2250: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 73 65 6e /*.** Try to sen
2260: 64 20 61 20 66 69 6c 65 20 61 73 20 61 20 64 65 d a file as a de
2270: 6c 74 61 20 61 67 61 69 6e 73 74 20 69 74 73 20 lta against its
2280: 70 61 72 65 6e 74 2e 0a 2a 2a 20 49 66 20 73 75 parent..** If su
2290: 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e ccessful, return
22a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
22b0: 79 74 65 73 20 69 6e 20 74 68 65 20 64 65 6c 74 ytes in the delt
22c0: 61 2e 0a 2a 2a 20 49 66 20 77 65 20 63 61 6e 6e a..** If we cann
22d0: 6f 74 20 67 65 6e 65 72 61 74 65 20 61 6e 20 61 ot generate an a
22e0: 70 70 72 6f 70 72 69 61 74 65 20 64 65 6c 74 61 ppropriate delta
22f0: 2c 20 74 68 65 6e 20 73 65 6e 64 0a 2a 2a 20 6e , then send.** n
2300: 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 othing and retur
2310: 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 65 n zero..**.** Ne
2320: 76 65 72 20 73 65 6e 64 20 61 20 64 65 6c 74 61 ver send a delta
2330: 20 61 67 61 69 6e 73 74 20 61 20 70 72 69 76 61 against a priva
2340: 74 65 20 61 72 74 69 66 61 63 74 2e 0a 2a 2f 0a te artifact..*/.
2350: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6e 64 5f static int send_
2360: 64 65 6c 74 61 5f 70 61 72 65 6e 74 28 0a 20 20 delta_parent(.
2370: 58 66 65 72 20 2a 70 58 66 65 72 2c 20 20 20 20 Xfer *pXfer,
2380: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 /* The t
2390: 72 61 6e 73 66 65 72 20 63 6f 6e 74 65 78 74 20 ransfer context
23a0: 2a 2f 0a 20 20 69 6e 74 20 72 69 64 2c 20 20 20 */. int rid,
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
23c0: 72 65 63 6f 72 64 20 69 64 20 6f 66 20 74 68 65 record id of the
23d0: 20 66 69 6c 65 20 74 6f 20 73 65 6e 64 20 2a 2f file to send */
23e0: 0a 20 20 69 6e 74 20 69 73 50 72 69 76 61 74 65 . int isPrivate
23f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 , /* Tr
2400: 75 65 20 69 66 20 72 69 64 20 69 73 20 61 20 70 ue if rid is a p
2410: 72 69 76 61 74 65 20 61 72 74 69 66 61 63 74 20 rivate artifact
2420: 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 43 6f 6e 74 */. Blob *pCont
2430: 65 6e 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 ent, /*
2440: 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 The content of t
2450: 68 65 20 66 69 6c 65 20 74 6f 20 73 65 6e 64 20 he file to send
2460: 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 55 75 69 64 */. Blob *pUuid
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2480: 54 68 65 20 55 55 49 44 20 6f 66 20 74 68 65 20 The UUID of the
2490: 66 69 6c 65 20 74 6f 20 73 65 6e 64 20 2a 2f 0a file to send */.
24a0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 ){. static cons
24b0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 20 61 7a t char *const az
24c0: 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 Query[] = {.
24d0: 22 53 45 4c 45 43 54 20 70 69 64 20 46 52 4f 4d "SELECT pid FROM
24e0: 20 70 6c 69 6e 6b 20 78 22 0a 20 20 20 20 22 20 plink x". "
24f0: 57 48 45 52 45 20 63 69 64 3d 25 64 22 0a 20 20 WHERE cid=%d".
2500: 20 20 22 20 20 20 41 4e 44 20 4e 4f 54 20 45 58 " AND NOT EX
2510: 49 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 ISTS(SELECT 1 FR
2520: 4f 4d 20 70 68 61 6e 74 6f 6d 20 57 48 45 52 45 OM phantom WHERE
2530: 20 72 69 64 3d 70 69 64 29 22 2c 0a 0a 20 20 20 rid=pid)",..
2540: 20 22 53 45 4c 45 43 54 20 70 69 64 2c 20 6d 69 "SELECT pid, mi
2550: 6e 28 6d 74 69 6d 65 29 20 46 52 4f 4d 20 6d 6c n(mtime) FROM ml
2560: 69 6e 6b 2c 20 65 76 65 6e 74 20 4f 4e 20 6d 6c ink, event ON ml
2570: 69 6e 6b 2e 6d 69 64 3d 65 76 65 6e 74 2e 6f 62 ink.mid=event.ob
2580: 6a 69 64 22 0a 20 20 20 20 22 20 57 48 45 52 45 jid". " WHERE
2590: 20 66 69 64 3d 25 64 22 0a 20 20 20 20 22 20 20 fid=%d". "
25a0: 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28 AND NOT EXISTS(
25b0: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 68 SELECT 1 FROM ph
25c0: 61 6e 74 6f 6d 20 57 48 45 52 45 20 72 69 64 3d antom WHERE rid=
25d0: 70 69 64 29 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 pid)". };. int
25e0: 20 69 3b 0a 20 20 42 6c 6f 62 20 73 72 63 2c 20 i;. Blob src,
25f0: 64 65 6c 74 61 3b 0a 20 20 69 6e 74 20 73 69 7a delta;. int siz
2600: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 72 63 e = 0;. int src
2610: 49 64 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 Id = 0;.. for(i
2620: 3d 30 3b 20 73 72 63 49 64 3d 3d 30 20 26 26 20 =0; srcId==0 &&
2630: 69 3c 63 6f 75 6e 74 28 61 7a 51 75 65 72 79 29 i<count(azQuery)
2640: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 72 63 49 ; i++){. srcI
2650: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 61 7a d = db_int(0, az
2660: 51 75 65 72 79 5b 69 5d 2c 20 72 69 64 29 3b 0a Query[i], rid);.
2670: 20 20 7d 0a 20 20 69 66 28 20 73 72 63 49 64 3e }. if( srcId>
2680: 30 0a 20 20 20 26 26 20 28 70 58 66 65 72 2d 3e 0. && (pXfer->
2690: 73 79 6e 63 50 72 69 76 61 74 65 20 7c 7c 20 21 syncPrivate || !
26a0: 63 6f 6e 74 65 6e 74 5f 69 73 5f 70 72 69 76 61 content_is_priva
26b0: 74 65 28 73 72 63 49 64 29 29 0a 20 20 20 26 26 te(srcId)). &&
26c0: 20 63 6f 6e 74 65 6e 74 5f 67 65 74 28 73 72 63 content_get(src
26d0: 49 64 2c 20 26 73 72 63 29 0a 20 20 29 7b 0a 20 Id, &src). ){.
26e0: 20 20 20 63 68 61 72 20 2a 7a 55 75 69 64 20 3d char *zUuid =
26f0: 20 64 62 5f 74 65 78 74 28 30 2c 20 22 53 45 4c db_text(0, "SEL
2700: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c ECT uuid FROM bl
2710: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 22 ob WHERE rid=%d"
2720: 2c 20 73 72 63 49 64 29 3b 0a 20 20 20 20 62 6c , srcId);. bl
2730: 6f 62 5f 64 65 6c 74 61 5f 63 72 65 61 74 65 28 ob_delta_create(
2740: 26 73 72 63 2c 20 70 43 6f 6e 74 65 6e 74 2c 20 &src, pContent,
2750: 26 64 65 6c 74 61 29 3b 0a 20 20 20 20 73 69 7a &delta);. siz
2760: 65 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 26 64 e = blob_size(&d
2770: 65 6c 74 61 29 3b 0a 20 20 20 20 69 66 28 20 73 elta);. if( s
2780: 69 7a 65 3e 3d 62 6c 6f 62 5f 73 69 7a 65 28 70 ize>=blob_size(p
2790: 43 6f 6e 74 65 6e 74 29 2d 35 30 20 29 7b 0a 20 Content)-50 ){.
27a0: 20 20 20 20 20 73 69 7a 65 20 3d 20 30 3b 0a 20 size = 0;.
27b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 75 69 }else if( uui
27c0: 64 5f 69 73 5f 73 68 75 6e 6e 65 64 28 7a 55 75 d_is_shunned(zUu
27d0: 69 64 29 20 29 7b 0a 20 20 20 20 20 20 73 69 7a id) ){. siz
27e0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 e = 0;. }else
27f0: 7b 0a 20 20 20 20 20 20 20 69 66 28 20 69 73 50 {. if( isP
2800: 72 69 76 61 74 65 20 29 20 62 6c 6f 62 5f 61 70 rivate ) blob_ap
2810: 70 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75 74 pend(pXfer->pOut
2820: 2c 20 22 70 72 69 76 61 74 65 5c 6e 22 2c 20 2d , "private\n", -
2830: 31 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 1);. blob_a
2840: 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f ppendf(pXfer->pO
2850: 75 74 2c 20 22 66 69 6c 65 20 25 62 20 25 73 20 ut, "file %b %s
2860: 25 64 5c 6e 22 2c 20 70 55 75 69 64 2c 20 7a 55 %d\n", pUuid, zU
2870: 75 69 64 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 uid, size);.
2880: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 58 blob_append(pX
2890: 66 65 72 2d 3e 70 4f 75 74 2c 20 62 6c 6f 62 5f fer->pOut, blob_
28a0: 62 75 66 66 65 72 28 26 64 65 6c 74 61 29 2c 20 buffer(&delta),
28b0: 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 size);. }.
28c0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 64 65 6c blob_reset(&del
28d0: 74 61 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 55 ta);. free(zU
28e0: 75 69 64 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 uid);. blob_r
28f0: 65 73 65 74 28 26 73 72 63 29 3b 0a 20 20 7d 0a eset(&src);. }.
2900: 20 20 72 65 74 75 72 6e 20 73 69 7a 65 3b 0a 7d return size;.}
2910: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 73 ../*.** Try to s
2920: 65 6e 64 20 61 20 66 69 6c 65 20 61 73 20 61 20 end a file as a
2930: 6e 61 74 69 76 65 20 64 65 6c 74 61 2e 0a 2a 2a native delta..**
2940: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 If successful,
2950: 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 return the numbe
2960: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 r of bytes in th
2970: 65 20 64 65 6c 74 61 2e 0a 2a 2a 20 49 66 20 77 e delta..** If w
2980: 65 20 63 61 6e 6e 6f 74 20 67 65 6e 65 72 61 74 e cannot generat
2990: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 e an appropriate
29a0: 20 64 65 6c 74 61 2c 20 74 68 65 6e 20 73 65 6e delta, then sen
29b0: 64 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 61 6e 64 d.** nothing and
29c0: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2a return zero..**
29d0: 0a 2a 2a 20 4e 65 76 65 72 20 73 65 6e 64 20 61 .** Never send a
29e0: 20 64 65 6c 74 61 20 61 67 61 69 6e 73 74 20 61 delta against a
29f0: 20 70 72 69 76 61 74 65 20 61 72 74 69 66 61 63 private artifac
2a00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 t..*/.static int
2a10: 20 73 65 6e 64 5f 64 65 6c 74 61 5f 6e 61 74 69 send_delta_nati
2a20: 76 65 28 0a 20 20 58 66 65 72 20 2a 70 58 66 65 ve(. Xfer *pXfe
2a30: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a r, /*
2a40: 20 54 68 65 20 74 72 61 6e 73 66 65 72 20 63 6f The transfer co
2a50: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 72 ntext */. int r
2a60: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 id,
2a70: 20 20 20 2f 2a 20 72 65 63 6f 72 64 20 69 64 20 /* record id
2a80: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 73 of the file to s
2a90: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 50 end */. int isP
2aa0: 72 69 76 61 74 65 2c 20 20 20 20 20 20 20 20 20 rivate,
2ab0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 69 64 20 /* True if rid
2ac0: 69 73 20 61 20 70 72 69 76 61 74 65 20 61 72 74 is a private art
2ad0: 69 66 61 63 74 20 2a 2f 0a 20 20 42 6c 6f 62 20 ifact */. Blob
2ae0: 2a 70 55 75 69 64 20 20 20 20 20 20 20 20 20 20 *pUuid
2af0: 20 20 20 2f 2a 20 54 68 65 20 55 55 49 44 20 6f /* The UUID o
2b00: 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 73 65 f the file to se
2b10: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 42 6c 6f 62 20 nd */.){. Blob
2b20: 73 72 63 2c 20 64 65 6c 74 61 3b 0a 20 20 69 6e src, delta;. in
2b30: 74 20 73 69 7a 65 20 3d 20 30 3b 0a 20 20 69 6e t size = 0;. in
2b40: 74 20 73 72 63 49 64 3b 0a 0a 20 20 73 72 63 49 t srcId;.. srcI
2b50: 64 20 3d 20 64 62 5f 69 6e 74 28 30 2c 20 22 53 d = db_int(0, "S
2b60: 45 4c 45 43 54 20 73 72 63 69 64 20 46 52 4f 4d ELECT srcid FROM
2b70: 20 64 65 6c 74 61 20 57 48 45 52 45 20 72 69 64 delta WHERE rid
2b80: 3d 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 69 66 =%d", rid);. if
2b90: 28 20 73 72 63 49 64 3e 30 0a 20 20 20 26 26 20 ( srcId>0. &&
2ba0: 28 70 58 66 65 72 2d 3e 73 79 6e 63 50 72 69 76 (pXfer->syncPriv
2bb0: 61 74 65 20 7c 7c 20 21 63 6f 6e 74 65 6e 74 5f ate || !content_
2bc0: 69 73 5f 70 72 69 76 61 74 65 28 73 72 63 49 64 is_private(srcId
2bd0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 62 6c 6f 62 )). ){. blob
2be0: 5f 7a 65 72 6f 28 26 73 72 63 29 3b 0a 20 20 20 _zero(&src);.
2bf0: 20 64 62 5f 62 6c 6f 62 28 26 73 72 63 2c 20 22 db_blob(&src, "
2c00: 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d SELECT uuid FROM
2c10: 20 62 6c 6f 62 20 57 48 45 52 45 20 72 69 64 3d blob WHERE rid=
2c20: 25 64 22 2c 20 73 72 63 49 64 29 3b 0a 20 20 20 %d", srcId);.
2c30: 20 69 66 28 20 75 75 69 64 5f 69 73 5f 73 68 75 if( uuid_is_shu
2c40: 6e 6e 65 64 28 62 6c 6f 62 5f 73 74 72 28 26 73 nned(blob_str(&s
2c50: 72 63 29 29 20 29 7b 0a 20 20 20 20 20 20 62 6c rc)) ){. bl
2c60: 6f 62 5f 72 65 73 65 74 28 26 73 72 63 29 3b 0a ob_reset(&src);.
2c70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a return 0;.
2c80: 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f 7a }. blob_z
2c90: 65 72 6f 28 26 64 65 6c 74 61 29 3b 0a 20 20 20 ero(&delta);.
2ca0: 20 64 62 5f 62 6c 6f 62 28 26 64 65 6c 74 61 2c db_blob(&delta,
2cb0: 20 22 53 45 4c 45 43 54 20 63 6f 6e 74 65 6e 74 "SELECT content
2cc0: 20 46 52 4f 4d 20 62 6c 6f 62 20 57 48 45 52 45 FROM blob WHERE
2cd0: 20 72 69 64 3d 25 64 22 2c 20 72 69 64 29 3b 0a rid=%d", rid);.
2ce0: 20 20 20 20 62 6c 6f 62 5f 75 6e 63 6f 6d 70 72 blob_uncompr
2cf0: 65 73 73 28 26 64 65 6c 74 61 2c 20 26 64 65 6c ess(&delta, &del
2d00: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 69 73 50 ta);. if( isP
2d10: 72 69 76 61 74 65 20 29 20 62 6c 6f 62 5f 61 70 rivate ) blob_ap
2d20: 70 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75 74 pend(pXfer->pOut
2d30: 2c 20 22 70 72 69 76 61 74 65 5c 6e 22 2c 20 2d , "private\n", -
2d40: 31 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 1);. blob_app
2d50: 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f 75 74 endf(pXfer->pOut
2d60: 2c 20 22 66 69 6c 65 20 25 62 20 25 62 20 25 64 , "file %b %b %d
2d70: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 \n",.
2d80: 20 20 20 20 20 70 55 75 69 64 2c 20 26 73 72 63 pUuid, &src
2d90: 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 26 64 65 6c , blob_size(&del
2da0: 74 61 29 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 ta));. blob_a
2db0: 70 70 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75 ppend(pXfer->pOu
2dc0: 74 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 t, blob_buffer(&
2dd0: 64 65 6c 74 61 29 2c 20 62 6c 6f 62 5f 73 69 7a delta), blob_siz
2de0: 65 28 26 64 65 6c 74 61 29 29 3b 0a 20 20 20 20 e(&delta));.
2df0: 73 69 7a 65 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 size = blob_size
2e00: 28 26 64 65 6c 74 61 29 3b 0a 20 20 20 20 62 6c (&delta);. bl
2e10: 6f 62 5f 72 65 73 65 74 28 26 64 65 6c 74 61 29 ob_reset(&delta)
2e20: 3b 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 ;. blob_reset
2e30: 28 26 73 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b (&src);. }else{
2e40: 0a 20 20 20 20 73 69 7a 65 20 3d 20 30 3b 0a 20 . size = 0;.
2e50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 }. return size
2e60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 ;.}../*.** Send
2e70: 74 68 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 the file identif
2e80: 69 65 64 20 62 79 20 72 69 64 2e 0a 2a 2a 0a 2a ied by rid..**.*
2e90: 2a 20 54 68 65 20 70 55 75 69 64 20 63 61 6e 20 * The pUuid can
2ea0: 62 65 20 4e 55 4c 4c 20 69 6e 20 77 68 69 63 68 be NULL in which
2eb0: 20 63 61 73 65 20 74 68 65 20 63 6f 72 72 65 63 case the correc
2ec0: 74 20 55 55 49 44 20 69 73 20 63 6f 6d 70 75 74 t UUID is comput
2ed0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 72 ed.** from the r
2ee0: 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f id..**.** Try to
2ef0: 20 73 65 6e 64 20 74 68 65 20 66 69 6c 65 20 61 send the file a
2f00: 73 20 61 20 6e 61 74 69 76 65 20 64 65 6c 74 61 s a native delta
2f10: 20 69 66 20 6e 61 74 69 76 65 44 65 6c 74 61 20 if nativeDelta
2f20: 69 73 20 74 72 75 65 2c 20 6f 72 0a 2a 2a 20 61 is true, or.** a
2f30: 73 20 61 20 70 61 72 65 6e 74 20 64 65 6c 74 61 s a parent delta
2f40: 20 69 66 20 6e 61 74 69 76 65 44 65 6c 74 61 20 if nativeDelta
2f50: 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 is false..**.**
2f60: 49 74 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 It should never
2f70: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 be the case that
2f80: 20 72 69 64 20 69 73 20 61 20 70 72 69 76 61 74 rid is a privat
2f90: 65 20 61 72 74 69 66 61 63 74 2e 20 20 42 75 74 e artifact. But
2fa0: 0a 2a 2a 20 61 73 20 61 20 70 72 65 63 61 75 74 .** as a precaut
2fb0: 69 6f 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e ion, this routin
2fc0: 65 20 64 6f 65 73 20 63 68 65 63 6b 20 6f 6e 20 e does check on
2fd0: 72 69 64 20 61 6e 64 20 69 66 20 69 74 20 69 73 rid and if it is
2fe0: 20 70 72 69 76 61 74 65 0a 2a 2a 20 74 68 69 73 private.** this
2ff0: 20 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73 routine becomes
3000: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 a no-op..*/.sta
3010: 74 69 63 20 76 6f 69 64 20 73 65 6e 64 5f 66 69 tic void send_fi
3020: 6c 65 28 58 66 65 72 20 2a 70 58 66 65 72 2c 20 le(Xfer *pXfer,
3030: 69 6e 74 20 72 69 64 2c 20 42 6c 6f 62 20 2a 70 int rid, Blob *p
3040: 55 75 69 64 2c 20 69 6e 74 20 6e 61 74 69 76 65 Uuid, int native
3050: 44 65 6c 74 61 29 7b 0a 20 20 42 6c 6f 62 20 63 Delta){. Blob c
3060: 6f 6e 74 65 6e 74 2c 20 75 75 69 64 3b 0a 20 20 ontent, uuid;.
3070: 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 20 20 int size = 0;.
3080: 69 6e 74 20 69 73 50 72 69 76 20 3d 20 63 6f 6e int isPriv = con
3090: 74 65 6e 74 5f 69 73 5f 70 72 69 76 61 74 65 28 tent_is_private(
30a0: 72 69 64 29 3b 0a 0a 20 20 69 66 28 20 70 58 66 rid);.. if( pXf
30b0: 65 72 2d 3e 73 79 6e 63 50 72 69 76 61 74 65 3d er->syncPrivate=
30c0: 3d 30 20 26 26 20 69 73 50 72 69 76 20 29 20 72 =0 && isPriv ) r
30d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 64 62 5f eturn;. if( db_
30e0: 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 20 31 exists("SELECT 1
30f0: 20 46 52 4f 4d 20 6f 6e 72 65 6d 6f 74 65 20 57 FROM onremote W
3100: 48 45 52 45 20 72 69 64 3d 25 64 22 2c 20 72 69 HERE rid=%d", ri
3110: 64 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 d) ){. retur
3120: 6e 3b 0a 20 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 n;. }. blob_ze
3130: 72 6f 28 26 75 75 69 64 29 3b 0a 20 20 64 62 5f ro(&uuid);. db_
3140: 62 6c 6f 62 28 26 75 75 69 64 2c 20 22 53 45 4c blob(&uuid, "SEL
3150: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c ECT uuid FROM bl
3160: 6f 62 20 57 48 45 52 45 20 72 69 64 3d 25 64 20 ob WHERE rid=%d
3170: 41 4e 44 20 73 69 7a 65 3e 3d 30 22 2c 20 72 69 AND size>=0", ri
3180: 64 29 3b 0a 20 20 69 66 28 20 62 6c 6f 62 5f 73 d);. if( blob_s
3190: 69 7a 65 28 26 75 75 69 64 29 3d 3d 30 20 29 7b ize(&uuid)==0 ){
31a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
31b0: 0a 20 20 69 66 28 20 70 55 75 69 64 20 29 7b 0a . if( pUuid ){.
31c0: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 63 6f 6d if( blob_com
31d0: 70 61 72 65 28 70 55 75 69 64 2c 20 26 75 75 69 pare(pUuid, &uui
31e0: 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 d)!=0 ){. b
31f0: 6c 6f 62 5f 72 65 73 65 74 28 26 75 75 69 64 29 lob_reset(&uuid)
3200: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a ;. return;.
3210: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 }. }else{.
3220: 20 20 20 70 55 75 69 64 20 3d 20 26 75 75 69 64 pUuid = &uuid
3230: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 75 69 64 ;. }. if( uuid
3240: 5f 69 73 5f 73 68 75 6e 6e 65 64 28 62 6c 6f 62 _is_shunned(blob
3250: 5f 73 74 72 28 70 55 75 69 64 29 29 20 29 7b 0a _str(pUuid)) ){.
3260: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 blob_reset(&
3270: 75 75 69 64 29 3b 0a 20 20 20 20 72 65 74 75 72 uuid);. retur
3280: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 58 n;. }. if( (pX
3290: 66 65 72 2d 3e 6d 61 78 54 69 6d 65 20 21 3d 20 fer->maxTime !=
32a0: 2d 31 20 26 26 20 74 69 6d 65 28 4e 55 4c 4c 29 -1 && time(NULL)
32b0: 20 3e 3d 20 70 58 66 65 72 2d 3e 6d 61 78 54 69 >= pXfer->maxTi
32c0: 6d 65 29 20 7c 7c 0a 20 20 20 20 20 20 20 70 58 me) ||. pX
32d0: 66 65 72 2d 3e 6d 78 53 65 6e 64 3c 3d 62 6c 6f fer->mxSend<=blo
32e0: 62 5f 73 69 7a 65 28 70 58 66 65 72 2d 3e 70 4f b_size(pXfer->pO
32f0: 75 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 ut) ){. const
3300: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d char *zFormat =
3310: 20 69 73 50 72 69 76 20 3f 20 22 69 67 6f 74 20 isPriv ? "igot
3320: 25 62 20 31 5c 6e 22 20 3a 20 22 69 67 6f 74 20 %b 1\n" : "igot
3330: 25 62 5c 6e 22 3b 0a 20 20 20 20 62 6c 6f 62 5f %b\n";. blob_
3340: 61 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 appendf(pXfer->p
3350: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 70 55 Out, zFormat, pU
3360: 75 69 64 29 3b 0a 20 20 20 20 70 58 66 65 72 2d uid);. pXfer-
3370: 3e 6e 49 47 6f 74 53 65 6e 74 2b 2b 3b 0a 20 20 >nIGotSent++;.
3380: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 75 75 blob_reset(&uu
3390: 69 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b id);. return;
33a0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 61 74 69 76 . }. if( nativ
33b0: 65 44 65 6c 74 61 20 29 7b 0a 20 20 20 20 73 69 eDelta ){. si
33c0: 7a 65 20 3d 20 73 65 6e 64 5f 64 65 6c 74 61 5f ze = send_delta_
33d0: 6e 61 74 69 76 65 28 70 58 66 65 72 2c 20 72 69 native(pXfer, ri
33e0: 64 2c 20 69 73 50 72 69 76 2c 20 70 55 75 69 64 d, isPriv, pUuid
33f0: 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 20 );. if( size
3400: 29 7b 0a 20 20 20 20 20 20 70 58 66 65 72 2d 3e ){. pXfer->
3410: 6e 44 65 6c 74 61 53 65 6e 74 2b 2b 3b 0a 20 20 nDeltaSent++;.
3420: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 }. }. if( si
3430: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e ze==0 ){. con
3440: 74 65 6e 74 5f 67 65 74 28 72 69 64 2c 20 26 63 tent_get(rid, &c
3450: 6f 6e 74 65 6e 74 29 3b 0a 0a 20 20 20 20 69 66 ontent);.. if
3460: 28 20 21 6e 61 74 69 76 65 44 65 6c 74 61 20 26 ( !nativeDelta &
3470: 26 20 62 6c 6f 62 5f 73 69 7a 65 28 26 63 6f 6e & blob_size(&con
3480: 74 65 6e 74 29 3e 31 30 30 20 29 7b 0a 20 20 20 tent)>100 ){.
3490: 20 20 20 73 69 7a 65 20 3d 20 73 65 6e 64 5f 64 size = send_d
34a0: 65 6c 74 61 5f 70 61 72 65 6e 74 28 70 58 66 65 elta_parent(pXfe
34b0: 72 2c 20 72 69 64 2c 20 69 73 50 72 69 76 2c 20 r, rid, isPriv,
34c0: 26 63 6f 6e 74 65 6e 74 2c 20 70 55 75 69 64 29 &content, pUuid)
34d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
34e0: 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 size==0 ){.
34f0: 20 69 6e 74 20 73 69 7a 65 20 3d 20 62 6c 6f 62 int size = blob
3500: 5f 73 69 7a 65 28 26 63 6f 6e 74 65 6e 74 29 3b _size(&content);
3510: 0a 20 20 20 20 20 20 69 66 28 20 69 73 50 72 69 . if( isPri
3520: 76 20 29 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 v ) blob_append(
3530: 70 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 70 72 pXfer->pOut, "pr
3540: 69 76 61 74 65 5c 6e 22 2c 20 2d 31 29 3b 0a 20 ivate\n", -1);.
3550: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
3560: 66 28 70 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 f(pXfer->pOut, "
3570: 66 69 6c 65 20 25 62 20 25 64 5c 6e 22 2c 20 70 file %b %d\n", p
3580: 55 75 69 64 2c 20 73 69 7a 65 29 3b 0a 20 20 20 Uuid, size);.
3590: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 blob_append(p
35a0: 58 66 65 72 2d 3e 70 4f 75 74 2c 20 62 6c 6f 62 Xfer->pOut, blob
35b0: 5f 62 75 66 66 65 72 28 26 63 6f 6e 74 65 6e 74 _buffer(&content
35c0: 29 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 ), size);.
35d0: 70 58 66 65 72 2d 3e 6e 46 69 6c 65 53 65 6e 74 pXfer->nFileSent
35e0: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ++;. }else{.
35f0: 20 20 20 20 20 70 58 66 65 72 2d 3e 6e 44 65 6c pXfer->nDel
3600: 74 61 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a taSent++;. }.
3610: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 blob_reset(&
3620: 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 content);. }.
3630: 72 65 6d 6f 74 65 5f 68 61 73 28 72 69 64 29 3b remote_has(rid);
3640: 0a 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 75 . blob_reset(&u
3650: 75 69 64 29 3b 0a 23 69 66 20 30 0a 20 20 69 66 uid);.#if 0. if
3660: 28 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 58 ( blob_buffer(pX
3670: 66 65 72 2d 3e 70 4f 75 74 29 5b 62 6c 6f 62 5f fer->pOut)[blob_
3680: 73 69 7a 65 28 70 58 66 65 72 2d 3e 70 4f 75 74 size(pXfer->pOut
3690: 29 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 )-1]!='\n' ){.
36a0: 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 blob_appendf(p
36b0: 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 5c 6e 22 Xfer->pOut, "\n"
36c0: 2c 20 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 , 1);. }.#endif
36d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74 .}../*.** Send t
36e0: 68 65 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 he file identifi
36f0: 65 64 20 62 79 20 72 69 64 20 61 73 20 61 20 63 ed by rid as a c
3700: 6f 6d 70 72 65 73 73 65 64 20 61 72 74 69 66 61 ompressed artifa
3710: 63 74 2e 20 20 42 61 73 69 63 61 6c 6c 79 2c 0a ct. Basically,.
3720: 2a 2a 20 73 65 6e 64 20 74 68 65 20 63 6f 6e 74 ** send the cont
3730: 65 6e 74 20 65 78 61 63 74 6c 79 20 61 73 20 69 ent exactly as i
3740: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 t appears in the
3750: 20 42 4c 4f 42 20 74 61 62 6c 65 20 75 73 69 6e BLOB table usin
3760: 67 0a 2a 2a 20 61 20 22 63 66 69 6c 65 22 20 63 g.** a "cfile" c
3770: 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ard..*/.static v
3780: 6f 69 64 20 73 65 6e 64 5f 63 6f 6d 70 72 65 73 oid send_compres
3790: 73 65 64 5f 66 69 6c 65 28 58 66 65 72 20 2a 70 sed_file(Xfer *p
37a0: 58 66 65 72 2c 20 69 6e 74 20 72 69 64 29 7b 0a Xfer, int rid){.
37b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 const char *zC
37c0: 6f 6e 74 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 ontent;. const
37d0: 63 68 61 72 20 2a 7a 55 75 69 64 3b 0a 20 20 63 char *zUuid;. c
37e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 6c 74 onst char *zDelt
37f0: 61 3b 0a 20 20 69 6e 74 20 73 7a 55 3b 0a 20 20 a;. int szU;.
3800: 69 6e 74 20 73 7a 43 3b 0a 20 20 69 6e 74 20 72 int szC;. int r
3810: 63 3b 0a 20 20 69 6e 74 20 69 73 50 72 69 76 61 c;. int isPriva
3820: 74 65 3b 0a 20 20 69 6e 74 20 73 72 63 49 73 50 te;. int srcIsP
3830: 72 69 76 61 74 65 3b 0a 20 20 73 74 61 74 69 63 rivate;. static
3840: 20 53 74 6d 74 20 71 31 3b 0a 20 20 42 6c 6f 62 Stmt q1;. Blob
3850: 20 66 75 6c 6c 43 6f 6e 74 65 6e 74 3b 0a 0a 20 fullContent;..
3860: 20 69 73 50 72 69 76 61 74 65 20 3d 20 63 6f 6e isPrivate = con
3870: 74 65 6e 74 5f 69 73 5f 70 72 69 76 61 74 65 28 tent_is_private(
3880: 72 69 64 29 3b 0a 20 20 69 66 28 20 69 73 50 72 rid);. if( isPr
3890: 69 76 61 74 65 20 26 26 20 70 58 66 65 72 2d 3e ivate && pXfer->
38a0: 73 79 6e 63 50 72 69 76 61 74 65 3d 3d 30 20 29 syncPrivate==0 )
38b0: 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 5f 73 74 return;. db_st
38c0: 61 74 69 63 5f 70 72 65 70 61 72 65 28 26 71 31 atic_prepare(&q1
38d0: 2c 0a 20 20 20 20 22 53 45 4c 45 43 54 20 75 75 ,. "SELECT uu
38e0: 69 64 2c 20 73 69 7a 65 2c 20 63 6f 6e 74 65 6e id, size, conten
38f0: 74 2c 20 64 65 6c 74 61 2e 73 72 63 69 64 20 49 t, delta.srcid I
3900: 4e 20 70 72 69 76 61 74 65 2c 22 0a 20 20 20 20 N private,".
3910: 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20 " (SELECT
3920: 75 75 69 64 20 46 52 4f 4d 20 62 6c 6f 62 20 57 uuid FROM blob W
3930: 48 45 52 45 20 72 69 64 3d 64 65 6c 74 61 2e 73 HERE rid=delta.s
3940: 72 63 69 64 29 22 0a 20 20 20 20 22 20 46 52 4f rcid)". " FRO
3950: 4d 20 62 6c 6f 62 20 4c 45 46 54 20 4a 4f 49 4e M blob LEFT JOIN
3960: 20 64 65 6c 74 61 20 4f 4e 20 28 62 6c 6f 62 2e delta ON (blob.
3970: 72 69 64 3d 64 65 6c 74 61 2e 72 69 64 29 22 0a rid=delta.rid)".
3980: 20 20 20 20 22 20 57 48 45 52 45 20 62 6c 6f 62 " WHERE blob
3990: 2e 72 69 64 3d 3a 72 69 64 22 0a 20 20 20 20 22 .rid=:rid". "
39a0: 20 20 20 41 4e 44 20 62 6c 6f 62 2e 73 69 7a 65 AND blob.size
39b0: 3e 3d 30 22 0a 20 20 20 20 22 20 20 20 41 4e 44 >=0". " AND
39c0: 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 NOT EXISTS(SELE
39d0: 43 54 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57 CT 1 FROM shun W
39e0: 48 45 52 45 20 73 68 75 6e 2e 75 75 69 64 3d 62 HERE shun.uuid=b
39f0: 6c 6f 62 2e 75 75 69 64 29 22 0a 20 20 29 3b 0a lob.uuid)". );.
3a00: 20 20 64 62 5f 62 69 6e 64 5f 69 6e 74 28 26 71 db_bind_int(&q
3a10: 31 2c 20 22 3a 72 69 64 22 2c 20 72 69 64 29 3b 1, ":rid", rid);
3a20: 0a 20 20 72 63 20 3d 20 64 62 5f 73 74 65 70 28 . rc = db_step(
3a30: 26 71 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d &q1);. if( rc==
3a40: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 SQLITE_ROW ){.
3a50: 20 20 7a 55 75 69 64 20 3d 20 64 62 5f 63 6f 6c zUuid = db_col
3a60: 75 6d 6e 5f 74 65 78 74 28 26 71 31 2c 20 30 29 umn_text(&q1, 0)
3a70: 3b 0a 20 20 20 20 73 7a 55 20 3d 20 64 62 5f 63 ;. szU = db_c
3a80: 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 31 2c 20 31 olumn_int(&q1, 1
3a90: 29 3b 0a 20 20 20 20 73 7a 43 20 3d 20 64 62 5f );. szC = db_
3aa0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 26 71 31 column_bytes(&q1
3ab0: 2c 20 32 29 3b 0a 20 20 20 20 7a 43 6f 6e 74 65 , 2);. zConte
3ac0: 6e 74 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 72 nt = db_column_r
3ad0: 61 77 28 26 71 31 2c 20 32 29 3b 0a 20 20 20 20 aw(&q1, 2);.
3ae0: 73 72 63 49 73 50 72 69 76 61 74 65 20 3d 20 64 srcIsPrivate = d
3af0: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 31 b_column_int(&q1
3b00: 2c 20 33 29 3b 0a 20 20 20 20 7a 44 65 6c 74 61 , 3);. zDelta
3b10: 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 = db_column_tex
3b20: 74 28 26 71 31 2c 20 34 29 3b 0a 20 20 20 20 69 t(&q1, 4);. i
3b30: 66 28 20 69 73 50 72 69 76 61 74 65 20 29 20 62 f( isPrivate ) b
3b40: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 58 66 65 72 lob_append(pXfer
3b50: 2d 3e 70 4f 75 74 2c 20 22 70 72 69 76 61 74 65 ->pOut, "private
3b60: 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 20 20 62 6c \n", -1);. bl
3b70: 6f 62 5f 61 70 70 65 6e 64 66 28 70 58 66 65 72 ob_appendf(pXfer
3b80: 2d 3e 70 4f 75 74 2c 20 22 63 66 69 6c 65 20 25 ->pOut, "cfile %
3b90: 73 20 22 2c 20 7a 55 75 69 64 29 3b 0a 20 20 20 s ", zUuid);.
3ba0: 20 69 66 28 20 21 69 73 50 72 69 76 61 74 65 20 if( !isPrivate
3bb0: 26 26 20 73 72 63 49 73 50 72 69 76 61 74 65 20 && srcIsPrivate
3bc0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 ){. content
3bd0: 5f 67 65 74 28 72 69 64 2c 20 26 66 75 6c 6c 43 _get(rid, &fullC
3be0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 73 ontent);. s
3bf0: 7a 55 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 26 zU = blob_size(&
3c00: 66 75 6c 6c 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 fullContent);.
3c10: 20 20 20 20 62 6c 6f 62 5f 63 6f 6d 70 72 65 73 blob_compres
3c20: 73 28 26 66 75 6c 6c 43 6f 6e 74 65 6e 74 2c 20 s(&fullContent,
3c30: 26 66 75 6c 6c 43 6f 6e 74 65 6e 74 29 3b 0a 20 &fullContent);.
3c40: 20 20 20 20 20 73 7a 43 20 3d 20 62 6c 6f 62 5f szC = blob_
3c50: 73 69 7a 65 28 26 66 75 6c 6c 43 6f 6e 74 65 6e size(&fullConten
3c60: 74 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6e 74 65 t);. zConte
3c70: 6e 74 20 3d 20 62 6c 6f 62 5f 62 75 66 66 65 72 nt = blob_buffer
3c80: 28 26 66 75 6c 6c 43 6f 6e 74 65 6e 74 29 3b 0a (&fullContent);.
3c90: 20 20 20 20 20 20 7a 44 65 6c 74 61 20 3d 20 30 zDelta = 0
3ca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
3cb0: 7a 44 65 6c 74 61 20 29 7b 0a 20 20 20 20 20 20 zDelta ){.
3cc0: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 58 66 blob_appendf(pXf
3cd0: 65 72 2d 3e 70 4f 75 74 2c 20 22 25 73 20 22 2c er->pOut, "%s ",
3ce0: 20 7a 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 zDelta);.
3cf0: 70 58 66 65 72 2d 3e 6e 44 65 6c 74 61 53 65 6e pXfer->nDeltaSen
3d00: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a t++;. }else{.
3d10: 20 20 20 20 20 20 70 58 66 65 72 2d 3e 6e 46 69 pXfer->nFi
3d20: 6c 65 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a leSent++;. }.
3d30: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
3d40: 28 70 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 25 (pXfer->pOut, "%
3d50: 64 20 25 64 5c 6e 22 2c 20 73 7a 55 2c 20 73 7a d %d\n", szU, sz
3d60: 43 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 C);. blob_app
3d70: 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75 74 2c end(pXfer->pOut,
3d80: 20 7a 43 6f 6e 74 65 6e 74 2c 20 73 7a 43 29 3b zContent, szC);
3d90: 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 62 75 . if( blob_bu
3da0: 66 66 65 72 28 70 58 66 65 72 2d 3e 70 4f 75 74 ffer(pXfer->pOut
3db0: 29 5b 62 6c 6f 62 5f 73 69 7a 65 28 70 58 66 65 )[blob_size(pXfe
3dc0: 72 2d 3e 70 4f 75 74 29 2d 31 5d 21 3d 27 5c 6e r->pOut)-1]!='\n
3dd0: 27 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f ' ){. blob_
3de0: 61 70 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 appendf(pXfer->p
3df0: 4f 75 74 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 Out, "\n", 1);.
3e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 }. if( !is
3e10: 50 72 69 76 61 74 65 20 26 26 20 73 72 63 49 73 Private && srcIs
3e20: 50 72 69 76 61 74 65 20 29 7b 0a 20 20 20 20 20 Private ){.
3e30: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 66 75 6c blob_reset(&ful
3e40: 6c 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 7d lContent);. }
3e50: 0a 20 20 7d 0a 20 20 64 62 5f 72 65 73 65 74 28 . }. db_reset(
3e60: 26 71 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 &q1);.}../*.** S
3e70: 65 6e 64 20 61 20 67 69 6d 6d 65 20 6d 65 73 73 end a gimme mess
3e80: 61 67 65 20 66 6f 72 20 65 76 65 72 79 20 70 68 age for every ph
3e90: 61 6e 74 6f 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 antom..**.** Exc
3ea0: 65 70 74 3a 20 64 6f 20 6e 6f 74 20 72 65 71 75 ept: do not requ
3eb0: 65 73 74 20 73 68 75 6e 6e 65 64 20 61 72 74 69 est shunned arti
3ec0: 66 61 63 74 73 2e 20 20 41 6e 64 20 64 6f 20 6e facts. And do n
3ed0: 6f 74 20 72 65 71 75 65 73 74 0a 2a 2a 20 70 72 ot request.** pr
3ee0: 69 76 61 74 65 20 61 72 74 69 66 61 63 74 73 20 ivate artifacts
3ef0: 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 64 6f if we are not do
3f00: 69 6e 67 20 61 20 70 72 69 76 61 74 65 20 74 72 ing a private tr
3f10: 61 6e 73 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 ansfer..*/.stati
3f20: 63 20 76 6f 69 64 20 72 65 71 75 65 73 74 5f 70 c void request_p
3f30: 68 61 6e 74 6f 6d 73 28 58 66 65 72 20 2a 70 58 hantoms(Xfer *pX
3f40: 66 65 72 2c 20 69 6e 74 20 6d 61 78 52 65 71 29 fer, int maxReq)
3f50: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 64 62 {. Stmt q;. db
3f60: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 _prepare(&q,.
3f70: 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 46 52 "SELECT uuid FR
3f80: 4f 4d 20 70 68 61 6e 74 6f 6d 20 4a 4f 49 4e 20 OM phantom JOIN
3f90: 62 6c 6f 62 20 55 53 49 4e 47 28 72 69 64 29 22 blob USING(rid)"
3fa0: 0a 20 20 20 20 22 20 57 48 45 52 45 20 4e 4f 54 . " WHERE NOT
3fb0: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 EXISTS(SELECT 1
3fc0: 20 46 52 4f 4d 20 73 68 75 6e 20 57 48 45 52 45 FROM shun WHERE
3fd0: 20 75 75 69 64 3d 62 6c 6f 62 2e 75 75 69 64 29 uuid=blob.uuid)
3fe0: 20 25 73 22 2c 0a 20 20 20 20 28 70 58 66 65 72 %s",. (pXfer
3ff0: 2d 3e 73 79 6e 63 50 72 69 76 61 74 65 20 3f 20 ->syncPrivate ?
4000: 22 22 20 3a 0a 20 20 20 20 20 20 20 20 20 22 20 "" :. "
4010: 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 AND NOT EXISTS
4020: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 (SELECT 1 FROM p
4030: 72 69 76 61 74 65 20 57 48 45 52 45 20 72 69 64 rivate WHERE rid
4040: 3d 62 6c 6f 62 2e 72 69 64 29 22 29 0a 20 20 29 =blob.rid)"). )
4050: 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 ;. while( db_st
4060: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 ep(&q)==SQLITE_R
4070: 4f 57 20 26 26 20 6d 61 78 52 65 71 2d 2d 20 3e OW && maxReq-- >
4080: 20 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 0 ){. const
4090: 63 68 61 72 20 2a 7a 55 75 69 64 20 3d 20 64 62 char *zUuid = db
40a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c _column_text(&q,
40b0: 20 30 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 0);. blob_ap
40c0: 70 65 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f 75 pendf(pXfer->pOu
40d0: 74 2c 20 22 67 69 6d 6d 65 20 25 73 5c 6e 22 2c t, "gimme %s\n",
40e0: 20 7a 55 75 69 64 29 3b 0a 20 20 20 20 70 58 66 zUuid);. pXf
40f0: 65 72 2d 3e 6e 47 69 6d 6d 65 53 65 6e 74 2b 2b er->nGimmeSent++
4100: 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 6e 61 6c ;. }. db_final
4110: 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a ize(&q);.}../*.*
4120: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 20 53 48 41 * Compute an SHA
4130: 31 20 68 61 73 68 20 6f 6e 20 74 68 65 20 74 61 1 hash on the ta
4140: 69 6c 20 6f 66 20 70 4d 73 67 2e 20 20 56 65 72 il of pMsg. Ver
4150: 69 66 79 20 74 68 61 74 20 69 74 20 6d 61 74 63 ify that it matc
4160: 68 65 73 20 74 68 65 0a 2a 2a 20 74 68 65 20 68 hes the.** the h
4170: 61 73 68 20 67 69 76 65 6e 20 69 6e 20 70 48 61 ash given in pHa
4180: 73 68 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d sh. Return non-
4190: 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f zero for an erro
41a0: 72 20 61 6e 64 20 30 20 6f 6e 20 73 75 63 63 65 r and 0 on succe
41b0: 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e ss..*/.static in
41c0: 74 20 63 68 65 63 6b 5f 74 61 69 6c 5f 68 61 73 t check_tail_has
41d0: 68 28 42 6c 6f 62 20 2a 70 48 61 73 68 2c 20 42 h(Blob *pHash, B
41e0: 6c 6f 62 20 2a 70 4d 73 67 29 7b 0a 20 20 42 6c lob *pMsg){. Bl
41f0: 6f 62 20 74 61 69 6c 3b 0a 20 20 42 6c 6f 62 20 ob tail;. Blob
4200: 68 32 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 h2;. int rc;.
4210: 62 6c 6f 62 5f 74 61 69 6c 28 70 4d 73 67 2c 20 blob_tail(pMsg,
4220: 26 74 61 69 6c 29 3b 0a 20 20 73 68 61 31 73 75 &tail);. sha1su
4230: 6d 5f 62 6c 6f 62 28 26 74 61 69 6c 2c 20 26 68 m_blob(&tail, &h
4240: 32 29 3b 0a 20 20 72 63 20 3d 20 62 6c 6f 62 5f 2);. rc = blob_
4250: 63 6f 6d 70 61 72 65 28 70 48 61 73 68 2c 20 26 compare(pHash, &
4260: 68 32 29 3b 0a 20 20 62 6c 6f 62 5f 72 65 73 65 h2);. blob_rese
4270: 74 28 26 68 32 29 3b 0a 20 20 62 6c 6f 62 5f 72 t(&h2);. blob_r
4280: 65 73 65 74 28 26 74 61 69 6c 29 3b 0a 20 20 72 eset(&tail);. r
4290: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
42a0: 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 73 69 67 ** Check the sig
42b0: 6e 61 74 75 72 65 20 6f 6e 20 61 6e 20 61 70 70 nature on an app
42c0: 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 lication/x-fossi
42d0: 6c 20 70 61 79 6c 6f 61 64 20 72 65 63 65 69 76 l payload receiv
42e0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 48 54 54 ed by.** the HTT
42f0: 50 20 73 65 72 76 65 72 2e 20 20 54 68 65 20 73 P server. The s
4300: 69 67 6e 61 74 75 72 65 20 69 73 20 61 20 6c 69 ignature is a li
4310: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ne of the follow
4320: 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 ing form:.**.**
4330: 20 20 20 20 20 20 20 6c 6f 67 69 6e 20 4c 4f 47 login LOG
4340: 49 4e 20 4e 4f 4e 43 45 20 53 49 47 4e 41 54 55 IN NONCE SIGNATU
4350: 52 45 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4e 4f 4e RE.**.** The NON
4360: 43 45 20 69 73 20 74 68 65 20 53 48 41 31 20 68 CE is the SHA1 h
4370: 61 73 68 20 6f 66 20 74 68 65 20 72 65 6d 61 69 ash of the remai
4380: 6e 64 65 72 20 6f 66 20 74 68 65 20 69 6e 70 75 nder of the inpu
4390: 74 2e 0a 2a 2a 20 53 49 47 4e 41 54 55 52 45 20 t..** SIGNATURE
43a0: 69 73 20 74 68 65 20 53 48 41 31 20 63 68 65 63 is the SHA1 chec
43b0: 6b 73 75 6d 20 6f 66 20 74 68 65 20 4e 4f 4e 43 ksum of the NONC
43c0: 45 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 0a 2a E concatenated.*
43d0: 2a 20 77 69 74 68 20 74 68 65 20 75 73 65 72 73 * with the users
43e0: 20 70 61 73 73 77 6f 72 64 2e 0a 2a 2a 0a 2a 2a password..**.**
43f0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 The parameters
4400: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 to this routine
4410: 61 72 65 20 65 70 68 65 6d 65 72 61 6c 20 62 6c are ephemeral bl
4420: 6f 62 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a obs holding the.
4430: 2a 2a 20 4c 4f 47 49 4e 2c 20 4e 4f 4e 43 45 20 ** LOGIN, NONCE
4440: 61 6e 64 20 53 49 47 4e 41 54 55 52 45 2e 0a 2a and SIGNATURE..*
4450: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
4460: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6c 6f e attempts to lo
4470: 63 61 74 65 20 74 68 65 20 75 73 65 72 20 61 6e cate the user an
4480: 64 20 76 65 72 69 66 79 20 74 68 65 20 73 69 67 d verify the sig
4490: 6e 61 74 75 72 65 2e 0a 2a 2a 20 49 66 20 65 76 nature..** If ev
44a0: 65 72 79 74 68 69 6e 67 20 63 68 65 63 6b 73 20 erything checks
44b0: 6f 75 74 2c 20 74 68 65 20 55 53 45 52 2e 43 41 out, the USER.CA
44c0: 50 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 74 68 65 P column for the
44d0: 20 55 53 45 52 20 74 61 62 6c 65 0a 2a 2a 20 69 USER table.** i
44e0: 73 20 63 6f 6e 73 75 6c 74 65 64 20 74 6f 20 73 s consulted to s
44f0: 65 74 20 70 72 69 76 69 6c 65 67 65 73 20 69 6e et privileges in
4500: 20 74 68 65 20 67 6c 6f 62 61 6c 20 67 20 76 61 the global g va
4510: 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 riable..**.** If
4520: 20 61 6e 79 74 68 69 6e 67 20 66 61 69 6c 73 20 anything fails
4530: 74 6f 20 63 68 65 63 6b 20 6f 75 74 2c 20 6e 6f to check out, no
4540: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 changes are mad
4550: 65 20 74 6f 20 70 72 69 76 69 6c 65 67 65 73 2e e to privileges.
4560: 0a 2a 2a 0a 2a 2a 20 53 69 67 6e 61 74 75 72 65 .**.** Signature
4570: 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 6e 20 74 generation on t
4580: 68 65 20 63 6c 69 65 6e 74 20 73 69 64 65 20 69 he client side i
4590: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 s handled by the
45a0: 0a 2a 2a 20 68 74 74 70 5f 65 78 63 68 61 6e 67 .** http_exchang
45b0: 65 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a e() routine..**.
45c0: 2a 2a 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 ** Return non-ze
45d0: 72 6f 20 66 6f 72 20 61 20 6c 6f 67 69 6e 20 66 ro for a login f
45e0: 61 69 6c 75 72 65 20 61 6e 64 20 7a 65 72 6f 20 ailure and zero
45f0: 66 6f 72 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a for success..*/.
4600: 69 6e 74 20 63 68 65 63 6b 5f 6c 6f 67 69 6e 28 int check_login(
4610: 42 6c 6f 62 20 2a 70 4c 6f 67 69 6e 2c 20 42 6c Blob *pLogin, Bl
4620: 6f 62 20 2a 70 4e 6f 6e 63 65 2c 20 42 6c 6f 62 ob *pNonce, Blob
4630: 20 2a 70 53 69 67 29 7b 0a 20 20 53 74 6d 74 20 *pSig){. Stmt
4640: 71 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 q;. int rc = -1
4650: 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 69 6e ;. char *zLogin
4660: 20 3d 20 62 6c 6f 62 5f 74 65 72 6d 69 6e 61 74 = blob_terminat
4670: 65 28 70 4c 6f 67 69 6e 29 3b 0a 20 20 64 65 66 e(pLogin);. def
4680: 6f 73 73 69 6c 69 7a 65 28 7a 4c 6f 67 69 6e 29 ossilize(zLogin)
4690: 3b 0a 0a 20 20 69 66 28 20 66 6f 73 73 69 6c 5f ;.. if( fossil_
46a0: 73 74 72 63 6d 70 28 7a 4c 6f 67 69 6e 2c 20 22 strcmp(zLogin, "
46b0: 6e 6f 62 6f 64 79 22 29 3d 3d 30 20 7c 7c 20 66 nobody")==0 || f
46c0: 6f 73 73 69 6c 5f 73 74 72 63 6d 70 28 7a 4c 6f ossil_strcmp(zLo
46d0: 67 69 6e 2c 22 61 6e 6f 6e 79 6d 6f 75 73 22 29 gin,"anonymous")
46e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
46f0: 6e 20 30 3b 20 20 20 2f 2a 20 41 6e 79 62 6f 64 n 0; /* Anybod
4700: 79 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 y is allowed to
4710: 73 79 6e 63 20 61 73 20 22 6e 6f 62 6f 64 79 22 sync as "nobody"
4720: 20 6f 72 20 22 61 6e 6f 6e 79 6d 6f 75 73 22 20 or "anonymous"
4730: 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 66 6f 73 */. }. if( fos
4740: 73 69 6c 5f 73 74 72 63 6d 70 28 50 28 22 52 45 sil_strcmp(P("RE
4750: 4d 4f 54 45 5f 55 53 45 52 22 29 2c 20 7a 4c 6f MOTE_USER"), zLo
4760: 67 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 gin)==0. &&
4770: 20 64 62 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 db_get_boolean(
4780: 22 72 65 6d 6f 74 65 5f 75 73 65 72 5f 6f 6b 22 "remote_user_ok"
4790: 2c 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ,0) ){. retur
47a0: 6e 20 30 3b 20 20 20 2f 2a 20 41 63 63 65 70 74 n 0; /* Accept
47b0: 20 42 61 73 69 63 20 41 75 74 68 6f 72 69 7a 61 Basic Authoriza
47c0: 74 69 6f 6e 20 2a 2f 0a 20 20 7d 0a 20 20 64 62 tion */. }. db
47d0: 5f 70 72 65 70 61 72 65 28 26 71 2c 0a 20 20 20 _prepare(&q,.
47e0: 20 20 22 53 45 4c 45 43 54 20 70 77 2c 20 63 61 "SELECT pw, ca
47f0: 70 2c 20 75 69 64 20 46 52 4f 4d 20 75 73 65 72 p, uid FROM user
4800: 22 0a 20 20 20 20 20 22 20 57 48 45 52 45 20 6c ". " WHERE l
4810: 6f 67 69 6e 3d 25 51 22 0a 20 20 20 20 20 22 20 ogin=%Q". "
4820: 20 20 41 4e 44 20 6c 6f 67 69 6e 20 4e 4f 54 20 AND login NOT
4830: 49 4e 20 28 27 61 6e 6f 6e 79 6d 6f 75 73 27 2c IN ('anonymous',
4840: 27 6e 6f 62 6f 64 79 27 2c 27 64 65 76 65 6c 6f 'nobody','develo
4850: 70 65 72 27 2c 27 72 65 61 64 65 72 27 29 22 0a per','reader')".
4860: 20 20 20 20 20 22 20 20 20 41 4e 44 20 6c 65 6e " AND len
4870: 67 74 68 28 70 77 29 3e 30 22 2c 0a 20 20 20 20 gth(pw)>0",.
4880: 20 7a 4c 6f 67 69 6e 0a 20 20 29 3b 0a 20 20 69 zLogin. );. i
4890: 66 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d f( db_step(&q)==
48a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 SQLITE_ROW ){.
48b0: 20 20 69 6e 74 20 73 7a 50 77 3b 0a 20 20 20 20 int szPw;.
48c0: 42 6c 6f 62 20 70 77 2c 20 63 6f 6d 62 69 6e 65 Blob pw, combine
48d0: 64 2c 20 68 61 73 68 3b 0a 20 20 20 20 62 6c 6f d, hash;. blo
48e0: 62 5f 7a 65 72 6f 28 26 70 77 29 3b 0a 20 20 20 b_zero(&pw);.
48f0: 20 64 62 5f 65 70 68 65 6d 65 72 61 6c 5f 62 6c db_ephemeral_bl
4900: 6f 62 28 26 71 2c 20 30 2c 20 26 70 77 29 3b 0a ob(&q, 0, &pw);.
4910: 20 20 20 20 73 7a 50 77 20 3d 20 62 6c 6f 62 5f szPw = blob_
4920: 73 69 7a 65 28 26 70 77 29 3b 0a 20 20 20 20 62 size(&pw);. b
4930: 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6d 62 69 6e lob_zero(&combin
4940: 65 64 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 63 6f ed);. blob_co
4950: 70 79 28 26 63 6f 6d 62 69 6e 65 64 2c 20 70 4e py(&combined, pN
4960: 6f 6e 63 65 29 3b 0a 20 20 20 20 62 6c 6f 62 5f once);. blob_
4970: 61 70 70 65 6e 64 28 26 63 6f 6d 62 69 6e 65 64 append(&combined
4980: 2c 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 70 , blob_buffer(&p
4990: 77 29 2c 20 73 7a 50 77 29 3b 0a 20 20 20 20 73 w), szPw);. s
49a0: 68 61 31 73 75 6d 5f 62 6c 6f 62 28 26 63 6f 6d ha1sum_blob(&com
49b0: 62 69 6e 65 64 2c 20 26 68 61 73 68 29 3b 0a 20 bined, &hash);.
49c0: 20 20 20 61 73 73 65 72 74 28 20 62 6c 6f 62 5f assert( blob_
49d0: 73 69 7a 65 28 26 68 61 73 68 29 3d 3d 34 30 20 size(&hash)==40
49e0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 6c 6f 62 );. rc = blob
49f0: 5f 63 6f 6e 73 74 61 6e 74 5f 74 69 6d 65 5f 63 _constant_time_c
4a00: 6d 70 28 26 68 61 73 68 2c 20 70 53 69 67 29 3b mp(&hash, pSig);
4a10: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 . blob_reset(
4a20: 26 68 61 73 68 29 3b 0a 20 20 20 20 62 6c 6f 62 &hash);. blob
4a30: 5f 72 65 73 65 74 28 26 63 6f 6d 62 69 6e 65 64 _reset(&combined
4a40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 );. if( rc!=0
4a50: 20 26 26 20 73 7a 50 77 21 3d 34 30 20 29 7b 0a && szPw!=40 ){.
4a60: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 /* If this
4a70: 20 73 65 72 76 65 72 20 73 74 6f 72 65 73 20 63 server stores c
4a80: 6c 65 61 72 74 65 78 74 20 70 61 73 73 77 6f 72 leartext passwor
4a90: 64 73 20 61 6e 64 20 74 68 65 20 70 61 73 73 77 ds and the passw
4aa0: 6f 72 64 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 ord did not.
4ab0: 20 20 2a 2a 20 6d 61 74 63 68 2c 20 74 68 65 6e ** match, then
4ac0: 20 70 65 72 68 61 70 73 20 74 68 65 20 63 6c 69 perhaps the cli
4ad0: 65 6e 74 20 69 73 20 73 65 6e 64 69 6e 67 20 53 ent is sending S
4ae0: 48 41 31 20 70 61 73 73 77 6f 72 64 73 2e 20 20 HA1 passwords.
4af0: 54 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 Try. ** aga
4b00: 69 6e 20 77 69 74 68 20 74 68 65 20 53 48 41 31 in with the SHA1
4b10: 20 70 61 73 73 77 6f 72 64 2e 0a 20 20 20 20 20 password..
4b20: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 */. const
4b30: 63 68 61 72 20 2a 7a 50 77 20 3d 20 64 62 5f 63 char *zPw = db_c
4b40: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 30 olumn_text(&q, 0
4b50: 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a );. char *z
4b60: 53 65 63 72 65 74 20 3d 20 73 68 61 31 5f 73 68 Secret = sha1_sh
4b70: 61 72 65 64 5f 73 65 63 72 65 74 28 7a 50 77 2c ared_secret(zPw,
4b80: 20 62 6c 6f 62 5f 73 74 72 28 70 4c 6f 67 69 6e blob_str(pLogin
4b90: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 6c 6f ), 0);. blo
4ba0: 62 5f 7a 65 72 6f 28 26 63 6f 6d 62 69 6e 65 64 b_zero(&combined
4bb0: 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 63 6f );. blob_co
4bc0: 70 79 28 26 63 6f 6d 62 69 6e 65 64 2c 20 70 4e py(&combined, pN
4bd0: 6f 6e 63 65 29 3b 0a 20 20 20 20 20 20 62 6c 6f once);. blo
4be0: 62 5f 61 70 70 65 6e 64 28 26 63 6f 6d 62 69 6e b_append(&combin
4bf0: 65 64 2c 20 7a 53 65 63 72 65 74 2c 20 2d 31 29 ed, zSecret, -1)
4c00: 3b 0a 20 20 20 20 20 20 66 72 65 65 28 7a 53 65 ;. free(zSe
4c10: 63 72 65 74 29 3b 0a 20 20 20 20 20 20 73 68 61 cret);. sha
4c20: 31 73 75 6d 5f 62 6c 6f 62 28 26 63 6f 6d 62 69 1sum_blob(&combi
4c30: 6e 65 64 2c 20 26 68 61 73 68 29 3b 0a 20 20 20 ned, &hash);.
4c40: 20 20 20 72 63 20 3d 20 62 6c 6f 62 5f 63 6f 6e rc = blob_con
4c50: 73 74 61 6e 74 5f 74 69 6d 65 5f 63 6d 70 28 26 stant_time_cmp(&
4c60: 68 61 73 68 2c 20 70 53 69 67 29 3b 0a 20 20 20 hash, pSig);.
4c70: 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 68 blob_reset(&h
4c80: 61 73 68 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 ash);. blob
4c90: 5f 72 65 73 65 74 28 26 63 6f 6d 62 69 6e 65 64 _reset(&combined
4ca0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
4cb0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 rc==0 ){.
4cc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 const char *zCap
4cd0: 3b 0a 20 20 20 20 20 20 7a 43 61 70 20 3d 20 64 ;. zCap = d
4ce0: 62 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 b_column_text(&q
4cf0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 6c 6f 67 69 , 1);. logi
4d00: 6e 5f 73 65 74 5f 63 61 70 61 62 69 6c 69 74 69 n_set_capabiliti
4d10: 65 73 28 7a 43 61 70 2c 20 30 29 3b 0a 20 20 20 es(zCap, 0);.
4d20: 20 20 20 67 2e 75 73 65 72 55 69 64 20 3d 20 64 g.userUid = d
4d30: 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c b_column_int(&q,
4d40: 20 32 29 3b 0a 20 20 20 20 20 20 67 2e 7a 4c 6f 2);. g.zLo
4d50: 67 69 6e 20 3d 20 6d 70 72 69 6e 74 66 28 22 25 gin = mprintf("%
4d60: 62 22 2c 20 70 4c 6f 67 69 6e 29 3b 0a 20 20 20 b", pLogin);.
4d70: 20 20 20 67 2e 7a 4e 6f 6e 63 65 20 3d 20 6d 70 g.zNonce = mp
4d80: 72 69 6e 74 66 28 22 25 62 22 2c 20 70 4e 6f 6e rintf("%b", pNon
4d90: 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 ce);. }. }.
4da0: 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 db_finalize(&q)
4db0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ;. return rc;.}
4dc0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 6e 64 20 74 68 65 ../*.** Send the
4dd0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 content of all
4de0: 66 69 6c 65 73 20 69 6e 20 74 68 65 20 75 6e 73 files in the uns
4df0: 65 6e 74 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a ent table..**.**
4e00: 20 54 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 This is really
4e10: 6a 75 73 74 20 61 6e 20 6f 70 74 69 6d 69 7a 61 just an optimiza
4e20: 74 69 6f 6e 2e 20 20 49 66 20 79 6f 75 20 63 6c tion. If you cl
4e30: 65 61 72 20 74 68 65 0a 2a 2a 20 75 6e 73 65 6e ear the.** unsen
4e40: 74 20 74 61 62 6c 65 2c 20 61 6c 6c 20 74 68 65 t table, all the
4e50: 20 72 69 67 68 74 20 66 69 6c 65 73 20 77 69 6c right files wil
4e60: 6c 20 73 74 69 6c 6c 20 67 65 74 20 74 72 61 6e l still get tran
4e70: 73 66 65 72 72 65 64 2e 0a 2a 2a 20 49 74 20 6a sferred..** It j
4e80: 75 73 74 20 6d 69 67 68 74 20 72 65 71 75 69 72 ust might requir
4e90: 65 20 61 6e 20 65 78 74 72 61 20 72 6f 75 6e 64 e an extra round
4ea0: 20 74 72 69 70 20 6f 72 20 74 77 6f 2e 0a 2a 2f trip or two..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6e .static void sen
4ec0: 64 5f 75 6e 73 65 6e 74 28 58 66 65 72 20 2a 70 d_unsent(Xfer *p
4ed0: 58 66 65 72 29 7b 0a 20 20 53 74 6d 74 20 71 3b Xfer){. Stmt q;
4ee0: 0a 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 71 . db_prepare(&q
4ef0: 2c 20 22 53 45 4c 45 43 54 20 72 69 64 20 46 52 , "SELECT rid FR
4f00: 4f 4d 20 75 6e 73 65 6e 74 20 45 58 43 45 50 54 OM unsent EXCEPT
4f10: 20 53 45 4c 45 43 54 20 72 69 64 20 46 52 4f 4d SELECT rid FROM
4f20: 20 70 72 69 76 61 74 65 22 29 3b 0a 20 20 77 68 private");. wh
4f30: 69 6c 65 28 20 64 62 5f 73 74 65 70 28 26 71 29 ile( db_step(&q)
4f40: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a ==SQLITE_ROW ){.
4f50: 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 64 62 int rid = db
4f60: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 2c 20 _column_int(&q,
4f70: 30 29 3b 0a 20 20 20 20 73 65 6e 64 5f 66 69 6c 0);. send_fil
4f80: 65 28 70 58 66 65 72 2c 20 72 69 64 2c 20 30 2c e(pXfer, rid, 0,
4f90: 20 30 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 69 0);. }. db_fi
4fa0: 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 64 62 nalize(&q);. db
4fb0: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 22 44 45 4c _multi_exec("DEL
4fc0: 45 54 45 20 46 52 4f 4d 20 75 6e 73 65 6e 74 22 ETE FROM unsent"
4fd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 );.}../*.** Chec
4fe0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 k to see if the
4ff0: 6e 75 6d 62 65 72 20 6f 66 20 75 6e 63 6c 75 73 number of unclus
5000: 74 65 72 65 64 20 65 6e 74 72 69 65 73 20 69 73 tered entries is
5010: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a greater than.**
5020: 20 31 30 30 20 61 6e 64 20 69 66 20 69 74 20 69 100 and if it i
5030: 73 2c 20 66 6f 72 6d 20 61 20 6e 65 77 20 63 6c s, form a new cl
5040: 75 73 74 65 72 2e 20 20 55 6e 63 6c 75 73 74 65 uster. Uncluste
5050: 72 65 64 20 70 68 61 6e 74 6f 6d 73 20 64 6f 20 red phantoms do
5060: 6e 6f 74 0a 2a 2a 20 63 6f 75 6e 74 20 74 6f 77 not.** count tow
5070: 61 72 64 20 74 68 65 20 31 30 30 20 74 6f 74 61 ard the 100 tota
5080: 6c 2e 20 20 41 6e 64 20 70 68 61 6e 74 6f 6d 73 l. And phantoms
5090: 20 61 72 65 20 6e 65 76 65 72 20 61 64 64 65 64 are never added
50a0: 20 74 6f 20 61 20 6e 65 77 0a 2a 2a 20 63 6c 75 to a new.** clu
50b0: 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 63 72 ster..*/.void cr
50c0: 65 61 74 65 5f 63 6c 75 73 74 65 72 28 76 6f 69 eate_cluster(voi
50d0: 64 29 7b 0a 20 20 42 6c 6f 62 20 63 6c 75 73 74 d){. Blob clust
50e0: 65 72 2c 20 63 6b 73 75 6d 3b 0a 20 20 42 6c 6f er, cksum;. Blo
50f0: 62 20 64 65 6c 65 74 65 57 68 65 72 65 3b 0a 20 b deleteWhere;.
5100: 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e 74 20 6e Stmt q;. int n
5110: 55 6e 63 6c 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 Uncl;. int nRow
5120: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 69 64 3b = 0;. int rid;
5130: 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 57 65 20 ..#if 0. /* We
5140: 73 68 6f 75 6c 64 20 6e 6f 74 20 65 76 65 72 20 should not ever
5150: 67 65 74 20 61 6e 79 20 70 72 69 76 61 74 65 20 get any private
5160: 61 72 74 69 66 61 63 74 73 20 69 6e 20 74 68 65 artifacts in the
5170: 20 75 6e 63 6c 75 73 74 65 72 65 64 20 74 61 62 unclustered tab
5180: 6c 65 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 le.. ** But if
5190: 77 65 20 64 6f 20 28 62 65 63 61 75 73 65 20 6f we do (because o
51a0: 66 20 61 20 62 75 67 29 20 6e 6f 77 20 69 73 20 f a bug) now is
51b0: 61 20 67 6f 6f 64 20 74 69 6d 65 20 74 6f 20 64 a good time to d
51c0: 65 6c 65 74 65 20 74 68 65 6d 2e 20 2a 2f 0a 20 elete them. */.
51d0: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a db_multi_exec(.
51e0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d "DELETE FROM
51f0: 20 75 6e 63 6c 75 73 74 65 72 65 64 20 57 48 45 unclustered WHE
5200: 52 45 20 72 69 64 20 49 4e 20 28 53 45 4c 45 43 RE rid IN (SELEC
5210: 54 20 72 69 64 20 46 52 4f 4d 20 70 72 69 76 61 T rid FROM priva
5220: 74 65 29 22 0a 20 20 29 3b 0a 23 65 6e 64 69 66 te)". );.#endif
5230: 0a 0a 20 20 6e 55 6e 63 6c 20 3d 20 64 62 5f 69 .. nUncl = db_i
5240: 6e 74 28 30 2c 20 22 53 45 4c 45 43 54 20 63 6f nt(0, "SELECT co
5250: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 75 6e 63 6c unt(*) FROM uncl
5260: 75 73 74 65 72 65 64 20 2f 2a 73 63 61 6e 2a 2f ustered /*scan*/
5270: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ".
5280: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 4e 4f " WHERE NO
5290: 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 T EXISTS(SELECT
52a0: 31 20 46 52 4f 4d 20 70 68 61 6e 74 6f 6d 22 0a 1 FROM phantom".
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
52d0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 72 69 " WHERE ri
52e0: 64 3d 75 6e 63 6c 75 73 74 65 72 65 64 2e 72 69 d=unclustered.ri
52f0: 64 29 22 29 3b 0a 20 20 69 66 28 20 6e 55 6e 63 d)");. if( nUnc
5300: 6c 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 62 6c l>=100 ){. bl
5310: 6f 62 5f 7a 65 72 6f 28 26 63 6c 75 73 74 65 72 ob_zero(&cluster
5320: 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f );. blob_zero
5330: 28 26 64 65 6c 65 74 65 57 68 65 72 65 29 3b 0a (&deleteWhere);.
5340: 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 28 26 db_prepare(&
5350: 71 2c 20 22 53 45 4c 45 43 54 20 75 75 69 64 20 q, "SELECT uuid
5360: 46 52 4f 4d 20 75 6e 63 6c 75 73 74 65 72 65 64 FROM unclustered
5370: 2c 20 62 6c 6f 62 22 0a 20 20 20 20 20 20 20 20 , blob".
5380: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 " WHE
5390: 52 45 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 RE NOT EXISTS(SE
53a0: 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 68 61 6e LECT 1 FROM phan
53b0: 74 6f 6d 22 0a 20 20 20 20 20 20 20 20 20 20 20 tom".
53c0: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20 "
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 WHER
53e0: 45 20 72 69 64 3d 75 6e 63 6c 75 73 74 65 72 65 E rid=unclustere
53f0: 64 2e 72 69 64 29 22 0a 20 20 20 20 20 20 20 20 d.rid)".
5400: 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20 41 " A
5410: 4e 44 20 75 6e 63 6c 75 73 74 65 72 65 64 2e 72 ND unclustered.r
5420: 69 64 3d 62 6c 6f 62 2e 72 69 64 22 0a 20 20 20 id=blob.rid".
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5440: 22 20 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 " AND NOT EXIS
5450: 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d TS(SELECT 1 FROM
5460: 20 73 68 75 6e 20 57 48 45 52 45 20 75 75 69 64 shun WHERE uuid
5470: 3d 62 6c 6f 62 2e 75 75 69 64 29 22 0a 20 20 20 =blob.uuid)".
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5490: 22 20 4f 52 44 45 52 20 42 59 20 31 22 29 3b 0a " ORDER BY 1");.
54a0: 20 20 20 20 77 68 69 6c 65 28 20 64 62 5f 73 74 while( db_st
54b0: 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 ep(&q)==SQLITE_R
54c0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 OW ){. blob
54d0: 5f 61 70 70 65 6e 64 66 28 26 63 6c 75 73 74 65 _appendf(&cluste
54e0: 72 2c 20 22 4d 20 25 73 5c 6e 22 2c 20 64 62 5f r, "M %s\n", db_
54f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 column_text(&q,
5500: 30 29 29 3b 0a 20 20 20 20 20 20 6e 52 6f 77 2b 0));. nRow+
5510: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 6f +;. if( nRo
5520: 77 3e 3d 38 30 30 20 26 26 20 6e 55 6e 63 6c 3e w>=800 && nUncl>
5530: 6e 52 6f 77 2b 31 30 30 20 29 7b 0a 20 20 20 20 nRow+100 ){.
5540: 20 20 20 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 md5sum_blob(
5550: 26 63 6c 75 73 74 65 72 2c 20 26 63 6b 73 75 6d &cluster, &cksum
5560: 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f );. blob_
5570: 61 70 70 65 6e 64 66 28 26 63 6c 75 73 74 65 72 appendf(&cluster
5580: 2c 20 22 5a 20 25 62 5c 6e 22 2c 20 26 63 6b 73 , "Z %b\n", &cks
5590: 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 62 6c 6f um);. blo
55a0: 62 5f 72 65 73 65 74 28 26 63 6b 73 75 6d 29 3b b_reset(&cksum);
55b0: 0a 20 20 20 20 20 20 20 20 72 69 64 20 3d 20 63 . rid = c
55c0: 6f 6e 74 65 6e 74 5f 70 75 74 28 26 63 6c 75 73 ontent_put(&clus
55d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 62 6c ter);. bl
55e0: 6f 62 5f 72 65 73 65 74 28 26 63 6c 75 73 74 65 ob_reset(&cluste
55f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 55 6e 63 r);. nUnc
5600: 6c 20 2d 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20 l -= nRow;.
5610: 20 20 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 nRow = 0;.
5620: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
5630: 66 28 26 64 65 6c 65 74 65 57 68 65 72 65 2c 20 f(&deleteWhere,
5640: 22 2c 25 64 22 2c 20 72 69 64 29 3b 0a 20 20 20 ",%d", rid);.
5650: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 }. }. d
5660: 62 5f 66 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a b_finalize(&q);.
5670: 20 20 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 db_multi_exe
5680: 63 28 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 c(. "DELETE
5690: 20 46 52 4f 4d 20 75 6e 63 6c 75 73 74 65 72 65 FROM unclustere
56a0: 64 20 57 48 45 52 45 20 72 69 64 20 4e 4f 54 20 d WHERE rid NOT
56b0: 49 4e 20 28 30 20 25 73 29 22 0a 20 20 20 20 20 IN (0 %s)".
56c0: 20 22 20 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 " AND NOT EXI
56d0: 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f STS(SELECT 1 FRO
56e0: 4d 20 70 68 61 6e 74 6f 6d 20 57 48 45 52 45 20 M phantom WHERE
56f0: 72 69 64 3d 75 6e 63 6c 75 73 74 65 72 65 64 2e rid=unclustered.
5700: 72 69 64 29 22 2c 0a 20 20 20 20 20 20 62 6c 6f rid)",. blo
5710: 62 5f 73 74 72 28 26 64 65 6c 65 74 65 57 68 65 b_str(&deleteWhe
5720: 72 65 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 62 re). );. b
5730: 6c 6f 62 5f 72 65 73 65 74 28 26 64 65 6c 65 74 lob_reset(&delet
5740: 65 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28 eWhere);. if(
5750: 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 nRow>0 ){.
5760: 20 6d 64 35 73 75 6d 5f 62 6c 6f 62 28 26 63 6c md5sum_blob(&cl
5770: 75 73 74 65 72 2c 20 26 63 6b 73 75 6d 29 3b 0a uster, &cksum);.
5780: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
5790: 64 66 28 26 63 6c 75 73 74 65 72 2c 20 22 5a 20 df(&cluster, "Z
57a0: 25 62 5c 6e 22 2c 20 26 63 6b 73 75 6d 29 3b 0a %b\n", &cksum);.
57b0: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 blob_reset
57c0: 28 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 (&cksum);.
57d0: 63 6f 6e 74 65 6e 74 5f 70 75 74 28 26 63 6c 75 content_put(&clu
57e0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 62 6c 6f ster);. blo
57f0: 62 5f 72 65 73 65 74 28 26 63 6c 75 73 74 65 72 b_reset(&cluster
5800: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a );. }. }.}..
5810: 2f 2a 0a 2a 2a 20 53 65 6e 64 20 69 67 6f 74 20 /*.** Send igot
5820: 6d 65 73 73 61 67 65 73 20 66 6f 72 20 65 76 65 messages for eve
5830: 72 79 20 70 72 69 76 61 74 65 20 61 72 74 69 66 ry private artif
5840: 61 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e act.*/.static in
5850: 74 20 73 65 6e 64 5f 70 72 69 76 61 74 65 28 58 t send_private(X
5860: 66 65 72 20 2a 70 58 66 65 72 29 7b 0a 20 20 69 fer *pXfer){. i
5870: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 53 74 nt cnt = 0;. St
5880: 6d 74 20 71 3b 0a 20 20 69 66 28 20 70 58 66 65 mt q;. if( pXfe
5890: 72 2d 3e 73 79 6e 63 50 72 69 76 61 74 65 20 29 r->syncPrivate )
58a0: 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 {. db_prepare
58b0: 28 26 71 2c 20 22 53 45 4c 45 43 54 20 75 75 69 (&q, "SELECT uui
58c0: 64 20 46 52 4f 4d 20 70 72 69 76 61 74 65 20 4a d FROM private J
58d0: 4f 49 4e 20 62 6c 6f 62 20 55 53 49 4e 47 28 72 OIN blob USING(r
58e0: 69 64 29 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 id)");. while
58f0: 28 20 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 ( db_step(&q)==S
5900: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 QLITE_ROW ){.
5910: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
5920: 70 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 69 67 pXfer->pOut, "ig
5930: 6f 74 20 25 73 20 31 5c 6e 22 2c 20 64 62 5f 63 ot %s 1\n", db_c
5940: 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c 30 29 olumn_text(&q,0)
5950: 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a );. cnt++;.
5960: 20 20 20 20 7d 0a 20 20 20 20 64 62 5f 66 69 6e }. db_fin
5970: 61 6c 69 7a 65 28 26 71 29 3b 0a 20 20 7d 0a 20 alize(&q);. }.
5980: 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a return cnt;.}..
5990: 2f 2a 0a 2a 2a 20 53 65 6e 64 20 61 6e 20 69 67 /*.** Send an ig
59a0: 6f 74 20 6d 65 73 73 61 67 65 20 66 6f 72 20 65 ot message for e
59b0: 76 65 72 79 20 65 6e 74 72 79 20 69 6e 20 75 6e very entry in un
59c0: 63 6c 75 73 74 65 72 65 64 20 74 61 62 6c 65 2e clustered table.
59d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
59e0: 75 6d 62 65 72 20 6f 66 20 63 61 72 64 73 20 73 umber of cards s
59f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ent..*/.static i
5a00: 6e 74 20 73 65 6e 64 5f 75 6e 63 6c 75 73 74 65 nt send_uncluste
5a10: 72 65 64 28 58 66 65 72 20 2a 70 58 66 65 72 29 red(Xfer *pXfer)
5a20: 7b 0a 20 20 53 74 6d 74 20 71 3b 0a 20 20 69 6e {. Stmt q;. in
5a30: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 t cnt = 0;. if(
5a40: 20 70 58 66 65 72 2d 3e 72 65 73 79 6e 63 20 29 pXfer->resync )
5a50: 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 72 65 {. db_prepare
5a60: 28 26 71 2c 0a 20 20 20 20 20 20 22 53 45 4c 45 (&q,. "SELE
5a70: 43 54 20 75 75 69 64 2c 20 72 69 64 20 46 52 4f CT uuid, rid FRO
5a80: 4d 20 62 6c 6f 62 22 0a 20 20 20 20 20 20 22 20 M blob". "
5a90: 57 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 WHERE NOT EXISTS
5aa0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 73 (SELECT 1 FROM s
5ab0: 68 75 6e 20 57 48 45 52 45 20 75 75 69 64 3d 62 hun WHERE uuid=b
5ac0: 6c 6f 62 2e 75 75 69 64 29 22 0a 20 20 20 20 20 lob.uuid)".
5ad0: 20 22 20 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 " AND NOT EXI
5ae0: 53 54 53 28 53 45 4c 45 43 54 20 31 20 46 52 4f STS(SELECT 1 FRO
5af0: 4d 20 70 68 61 6e 74 6f 6d 20 57 48 45 52 45 20 M phantom WHERE
5b00: 72 69 64 3d 62 6c 6f 62 2e 72 69 64 29 22 0a 20 rid=blob.rid)".
5b10: 20 20 20 20 20 22 20 20 20 41 4e 44 20 4e 4f 54 " AND NOT
5b20: 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 20 31 EXISTS(SELECT 1
5b30: 20 46 52 4f 4d 20 70 72 69 76 61 74 65 20 57 48 FROM private WH
5b40: 45 52 45 20 72 69 64 3d 62 6c 6f 62 2e 72 69 64 ERE rid=blob.rid
5b50: 29 22 0a 20 20 20 20 20 20 22 20 20 20 41 4e 44 )". " AND
5b60: 20 62 6c 6f 62 2e 72 69 64 3c 3d 25 64 22 0a 20 blob.rid<=%d".
5b70: 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 " ORDER BY
5b80: 62 6c 6f 62 2e 72 69 64 20 44 45 53 43 22 2c 0a blob.rid DESC",.
5b90: 20 20 20 20 20 20 70 58 66 65 72 2d 3e 72 65 73 pXfer->res
5ba0: 79 6e 63 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c ync. );. }el
5bb0: 73 65 7b 0a 20 20 20 20 64 62 5f 70 72 65 70 61 se{. db_prepa
5bc0: 72 65 28 26 71 2c 0a 20 20 20 20 20 20 22 53 45 re(&q,. "SE
5bd0: 4c 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 75 LECT uuid FROM u
5be0: 6e 63 6c 75 73 74 65 72 65 64 20 4a 4f 49 4e 20 nclustered JOIN
5bf0: 62 6c 6f 62 20 55 53 49 4e 47 28 72 69 64 29 22 blob USING(rid)"
5c00: 0a 20 20 20 20 20 20 22 20 57 48 45 52 45 20 4e . " WHERE N
5c10: 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 43 54 OT EXISTS(SELECT
5c20: 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57 48 45 1 FROM shun WHE
5c30: 52 45 20 75 75 69 64 3d 62 6c 6f 62 2e 75 75 69 RE uuid=blob.uui
5c40: 64 29 22 0a 20 20 20 20 20 20 22 20 20 20 41 4e d)". " AN
5c50: 44 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c D NOT EXISTS(SEL
5c60: 45 43 54 20 31 20 46 52 4f 4d 20 70 68 61 6e 74 ECT 1 FROM phant
5c70: 6f 6d 20 57 48 45 52 45 20 72 69 64 3d 62 6c 6f om WHERE rid=blo
5c80: 62 2e 72 69 64 29 22 0a 20 20 20 20 20 20 22 20 b.rid)". "
5c90: 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 AND NOT EXISTS
5ca0: 28 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 (SELECT 1 FROM p
5cb0: 72 69 76 61 74 65 20 57 48 45 52 45 20 72 69 64 rivate WHERE rid
5cc0: 3d 62 6c 6f 62 2e 72 69 64 29 22 0a 20 20 20 20 =blob.rid)".
5cd0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 );. }. while(
5ce0: 64 62 5f 73 74 65 70 28 26 71 29 3d 3d 53 51 4c db_step(&q)==SQL
5cf0: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 62 ITE_ROW ){. b
5d00: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 58 66 65 lob_appendf(pXfe
5d10: 72 2d 3e 70 4f 75 74 2c 20 22 69 67 6f 74 20 25 r->pOut, "igot %
5d20: 73 5c 6e 22 2c 20 64 62 5f 63 6f 6c 75 6d 6e 5f s\n", db_column_
5d30: 74 65 78 74 28 26 71 2c 20 30 29 29 3b 0a 20 20 text(&q, 0));.
5d40: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 28 cnt++;. if(
5d50: 20 70 58 66 65 72 2d 3e 72 65 73 79 6e 63 20 26 pXfer->resync &
5d60: 26 20 70 58 66 65 72 2d 3e 6d 78 53 65 6e 64 3c & pXfer->mxSend<
5d70: 62 6c 6f 62 5f 73 69 7a 65 28 70 58 66 65 72 2d blob_size(pXfer-
5d80: 3e 70 4f 75 74 29 20 29 7b 0a 20 20 20 20 20 20 >pOut) ){.
5d90: 70 58 66 65 72 2d 3e 72 65 73 79 6e 63 20 3d 20 pXfer->resync =
5da0: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 db_column_int(&q
5db0: 2c 20 31 29 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 , 1)-1;. }.
5dc0: 7d 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 28 }. db_finalize(
5dd0: 26 71 29 3b 0a 20 20 69 66 28 20 63 6e 74 3d 3d &q);. if( cnt==
5de0: 30 20 29 20 70 58 66 65 72 2d 3e 72 65 73 79 6e 0 ) pXfer->resyn
5df0: 63 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 c = 0;. return
5e00: 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 cnt;.}../*.** Se
5e10: 6e 64 20 61 6e 20 69 67 6f 74 20 6d 65 73 73 61 nd an igot messa
5e20: 67 65 20 66 6f 72 20 65 76 65 72 79 20 61 72 74 ge for every art
5e30: 69 66 61 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 ifact..*/.static
5e40: 20 76 6f 69 64 20 73 65 6e 64 5f 61 6c 6c 28 58 void send_all(X
5e50: 66 65 72 20 2a 70 58 66 65 72 29 7b 0a 20 20 53 fer *pXfer){. S
5e60: 74 6d 74 20 71 3b 0a 20 20 64 62 5f 70 72 65 70 tmt q;. db_prep
5e70: 61 72 65 28 26 71 2c 0a 20 20 20 20 22 53 45 4c are(&q,. "SEL
5e80: 45 43 54 20 75 75 69 64 20 46 52 4f 4d 20 62 6c ECT uuid FROM bl
5e90: 6f 62 20 22 0a 20 20 20 20 22 20 57 48 45 52 45 ob ". " WHERE
5ea0: 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c 45 NOT EXISTS(SELE
5eb0: 43 54 20 31 20 46 52 4f 4d 20 73 68 75 6e 20 57 CT 1 FROM shun W
5ec0: 48 45 52 45 20 75 75 69 64 3d 62 6c 6f 62 2e 75 HERE uuid=blob.u
5ed0: 75 69 64 29 22 0a 20 20 20 20 22 20 20 20 41 4e uid)". " AN
5ee0: 44 20 4e 4f 54 20 45 58 49 53 54 53 28 53 45 4c D NOT EXISTS(SEL
5ef0: 45 43 54 20 31 20 46 52 4f 4d 20 70 72 69 76 61 ECT 1 FROM priva
5f00: 74 65 20 57 48 45 52 45 20 72 69 64 3d 62 6c 6f te WHERE rid=blo
5f10: 62 2e 72 69 64 29 22 0a 20 20 20 20 22 20 20 20 b.rid)". "
5f20: 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 28 53 AND NOT EXISTS(S
5f30: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 70 68 61 ELECT 1 FROM pha
5f40: 6e 74 6f 6d 20 57 48 45 52 45 20 72 69 64 3d 62 ntom WHERE rid=b
5f50: 6c 6f 62 2e 72 69 64 29 22 0a 20 20 29 3b 0a 20 lob.rid)". );.
5f60: 20 77 68 69 6c 65 28 20 64 62 5f 73 74 65 70 28 while( db_step(
5f70: 26 71 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 &q)==SQLITE_ROW
5f80: 29 7b 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 ){. blob_appe
5f90: 6e 64 66 28 70 58 66 65 72 2d 3e 70 4f 75 74 2c ndf(pXfer->pOut,
5fa0: 20 22 69 67 6f 74 20 25 73 5c 6e 22 2c 20 64 62 "igot %s\n", db
5fb0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 26 71 2c _column_text(&q,
5fc0: 20 30 29 29 3b 0a 20 20 7d 0a 20 20 64 62 5f 66 0));. }. db_f
5fd0: 69 6e 61 6c 69 7a 65 28 26 71 29 3b 0a 7d 0a 0a inalize(&q);.}..
5fe0: 2f 2a 0a 2a 2a 20 53 65 6e 64 20 61 20 73 69 6e /*.** Send a sin
5ff0: 67 6c 65 20 6f 6c 64 2d 73 74 79 6c 65 20 63 6f gle old-style co
6000: 6e 66 69 67 20 63 61 72 64 20 66 6f 72 20 63 6f nfig card for co
6010: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 74 65 6d nfiguration item
6020: 20 7a 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 zName..**.** Th
6030: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 is routine and t
6040: 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 he functionality
6050: 20 69 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 69 it implements i
6060: 73 20 73 63 68 65 64 75 6c 65 64 20 66 6f 72 0a s scheduled for.
6070: 2a 2a 20 72 65 6d 6f 76 61 6c 20 6f 6e 20 32 30 ** removal on 20
6080: 31 32 2d 30 35 2d 30 31 2e 0a 2a 2f 0a 73 74 61 12-05-01..*/.sta
6090: 74 69 63 20 76 6f 69 64 20 73 65 6e 64 5f 6c 65 tic void send_le
60a0: 67 61 63 79 5f 63 6f 6e 66 69 67 5f 63 61 72 64 gacy_config_card
60b0: 28 58 66 65 72 20 2a 70 58 66 65 72 2c 20 63 6f (Xfer *pXfer, co
60c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 nst char *zName)
60d0: 7b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d {. if( zName[0]
60e0: 21 3d 27 40 27 20 29 7b 0a 20 20 20 20 42 6c 6f !='@' ){. Blo
60f0: 62 20 76 61 6c 3b 0a 20 20 20 20 62 6c 6f 62 5f b val;. blob_
6100: 7a 65 72 6f 28 26 76 61 6c 29 3b 0a 20 20 20 20 zero(&val);.
6110: 64 62 5f 62 6c 6f 62 28 26 76 61 6c 2c 20 22 53 db_blob(&val, "S
6120: 45 4c 45 43 54 20 76 61 6c 75 65 20 46 52 4f 4d ELECT value FROM
6130: 20 63 6f 6e 66 69 67 20 57 48 45 52 45 20 6e 61 config WHERE na
6140: 6d 65 3d 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a me=%Q", zName);.
6150: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a if( blob_siz
6160: 65 28 26 76 61 6c 29 3e 30 20 29 7b 0a 20 20 20 e(&val)>0 ){.
6170: 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 blob_appendf(
6180: 70 58 66 65 72 2d 3e 70 4f 75 74 2c 20 22 63 6f pXfer->pOut, "co
6190: 6e 66 69 67 20 25 73 20 25 64 5c 6e 22 2c 20 7a nfig %s %d\n", z
61a0: 4e 61 6d 65 2c 20 62 6c 6f 62 5f 73 69 7a 65 28 Name, blob_size(
61b0: 26 76 61 6c 29 29 3b 0a 20 20 20 20 20 20 62 6c &val));. bl
61c0: 6f 62 5f 61 70 70 65 6e 64 28 70 58 66 65 72 2d ob_append(pXfer-
61d0: 3e 70 4f 75 74 2c 20 62 6c 6f 62 5f 62 75 66 66 >pOut, blob_buff
61e0: 65 72 28 26 76 61 6c 29 2c 20 62 6c 6f 62 5f 73 er(&val), blob_s
61f0: 69 7a 65 28 26 76 61 6c 29 29 3b 0a 20 20 20 20 ize(&val));.
6200: 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 76 61 blob_reset(&va
6210: 6c 29 3b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 61 l);. blob_a
6220: 70 70 65 6e 64 28 70 58 66 65 72 2d 3e 70 4f 75 ppend(pXfer->pOu
6230: 74 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 20 t, "\n", 1);.
6240: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }. }else{.
6250: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 Blob content;.
6260: 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 6f 6e blob_zero(&con
6270: 74 65 6e 74 29 3b 0a 20 20 20 20 63 6f 6e 66 69 tent);. confi
6280: 67 75 72 65 5f 72 65 6e 64 65 72 5f 73 70 65 63 gure_render_spec
6290: 69 61 6c 5f 6e 61 6d 65 28 7a 4e 61 6d 65 2c 20 ial_name(zName,
62a0: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 62 &content);. b
62b0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 70 58 66 65 lob_appendf(pXfe
62c0: 72 2d 3e 70 4f 75 74 2c 20 22 63 6f 6e 66 69 67 r->pOut, "config
62d0: 20 25 73 20 25 64 5c 6e 25 73 5c 6e 22 2c 20 7a %s %d\n%s\n", z
62e0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 Name,.
62f0: 20 20 20 20 20 20 20 62 6c 6f 62 5f 73 69 7a 65 blob_size
6300: 28 26 63 6f 6e 74 65 6e 74 29 2c 20 62 6c 6f 62 (&content), blob
6310: 5f 73 74 72 28 26 63 6f 6e 74 65 6e 74 29 29 3b _str(&content));
6320: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 . blob_reset(
6330: 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 7d &content);. }.}
6340: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 ../*.** Called w
6350: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e 20 hen there is an
6360: 61 74 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 attempt to trans
6370: 66 65 72 20 70 72 69 76 61 74 65 20 63 6f 6e 74 fer private cont
6380: 65 6e 74 20 74 6f 20 61 6e 64 0a 2a 2a 20 66 72 ent to and.** fr
6390: 6f 6d 20 61 20 73 65 72 76 65 72 20 77 69 74 68 om a server with
63a0: 6f 75 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f out authorizatio
63b0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 n..*/.static voi
63c0: 64 20 73 65 72 76 65 72 5f 70 72 69 76 61 74 65 d server_private
63d0: 5f 78 66 65 72 5f 6e 6f 74 5f 61 75 74 68 6f 72 _xfer_not_author
63e0: 69 7a 65 64 28 76 6f 69 64 29 7b 0a 20 20 40 20 ized(void){. @
63f0: 65 72 72 6f 72 20 6e 6f 74 5c 73 61 75 74 68 6f error not\sautho
6400: 72 69 7a 65 64 5c 73 74 6f 5c 73 73 79 6e 63 5c rized\sto\ssync\
6410: 73 70 72 69 76 61 74 65 5c 73 63 6f 6e 74 65 6e sprivate\sconten
6420: 74 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 t.}../*.** Retur
6430: 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 54 48 31 n the common TH1
6440: 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 code to evaluat
6450: 65 20 70 72 69 6f 72 20 74 6f 20 65 76 61 6c 75 e prior to evalu
6460: 61 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 0a ating any other.
6470: 2a 2a 20 54 48 31 20 74 72 61 6e 73 66 65 72 20 ** TH1 transfer
6480: 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 73 63 72 notification scr
6490: 69 70 74 73 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 ipts..*/.const c
64a0: 68 61 72 20 2a 78 66 65 72 5f 63 6f 6d 6d 6f 6e har *xfer_common
64b0: 5f 63 6f 64 65 28 76 6f 69 64 29 7b 0a 20 20 72 _code(void){. r
64c0: 65 74 75 72 6e 20 64 62 5f 67 65 74 28 22 78 66 eturn db_get("xf
64d0: 65 72 2d 63 6f 6d 6d 6f 6e 2d 73 63 72 69 70 74 er-common-script
64e0: 22 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ", 0);.}../*.**
64f0: 52 65 74 75 72 6e 20 74 68 65 20 54 48 31 20 63 Return the TH1 c
6500: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 ode to evaluate
6510: 77 68 65 6e 20 61 20 70 75 73 68 20 69 73 20 70 when a push is p
6520: 72 6f 63 65 73 73 65 64 2e 0a 2a 2f 0a 63 6f 6e rocessed..*/.con
6530: 73 74 20 63 68 61 72 20 2a 78 66 65 72 5f 70 75 st char *xfer_pu
6540: 73 68 5f 63 6f 64 65 28 76 6f 69 64 29 7b 0a 20 sh_code(void){.
6550: 20 72 65 74 75 72 6e 20 64 62 5f 67 65 74 28 22 return db_get("
6560: 78 66 65 72 2d 70 75 73 68 2d 73 63 72 69 70 74 xfer-push-script
6570: 22 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ", 0);.}../*.**
6580: 52 65 74 75 72 6e 20 74 68 65 20 54 48 31 20 63 Return the TH1 c
6590: 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 ode to evaluate
65a0: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 69 73 when a commit is
65b0: 20 70 72 6f 63 65 73 73 65 64 2e 0a 2a 2f 0a 63 processed..*/.c
65c0: 6f 6e 73 74 20 63 68 61 72 20 2a 78 66 65 72 5f onst char *xfer_
65d0: 63 6f 6d 6d 69 74 5f 63 6f 64 65 28 76 6f 69 64 commit_code(void
65e0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 5f 67 ){. return db_g
65f0: 65 74 28 22 78 66 65 72 2d 63 6f 6d 6d 69 74 2d et("xfer-commit-
6600: 73 63 72 69 70 74 22 2c 20 30 29 3b 0a 7d 0a 0a script", 0);.}..
6610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
6620: 20 54 48 31 20 63 6f 64 65 20 74 6f 20 65 76 61 TH1 code to eva
6630: 6c 75 61 74 65 20 77 68 65 6e 20 61 20 74 69 63 luate when a tic
6640: 6b 65 74 20 63 68 61 6e 67 65 20 69 73 20 70 72 ket change is pr
6650: 6f 63 65 73 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 ocessed..*/.cons
6660: 74 20 63 68 61 72 20 2a 78 66 65 72 5f 74 69 63 t char *xfer_tic
6670: 6b 65 74 5f 63 6f 64 65 28 76 6f 69 64 29 7b 0a ket_code(void){.
6680: 20 20 72 65 74 75 72 6e 20 64 62 5f 67 65 74 28 return db_get(
6690: 22 78 66 65 72 2d 74 69 63 6b 65 74 2d 73 63 72 "xfer-ticket-scr
66a0: 69 70 74 22 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a ipt", 0);.}../*.
66b0: 2a 2a 20 52 75 6e 20 74 68 65 20 73 70 65 63 69 ** Run the speci
66c0: 66 69 65 64 20 54 48 31 20 73 63 72 69 70 74 2c fied TH1 script,
66d0: 20 69 66 20 61 6e 79 2c 20 61 6e 64 20 72 65 74 if any, and ret
66e0: 75 72 6e 73 20 31 20 6f 6e 20 65 72 72 6f 72 2e urns 1 on error.
66f0: 0a 2a 2f 0a 69 6e 74 20 78 66 65 72 5f 72 75 6e .*/.int xfer_run
6700: 5f 73 63 72 69 70 74 28 0a 20 20 63 6f 6e 73 74 _script(. const
6710: 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74 2c 0a char *zScript,.
6720: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 const char *zU
6730: 75 69 64 4f 72 4c 69 73 74 2c 0a 20 20 69 6e 74 uidOrList,. int
6740: 20 62 49 73 4c 69 73 74 0a 29 7b 0a 20 20 69 6e bIsList.){. in
6750: 74 20 72 63 20 3d 20 54 48 5f 4f 4b 3b 0a 20 20 t rc = TH_OK;.
6760: 69 66 28 20 21 7a 53 63 72 69 70 74 20 29 20 72 if( !zScript ) r
6770: 65 74 75 72 6e 20 72 63 3b 0a 20 20 54 68 5f 46 eturn rc;. Th_F
6780: 6f 73 73 69 6c 49 6e 69 74 28 54 48 5f 49 4e 49 ossilInit(TH_INI
6790: 54 5f 44 45 46 41 55 4c 54 29 3b 0a 20 20 54 68 T_DEFAULT);. Th
67a0: 5f 53 74 6f 72 65 28 62 49 73 4c 69 73 74 20 3f _Store(bIsList ?
67b0: 20 22 75 75 69 64 73 22 20 3a 20 22 75 75 69 64 "uuids" : "uuid
67c0: 22 2c 20 7a 55 75 69 64 4f 72 4c 69 73 74 20 3f ", zUuidOrList ?
67d0: 20 7a 55 75 69 64 4f 72 4c 69 73 74 20 3a 20 22 zUuidOrList : "
67e0: 22 29 3b 0a 20 20 72 63 20 3d 20 54 68 5f 45 76 ");. rc = Th_Ev
67f0: 61 6c 28 67 2e 69 6e 74 65 72 70 2c 20 30 2c 20 al(g.interp, 0,
6800: 7a 53 63 72 69 70 74 2c 20 2d 31 29 3b 0a 20 20 zScript, -1);.
6810: 69 66 28 20 72 63 21 3d 54 48 5f 4f 4b 20 29 7b if( rc!=TH_OK ){
6820: 0a 20 20 20 20 66 6f 73 73 69 6c 5f 65 72 72 6f . fossil_erro
6830: 72 28 31 2c 20 22 25 73 22 2c 20 54 68 5f 47 65 r(1, "%s", Th_Ge
6840: 74 52 65 73 75 6c 74 28 67 2e 69 6e 74 65 72 70 tResult(g.interp
6850: 2c 20 30 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 , 0));. }. ret
6860: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
6870: 20 52 75 6e 73 20 74 68 65 20 70 72 65 2d 74 72 Runs the pre-tr
6880: 61 6e 73 66 65 72 20 54 48 31 20 73 63 72 69 70 ansfer TH1 scrip
6890: 74 2c 20 69 66 20 61 6e 79 2c 20 61 6e 64 20 72 t, if any, and r
68a0: 65 74 75 72 6e 73 20 69 74 73 20 72 65 74 75 72 eturns its retur
68b0: 6e 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 n code..** This
68c0: 73 63 72 69 70 74 20 6d 61 79 20 62 65 20 72 75 script may be ru
68d0: 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 n multiple times
68e0: 2e 20 20 49 66 20 74 68 65 20 73 63 72 69 70 74 . If the script
68f0: 20 70 65 72 66 6f 72 6d 73 20 61 63 74 69 6f 6e performs action
6900: 73 0a 2a 2a 20 74 68 61 74 20 63 61 6e 6e 6f 74 s.** that cannot
6910: 20 62 65 20 72 65 64 6f 6e 65 2c 20 69 74 20 73 be redone, it s
6920: 68 6f 75 6c 64 20 75 73 65 20 61 6e 20 69 6e 74 hould use an int
6930: 65 72 6e 61 6c 20 5b 69 66 5d 20 67 75 61 72 64 ernal [if] guard
6940: 20 73 69 6d 69 6c 61 72 20 74 6f 0a 2a 2a 20 74 similar to.** t
6950: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a he following:.**
6960: 0a 2a 2a 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 .** if {![info e
6970: 78 69 73 74 73 20 63 6f 6d 6d 6f 6e 5f 64 6f 6e xists common_don
6980: 65 5d 7d 20 7b 0a 2a 2a 20 20 20 23 20 2e 2e 2e e]} {.** # ...
6990: 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 20 20 code here.**
69a0: 73 65 74 20 63 6f 6d 6d 6f 6e 5f 64 6f 6e 65 20 set common_done
69b0: 31 0a 2a 2a 20 7d 0a 2a 2f 0a 69 6e 74 20 78 66 1.** }.*/.int xf
69c0: 65 72 5f 72 75 6e 5f 63 6f 6d 6d 6f 6e 5f 73 63 er_run_common_sc
69d0: 72 69 70 74 28 76 6f 69 64 29 7b 0a 20 20 72 65 ript(void){. re
69e0: 74 75 72 6e 20 78 66 65 72 5f 72 75 6e 5f 73 63 turn xfer_run_sc
69f0: 72 69 70 74 28 78 66 65 72 5f 63 6f 6d 6d 6f 6e ript(xfer_common
6a00: 5f 63 6f 64 65 28 29 2c 20 30 2c 20 30 29 3b 0a _code(), 0, 0);.
6a10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 69 73 }../*.** If this
6a20: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 variable is set
6a30: 2c 20 64 69 73 61 62 6c 65 20 6c 6f 67 69 6e 20 , disable login
6a40: 63 68 65 63 6b 73 2e 20 20 55 73 65 64 20 66 6f checks. Used fo
6a50: 72 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 6f r debugging.** o
6a60: 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 nly..*/.static i
6a70: 6e 74 20 64 69 73 61 62 6c 65 4c 6f 67 69 6e 20 nt disableLogin
6a80: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 = 0;../*.** The
6a90: 43 47 49 2f 48 54 54 50 20 70 72 65 70 72 6f 63 CGI/HTTP preproc
6aa0: 65 73 73 6f 72 20 61 6c 77 61 79 73 20 72 65 64 essor always red
6ab0: 69 72 65 63 74 73 20 72 65 71 75 65 73 74 73 20 irects requests
6ac0: 77 69 74 68 20 61 20 63 6f 6e 74 65 6e 74 2d 74 with a content-t
6ad0: 79 70 65 0a 2a 2a 20 6f 66 20 61 70 70 6c 69 63 ype.** of applic
6ae0: 61 74 69 6f 6e 2f 78 2d 66 6f 73 73 69 6c 20 6f ation/x-fossil o
6af0: 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d r application/x-
6b00: 66 6f 73 73 69 6c 2d 64 65 62 75 67 20 74 6f 20 fossil-debug to
6b10: 74 68 69 73 20 70 61 67 65 2c 0a 2a 2a 20 72 65 this page,.** re
6b20: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 61 74 gardless of what
6b30: 20 70 61 74 68 20 77 61 73 20 73 70 65 63 69 66 path was specif
6b40: 69 65 64 20 69 6e 20 74 68 65 20 48 54 54 50 20 ied in the HTTP
6b50: 68 65 61 64 65 72 2e 20 20 54 68 69 73 20 61 6c header. This al
6b60: 6c 6f 77 73 0a 2a 2a 20 63 6c 6f 6e 65 20 63 6c lows.** clone cl
6b70: 69 65 6e 74 73 20 74 6f 20 73 70 65 63 69 66 79 ients to specify
6b80: 20 61 20 55 52 4c 20 74 68 61 74 20 6f 6d 69 74 a URL that omit
6b90: 73 20 64 65 66 61 75 6c 74 20 70 61 74 68 6e 61 s default pathna
6ba0: 6d 65 73 2c 20 73 75 63 68 0a 2a 2a 20 61 73 20 mes, such.** as
6bb0: 22 68 74 74 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 "http://fossil-s
6bc0: 63 6d 2e 6f 72 67 2f 22 20 69 6e 73 74 65 61 64 cm.org/" instead
6bd0: 20 6f 66 20 22 68 74 74 70 3a 2f 2f 66 6f 73 73 of "http://foss
6be0: 69 6c 2d 73 63 6d 2e 6f 72 67 2f 69 6e 64 65 78 il-scm.org/index
6bf0: 2e 63 67 69 22 2e 0a 2a 2a 0a 2a 2a 20 57 45 42 .cgi"..**.** WEB
6c00: 50 41 47 45 3a 20 78 66 65 72 0a 2a 2a 0a 2a 2a PAGE: xfer.**.**
6c10: 20 54 68 69 73 20 69 73 20 74 68 65 20 74 72 61 This is the tra
6c20: 6e 73 66 65 72 20 68 61 6e 64 6c 65 72 20 6f 6e nsfer handler on
6c30: 20 74 68 65 20 73 65 72 76 65 72 20 73 69 64 65 the server side
6c40: 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a . The transfer.
6c50: 2a 2a 20 6d 65 73 73 61 67 65 20 68 61 73 20 62 ** message has b
6c60: 65 65 6e 20 75 6e 63 6f 6d 70 72 65 73 73 65 64 een uncompressed
6c70: 20 61 6e 64 20 70 6c 61 63 65 64 20 69 6e 20 74 and placed in t
6c80: 68 65 20 67 2e 63 67 69 49 6e 20 62 6c 6f 62 2e he g.cgiIn blob.
6c90: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 74 68 69 73 .** Process this
6ca0: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 66 6f 72 message and for
6cb0: 6d 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 m an appropriate
6cc0: 20 72 65 70 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 reply..*/.void
6cd0: 70 61 67 65 5f 78 66 65 72 28 76 6f 69 64 29 7b page_xfer(void){
6ce0: 0a 20 20 69 6e 74 20 69 73 50 75 6c 6c 20 3d 20 . int isPull =
6cf0: 30 3b 0a 20 20 69 6e 74 20 69 73 50 75 73 68 20 0;. int isPush
6d00: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 = 0;. int nErr
6d10: 3d 20 30 3b 0a 20 20 58 66 65 72 20 78 66 65 72 = 0;. Xfer xfer
6d20: 3b 0a 20 20 69 6e 74 20 64 65 6c 74 61 46 6c 61 ;. int deltaFla
6d30: 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43 g = 0;. int isC
6d40: 6c 6f 6e 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 lone = 0;. int
6d50: 6e 47 69 6d 6d 65 20 3d 20 30 3b 0a 20 20 69 6e nGimme = 0;. in
6d60: 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 72 65 t size;. int re
6d70: 63 76 43 6f 6e 66 69 67 20 3d 20 30 3b 0a 20 20 cvConfig = 0;.
6d80: 63 68 61 72 20 2a 7a 4e 6f 77 3b 0a 20 20 69 6e char *zNow;. in
6d90: 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 t rc;. const ch
6da0: 61 72 20 2a 7a 53 63 72 69 70 74 20 3d 20 30 3b ar *zScript = 0;
6db0: 0a 20 20 63 68 61 72 20 2a 7a 55 75 69 64 4c 69 . char *zUuidLi
6dc0: 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 55 st = 0;. int nU
6dd0: 75 69 64 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 uidList = 0;. c
6de0: 68 61 72 20 2a 2a 70 7a 55 75 69 64 4c 69 73 74 har **pzUuidList
6df0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 2a 70 6e 55 = 0;. int *pnU
6e00: 75 69 64 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20 uidList = 0;..
6e10: 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 6d if( fossil_strcm
6e20: 70 28 50 44 28 22 52 45 51 55 45 53 54 5f 4d 45 p(PD("REQUEST_ME
6e30: 54 48 4f 44 22 2c 22 50 4f 53 54 22 29 2c 22 50 THOD","POST"),"P
6e40: 4f 53 54 22 29 20 29 7b 0a 20 20 20 20 20 66 6f OST") ){. fo
6e50: 73 73 69 6c 5f 72 65 64 69 72 65 63 74 5f 68 6f ssil_redirect_ho
6e60: 6d 65 28 29 3b 0a 20 20 7d 0a 20 20 67 2e 7a 4c me();. }. g.zL
6e70: 6f 67 69 6e 20 3d 20 22 61 6e 6f 6e 79 6d 6f 75 ogin = "anonymou
6e80: 73 22 3b 0a 20 20 6c 6f 67 69 6e 5f 73 65 74 5f s";. login_set_
6e90: 61 6e 6f 6e 5f 6e 6f 62 6f 64 79 5f 63 61 70 61 anon_nobody_capa
6ea0: 62 69 6c 69 74 69 65 73 28 29 3b 0a 20 20 6c 6f bilities();. lo
6eb0: 67 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e gin_check_creden
6ec0: 74 69 61 6c 73 28 29 3b 0a 20 20 6d 65 6d 73 65 tials();. memse
6ed0: 74 28 26 78 66 65 72 2c 20 30 2c 20 73 69 7a 65 t(&xfer, 0, size
6ee0: 6f 66 28 78 66 65 72 29 29 3b 0a 20 20 62 6c 6f of(xfer));. blo
6ef0: 62 61 72 72 61 79 5f 7a 65 72 6f 28 78 66 65 72 barray_zero(xfer
6f00: 2e 61 54 6f 6b 65 6e 2c 20 63 6f 75 6e 74 28 78 .aToken, count(x
6f10: 66 65 72 2e 61 54 6f 6b 65 6e 29 29 3b 0a 20 20 fer.aToken));.
6f20: 63 67 69 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f cgi_set_content_
6f30: 74 79 70 65 28 67 2e 7a 43 6f 6e 74 65 6e 74 54 type(g.zContentT
6f40: 79 70 65 29 3b 0a 20 20 63 67 69 5f 72 65 73 65 ype);. cgi_rese
6f50: 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 69 t_content();. i
6f60: 66 28 20 64 62 5f 73 63 68 65 6d 61 5f 69 73 5f f( db_schema_is_
6f70: 6f 75 74 6f 66 64 61 74 65 28 29 20 29 7b 0a 20 outofdate() ){.
6f80: 20 20 20 40 20 65 72 72 6f 72 20 64 61 74 61 62 @ error datab
6f90: 61 73 65 5c 73 73 63 68 65 6d 61 5c 73 69 73 5c ase\sschema\sis\
6fa0: 73 6f 75 74 2d 6f 66 2d 64 61 74 65 5c 73 6f 6e sout-of-date\son
6fb0: 5c 73 74 68 65 5c 73 73 65 72 76 65 72 2e 0a 20 \sthe\sserver..
6fc0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 return;. }.
6fd0: 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 78 66 65 72 blob_zero(&xfer
6fe0: 2e 65 72 72 29 3b 0a 20 20 78 66 65 72 2e 70 49 .err);. xfer.pI
6ff0: 6e 20 3d 20 26 67 2e 63 67 69 49 6e 3b 0a 20 20 n = &g.cgiIn;.
7000: 78 66 65 72 2e 70 4f 75 74 20 3d 20 63 67 69 5f xfer.pOut = cgi_
7010: 6f 75 74 70 75 74 5f 62 6c 6f 62 28 29 3b 0a 20 output_blob();.
7020: 20 78 66 65 72 2e 6d 78 53 65 6e 64 20 3d 20 64 xfer.mxSend = d
7030: 62 5f 67 65 74 5f 69 6e 74 28 22 6d 61 78 2d 64 b_get_int("max-d
7040: 6f 77 6e 6c 6f 61 64 22 2c 20 35 30 30 30 30 30 ownload", 500000
7050: 30 29 3b 0a 20 20 78 66 65 72 2e 6d 61 78 54 69 0);. xfer.maxTi
7060: 6d 65 20 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28 me = db_get_int(
7070: 22 6d 61 78 2d 64 6f 77 6e 6c 6f 61 64 2d 74 69 "max-download-ti
7080: 6d 65 22 2c 20 33 30 29 3b 0a 20 20 69 66 28 20 me", 30);. if(
7090: 78 66 65 72 2e 6d 61 78 54 69 6d 65 3c 31 20 29 xfer.maxTime<1 )
70a0: 20 78 66 65 72 2e 6d 61 78 54 69 6d 65 20 3d 20 xfer.maxTime =
70b0: 31 3b 0a 20 20 78 66 65 72 2e 6d 61 78 54 69 6d 1;. xfer.maxTim
70c0: 65 20 2b 3d 20 74 69 6d 65 28 4e 55 4c 4c 29 3b e += time(NULL);
70d0: 0a 20 20 67 2e 78 66 65 72 50 61 6e 69 63 20 3d . g.xferPanic =
70e0: 20 31 3b 0a 0a 20 20 64 62 5f 62 65 67 69 6e 5f 1;.. db_begin_
70f0: 74 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 transaction();.
7100: 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a db_multi_exec(.
7110: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d "CREATE TEM
7120: 50 20 54 41 42 4c 45 20 6f 6e 72 65 6d 6f 74 65 P TABLE onremote
7130: 28 72 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (rid INTEGER PRI
7140: 4d 41 52 59 20 4b 45 59 29 3b 22 0a 20 20 29 3b MARY KEY);". );
7150: 0a 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 . manifest_cros
7160: 73 6c 69 6e 6b 5f 62 65 67 69 6e 28 29 3b 0a 20 slink_begin();.
7170: 20 72 63 20 3d 20 78 66 65 72 5f 72 75 6e 5f 63 rc = xfer_run_c
7180: 6f 6d 6d 6f 6e 5f 73 63 72 69 70 74 28 29 3b 0a ommon_script();.
7190: 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 45 52 52 if( rc==TH_ERR
71a0: 4f 52 20 29 7b 0a 20 20 20 20 63 67 69 5f 72 65 OR ){. cgi_re
71b0: 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 set_content();.
71c0: 20 20 20 40 20 65 72 72 6f 72 20 63 6f 6d 6d 6f @ error commo
71d0: 6e 5c 73 73 63 72 69 70 74 5c 73 66 61 69 6c 65 n\sscript\sfaile
71e0: 64 3a 5c 73 25 46 28 67 2e 7a 45 72 72 4d 73 67 d:\s%F(g.zErrMsg
71f0: 29 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 ). nErr++;.
7200: 7d 0a 20 20 7a 53 63 72 69 70 74 20 3d 20 78 66 }. zScript = xf
7210: 65 72 5f 70 75 73 68 5f 63 6f 64 65 28 29 3b 0a er_push_code();.
7220: 20 20 69 66 28 20 7a 53 63 72 69 70 74 20 29 7b if( zScript ){
7230: 20 2f 2a 20 4e 4f 54 45 3a 20 41 72 65 20 54 48 /* NOTE: Are TH
7240: 31 20 74 72 61 6e 73 66 65 72 20 68 6f 6f 6b 73 1 transfer hooks
7250: 20 65 6e 61 62 6c 65 64 3f 20 2a 2f 0a 20 20 20 enabled? */.
7260: 20 70 7a 55 75 69 64 4c 69 73 74 20 3d 20 26 7a pzUuidList = &z
7270: 55 75 69 64 4c 69 73 74 3b 0a 20 20 20 20 70 6e UuidList;. pn
7280: 55 75 69 64 4c 69 73 74 20 3d 20 26 6e 55 75 69 UuidList = &nUui
7290: 64 4c 69 73 74 3b 0a 20 20 7d 0a 20 20 77 68 69 dList;. }. whi
72a0: 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 28 78 66 le( blob_line(xf
72b0: 65 72 2e 70 49 6e 2c 20 26 78 66 65 72 2e 6c 69 er.pIn, &xfer.li
72c0: 6e 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 62 ne) ){. if( b
72d0: 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 66 65 72 lob_buffer(&xfer
72e0: 2e 6c 69 6e 65 29 5b 30 5d 3d 3d 27 23 27 20 29 .line)[0]=='#' )
72f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 continue;. i
7300: 66 28 20 62 6c 6f 62 5f 73 69 7a 65 28 26 78 66 f( blob_size(&xf
7310: 65 72 2e 6c 69 6e 65 29 3d 3d 30 20 29 20 63 6f er.line)==0 ) co
7320: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 78 66 65 72 ntinue;. xfer
7330: 2e 6e 54 6f 6b 65 6e 20 3d 20 62 6c 6f 62 5f 74 .nToken = blob_t
7340: 6f 6b 65 6e 69 7a 65 28 26 78 66 65 72 2e 6c 69 okenize(&xfer.li
7350: 6e 65 2c 20 78 66 65 72 2e 61 54 6f 6b 65 6e 2c ne, xfer.aToken,
7360: 20 63 6f 75 6e 74 28 78 66 65 72 2e 61 54 6f 6b count(xfer.aTok
7370: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 20 20 en));.. /*
7380: 66 69 6c 65 20 55 55 49 44 20 53 49 5a 45 20 5c file UUID SIZE \
7390: 6e 20 43 4f 4e 54 45 4e 54 0a 20 20 20 20 2a 2a n CONTENT. **
73a0: 20 20 20 66 69 6c 65 20 55 55 49 44 20 44 45 4c file UUID DEL
73b0: 54 41 53 52 43 20 53 49 5a 45 20 5c 6e 20 43 4f TASRC SIZE \n CO
73c0: 4e 54 45 4e 54 0a 20 20 20 20 2a 2a 0a 20 20 20 NTENT. **.
73d0: 20 2a 2a 20 41 63 63 65 70 74 20 61 20 66 69 6c ** Accept a fil
73e0: 65 20 66 72 6f 6d 20 74 68 65 20 63 6c 69 65 6e e from the clien
73f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 t.. */. if
7400: 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e ( blob_eq(&xfer.
7410: 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 66 69 6c 65 aToken[0], "file
7420: 22 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 ") ){. if(
7430: 21 69 73 50 75 73 68 20 29 7b 0a 20 20 20 20 20 !isPush ){.
7440: 20 20 20 63 67 69 5f 72 65 73 65 74 5f 63 6f 6e cgi_reset_con
7450: 74 65 6e 74 28 29 3b 0a 20 20 20 20 20 20 20 20 tent();.
7460: 40 20 65 72 72 6f 72 20 6e 6f 74 5c 73 61 75 74 @ error not\saut
7470: 68 6f 72 69 7a 65 64 5c 73 74 6f 5c 73 77 72 69 horized\sto\swri
7480: 74 65 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b te. nErr+
7490: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b +;. break
74a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
74b0: 78 66 65 72 5f 61 63 63 65 70 74 5f 66 69 6c 65 xfer_accept_file
74c0: 28 26 78 66 65 72 2c 20 30 2c 20 70 7a 55 75 69 (&xfer, 0, pzUui
74d0: 64 4c 69 73 74 2c 20 70 6e 55 75 69 64 4c 69 73 dList, pnUuidLis
74e0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c t);. if( bl
74f0: 6f 62 5f 73 69 7a 65 28 26 78 66 65 72 2e 65 72 ob_size(&xfer.er
7500: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 67 r) ){. cg
7510: 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 i_reset_content(
7520: 29 3b 0a 20 20 20 20 20 20 20 20 40 20 65 72 72 );. @ err
7530: 6f 72 20 25 54 28 62 6c 6f 62 5f 73 74 72 28 26 or %T(blob_str(&
7540: 78 66 65 72 2e 65 72 72 29 29 0a 20 20 20 20 20 xfer.err)).
7550: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 nErr++;.
7560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
7570: 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 }. }else..
7580: 20 2f 2a 20 20 20 63 66 69 6c 65 20 55 55 49 44 /* cfile UUID
7590: 20 55 53 49 5a 45 20 43 53 49 5a 45 20 5c 6e 20 USIZE CSIZE \n
75a0: 43 4f 4e 54 45 4e 54 0a 20 20 20 20 2a 2a 20 20 CONTENT. **
75b0: 20 63 66 69 6c 65 20 55 55 49 44 20 44 45 4c 54 cfile UUID DELT
75c0: 41 53 52 43 20 55 53 49 5a 45 20 43 53 49 5a 45 ASRC USIZE CSIZE
75d0: 20 5c 6e 20 43 4f 4e 54 45 4e 54 0a 20 20 20 20 \n CONTENT.
75e0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 63 63 65 70 74 **. ** Accept
75f0: 20 61 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 a file from the
7600: 20 63 6c 69 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a client.. */.
7610: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 if( blob_eq(
7620: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c &xfer.aToken[0],
7630: 20 22 63 66 69 6c 65 22 29 20 29 7b 0a 20 20 20 "cfile") ){.
7640: 20 20 20 69 66 28 20 21 69 73 50 75 73 68 20 29 if( !isPush )
7650: 7b 0a 20 20 20 20 20 20 20 20 63 67 69 5f 72 65 {. cgi_re
7660: 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 set_content();.
7670: 20 20 20 20 20 20 20 40 20 65 72 72 6f 72 20 6e @ error n
7680: 6f 74 5c 73 61 75 74 68 6f 72 69 7a 65 64 5c 73 ot\sauthorized\s
7690: 74 6f 5c 73 77 72 69 74 65 0a 20 20 20 20 20 20 to\swrite.
76a0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 nErr++;.
76b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
76c0: 0a 20 20 20 20 20 20 78 66 65 72 5f 61 63 63 65 . xfer_acce
76d0: 70 74 5f 63 6f 6d 70 72 65 73 73 65 64 5f 66 69 pt_compressed_fi
76e0: 6c 65 28 26 78 66 65 72 2c 20 70 7a 55 75 69 64 le(&xfer, pzUuid
76f0: 4c 69 73 74 2c 20 70 6e 55 75 69 64 4c 69 73 74 List, pnUuidList
7700: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f );. if( blo
7710: 62 5f 73 69 7a 65 28 26 78 66 65 72 2e 65 72 72 b_size(&xfer.err
7720: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 67 69 ) ){. cgi
7730: 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 _reset_content()
7740: 3b 0a 20 20 20 20 20 20 20 20 40 20 65 72 72 6f ;. @ erro
7750: 72 20 25 54 28 62 6c 6f 62 5f 73 74 72 28 26 78 r %T(blob_str(&x
7760: 66 65 72 2e 65 72 72 29 29 0a 20 20 20 20 20 20 fer.err)).
7770: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 nErr++;.
7780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
7790: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 . }else..
77a0: 2f 2a 20 20 20 67 69 6d 6d 65 20 55 55 49 44 0a /* gimme UUID.
77b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c **. ** Cl
77c0: 69 65 6e 74 20 69 73 20 72 65 71 75 65 73 74 69 ient is requesti
77d0: 6e 67 20 61 20 66 69 6c 65 2e 20 20 53 65 6e 64 ng a file. Send
77e0: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 it.. */.
77f0: 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 if( blob_eq(&xfe
7800: 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 67 69 r.aToken[0], "gi
7810: 6d 6d 65 22 29 0a 20 20 20 20 20 26 26 20 78 66 mme"). && xf
7820: 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32 0a 20 20 20 er.nToken==2.
7830: 20 20 26 26 20 62 6c 6f 62 5f 69 73 5f 75 75 69 && blob_is_uui
7840: 64 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 d(&xfer.aToken[1
7850: 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 ]). ){.
7860: 6e 47 69 6d 6d 65 2b 2b 3b 0a 20 20 20 20 20 20 nGimme++;.
7870: 69 66 28 20 69 73 50 75 6c 6c 20 29 7b 0a 20 20 if( isPull ){.
7880: 20 20 20 20 20 20 69 6e 74 20 72 69 64 20 3d 20 int rid =
7890: 72 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 26 78 rid_from_uuid(&x
78a0: 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 30 fer.aToken[1], 0
78b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 , 0);. if
78c0: 28 20 72 69 64 20 29 7b 0a 20 20 20 20 20 20 20 ( rid ){.
78d0: 20 20 20 73 65 6e 64 5f 66 69 6c 65 28 26 78 66 send_file(&xf
78e0: 65 72 2c 20 72 69 64 2c 20 26 78 66 65 72 2e 61 er, rid, &xfer.a
78f0: 54 6f 6b 65 6e 5b 31 5d 2c 20 64 65 6c 74 61 46 Token[1], deltaF
7900: 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a lag);. }.
7910: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 }. }els
7920: 65 0a 0a 20 20 20 20 2f 2a 20 20 20 69 67 6f 74 e.. /* igot
7930: 20 55 55 49 44 20 3f 49 53 50 52 49 56 41 54 45 UUID ?ISPRIVATE
7940: 3f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 ?. **. **
7950: 43 6c 69 65 6e 74 20 61 6e 6e 6f 75 6e 63 65 73 Client announces
7960: 20 74 68 61 74 20 69 74 20 68 61 73 20 61 20 70 that it has a p
7970: 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 2e 20 articular file.
7980: 20 49 66 20 74 68 65 20 49 53 50 52 49 56 41 54 If the ISPRIVAT
7990: 45 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e E. ** argumen
79a0: 74 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 t exists and is
79b0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 non-zero, then t
79c0: 68 65 20 66 69 6c 65 20 69 73 20 61 20 70 72 69 he file is a pri
79d0: 76 61 74 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a vate file.. *
79e0: 2f 0a 20 20 20 20 69 66 28 20 78 66 65 72 2e 6e /. if( xfer.n
79f0: 54 6f 6b 65 6e 3e 3d 32 0a 20 20 20 20 20 26 26 Token>=2. &&
7a00: 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 blob_eq(&xfer.a
7a10: 54 6f 6b 65 6e 5b 30 5d 2c 20 22 69 67 6f 74 22 Token[0], "igot"
7a20: 29 0a 20 20 20 20 20 26 26 20 62 6c 6f 62 5f 69 ). && blob_i
7a30: 73 5f 75 75 69 64 28 26 78 66 65 72 2e 61 54 6f s_uuid(&xfer.aTo
7a40: 6b 65 6e 5b 31 5d 29 0a 20 20 20 20 29 7b 0a 20 ken[1]). ){.
7a50: 20 20 20 20 20 69 66 28 20 69 73 50 75 73 68 20 if( isPush
7a60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 ){. if( x
7a70: 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32 20 7c 7c fer.nToken==2 ||
7a80: 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 blob_eq(&xfer.a
7a90: 54 6f 6b 65 6e 5b 32 5d 2c 22 31 22 29 3d 3d 30 Token[2],"1")==0
7aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 69 ){. ri
7ab0: 64 5f 66 72 6f 6d 5f 75 75 69 64 28 26 78 66 65 d_from_uuid(&xfe
7ac0: 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 31 2c 20 r.aToken[1], 1,
7ad0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 0);. }els
7ae0: 65 20 69 66 28 20 67 2e 70 65 72 6d 2e 50 72 69 e if( g.perm.Pri
7af0: 76 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 vate ){.
7b00: 20 20 72 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 rid_from_uuid(
7b10: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c &xfer.aToken[1],
7b20: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 1, 1);.
7b30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
7b40: 20 73 65 72 76 65 72 5f 70 72 69 76 61 74 65 5f server_private_
7b50: 78 66 65 72 5f 6e 6f 74 5f 61 75 74 68 6f 72 69 xfer_not_authori
7b60: 7a 65 64 28 29 3b 0a 20 20 20 20 20 20 20 20 7d zed();. }
7b70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c . }. }el
7b80: 73 65 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 20 70 se... /* p
7b90: 75 6c 6c 20 20 53 45 52 56 45 52 43 4f 44 45 20 ull SERVERCODE
7ba0: 20 50 52 4f 4a 45 43 54 43 4f 44 45 0a 20 20 20 PROJECTCODE.
7bb0: 20 2a 2a 20 20 20 20 70 75 73 68 20 20 53 45 52 ** push SER
7bc0: 56 45 52 43 4f 44 45 20 20 50 52 4f 4a 45 43 54 VERCODE PROJECT
7bd0: 43 4f 44 45 0a 20 20 20 20 2a 2a 0a 20 20 20 20 CODE. **.
7be0: 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 77 61 ** The client wa
7bf0: 6e 74 73 20 65 69 74 68 65 72 20 73 65 6e 64 20 nts either send
7c00: 6f 72 20 72 65 63 65 69 76 65 2e 20 20 54 68 65 or receive. The
7c10: 20 73 65 72 76 65 72 20 73 68 6f 75 6c 64 0a 20 server should.
7c20: 20 20 20 2a 2a 20 76 65 72 69 66 79 20 74 68 61 ** verify tha
7c30: 74 20 74 68 65 20 70 72 6f 6a 65 63 74 20 63 6f t the project co
7c40: 64 65 20 6d 61 74 63 68 65 73 2e 0a 20 20 20 20 de matches..
7c50: 2a 2f 0a 20 20 20 20 69 66 28 20 78 66 65 72 2e */. if( xfer.
7c60: 6e 54 6f 6b 65 6e 3d 3d 33 0a 20 20 20 20 20 26 nToken==3. &
7c70: 26 20 28 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 & (blob_eq(&xfer
7c80: 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 70 75 6c .aToken[0], "pul
7c90: 6c 22 29 20 7c 7c 20 62 6c 6f 62 5f 65 71 28 26 l") || blob_eq(&
7ca0: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 xfer.aToken[0],
7cb0: 22 70 75 73 68 22 29 29 0a 20 20 20 20 20 26 26 "push")). &&
7cc0: 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 26 78 blob_is_uuid(&x
7cd0: 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 0a 20 fer.aToken[1]).
7ce0: 20 20 20 20 26 26 20 62 6c 6f 62 5f 69 73 5f 75 && blob_is_u
7cf0: 75 69 64 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e uid(&xfer.aToken
7d00: 5b 32 5d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 [2]). ){.
7d10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
7d20: 43 6f 64 65 3b 0a 20 20 20 20 20 20 7a 50 43 6f Code;. zPCo
7d30: 64 65 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f de = db_get("pro
7d40: 6a 65 63 74 2d 63 6f 64 65 22 2c 20 30 29 3b 0a ject-code", 0);.
7d50: 20 20 20 20 20 20 69 66 28 20 7a 50 43 6f 64 65 if( zPCode
7d60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 ==0 ){. f
7d70: 6f 73 73 69 6c 5f 70 61 6e 69 63 28 22 6d 69 73 ossil_panic("mis
7d80: 73 69 6e 67 20 70 72 6f 6a 65 63 74 20 63 6f 64 sing project cod
7d90: 65 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 e");. }.
7da0: 20 20 20 69 66 28 20 21 62 6c 6f 62 5f 65 71 5f if( !blob_eq_
7db0: 73 74 72 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e str(&xfer.aToken
7dc0: 5b 32 5d 2c 20 7a 50 43 6f 64 65 2c 20 2d 31 29 [2], zPCode, -1)
7dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 67 69 5f ){. cgi_
7de0: 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b reset_content();
7df0: 0a 20 20 20 20 20 20 20 20 40 20 65 72 72 6f 72 . @ error
7e00: 20 77 72 6f 6e 67 5c 73 70 72 6f 6a 65 63 74 0a wrong\sproject.
7e10: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a nErr++;.
7e20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
7e30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 67 }. log
7e40: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 in_check_credent
7e50: 69 61 6c 73 28 29 3b 0a 20 20 20 20 20 20 69 66 ials();. if
7e60: 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e ( blob_eq(&xfer.
7e70: 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 70 75 6c 6c aToken[0], "pull
7e80: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 ") ){. if
7e90: 28 20 21 67 2e 70 65 72 6d 2e 52 65 61 64 20 29 ( !g.perm.Read )
7ea0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 67 69 5f {. cgi_
7eb0: 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b reset_content();
7ec0: 0a 20 20 20 20 20 20 20 20 20 20 40 20 65 72 72 . @ err
7ed0: 6f 72 20 6e 6f 74 5c 73 61 75 74 68 6f 72 69 7a or not\sauthoriz
7ee0: 65 64 5c 73 74 6f 5c 73 72 65 61 64 0a 20 20 20 ed\sto\sread.
7ef0: 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 nErr++;.
7f00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
7f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
7f20: 20 20 69 73 50 75 6c 6c 20 3d 20 31 3b 0a 20 20 isPull = 1;.
7f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
7f40: 20 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 57 if( !g.perm.W
7f50: 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 rite ){.
7f60: 20 20 69 66 28 20 21 69 73 50 75 6c 6c 20 29 7b if( !isPull ){
7f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 67 69 . cgi
7f80: 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 _reset_content()
7f90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 40 20 ;. @
7fa0: 65 72 72 6f 72 20 6e 6f 74 5c 73 61 75 74 68 6f error not\sautho
7fb0: 72 69 7a 65 64 5c 73 74 6f 5c 73 77 72 69 74 65 rized\sto\swrite
7fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 . nEr
7fd0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d r++;. }
7fe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
7ff0: 20 20 40 20 6d 65 73 73 61 67 65 20 70 75 6c 6c @ message pull
8000: 5c 73 6f 6e 6c 79 5c 73 2d 5c 73 6e 6f 74 5c 73 \sonly\s-\snot\s
8010: 61 75 74 68 6f 72 69 7a 65 64 5c 73 74 6f 5c 73 authorized\sto\s
8020: 70 75 73 68 0a 20 20 20 20 20 20 20 20 20 20 7d push. }
8030: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
8040: 20 20 20 20 20 20 20 20 20 20 69 73 50 75 73 68 isPush
8050: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a = 1;. }.
8060: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 }. }els
8070: 65 0a 0a 20 20 20 20 2f 2a 20 20 20 20 63 6c 6f e.. /* clo
8080: 6e 65 20 20 20 3f 50 52 4f 54 4f 43 4f 4c 2d 56 ne ?PROTOCOL-V
8090: 45 52 53 49 4f 4e 3f 20 20 3f 53 45 51 55 45 4e ERSION? ?SEQUEN
80a0: 43 45 2d 4e 55 4d 42 45 52 3f 0a 20 20 20 20 2a CE-NUMBER?. *
80b0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 6c 69 *. ** The cli
80c0: 65 6e 74 20 6b 6e 6f 77 73 20 6e 6f 74 68 69 6e ent knows nothin
80d0: 67 2e 20 20 54 65 6c 6c 20 61 6c 6c 2e 0a 20 20 g. Tell all..
80e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 6c 6f */. if( blo
80f0: 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 b_eq(&xfer.aToke
8100: 6e 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 29 20 29 n[0], "clone") )
8110: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 65 72 {. int iVer
8120: 73 3b 0a 20 20 20 20 20 20 6c 6f 67 69 6e 5f 63 s;. login_c
8130: 68 65 63 6b 5f 63 72 65 64 65 6e 74 69 61 6c 73 heck_credentials
8140: 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 67 ();. if( !g
8150: 2e 70 65 72 6d 2e 43 6c 6f 6e 65 20 29 7b 0a 20 .perm.Clone ){.
8160: 20 20 20 20 20 20 20 63 67 69 5f 72 65 73 65 74 cgi_reset
8170: 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 20 20 20 _content();.
8180: 20 20 20 20 40 20 70 75 73 68 20 25 73 28 64 62 @ push %s(db
8190: 5f 67 65 74 28 22 73 65 72 76 65 72 2d 63 6f 64 _get("server-cod
81a0: 65 22 2c 20 22 78 22 29 29 20 25 73 28 64 62 5f e", "x")) %s(db_
81b0: 67 65 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 get("project-cod
81c0: 65 22 2c 20 22 78 22 29 29 0a 20 20 20 20 20 20 e", "x")).
81d0: 20 20 40 20 65 72 72 6f 72 20 6e 6f 74 5c 73 61 @ error not\sa
81e0: 75 74 68 6f 72 69 7a 65 64 5c 73 74 6f 5c 73 63 uthorized\sto\sc
81f0: 6c 6f 6e 65 0a 20 20 20 20 20 20 20 20 6e 45 72 lone. nEr
8200: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 r++;. bre
8210: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
8220: 20 20 69 66 28 20 78 66 65 72 2e 6e 54 6f 6b 65 if( xfer.nToke
8230: 6e 3d 3d 33 0a 20 20 20 20 20 20 20 26 26 20 62 n==3. && b
8240: 6c 6f 62 5f 69 73 5f 69 6e 74 28 26 78 66 65 72 lob_is_int(&xfer
8250: 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 26 69 56 65 .aToken[1], &iVe
8260: 72 73 29 0a 20 20 20 20 20 20 20 26 26 20 69 56 rs). && iV
8270: 65 72 73 3e 3d 32 0a 20 20 20 20 20 20 29 7b 0a ers>=2. ){.
8280: 20 20 20 20 20 20 20 20 69 6e 74 20 73 65 71 6e int seqn
8290: 6f 2c 20 6d 61 78 3b 0a 20 20 20 20 20 20 20 20 o, max;.
82a0: 69 66 28 20 69 56 65 72 73 3e 3d 33 20 29 7b 0a if( iVers>=3 ){.
82b0: 20 20 20 20 20 20 20 20 20 20 63 67 69 5f 73 65 cgi_se
82c0: 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 65 28 22 t_content_type("
82d0: 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d 66 6f application/x-fo
82e0: 73 73 69 6c 2d 75 6e 63 6f 6d 70 72 65 73 73 65 ssil-uncompresse
82f0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 d");. }.
8300: 20 20 20 20 20 20 20 62 6c 6f 62 5f 69 73 5f 69 blob_is_i
8310: 6e 74 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b nt(&xfer.aToken[
8320: 32 5d 2c 20 26 73 65 71 6e 6f 29 3b 0a 20 20 20 2], &seqno);.
8330: 20 20 20 20 20 6d 61 78 20 3d 20 64 62 5f 69 6e max = db_in
8340: 74 28 30 2c 20 22 53 45 4c 45 43 54 20 6d 61 78 t(0, "SELECT max
8350: 28 72 69 64 29 20 46 52 4f 4d 20 62 6c 6f 62 22 (rid) FROM blob"
8360: 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 );. while
8370: 28 20 78 66 65 72 2e 6d 78 53 65 6e 64 3e 62 6c ( xfer.mxSend>bl
8380: 6f 62 5f 73 69 7a 65 28 78 66 65 72 2e 70 4f 75 ob_size(xfer.pOu
8390: 74 29 20 26 26 20 73 65 71 6e 6f 3c 3d 6d 61 78 t) && seqno<=max
83a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
83b0: 20 74 69 6d 65 28 4e 55 4c 4c 29 20 3e 3d 20 78 time(NULL) >= x
83c0: 66 65 72 2e 6d 61 78 54 69 6d 65 20 29 20 62 72 fer.maxTime ) br
83d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 eak;. i
83e0: 66 28 20 69 56 65 72 73 3e 3d 33 20 29 7b 0a 20 f( iVers>=3 ){.
83f0: 20 20 20 20 20 20 20 20 20 20 20 73 65 6e 64 5f send_
8400: 63 6f 6d 70 72 65 73 73 65 64 5f 66 69 6c 65 28 compressed_file(
8410: 26 78 66 65 72 2c 20 73 65 71 6e 6f 29 3b 0a 20 &xfer, seqno);.
8420: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a }else{.
8430: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6e 64 send
8440: 5f 66 69 6c 65 28 26 78 66 65 72 2c 20 73 65 71 _file(&xfer, seq
8450: 6e 6f 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 no, 0, 1);.
8460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
8470: 20 73 65 71 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 seqno++;.
8480: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }. if(
8490: 73 65 71 6e 6f 3e 6d 61 78 20 29 20 73 65 71 6e seqno>max ) seqn
84a0: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 40 o = 0;. @
84b0: 20 63 6c 6f 6e 65 5f 73 65 71 6e 6f 20 25 64 28 clone_seqno %d(
84c0: 73 65 71 6e 6f 29 0a 20 20 20 20 20 20 7d 65 6c seqno). }el
84d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 43 6c se{. isCl
84e0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 one = 1;.
84f0: 20 69 73 50 75 6c 6c 20 3d 20 31 3b 0a 20 20 20 isPull = 1;.
8500: 20 20 20 20 20 64 65 6c 74 61 46 6c 61 67 20 3d deltaFlag =
8510: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 1;. }.
8520: 20 20 40 20 70 75 73 68 20 25 73 28 64 62 5f 67 @ push %s(db_g
8530: 65 74 28 22 73 65 72 76 65 72 2d 63 6f 64 65 22 et("server-code"
8540: 2c 20 22 78 22 29 29 20 25 73 28 64 62 5f 67 65 , "x")) %s(db_ge
8550: 74 28 22 70 72 6f 6a 65 63 74 2d 63 6f 64 65 22 t("project-code"
8560: 2c 20 22 78 22 29 29 0a 20 20 20 20 7d 65 6c 73 , "x")). }els
8570: 65 0a 0a 20 20 20 20 2f 2a 20 20 20 20 6c 6f 67 e.. /* log
8580: 69 6e 20 20 55 53 45 52 20 20 4e 4f 4e 43 45 20 in USER NONCE
8590: 20 53 49 47 4e 41 54 55 52 45 0a 20 20 20 20 2a SIGNATURE. *
85a0: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 66 *. ** Check f
85b0: 6f 72 20 61 20 76 61 6c 69 64 20 6c 6f 67 69 6e or a valid login
85c0: 2e 20 20 54 68 69 73 20 68 61 73 20 74 6f 20 68 . This has to h
85d0: 61 70 70 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 appen before any
85e0: 74 68 69 6e 67 20 65 6c 73 65 2e 0a 20 20 20 20 thing else..
85f0: 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 63 61 ** The client ca
8600: 6e 20 73 65 6e 64 20 6d 75 6c 74 69 70 6c 65 20 n send multiple
8610: 6c 6f 67 69 6e 73 2e 20 20 50 65 72 6d 69 73 73 logins. Permiss
8620: 69 6f 6e 73 20 61 72 65 20 63 75 6d 75 6c 61 74 ions are cumulat
8630: 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ive.. */.
8640: 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 if( blob_eq(&xfe
8650: 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 6c 6f r.aToken[0], "lo
8660: 67 69 6e 22 29 0a 20 20 20 20 20 26 26 20 78 66 gin"). && xf
8670: 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 34 0a 20 20 20 er.nToken==4.
8680: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 69 ){. if( di
8690: 73 61 62 6c 65 4c 6f 67 69 6e 20 29 7b 0a 20 20 sableLogin ){.
86a0: 20 20 20 20 20 20 67 2e 70 65 72 6d 2e 52 65 61 g.perm.Rea
86b0: 64 20 3d 20 67 2e 70 65 72 6d 2e 57 72 69 74 65 d = g.perm.Write
86c0: 20 3d 20 67 2e 70 65 72 6d 2e 50 72 69 76 61 74 = g.perm.Privat
86d0: 65 20 3d 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e e = g.perm.Admin
86e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 = 1;. }els
86f0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 e{. if( c
8700: 68 65 63 6b 5f 74 61 69 6c 5f 68 61 73 68 28 26 heck_tail_hash(&
8710: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 32 5d 2c 20 xfer.aToken[2],
8720: 78 66 65 72 2e 70 49 6e 29 0a 20 20 20 20 20 20 xfer.pIn).
8730: 20 20 20 7c 7c 20 63 68 65 63 6b 5f 6c 6f 67 69 || check_logi
8740: 6e 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 n(&xfer.aToken[1
8750: 5d 2c 20 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b ], &xfer.aToken[
8760: 32 5d 2c 20 26 78 66 65 72 2e 61 54 6f 6b 65 6e 2], &xfer.aToken
8770: 5b 33 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a [3]). ){.
8780: 20 20 20 20 20 20 20 20 20 20 63 67 69 5f 72 65 cgi_re
8790: 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 set_content();.
87a0: 20 20 20 20 20 20 20 20 20 40 20 65 72 72 6f 72 @ error
87b0: 20 6c 6f 67 69 6e 5c 73 66 61 69 6c 65 64 0a 20 login\sfailed.
87c0: 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b nErr++;
87d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b . break
87e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
87f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 }. }else..
8800: 20 20 20 2f 2a 20 20 20 20 72 65 71 63 6f 6e 66 /* reqconf
8810: 69 67 20 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a ig NAME. **.
8820: 20 20 20 20 2a 2a 20 52 65 71 75 65 73 74 20 61 ** Request a
8830: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76 configuration v
8840: 61 6c 75 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 alue. */.
8850: 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 if( blob_eq(&xfe
8860: 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 72 65 r.aToken[0], "re
8870: 71 63 6f 6e 66 69 67 22 29 0a 20 20 20 20 20 26 qconfig"). &
8880: 26 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32 & xfer.nToken==2
8890: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 . ){. if
88a0: 28 20 67 2e 70 65 72 6d 2e 52 65 61 64 20 29 7b ( g.perm.Read ){
88b0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a . char *z
88c0: 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f 73 74 72 28 Name = blob_str(
88d0: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 &xfer.aToken[1])
88e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e ;. if( zN
88f0: 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 ame[0]=='/' ){.
8900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 /* New
8910: 73 74 79 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 style configurat
8920: 69 6f 6e 20 74 72 61 6e 73 66 65 72 20 2a 2f 0a ion transfer */.
8930: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 67 72 int gr
8940: 6f 75 70 4d 61 73 6b 20 3d 20 63 6f 6e 66 69 67 oupMask = config
8950: 75 72 65 5f 6e 61 6d 65 5f 74 6f 5f 6d 61 73 6b ure_name_to_mask
8960: 28 26 7a 4e 61 6d 65 5b 31 5d 2c 20 30 29 3b 0a (&zName[1], 0);.
8970: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 67 if( !g
8980: 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 29 20 67 72 .perm.Admin ) gr
8990: 6f 75 70 4d 61 73 6b 20 26 3d 20 7e 43 4f 4e 46 oupMask &= ~CONF
89a0: 49 47 53 45 54 5f 55 53 45 52 3b 0a 20 20 20 20 IGSET_USER;.
89b0: 20 20 20 20 20 20 69 66 28 20 21 67 2e 70 65 72 if( !g.per
89c0: 6d 2e 52 64 41 64 64 72 20 29 20 67 72 6f 75 70 m.RdAddr ) group
89d0: 4d 61 73 6b 20 26 3d 20 7e 43 4f 4e 46 49 47 53 Mask &= ~CONFIGS
89e0: 45 54 5f 41 44 44 52 3b 0a 20 20 20 20 20 20 20 ET_ADDR;.
89f0: 20 20 20 63 6f 6e 66 69 67 75 72 65 5f 73 65 6e configure_sen
8a00: 64 5f 67 72 6f 75 70 28 78 66 65 72 2e 70 4f 75 d_group(xfer.pOu
8a10: 74 2c 20 67 72 6f 75 70 4d 61 73 6b 2c 20 30 29 t, groupMask, 0)
8a20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 ;. }else
8a30: 69 66 28 20 63 6f 6e 66 69 67 75 72 65 5f 69 73 if( configure_is
8a40: 5f 65 78 70 6f 72 74 61 62 6c 65 28 7a 4e 61 6d _exportable(zNam
8a50: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 e) ){.
8a60: 2f 2a 20 4f 6c 64 20 73 74 79 6c 65 20 63 6f 6e /* Old style con
8a70: 66 69 67 75 72 61 74 69 6f 6e 20 74 72 61 6e 73 figuration trans
8a80: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 fer */.
8a90: 20 73 65 6e 64 5f 6c 65 67 61 63 79 5f 63 6f 6e send_legacy_con
8aa0: 66 69 67 5f 63 61 72 64 28 26 78 66 65 72 2c 20 fig_card(&xfer,
8ab0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 zName);.
8ac0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 }. }. }e
8ad0: 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 20 20 63 6f lse.. /* co
8ae0: 6e 66 69 67 20 4e 41 4d 45 20 53 49 5a 45 20 5c nfig NAME SIZE \
8af0: 6e 20 43 4f 4e 54 45 4e 54 0a 20 20 20 20 2a 2a n CONTENT. **
8b00: 0a 20 20 20 20 2a 2a 20 52 65 63 65 69 76 65 20 . ** Receive
8b10: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 a configuration
8b20: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 63 value from the c
8b30: 6c 69 65 6e 74 2e 20 20 54 68 69 73 20 69 73 20 lient. This is
8b40: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 65 72 6d only. ** perm
8b50: 69 74 74 65 64 20 66 6f 72 20 68 69 67 68 2d 70 itted for high-p
8b60: 72 69 76 69 6c 65 67 65 20 75 73 65 72 73 2e 0a rivilege users..
8b70: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 */. if( b
8b80: 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f lob_eq(&xfer.aTo
8b90: 6b 65 6e 5b 30 5d 2c 22 63 6f 6e 66 69 67 22 29 ken[0],"config")
8ba0: 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d && xfer.nToken=
8bb0: 3d 33 0a 20 20 20 20 20 20 20 20 26 26 20 62 6c =3. && bl
8bc0: 6f 62 5f 69 73 5f 69 6e 74 28 26 78 66 65 72 2e ob_is_int(&xfer.
8bd0: 61 54 6f 6b 65 6e 5b 32 5d 2c 20 26 73 69 7a 65 aToken[2], &size
8be0: 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 ) ){. const
8bf0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 62 char *zName = b
8c00: 6c 6f 62 5f 73 74 72 28 26 78 66 65 72 2e 61 54 lob_str(&xfer.aT
8c10: 6f 6b 65 6e 5b 31 5d 29 3b 0a 20 20 20 20 20 20 oken[1]);.
8c20: 42 6c 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 Blob content;.
8c30: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 blob_zero(&c
8c40: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 62 ontent);. b
8c50: 6c 6f 62 5f 65 78 74 72 61 63 74 28 78 66 65 72 lob_extract(xfer
8c60: 2e 70 49 6e 2c 20 73 69 7a 65 2c 20 26 63 6f 6e .pIn, size, &con
8c70: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 tent);. if(
8c80: 20 21 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 29 !g.perm.Admin )
8c90: 7b 0a 20 20 20 20 20 20 20 20 63 67 69 5f 72 65 {. cgi_re
8ca0: 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 set_content();.
8cb0: 20 20 20 20 20 20 20 40 20 65 72 72 6f 72 20 6e @ error n
8cc0: 6f 74 5c 73 61 75 74 68 6f 72 69 7a 65 64 5c 73 ot\sauthorized\s
8cd0: 74 6f 5c 73 70 75 73 68 5c 73 63 6f 6e 66 69 67 to\spush\sconfig
8ce0: 75 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 uration.
8cf0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 nErr++;.
8d00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
8d10: 20 20 20 20 20 69 66 28 20 21 72 65 63 76 43 6f if( !recvCo
8d20: 6e 66 69 67 20 26 26 20 7a 4e 61 6d 65 5b 30 5d nfig && zName[0]
8d30: 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20 =='@' ){.
8d40: 20 63 6f 6e 66 69 67 75 72 65 5f 70 72 65 70 61 configure_prepa
8d50: 72 65 5f 74 6f 5f 72 65 63 65 69 76 65 28 30 29 re_to_receive(0)
8d60: 3b 0a 20 20 20 20 20 20 20 20 72 65 63 76 43 6f ;. recvCo
8d70: 6e 66 69 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 nfig = 1;.
8d80: 7d 0a 20 20 20 20 20 20 63 6f 6e 66 69 67 75 72 }. configur
8d90: 65 5f 72 65 63 65 69 76 65 28 7a 4e 61 6d 65 2c e_receive(zName,
8da0: 20 26 63 6f 6e 74 65 6e 74 2c 20 43 4f 4e 46 49 &content, CONFI
8db0: 47 53 45 54 5f 41 4c 4c 29 3b 0a 20 20 20 20 20 GSET_ALL);.
8dc0: 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 63 6f 6e blob_reset(&con
8dd0: 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 62 6c 6f tent);. blo
8de0: 62 5f 73 65 65 6b 28 78 66 65 72 2e 70 49 6e 2c b_seek(xfer.pIn,
8df0: 20 31 2c 20 42 4c 4f 42 5f 53 45 45 4b 5f 43 55 1, BLOB_SEEK_CU
8e00: 52 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 0a R);. }else...
8e10: 0a 20 20 20 20 2f 2a 20 20 20 20 63 6f 6f 6b 69 . /* cooki
8e20: 65 20 54 45 58 54 0a 20 20 20 20 2a 2a 0a 20 20 e TEXT. **.
8e30: 20 20 2a 2a 20 41 20 63 6f 6f 6b 69 65 20 63 6f ** A cookie co
8e40: 6e 74 61 69 6e 73 20 61 20 61 72 62 69 74 72 61 ntains a arbitra
8e50: 72 79 2d 6c 65 6e 67 74 68 20 61 72 67 75 6d 65 ry-length argume
8e60: 6e 74 20 74 68 61 74 20 69 73 20 73 65 72 76 65 nt that is serve
8e70: 72 2d 64 65 66 69 6e 65 64 2e 0a 20 20 20 20 2a r-defined.. *
8e80: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d * The argument m
8e90: 75 73 74 20 62 65 20 65 6e 63 6f 64 65 64 20 73 ust be encoded s
8ea0: 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63 6f 6e 74 o as not to cont
8eb0: 61 69 6e 20 61 6e 79 20 77 68 69 74 65 73 70 61 ain any whitespa
8ec0: 63 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 ce.. ** The s
8ed0: 65 72 76 65 72 20 63 61 6e 20 6f 70 74 69 6f 6e erver can option
8ee0: 61 6c 6c 79 20 73 65 6e 64 20 61 20 63 6f 6f 6b ally send a cook
8ef0: 69 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 ie to the client
8f00: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 20 20 . The client.
8f10: 20 20 2a 2a 20 6d 69 67 68 74 20 74 68 65 6e 20 ** might then
8f20: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 return the same
8f30: 63 6f 6f 6b 69 65 20 62 61 63 6b 20 74 6f 20 74 cookie back to t
8f40: 68 65 20 73 65 72 76 65 72 20 6f 6e 20 69 74 73 he server on its
8f50: 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 6f 6d next. ** com
8f60: 6d 75 6e 69 63 61 74 69 6f 6e 2e 20 20 54 68 65 munication. The
8f70: 20 63 6f 6f 6b 69 65 20 6d 69 67 68 74 20 72 65 cookie might re
8f80: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e cord information
8f90: 20 74 68 61 74 20 68 65 6c 70 73 0a 20 20 20 20 that helps.
8fa0: 2a 2a 20 74 68 65 20 73 65 72 76 65 72 20 6f 70 ** the server op
8fb0: 74 69 6d 69 7a 65 20 61 20 70 75 73 68 20 6f 72 timize a push or
8fc0: 20 70 75 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 pull.. **.
8fd0: 20 20 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 ** The client
8fe0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 is not required
8ff0: 74 6f 20 72 65 74 75 72 6e 20 61 20 63 6f 6f 6b to return a cook
9000: 69 65 2e 20 20 53 6f 20 74 68 65 20 73 65 72 76 ie. So the serv
9010: 65 72 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e er. ** must n
9020: 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 ot depend on the
9030: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 20 63 6f cookie. The co
9040: 6f 6b 69 65 20 73 68 6f 75 6c 64 20 62 65 20 61 okie should be a
9050: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 n optimization.
9060: 20 20 20 2a 2a 20 6f 6e 6c 79 2e 20 20 54 68 65 ** only. The
9070: 20 63 6c 69 65 6e 74 20 6d 69 67 68 74 20 61 6c client might al
9080: 73 6f 20 73 65 6e 64 20 61 20 63 6f 6f 6b 69 65 so send a cookie
9090: 20 74 68 61 74 20 63 61 6d 65 20 66 72 6f 6d 20 that came from
90a0: 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 a different.
90b0: 2a 2a 20 73 65 72 76 65 72 2e 20 20 53 6f 20 74 ** server. So t
90c0: 68 65 20 73 65 72 76 65 72 20 6d 75 73 74 20 62 he server must b
90d0: 65 20 70 72 65 70 61 72 65 64 20 74 6f 20 64 69 e prepared to di
90e0: 73 74 69 6e 67 75 69 73 68 20 69 74 73 20 6f 77 stinguish its ow
90f0: 6e 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 n cookie. **
9100: 66 72 6f 6d 20 63 6f 6f 6b 69 65 73 20 6f 72 69 from cookies ori
9110: 67 69 6e 61 74 69 6e 67 20 66 72 6f 6d 20 6f 74 ginating from ot
9120: 68 65 72 20 73 65 72 76 65 72 73 2e 20 20 54 68 her servers. Th
9130: 65 20 63 6c 69 65 6e 74 20 6d 69 67 68 74 20 73 e client might s
9140: 65 6e 64 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 end. ** back
9150: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e several differen
9160: 74 20 63 6f 6f 6b 69 65 73 20 74 6f 20 74 68 65 t cookies to the
9170: 20 73 65 72 76 65 72 2e 20 20 54 68 65 20 73 65 server. The se
9180: 72 76 65 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 rver should be.
9190: 20 20 20 2a 2a 20 70 72 65 70 61 72 65 64 20 74 ** prepared t
91a0: 6f 20 73 69 66 74 20 74 68 72 6f 75 67 68 20 74 o sift through t
91b0: 68 65 20 63 6f 6f 6b 69 65 73 20 61 6e 64 20 70 he cookies and p
91c0: 69 63 6b 20 74 68 65 20 6f 6e 65 20 74 68 61 74 ick the one that
91d0: 20 69 74 20 77 61 6e 74 73 2e 0a 20 20 20 20 2a it wants.. *
91e0: 2f 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 /. if( blob_e
91f0: 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 q(&xfer.aToken[0
9200: 5d 2c 20 22 63 6f 6f 6b 69 65 22 29 20 26 26 20 ], "cookie") &&
9210: 78 66 65 72 2e 6e 54 6f 6b 65 6e 3d 3d 32 20 29 xfer.nToken==2 )
9220: 7b 0a 20 20 20 20 20 20 2f 2a 20 50 72 6f 63 65 {. /* Proce
9230: 73 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 2a 2f ss the cookie */
9240: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 20 . }else...
9250: 20 2f 2a 20 20 20 20 70 72 69 76 61 74 65 0a 20 /* private.
9260: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 **. ** Thi
9270: 73 20 63 61 72 64 20 69 6e 64 69 63 61 74 65 73 s card indicates
9280: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 22 that the next "
9290: 66 69 6c 65 22 20 6f 72 20 22 63 66 69 6c 65 22 file" or "cfile"
92a0: 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 0a 20 20 will contain.
92b0: 20 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 6e ** private con
92c0: 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 tent.. */.
92d0: 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 if( blob_eq(&xf
92e0: 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 70 er.aToken[0], "p
92f0: 72 69 76 61 74 65 22 29 20 29 7b 0a 20 20 20 20 rivate") ){.
9300: 20 20 69 66 28 20 21 67 2e 70 65 72 6d 2e 50 72 if( !g.perm.Pr
9310: 69 76 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 ivate ){.
9320: 20 73 65 72 76 65 72 5f 70 72 69 76 61 74 65 5f server_private_
9330: 78 66 65 72 5f 6e 6f 74 5f 61 75 74 68 6f 72 69 xfer_not_authori
9340: 7a 65 64 28 29 3b 0a 20 20 20 20 20 20 7d 65 6c zed();. }el
9350: 73 65 7b 0a 20 20 20 20 20 20 20 20 78 66 65 72 se{. xfer
9360: 2e 6e 65 78 74 49 73 50 72 69 76 61 74 65 20 3d .nextIsPrivate =
9370: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 1;. }.
9380: 7d 65 6c 73 65 0a 0a 0a 20 20 20 20 2f 2a 20 20 }else... /*
9390: 20 20 70 72 61 67 6d 61 20 4e 41 4d 45 20 56 41 pragma NAME VA
93a0: 4c 55 45 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 LUE.... **.
93b0: 20 20 2a 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 ** The client
93c0: 69 73 73 75 65 20 70 72 61 67 6d 61 73 20 74 6f issue pragmas to
93d0: 20 74 72 79 20 74 6f 20 69 6e 66 6c 75 65 6e 63 try to influenc
93e0: 65 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f e the behavior o
93f0: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 65 72 f the. ** ser
9400: 76 65 72 2e 20 20 54 68 65 73 65 20 61 72 65 20 ver. These are
9410: 72 65 71 75 65 73 74 73 20 6f 6e 6c 79 2e 20 20 requests only.
9420: 55 6e 6b 6e 6f 77 6e 20 70 72 61 67 6d 61 73 20 Unknown pragmas
9430: 61 72 65 20 73 69 6c 65 6e 74 6c 79 0a 20 20 20 are silently.
9440: 20 2a 2a 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 ** ignored..
9450: 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 6c 6f 62 */. if( blob
9460: 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e _eq(&xfer.aToken
9470: 5b 30 5d 2c 20 22 70 72 61 67 6d 61 22 29 20 26 [0], "pragma") &
9480: 26 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3e 3d 32 & xfer.nToken>=2
9490: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20 20 70 ){. /* p
94a0: 72 61 67 6d 61 20 73 65 6e 64 2d 70 72 69 76 61 ragma send-priva
94b0: 74 65 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 te. **.
94c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 ** If the user
94d0: 20 68 61 73 20 74 68 65 20 22 78 22 20 70 72 69 has the "x" pri
94e0: 76 69 6c 65 67 65 20 28 77 68 69 63 68 20 6d 75 vilege (which mu
94f0: 73 74 20 62 65 20 73 65 74 20 65 78 70 6c 69 63 st be set explic
9500: 69 74 6c 79 20 2d 0a 20 20 20 20 20 20 2a 2a 20 itly -. **
9510: 69 74 20 69 73 20 6e 6f 74 20 61 75 74 6f 6d 61 it is not automa
9520: 74 69 63 20 77 69 74 68 20 22 61 22 20 6f 72 20 tic with "a" or
9530: 22 73 22 29 20 74 68 65 6e 20 74 68 69 73 20 70 "s") then this p
9540: 72 61 67 6d 61 20 63 61 75 73 65 73 0a 20 20 20 ragma causes.
9550: 20 20 20 2a 2a 20 70 72 69 76 61 74 65 20 69 6e ** private in
9560: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 62 65 20 formation to be
9570: 70 75 6c 6c 65 64 20 69 6e 20 61 64 64 69 74 69 pulled in additi
9580: 6f 6e 20 74 6f 20 70 75 62 6c 69 63 20 72 65 63 on to public rec
9590: 6f 72 64 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 ords.. */.
95a0: 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 if( blob_eq
95b0: 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d (&xfer.aToken[1]
95c0: 2c 20 22 73 65 6e 64 2d 70 72 69 76 61 74 65 22 , "send-private"
95d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 6f 67 ) ){. log
95e0: 69 6e 5f 63 68 65 63 6b 5f 63 72 65 64 65 6e 74 in_check_credent
95f0: 69 61 6c 73 28 29 3b 0a 20 20 20 20 20 20 20 20 ials();.
9600: 69 66 28 20 21 67 2e 70 65 72 6d 2e 50 72 69 76 if( !g.perm.Priv
9610: 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ate ){.
9620: 20 73 65 72 76 65 72 5f 70 72 69 76 61 74 65 5f server_private_
9630: 78 66 65 72 5f 6e 6f 74 5f 61 75 74 68 6f 72 69 xfer_not_authori
9640: 7a 65 64 28 29 3b 0a 20 20 20 20 20 20 20 20 7d zed();. }
9650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
9660: 78 66 65 72 2e 73 79 6e 63 50 72 69 76 61 74 65 xfer.syncPrivate
9670: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a = 1;. }.
9680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a }. /*
9690: 20 20 20 70 72 61 67 6d 61 20 73 65 6e 64 2d 63 pragma send-c
96a0: 61 74 61 6c 6f 67 0a 20 20 20 20 20 20 2a 2a 0a atalog. **.
96b0: 20 20 20 20 20 20 2a 2a 20 53 65 6e 64 20 69 67 ** Send ig
96c0: 6f 74 20 63 61 72 64 73 20 66 6f 72 20 61 6c 6c ot cards for all
96d0: 20 6b 6e 6f 77 6e 20 61 72 74 69 66 61 63 74 73 known artifacts
96e0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 .. */.
96f0: 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 if( blob_eq(&xf
9700: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 22 73 er.aToken[1], "s
9710: 65 6e 64 2d 63 61 74 61 6c 6f 67 22 29 20 29 7b end-catalog") ){
9720: 0a 20 20 20 20 20 20 20 20 78 66 65 72 2e 72 65 . xfer.re
9730: 73 79 6e 63 20 3d 20 30 78 37 66 66 66 66 66 66 sync = 0x7ffffff
9740: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d f;. }. }
9750: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 55 6e 6b else.. /* Unk
9760: 6e 6f 77 6e 20 6d 65 73 73 61 67 65 0a 20 20 20 nown message.
9770: 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 */. {.
9780: 63 67 69 5f 72 65 73 65 74 5f 63 6f 6e 74 65 6e cgi_reset_conten
9790: 74 28 29 3b 0a 20 20 20 20 20 20 40 20 65 72 72 t();. @ err
97a0: 6f 72 20 62 61 64 5c 73 63 6f 6d 6d 61 6e 64 3a or bad\scommand:
97b0: 5c 73 25 46 28 62 6c 6f 62 5f 73 74 72 28 26 78 \s%F(blob_str(&x
97c0: 66 65 72 2e 6c 69 6e 65 29 29 0a 20 20 20 20 7d fer.line)). }
97d0: 0a 20 20 20 20 62 6c 6f 62 61 72 72 61 79 5f 72 . blobarray_r
97e0: 65 73 65 74 28 78 66 65 72 2e 61 54 6f 6b 65 6e eset(xfer.aToken
97f0: 2c 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 29 3b 0a , xfer.nToken);.
9800: 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 26 blob_reset(&
9810: 78 66 65 72 2e 6c 69 6e 65 29 3b 0a 20 20 7d 0a xfer.line);. }.
9820: 20 20 69 66 28 20 69 73 50 75 73 68 20 29 7b 0a if( isPush ){.
9830: 20 20 20 20 69 66 28 20 72 63 3d 3d 54 48 5f 4f if( rc==TH_O
9840: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 K ){. rc =
9850: 78 66 65 72 5f 72 75 6e 5f 73 63 72 69 70 74 28 xfer_run_script(
9860: 7a 53 63 72 69 70 74 2c 20 7a 55 75 69 64 4c 69 zScript, zUuidLi
9870: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 st, 1);. if
9880: 28 20 72 63 3d 3d 54 48 5f 45 52 52 4f 52 20 29 ( rc==TH_ERROR )
9890: 7b 0a 20 20 20 20 20 20 20 20 63 67 69 5f 72 65 {. cgi_re
98a0: 73 65 74 5f 63 6f 6e 74 65 6e 74 28 29 3b 0a 20 set_content();.
98b0: 20 20 20 20 20 20 20 40 20 65 72 72 6f 72 20 70 @ error p
98c0: 75 73 68 5c 73 73 63 72 69 70 74 5c 73 66 61 69 ush\sscript\sfai
98d0: 6c 65 64 3a 5c 73 25 46 28 67 2e 7a 45 72 72 4d led:\s%F(g.zErrM
98e0: 73 67 29 0a 20 20 20 20 20 20 20 20 6e 45 72 72 sg). nErr
98f0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ++;. }.
9900: 7d 0a 20 20 20 20 72 65 71 75 65 73 74 5f 70 68 }. request_ph
9910: 61 6e 74 6f 6d 73 28 26 78 66 65 72 2c 20 35 30 antoms(&xfer, 50
9920: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 55 0);. }. if( zU
9930: 75 69 64 4c 69 73 74 20 29 7b 0a 20 20 20 20 54 uidList ){. T
9940: 68 5f 46 72 65 65 28 67 2e 69 6e 74 65 72 70 2c h_Free(g.interp,
9950: 20 7a 55 75 69 64 4c 69 73 74 29 3b 0a 20 20 7d zUuidList);. }
9960: 0a 20 20 69 66 28 20 69 73 43 6c 6f 6e 65 20 26 . if( isClone &
9970: 26 20 6e 47 69 6d 6d 65 3d 3d 30 20 29 7b 0a 20 & nGimme==0 ){.
9980: 20 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 /* The initia
9990: 6c 20 22 63 6c 6f 6e 65 22 20 6d 65 73 73 61 67 l "clone" messag
99a0: 65 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 74 6f e from client to
99b0: 20 73 65 72 76 65 72 20 63 6f 6e 74 61 69 6e 73 server contains
99c0: 20 6e 6f 0a 20 20 20 20 2a 2a 20 22 67 69 6d 6d no. ** "gimm
99d0: 65 22 20 63 61 72 64 73 2e 20 4f 6e 20 74 68 61 e" cards. On tha
99e0: 74 20 69 6e 69 74 69 61 6c 20 6d 65 73 73 61 67 t initial messag
99f0: 65 2c 20 73 65 6e 64 20 74 68 65 20 63 6c 69 65 e, send the clie
9a00: 6e 74 20 61 6e 20 22 69 67 6f 74 22 0a 20 20 20 nt an "igot".
9a10: 20 2a 2a 20 63 61 72 64 20 66 6f 72 20 65 76 65 ** card for eve
9a20: 72 79 20 61 72 74 69 66 61 63 74 20 63 75 72 72 ry artifact curr
9a30: 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 72 65 70 ently in the rep
9a40: 6f 73 69 74 6f 72 79 2e 20 20 54 68 69 73 20 77 ository. This w
9a50: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 ill. ** cause
9a60: 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 the client to c
9a70: 72 65 61 74 65 20 70 68 61 6e 74 6f 6d 73 20 66 reate phantoms f
9a80: 6f 72 20 61 6c 6c 20 61 72 74 69 66 61 63 74 73 or all artifacts
9a90: 2c 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 , which will.
9aa0: 20 2a 2a 20 69 6e 20 74 75 72 6e 20 6d 61 6b 65 ** in turn make
9ab0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 65 sure that the e
9ac0: 6e 74 69 72 65 20 72 65 70 6f 73 69 74 6f 72 79 ntire repository
9ad0: 20 69 73 20 73 65 6e 74 20 65 66 66 69 63 69 65 is sent efficie
9ae0: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 61 6e 64 20 ntly. ** and
9af0: 65 78 70 65 64 69 74 69 6f 75 73 6c 79 2e 0a 20 expeditiously..
9b00: 20 20 20 2a 2f 0a 20 20 20 20 73 65 6e 64 5f 61 */. send_a
9b10: 6c 6c 28 26 78 66 65 72 29 3b 0a 20 20 20 20 69 ll(&xfer);. i
9b20: 66 28 20 78 66 65 72 2e 73 79 6e 63 50 72 69 76 f( xfer.syncPriv
9b30: 61 74 65 20 29 20 73 65 6e 64 5f 70 72 69 76 61 ate ) send_priva
9b40: 74 65 28 26 78 66 65 72 29 3b 0a 20 20 7d 65 6c te(&xfer);. }el
9b50: 73 65 20 69 66 28 20 69 73 50 75 6c 6c 20 29 7b se if( isPull ){
9b60: 0a 20 20 20 20 63 72 65 61 74 65 5f 63 6c 75 73 . create_clus
9b70: 74 65 72 28 29 3b 0a 20 20 20 20 73 65 6e 64 5f ter();. send_
9b80: 75 6e 63 6c 75 73 74 65 72 65 64 28 26 78 66 65 unclustered(&xfe
9b90: 72 29 3b 0a 20 20 20 20 69 66 28 20 78 66 65 72 r);. if( xfer
9ba0: 2e 73 79 6e 63 50 72 69 76 61 74 65 20 29 20 73 .syncPrivate ) s
9bb0: 65 6e 64 5f 70 72 69 76 61 74 65 28 26 78 66 65 end_private(&xfe
9bc0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 r);. }. if( re
9bd0: 63 76 43 6f 6e 66 69 67 20 29 7b 0a 20 20 20 20 cvConfig ){.
9be0: 63 6f 6e 66 69 67 75 72 65 5f 66 69 6e 61 6c 69 configure_finali
9bf0: 7a 65 5f 72 65 63 65 69 76 65 28 29 3b 0a 20 20 ze_receive();.
9c00: 7d 0a 20 20 64 62 5f 6d 75 6c 74 69 5f 65 78 65 }. db_multi_exe
9c10: 63 28 22 44 52 4f 50 20 54 41 42 4c 45 20 6f 6e c("DROP TABLE on
9c20: 72 65 6d 6f 74 65 22 29 3b 0a 20 20 6d 61 6e 69 remote");. mani
9c30: 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 5f 65 fest_crosslink_e
9c40: 6e 64 28 4d 43 5f 50 45 52 4d 49 54 5f 48 4f 4f nd(MC_PERMIT_HOO
9c50: 4b 53 29 3b 0a 0a 20 20 2f 2a 20 53 65 6e 64 20 KS);.. /* Send
9c60: 74 68 65 20 73 65 72 76 65 72 20 74 69 6d 65 73 the server times
9c70: 74 61 6d 70 20 6c 61 73 74 2c 20 69 6e 20 63 61 tamp last, in ca
9c80: 73 65 20 70 72 69 6f 72 20 70 72 6f 63 65 73 73 se prior process
9c90: 69 6e 67 20 68 61 70 70 65 6e 65 64 0a 20 20 2a ing happened. *
9ca0: 2a 20 74 6f 20 75 73 65 20 75 70 20 61 20 73 69 * to use up a si
9cb0: 67 6e 69 66 69 63 61 6e 74 20 66 72 61 63 74 69 gnificant fracti
9cc0: 6f 6e 20 6f 66 20 6f 75 72 20 74 69 6d 65 20 77 on of our time w
9cd0: 69 6e 64 6f 77 2e 0a 20 20 2a 2f 0a 20 20 7a 4e indow.. */. zN
9ce0: 6f 77 20 3d 20 64 62 5f 74 65 78 74 28 30 2c 20 ow = db_text(0,
9cf0: 22 53 45 4c 45 43 54 20 73 74 72 66 74 69 6d 65 "SELECT strftime
9d00: 28 27 25 25 59 2d 25 25 6d 2d 25 25 64 54 25 25 ('%%Y-%%m-%%dT%%
9d10: 48 3a 25 25 4d 3a 25 25 53 27 2c 20 27 6e 6f 77 H:%%M:%%S', 'now
9d20: 27 29 22 29 3b 0a 20 20 40 20 23 20 74 69 6d 65 ')");. @ # time
9d30: 73 74 61 6d 70 20 25 73 28 7a 4e 6f 77 29 0a 20 stamp %s(zNow).
9d40: 20 66 72 65 65 28 7a 4e 6f 77 29 3b 0a 0a 20 20 free(zNow);..
9d50: 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 db_end_transacti
9d60: 6f 6e 28 30 29 3b 0a 20 20 63 6f 6e 66 69 67 75 on(0);. configu
9d70: 72 65 5f 72 65 62 75 69 6c 64 28 29 3b 0a 7d 0a re_rebuild();.}.
9d80: 0a 2f 2a 0a 2a 2a 20 43 4f 4d 4d 41 4e 44 3a 20 ./*.** COMMAND:
9d90: 74 65 73 74 2d 78 66 65 72 0a 2a 2a 0a 2a 2a 20 test-xfer.**.**
9da0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 This command is
9db0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 used for debuggi
9dc0: 6e 67 20 74 68 65 20 73 65 72 76 65 72 2e 20 20 ng the server.
9dd0: 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67 6c There is a singl
9de0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 77 68 e.** argument wh
9df0: 69 63 68 20 69 73 20 74 68 65 20 75 6e 63 6f 6d ich is the uncom
9e00: 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 20 pressed content
9e10: 6f 66 20 61 6e 20 22 78 66 65 72 22 20 6d 65 73 of an "xfer" mes
9e20: 73 61 67 65 0a 2a 2a 20 66 72 6f 6d 20 63 6c 69 sage.** from cli
9e30: 65 6e 74 20 74 6f 20 73 65 72 76 65 72 2e 20 20 ent to server.
9e40: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 This command int
9e50: 65 72 70 72 65 74 73 20 74 68 61 74 20 6d 65 73 erprets that mes
9e60: 73 61 67 65 20 61 73 0a 2a 2a 20 69 66 20 68 61 sage as.** if ha
9e70: 64 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 20 d been received
9e80: 62 79 20 74 68 65 20 73 65 72 76 65 72 2e 0a 2a by the server..*
9e90: 2a 0a 2a 2a 20 4f 6e 20 74 68 65 20 63 6c 69 65 *.** On the clie
9ea0: 6e 74 20 73 69 64 65 2c 20 72 75 6e 3a 0a 2a 2a nt side, run:.**
9eb0: 0a 2a 2a 20 20 20 20 20 20 66 6f 73 73 69 6c 20 .** fossil
9ec0: 70 75 73 68 20 68 74 74 70 3a 2f 2f 62 6f 67 75 push http://bogu
9ed0: 73 2f 20 2d 2d 68 74 74 70 74 72 61 63 65 0a 2a s/ --httptrace.*
9ee0: 2a 0a 2a 2a 20 4f 72 20 61 20 73 69 6d 69 6c 61 *.** Or a simila
9ef0: 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 70 72 6f r command to pro
9f00: 76 69 64 65 20 74 68 65 20 6f 75 74 70 75 74 2e vide the output.
9f10: 20 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 The content of
9f20: 20 74 68 65 0a 2a 2a 20 6d 65 73 73 61 67 65 20 the.** message
9f30: 77 69 6c 6c 20 61 70 70 65 61 72 20 6f 6e 20 73 will appear on s
9f40: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 20 tandard output.
9f50: 20 43 61 70 74 75 72 65 20 74 68 69 73 20 6d 65 Capture this me
9f60: 73 73 61 67 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 ssage.** into a
9f70: 66 69 6c 65 20 6e 61 6d 65 64 20 28 66 6f 72 20 file named (for
9f80: 65 78 61 6d 70 6c 65 29 20 6f 75 74 2e 74 78 74 example) out.txt
9f90: 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 0a . Then run the.
9fa0: 2a 2a 20 73 65 72 76 65 72 20 69 6e 20 67 64 62 ** server in gdb
9fb0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 64 62 20 :.**.** gdb
9fc0: 66 6f 73 73 69 6c 0a 2a 2a 20 20 20 20 20 72 20 fossil.** r
9fd0: 74 65 73 74 2d 78 66 65 72 20 6f 75 74 2e 74 78 test-xfer out.tx
9fe0: 74 0a 2a 2f 0a 76 6f 69 64 20 63 6d 64 5f 74 65 t.*/.void cmd_te
9ff0: 73 74 5f 78 66 65 72 28 76 6f 69 64 29 7b 0a 20 st_xfer(void){.
a000: 20 64 62 5f 66 69 6e 64 5f 61 6e 64 5f 6f 70 65 db_find_and_ope
a010: 6e 5f 72 65 70 6f 73 69 74 6f 72 79 28 30 2c 30 n_repository(0,0
a020: 29 3b 0a 20 20 69 66 28 20 67 2e 61 72 67 63 21 );. if( g.argc!
a030: 3d 32 20 26 26 20 67 2e 61 72 67 63 21 3d 33 20 =2 && g.argc!=3
a040: 29 7b 0a 20 20 20 20 75 73 61 67 65 28 22 3f 4d ){. usage("?M
a050: 45 53 53 41 47 45 46 49 4c 45 3f 22 29 3b 0a 20 ESSAGEFILE?");.
a060: 20 7d 0a 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 }. blob_zero(&
a070: 67 2e 63 67 69 49 6e 29 3b 0a 20 20 62 6c 6f 62 g.cgiIn);. blob
a080: 5f 72 65 61 64 5f 66 72 6f 6d 5f 66 69 6c 65 28 _read_from_file(
a090: 26 67 2e 63 67 69 49 6e 2c 20 67 2e 61 72 67 63 &g.cgiIn, g.argc
a0a0: 3d 3d 32 20 3f 20 22 2d 22 20 3a 20 67 2e 61 72 ==2 ? "-" : g.ar
a0b0: 67 76 5b 32 5d 29 3b 0a 20 20 64 69 73 61 62 6c gv[2]);. disabl
a0c0: 65 4c 6f 67 69 6e 20 3d 20 31 3b 0a 20 20 70 61 eLogin = 1;. pa
a0d0: 67 65 5f 78 66 65 72 28 29 3b 0a 20 20 66 6f 73 ge_xfer();. fos
a0e0: 73 69 6c 5f 70 72 69 6e 74 28 22 25 73 5c 6e 22 sil_print("%s\n"
a0f0: 2c 20 63 67 69 5f 65 78 74 72 61 63 74 5f 63 6f , cgi_extract_co
a100: 6e 74 65 6e 74 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a ntent());.}../*.
a110: 2a 2a 20 46 6f 72 6d 61 74 20 73 74 72 69 6e 67 ** Format string
a120: 73 20 66 6f 72 20 70 72 6f 67 72 65 73 73 20 72 s for progress r
a130: 65 70 6f 72 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 eporting..*/.sta
a140: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a tic const char z
a150: 4c 61 62 65 6c 46 6f 72 6d 61 74 5b 5d 20 3d 20 LabelFormat[] =
a160: 22 25 2d 31 30 73 20 25 31 30 73 20 25 31 30 73 "%-10s %10s %10s
a170: 20 25 31 30 73 20 25 31 30 73 5c 6e 22 3b 0a 73 %10s %10s\n";.s
a180: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
a190: 20 7a 56 61 6c 75 65 46 6f 72 6d 61 74 5b 5d 20 zValueFormat[]
a1a0: 3d 20 22 5c 72 25 2d 31 30 73 20 25 31 30 64 20 = "\r%-10s %10d
a1b0: 25 31 30 64 20 25 31 30 64 20 25 31 30 64 5c 6e %10d %10d %10d\n
a1c0: 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 ";.static const
a1d0: 63 68 61 72 20 7a 42 72 69 65 66 46 6f 72 6d 61 char zBriefForma
a1e0: 74 5b 5d 20 3d 0a 20 20 20 22 52 6f 75 6e 64 2d t[] =. "Round-
a1f0: 74 72 69 70 73 3a 20 25 64 20 20 20 41 72 74 69 trips: %d Arti
a200: 66 61 63 74 73 20 73 65 6e 74 3a 20 25 64 20 20 facts sent: %d
a210: 72 65 63 65 69 76 65 64 3a 20 25 64 5c 72 22 3b received: %d\r";
a220: 0a 0a 23 69 66 20 49 4e 54 45 52 46 41 43 45 0a ..#if INTERFACE.
a230: 2f 2a 0a 2a 2a 20 46 6c 61 67 20 6f 70 74 69 6f /*.** Flag optio
a240: 6e 73 20 66 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69 ns for controlli
a250: 6e 67 20 63 6c 69 65 6e 74 5f 73 79 6e 63 28 29 ng client_sync()
a260: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 59 4e 43 .*/.#define SYNC
a270: 5f 50 55 53 48 20 20 20 20 20 20 30 78 30 30 30 _PUSH 0x000
a280: 31 0a 23 64 65 66 69 6e 65 20 53 59 4e 43 5f 50 1.#define SYNC_P
a290: 55 4c 4c 20 20 20 20 20 20 30 78 30 30 30 32 0a ULL 0x0002.
a2a0: 23 64 65 66 69 6e 65 20 53 59 4e 43 5f 43 4c 4f #define SYNC_CLO
a2b0: 4e 45 20 20 20 20 20 30 78 30 30 30 34 0a 23 64 NE 0x0004.#d
a2c0: 65 66 69 6e 65 20 53 59 4e 43 5f 50 52 49 56 41 efine SYNC_PRIVA
a2d0: 54 45 20 20 20 30 78 30 30 30 38 0a 23 64 65 66 TE 0x0008.#def
a2e0: 69 6e 65 20 53 59 4e 43 5f 56 45 52 42 4f 53 45 ine SYNC_VERBOSE
a2f0: 20 20 20 30 78 30 30 31 30 0a 23 64 65 66 69 6e 0x0010.#defin
a300: 65 20 53 59 4e 43 5f 52 45 53 59 4e 43 20 20 20 e SYNC_RESYNC
a310: 20 30 78 30 30 32 30 0a 23 65 6e 64 69 66 0a 0a 0x0020.#endif..
a320: 2f 2a 0a 2a 2a 20 46 6c 6f 61 74 69 6e 67 2d 70 /*.** Floating-p
a330: 6f 69 6e 74 20 61 62 73 6f 6c 75 74 65 20 76 61 oint absolute va
a340: 6c 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f lue.*/.static do
a350: 75 62 6c 65 20 66 6f 73 73 69 6c 5f 66 61 62 73 uble fossil_fabs
a360: 28 64 6f 75 62 6c 65 20 78 29 7b 0a 20 20 72 65 (double x){. re
a370: 74 75 72 6e 20 78 3e 30 2e 30 20 3f 20 78 20 3a turn x>0.0 ? x :
a380: 20 2d 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 -x;.}../*.** Sy
a390: 6e 63 20 74 6f 20 74 68 65 20 68 6f 73 74 20 69 nc to the host i
a3a0: 64 65 6e 74 69 66 69 65 64 20 69 6e 20 67 2e 75 dentified in g.u
a3b0: 72 6c 2e 6e 61 6d 65 20 61 6e 64 20 67 2e 75 72 rl.name and g.ur
a3c0: 6c 2e 70 61 74 68 2e 20 20 54 68 69 73 0a 2a 2a l.path. This.**
a3d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c routine is call
a3e0: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 ed by the client
a3f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 63 6f 72 64 73 20 ..**.** Records
a400: 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 74 68 are pushed to th
a410: 65 20 73 65 72 76 65 72 20 69 66 20 70 75 73 68 e server if push
a420: 46 6c 61 67 20 69 73 20 74 72 75 65 2e 20 20 52 Flag is true. R
a430: 65 63 6f 72 64 73 0a 2a 2a 20 61 72 65 20 70 75 ecords.** are pu
a440: 6c 6c 65 64 20 69 66 20 70 75 6c 6c 46 6c 61 67 lled if pullFlag
a450: 20 69 73 20 74 72 75 65 2e 20 20 41 20 66 75 6c is true. A ful
a460: 6c 20 73 79 6e 63 20 6f 63 63 75 72 73 20 69 66 l sync occurs if
a470: 20 62 6f 74 68 20 61 72 65 0a 2a 2a 20 74 72 75 both are.** tru
a480: 65 2e 0a 2a 2f 0a 69 6e 74 20 63 6c 69 65 6e 74 e..*/.int client
a490: 5f 73 79 6e 63 28 0a 20 20 75 6e 73 69 67 6e 65 _sync(. unsigne
a4a0: 64 20 73 79 6e 63 46 6c 61 67 73 2c 20 20 20 20 d syncFlags,
a4b0: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 53 59 4e 43 /* Mask of SYNC
a4c0: 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75 6e _* flags */. un
a4d0: 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 52 63 76 signed configRcv
a4e0: 4d 61 73 6b 2c 20 2f 2a 20 52 65 63 65 69 76 65 Mask, /* Receive
a4f0: 20 74 68 65 73 65 20 63 6f 6e 66 69 67 75 72 61 these configura
a500: 74 69 6f 6e 20 69 74 65 6d 73 20 2a 2f 0a 20 20 tion items */.
a510: 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 53 unsigned configS
a520: 65 6e 64 4d 61 73 6b 20 2f 2a 20 53 65 6e 64 20 endMask /* Send
a530: 74 68 65 73 65 20 63 6f 6e 66 69 67 75 72 61 74 these configurat
a540: 69 6f 6e 20 69 74 65 6d 73 20 2a 2f 0a 29 7b 0a ion items */.){.
a550: 20 20 69 6e 74 20 67 6f 20 3d 20 31 3b 20 20 20 int go = 1;
a560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f /* Loo
a570: 70 20 75 6e 74 69 6c 20 7a 65 72 6f 20 2a 2f 0a p until zero */.
a580: 20 20 69 6e 74 20 6e 43 61 72 64 53 65 6e 74 20 int nCardSent
a590: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d = 0; /* Num
a5a0: 62 65 72 20 6f 66 20 63 61 72 64 73 20 73 65 6e ber of cards sen
a5b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 61 72 64 t */. int nCard
a5c0: 52 63 76 64 20 3d 20 30 3b 20 20 20 20 20 20 2f Rcvd = 0; /
a5d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 72 64 * Number of card
a5e0: 73 20 72 65 63 65 69 76 65 64 20 2a 2f 0a 20 20 s received */.
a5f0: 69 6e 74 20 6e 43 79 63 6c 65 20 3d 20 30 3b 20 int nCycle = 0;
a600: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
a610: 72 20 6f 66 20 72 6f 75 6e 64 20 74 72 69 70 73 r of round trips
a620: 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 20 2a to the server *
a630: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 /. int size;
a640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
a650: 69 7a 65 20 6f 66 20 61 20 63 6f 6e 66 69 67 20 ize of a config
a660: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6f value */. int o
a670: 72 69 67 43 6f 6e 66 69 67 52 63 76 4d 61 73 6b rigConfigRcvMask
a680: 3b 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 ; /* Original v
a690: 61 6c 75 65 20 6f 66 20 63 6f 6e 66 69 67 52 63 alue of configRc
a6a0: 76 4d 61 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e vMask */. int n
a6b0: 46 69 6c 65 52 65 63 76 3b 20 20 20 20 20 20 20 FileRecv;
a6c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
a6d0: 66 69 6c 65 73 20 72 65 63 65 69 76 65 64 20 2a files received *
a6e0: 2f 0a 20 20 69 6e 74 20 6d 78 50 68 61 6e 74 6f /. int mxPhanto
a6f0: 6d 52 65 71 20 3d 20 32 30 30 3b 20 2f 2a 20 4d mReq = 200; /* M
a700: 61 78 20 6e 75 6d 62 65 72 20 6f 66 20 70 68 61 ax number of pha
a710: 6e 74 6f 6d 73 20 74 6f 20 72 65 71 75 65 73 74 ntoms to request
a720: 20 70 65 72 20 63 6f 6d 6d 20 2a 2f 0a 20 20 63 per comm */. c
a730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6f 6b onst char *zCook
a740: 69 65 3b 20 20 20 20 2f 2a 20 53 65 72 76 65 72 ie; /* Server
a750: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 69 36 34 cookie */. i64
a760: 20 6e 53 65 6e 74 2c 20 6e 52 63 76 64 3b 20 20 nSent, nRcvd;
a770: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 73 65 /* Bytes se
a780: 6e 74 20 61 6e 64 20 72 65 63 65 69 76 65 64 20 nt and received
a790: 28 61 66 74 65 72 20 63 6f 6d 70 72 65 73 73 69 (after compressi
a7a0: 6f 6e 29 20 2a 2f 0a 20 20 69 6e 74 20 63 6c 6f on) */. int clo
a7b0: 6e 65 53 65 71 6e 6f 20 3d 20 31 3b 20 20 20 20 neSeqno = 1;
a7c0: 20 2f 2a 20 53 65 71 75 65 6e 63 65 20 6e 75 6d /* Sequence num
a7d0: 62 65 72 20 66 6f 72 20 63 6c 6f 6e 65 73 20 2a ber for clones *
a7e0: 2f 0a 20 20 42 6c 6f 62 20 73 65 6e 64 3b 20 20 /. Blob send;
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
a800: 65 78 74 20 77 65 20 61 72 65 20 73 65 6e 64 69 ext we are sendi
a810: 6e 67 20 74 6f 20 74 68 65 20 73 65 72 76 65 72 ng to the server
a820: 20 2a 2f 0a 20 20 42 6c 6f 62 20 72 65 63 76 3b */. Blob recv;
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
a840: 20 52 65 70 6c 79 20 77 65 20 67 6f 74 20 62 61 Reply we got ba
a850: 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 65 72 76 ck from the serv
a860: 65 72 20 2a 2f 0a 20 20 58 66 65 72 20 78 66 65 er */. Xfer xfe
a870: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
a880: 2f 2a 20 54 72 61 6e 73 66 65 72 20 64 61 74 61 /* Transfer data
a890: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 74 44 6f 6e */. int pctDon
a8a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a e; /*
a8b0: 20 50 65 72 63 65 6e 74 61 67 65 20 64 6f 6e 65 Percentage done
a8c0: 20 77 69 74 68 20 61 20 6d 65 73 73 61 67 65 20 with a message
a8d0: 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74 50 63 74 */. int lastPct
a8e0: 44 6f 6e 65 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 Done = -1; /*
a8f0: 4c 61 73 74 20 64 69 73 70 6c 61 79 65 64 20 70 Last displayed p
a900: 63 74 44 6f 6e 65 20 2a 2f 0a 20 20 64 6f 75 62 ctDone */. doub
a910: 6c 65 20 72 41 72 72 69 76 61 6c 54 69 6d 65 3b le rArrivalTime;
a920: 20 20 20 20 2f 2a 20 54 69 6d 65 20 61 74 20 77 /* Time at w
a930: 68 69 63 68 20 61 20 6d 65 73 73 61 67 65 20 61 hich a message a
a940: 72 72 69 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 rrived */. cons
a950: 74 20 63 68 61 72 20 2a 7a 53 43 6f 64 65 20 3d t char *zSCode =
a960: 20 64 62 5f 67 65 74 28 22 73 65 72 76 65 72 2d db_get("server-
a970: 63 6f 64 65 22 2c 20 22 78 22 29 3b 0a 20 20 63 code", "x");. c
a980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 43 6f 64 onst char *zPCod
a990: 65 20 3d 20 64 62 5f 67 65 74 28 22 70 72 6f 6a e = db_get("proj
a9a0: 65 63 74 2d 63 6f 64 65 22 2c 20 30 29 3b 0a 20 ect-code", 0);.
a9b0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 int nErr = 0;
a9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
a9d0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a er of errors */.
a9e0: 20 20 69 6e 74 20 6e 52 6f 75 6e 64 74 72 69 70 int nRoundtrip
a9f0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d = 0; /* Num
aa00: 62 65 72 20 6f 66 20 48 54 54 50 20 72 65 71 75 ber of HTTP requ
aa10: 65 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 ests */. int nA
aa20: 72 74 69 66 61 63 74 53 65 6e 74 20 3d 20 30 3b rtifactSent = 0;
aa30: 20 20 2f 2a 20 54 6f 74 61 6c 20 61 72 74 69 66 /* Total artif
aa40: 61 63 74 73 20 73 65 6e 74 20 2a 2f 0a 20 20 69 acts sent */. i
aa50: 6e 74 20 6e 41 72 74 69 66 61 63 74 52 63 76 64 nt nArtifactRcvd
aa60: 20 3d 20 30 3b 20 20 2f 2a 20 54 6f 74 61 6c 20 = 0; /* Total
aa70: 61 72 74 69 66 61 63 74 73 20 72 65 63 65 69 76 artifacts receiv
aa80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 ed */. const ch
aa90: 61 72 20 2a 7a 4f 70 54 79 70 65 20 3d 20 30 3b ar *zOpType = 0;
aaa0: 2f 2a 20 50 75 73 68 2c 20 50 75 6c 6c 2c 20 53 /* Push, Pull, S
aab0: 79 6e 63 2c 20 43 6c 6f 6e 65 20 2a 2f 0a 20 20 ync, Clone */.
aac0: 64 6f 75 62 6c 65 20 72 53 6b 65 77 20 3d 20 30 double rSkew = 0
aad0: 2e 30 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d .0; /* Maxim
aae0: 75 6d 20 74 69 6d 65 20 73 6b 65 77 20 2a 2f 0a um time skew */.
aaf0: 0a 20 20 69 66 28 20 64 62 5f 67 65 74 5f 62 6f . if( db_get_bo
ab00: 6f 6c 65 61 6e 28 22 64 6f 6e 74 2d 70 75 73 68 olean("dont-push
ab10: 22 2c 20 30 29 20 29 20 73 79 6e 63 46 6c 61 67 ", 0) ) syncFlag
ab20: 73 20 26 3d 20 7e 53 59 4e 43 5f 50 55 53 48 3b s &= ~SYNC_PUSH;
ab30: 0a 20 20 69 66 28 20 28 73 79 6e 63 46 6c 61 67 . if( (syncFlag
ab40: 73 20 26 20 28 53 59 4e 43 5f 50 55 53 48 7c 53 s & (SYNC_PUSH|S
ab50: 59 4e 43 5f 50 55 4c 4c 7c 53 59 4e 43 5f 43 4c YNC_PULL|SYNC_CL
ab60: 4f 4e 45 29 29 3d 3d 30 0a 20 20 20 20 20 26 26 ONE))==0. &&
ab70: 20 63 6f 6e 66 69 67 52 63 76 4d 61 73 6b 3d 3d configRcvMask==
ab80: 30 20 26 26 20 63 6f 6e 66 69 67 53 65 6e 64 4d 0 && configSendM
ab90: 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 ask==0 ) return
aba0: 30 3b 0a 0a 20 20 74 72 61 6e 73 70 6f 72 74 5f 0;.. transport_
abb0: 73 74 61 74 73 28 30 2c 20 30 2c 20 31 29 3b 0a stats(0, 0, 1);.
abc0: 20 20 73 6f 63 6b 65 74 5f 67 6c 6f 62 61 6c 5f socket_global_
abd0: 69 6e 69 74 28 29 3b 0a 20 20 6d 65 6d 73 65 74 init();. memset
abe0: 28 26 78 66 65 72 2c 20 30 2c 20 73 69 7a 65 6f (&xfer, 0, sizeo
abf0: 66 28 78 66 65 72 29 29 3b 0a 20 20 78 66 65 72 f(xfer));. xfer
ac00: 2e 70 49 6e 20 3d 20 26 72 65 63 76 3b 0a 20 20 .pIn = &recv;.
ac10: 78 66 65 72 2e 70 4f 75 74 20 3d 20 26 73 65 6e xfer.pOut = &sen
ac20: 64 3b 0a 20 20 78 66 65 72 2e 6d 78 53 65 6e 64 d;. xfer.mxSend
ac30: 20 3d 20 64 62 5f 67 65 74 5f 69 6e 74 28 22 6d = db_get_int("m
ac40: 61 78 2d 75 70 6c 6f 61 64 22 2c 20 32 35 30 30 ax-upload", 2500
ac50: 30 30 29 3b 0a 20 20 78 66 65 72 2e 6d 61 78 54 00);. xfer.maxT
ac60: 69 6d 65 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 ime = -1;. if(
ac70: 73 79 6e 63 46 6c 61 67 73 20 26 20 53 59 4e 43 syncFlags & SYNC
ac80: 5f 50 52 49 56 41 54 45 20 29 7b 0a 20 20 20 20 _PRIVATE ){.
ac90: 67 2e 70 65 72 6d 2e 50 72 69 76 61 74 65 20 3d g.perm.Private =
aca0: 20 31 3b 0a 20 20 20 20 78 66 65 72 2e 73 79 6e 1;. xfer.syn
acb0: 63 50 72 69 76 61 74 65 20 3d 20 31 3b 0a 20 20 cPrivate = 1;.
acc0: 7d 0a 0a 20 20 62 6c 6f 62 61 72 72 61 79 5f 7a }.. blobarray_z
acd0: 65 72 6f 28 78 66 65 72 2e 61 54 6f 6b 65 6e 2c ero(xfer.aToken,
ace0: 20 63 6f 75 6e 74 28 78 66 65 72 2e 61 54 6f 6b count(xfer.aTok
acf0: 65 6e 29 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 en));. blob_zer
ad00: 6f 28 26 73 65 6e 64 29 3b 0a 20 20 62 6c 6f 62 o(&send);. blob
ad10: 5f 7a 65 72 6f 28 26 72 65 63 76 29 3b 0a 20 20 _zero(&recv);.
ad20: 62 6c 6f 62 5f 7a 65 72 6f 28 26 78 66 65 72 2e blob_zero(&xfer.
ad30: 65 72 72 29 3b 0a 20 20 62 6c 6f 62 5f 7a 65 72 err);. blob_zer
ad40: 6f 28 26 78 66 65 72 2e 6c 69 6e 65 29 3b 0a 20 o(&xfer.line);.
ad50: 20 6f 72 69 67 43 6f 6e 66 69 67 52 63 76 4d 61 origConfigRcvMa
ad60: 73 6b 20 3d 20 30 3b 0a 0a 0a 20 20 2f 2a 20 53 sk = 0;... /* S
ad70: 65 6e 64 20 74 68 65 20 73 65 6e 64 2d 70 72 69 end the send-pri
ad80: 76 61 74 65 20 70 72 61 67 6d 61 20 69 66 20 77 vate pragma if w
ad90: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 e are trying to
ada0: 73 79 6e 63 20 70 72 69 76 61 74 65 20 64 61 74 sync private dat
adb0: 61 20 2a 2f 0a 20 20 69 66 28 20 73 79 6e 63 46 a */. if( syncF
adc0: 6c 61 67 73 20 26 20 53 59 4e 43 5f 50 52 49 56 lags & SYNC_PRIV
add0: 41 54 45 20 29 7b 0a 20 20 20 20 62 6c 6f 62 5f ATE ){. blob_
ade0: 61 70 70 65 6e 64 28 26 73 65 6e 64 2c 20 22 70 append(&send, "p
adf0: 72 61 67 6d 61 20 73 65 6e 64 2d 70 72 69 76 61 ragma send-priva
ae00: 74 65 5c 6e 22 2c 20 2d 31 29 3b 0a 20 20 7d 0a te\n", -1);. }.
ae10: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 77 61 79 . /*. ** Alway
ae20: 73 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 63 s begin with a c
ae30: 6c 6f 6e 65 2c 20 70 75 6c 6c 2c 20 6f 72 20 70 lone, pull, or p
ae40: 75 73 68 20 6d 65 73 73 61 67 65 0a 20 20 2a 2f ush message. */
ae50: 0a 20 20 69 66 28 20 73 79 6e 63 46 6c 61 67 73 . if( syncFlags
ae60: 20 26 20 53 59 4e 43 5f 43 4c 4f 4e 45 20 29 7b & SYNC_CLONE ){
ae70: 0a 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 . blob_append
ae80: 66 28 26 73 65 6e 64 2c 20 22 63 6c 6f 6e 65 20 f(&send, "clone
ae90: 33 20 25 64 5c 6e 22 2c 20 63 6c 6f 6e 65 53 65 3 %d\n", cloneSe
aea0: 71 6e 6f 29 3b 0a 20 20 20 20 73 79 6e 63 46 6c qno);. syncFl
aeb0: 61 67 73 20 26 3d 20 7e 28 53 59 4e 43 5f 50 55 ags &= ~(SYNC_PU
aec0: 53 48 7c 53 59 4e 43 5f 50 55 4c 4c 29 3b 0a 20 SH|SYNC_PULL);.
aed0: 20 20 20 6e 43 61 72 64 53 65 6e 74 2b 2b 3b 0a nCardSent++;.
aee0: 20 20 20 20 2f 2a 20 54 42 44 3a 20 52 65 71 75 /* TBD: Requ
aef0: 65 73 74 20 61 6c 6c 20 74 72 61 6e 73 66 65 72 est all transfer
af00: 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 able configurati
af10: 6f 6e 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 on values */.
af20: 20 63 6f 6e 74 65 6e 74 5f 65 6e 61 62 6c 65 5f content_enable_
af30: 64 65 70 68 61 6e 74 6f 6d 69 7a 65 28 30 29 3b dephantomize(0);
af40: 0a 20 20 20 20 7a 4f 70 54 79 70 65 20 3d 20 22 . zOpType = "
af50: 43 6c 6f 6e 65 22 3b 0a 20 20 7d 65 6c 73 65 20 Clone";. }else
af60: 69 66 28 20 73 79 6e 63 46 6c 61 67 73 20 26 20 if( syncFlags &
af70: 53 59 4e 43 5f 50 55 4c 4c 20 29 7b 0a 20 20 20 SYNC_PULL ){.
af80: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 blob_appendf(&s
af90: 65 6e 64 2c 20 22 70 75 6c 6c 20 25 73 20 25 73 end, "pull %s %s
afa0: 5c 6e 22 2c 20 7a 53 43 6f 64 65 2c 20 7a 50 43 \n", zSCode, zPC
afb0: 6f 64 65 29 3b 0a 20 20 20 20 6e 43 61 72 64 53 ode);. nCardS
afc0: 65 6e 74 2b 2b 3b 0a 20 20 20 20 7a 4f 70 54 79 ent++;. zOpTy
afd0: 70 65 20 3d 20 28 73 79 6e 63 46 6c 61 67 73 20 pe = (syncFlags
afe0: 26 20 53 59 4e 43 5f 50 55 53 48 29 3f 22 53 79 & SYNC_PUSH)?"Sy
aff0: 6e 63 22 3a 22 50 75 6c 6c 22 3b 0a 20 20 20 20 nc":"Pull";.
b000: 69 66 28 20 28 73 79 6e 63 46 6c 61 67 73 20 26 if( (syncFlags &
b010: 20 53 59 4e 43 5f 52 45 53 59 4e 43 29 21 3d 30 SYNC_RESYNC)!=0
b020: 20 26 26 20 6e 43 79 63 6c 65 3c 32 20 29 7b 0a && nCycle<2 ){.
b030: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
b040: 64 66 28 26 73 65 6e 64 2c 20 22 70 72 61 67 6d df(&send, "pragm
b050: 61 20 73 65 6e 64 2d 63 61 74 61 6c 6f 67 5c 6e a send-catalog\n
b060: 22 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 64 53 ");. nCardS
b070: 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d ent++;. }. }
b080: 0a 20 20 69 66 28 20 73 79 6e 63 46 6c 61 67 73 . if( syncFlags
b090: 20 26 20 53 59 4e 43 5f 50 55 53 48 20 29 7b 0a & SYNC_PUSH ){.
b0a0: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
b0b0: 28 26 73 65 6e 64 2c 20 22 70 75 73 68 20 25 73 (&send, "push %s
b0c0: 20 25 73 5c 6e 22 2c 20 7a 53 43 6f 64 65 2c 20 %s\n", zSCode,
b0d0: 7a 50 43 6f 64 65 29 3b 0a 20 20 20 20 6e 43 61 zPCode);. nCa
b0e0: 72 64 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 69 66 rdSent++;. if
b0f0: 28 20 28 73 79 6e 63 46 6c 61 67 73 20 26 20 53 ( (syncFlags & S
b100: 59 4e 43 5f 50 55 4c 4c 29 3d 3d 30 20 29 20 7a YNC_PULL)==0 ) z
b110: 4f 70 54 79 70 65 20 3d 20 22 50 75 73 68 22 3b OpType = "Push";
b120: 0a 20 20 20 20 69 66 28 20 28 73 79 6e 63 46 6c . if( (syncFl
b130: 61 67 73 20 26 20 53 59 4e 43 5f 52 45 53 59 4e ags & SYNC_RESYN
b140: 43 29 21 3d 30 20 29 20 78 66 65 72 2e 72 65 73 C)!=0 ) xfer.res
b150: 79 6e 63 20 3d 20 30 78 37 66 66 66 66 66 66 66 ync = 0x7fffffff
b160: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 79 6e 63 ;. }. if( sync
b170: 46 6c 61 67 73 20 26 20 53 59 4e 43 5f 56 45 52 Flags & SYNC_VER
b180: 42 4f 53 45 20 29 7b 0a 20 20 20 20 66 6f 73 73 BOSE ){. foss
b190: 69 6c 5f 70 72 69 6e 74 28 7a 4c 61 62 65 6c 46 il_print(zLabelF
b1a0: 6f 72 6d 61 74 2c 20 22 22 2c 20 22 42 79 74 65 ormat, "", "Byte
b1b0: 73 22 2c 20 22 43 61 72 64 73 22 2c 20 22 41 72 s", "Cards", "Ar
b1c0: 74 69 66 61 63 74 73 22 2c 20 22 44 65 6c 74 61 tifacts", "Delta
b1d0: 73 22 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c s");. }.. whil
b1e0: 65 28 20 67 6f 20 29 7b 0a 20 20 20 20 69 6e 74 e( go ){. int
b1f0: 20 6e 65 77 50 68 61 6e 74 6f 6d 20 3d 20 30 3b newPhantom = 0;
b200: 0a 20 20 20 20 63 68 61 72 20 2a 7a 52 61 6e 64 . char *zRand
b210: 6f 6d 6e 65 73 73 3b 0a 20 20 20 20 64 62 5f 62 omness;. db_b
b220: 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e egin_transaction
b230: 28 29 3b 0a 20 20 20 20 64 62 5f 72 65 63 6f 72 ();. db_recor
b240: 64 5f 72 65 70 6f 73 69 74 6f 72 79 5f 66 69 6c d_repository_fil
b250: 65 6e 61 6d 65 28 30 29 3b 0a 20 20 20 20 64 62 ename(0);. db
b260: 5f 6d 75 6c 74 69 5f 65 78 65 63 28 0a 20 20 20 _multi_exec(.
b270: 20 20 20 22 43 52 45 41 54 45 20 54 45 4d 50 20 "CREATE TEMP
b280: 54 41 42 4c 45 20 6f 6e 72 65 6d 6f 74 65 28 72 TABLE onremote(r
b290: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA
b2a0: 52 59 20 4b 45 59 29 3b 22 0a 20 20 20 20 29 3b RY KEY);". );
b2b0: 0a 20 20 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 . manifest_cr
b2c0: 6f 73 73 6c 69 6e 6b 5f 62 65 67 69 6e 28 29 3b osslink_begin();
b2d0: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 6d 61 .. /* Send ma
b2e0: 6b 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 ke the most rece
b2f0: 6e 74 6c 79 20 72 65 63 65 69 76 65 64 20 63 6f ntly received co
b300: 6f 6b 69 65 2e 20 20 4c 65 74 20 74 68 65 20 73 okie. Let the s
b310: 65 72 76 65 72 0a 20 20 20 20 2a 2a 20 66 69 67 erver. ** fig
b320: 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 ure out if this
b330: 69 73 20 61 20 63 6f 6f 6b 69 65 20 74 68 61 74 is a cookie that
b340: 20 69 74 20 63 61 72 65 73 20 61 62 6f 75 74 2e it cares about.
b350: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 43 6f 6f . */. zCoo
b360: 6b 69 65 20 3d 20 64 62 5f 67 65 74 28 22 63 6f kie = db_get("co
b370: 6f 6b 69 65 22 2c 20 30 29 3b 0a 20 20 20 20 69 okie", 0);. i
b380: 66 28 20 7a 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 f( zCookie ){.
b390: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 blob_appendf
b3a0: 28 26 73 65 6e 64 2c 20 22 63 6f 6f 6b 69 65 20 (&send, "cookie
b3b0: 25 73 5c 6e 22 2c 20 7a 43 6f 6f 6b 69 65 29 3b %s\n", zCookie);
b3c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
b3d0: 65 6e 65 72 61 74 65 20 67 69 6d 6d 65 20 63 61 enerate gimme ca
b3e0: 72 64 73 20 66 6f 72 20 70 68 61 6e 74 6f 6d 73 rds for phantoms
b3f0: 20 61 6e 64 20 6c 65 61 66 20 63 61 72 64 73 0a and leaf cards.
b400: 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 6c ** for all l
b410: 65 61 76 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 eaves.. */.
b420: 20 20 69 66 28 20 28 73 79 6e 63 46 6c 61 67 73 if( (syncFlags
b430: 20 26 20 53 59 4e 43 5f 50 55 4c 4c 29 21 3d 30 & SYNC_PULL)!=0
b440: 0a 20 20 20 20 20 7c 7c 20 28 28 73 79 6e 63 46 . || ((syncF
b450: 6c 61 67 73 20 26 20 53 59 4e 43 5f 43 4c 4f 4e lags & SYNC_CLON
b460: 45 29 21 3d 30 20 26 26 20 63 6c 6f 6e 65 53 65 E)!=0 && cloneSe
b470: 71 6e 6f 3d 3d 31 29 0a 20 20 20 20 29 7b 0a 20 qno==1). ){.
b480: 20 20 20 20 20 72 65 71 75 65 73 74 5f 70 68 61 request_pha
b490: 6e 74 6f 6d 73 28 26 78 66 65 72 2c 20 6d 78 50 ntoms(&xfer, mxP
b4a0: 68 61 6e 74 6f 6d 52 65 71 29 3b 0a 20 20 20 20 hantomReq);.
b4b0: 7d 0a 20 20 20 20 69 66 28 20 73 79 6e 63 46 6c }. if( syncFl
b4c0: 61 67 73 20 26 20 53 59 4e 43 5f 50 55 53 48 20 ags & SYNC_PUSH
b4d0: 29 7b 0a 20 20 20 20 20 20 73 65 6e 64 5f 75 6e ){. send_un
b4e0: 73 65 6e 74 28 26 78 66 65 72 29 3b 0a 20 20 20 sent(&xfer);.
b4f0: 20 20 20 6e 43 61 72 64 53 65 6e 74 20 2b 3d 20 nCardSent +=
b500: 73 65 6e 64 5f 75 6e 63 6c 75 73 74 65 72 65 64 send_unclustered
b510: 28 26 78 66 65 72 29 3b 0a 20 20 20 20 20 20 69 (&xfer);. i
b520: 66 28 20 73 79 6e 63 46 6c 61 67 73 20 26 20 53 f( syncFlags & S
b530: 59 4e 43 5f 50 52 49 56 41 54 45 20 29 20 73 65 YNC_PRIVATE ) se
b540: 6e 64 5f 70 72 69 76 61 74 65 28 26 78 66 65 72 nd_private(&xfer
b550: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
b560: 20 53 65 6e 64 20 63 6f 6e 66 69 67 75 72 61 74 Send configurat
b570: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 72 65 ion parameter re
b580: 71 75 65 73 74 73 2e 20 20 4f 6e 20 61 20 63 6c quests. On a cl
b590: 6f 6e 65 2c 20 64 65 6c 61 79 20 73 65 6e 64 69 one, delay sendi
b5a0: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 75 ng. ** this u
b5b0: 6e 74 69 6c 20 74 68 65 20 73 65 63 6f 6e 64 20 ntil the second
b5c0: 63 79 63 6c 65 20 73 69 6e 63 65 20 74 68 65 20 cycle since the
b5d0: 6c 6f 67 69 6e 20 63 61 72 64 20 6d 69 67 68 74 login card might
b5e0: 20 66 61 69 6c 20 6f 6e 0a 20 20 20 20 2a 2a 20 fail on. **
b5f0: 74 68 65 20 66 69 72 73 74 20 63 79 63 6c 65 2e the first cycle.
b600: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
b610: 63 6f 6e 66 69 67 52 63 76 4d 61 73 6b 20 26 26 configRcvMask &&
b620: 20 28 28 73 79 6e 63 46 6c 61 67 73 20 26 20 53 ((syncFlags & S
b630: 59 4e 43 5f 43 4c 4f 4e 45 29 3d 3d 30 20 7c 7c YNC_CLONE)==0 ||
b640: 20 6e 43 79 63 6c 65 3e 30 29 20 29 7b 0a 20 20 nCycle>0) ){.
b650: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
b660: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 zName;. if(
b670: 20 7a 4f 70 54 79 70 65 3d 3d 30 20 29 20 7a 4f zOpType==0 ) zO
b680: 70 54 79 70 65 20 3d 20 22 50 75 6c 6c 22 3b 0a pType = "Pull";.
b690: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 63 6f zName = co
b6a0: 6e 66 69 67 75 72 65 5f 66 69 72 73 74 5f 6e 61 nfigure_first_na
b6b0: 6d 65 28 63 6f 6e 66 69 67 52 63 76 4d 61 73 6b me(configRcvMask
b6c0: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 );. while(
b6d0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 zName ){.
b6e0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 blob_appendf(&s
b6f0: 65 6e 64 2c 20 22 72 65 71 63 6f 6e 66 69 67 20 end, "reqconfig
b700: 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 %s\n", zName);.
b710: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 63 zName = c
b720: 6f 6e 66 69 67 75 72 65 5f 6e 65 78 74 5f 6e 61 onfigure_next_na
b730: 6d 65 28 63 6f 6e 66 69 67 52 63 76 4d 61 73 6b me(configRcvMask
b740: 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 61 72 64 );. nCard
b750: 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a Sent++;. }.
b760: 20 20 20 20 20 20 69 66 28 20 28 63 6f 6e 66 69 if( (confi
b770: 67 52 63 76 4d 61 73 6b 20 26 20 28 43 4f 4e 46 gRcvMask & (CONF
b780: 49 47 53 45 54 5f 55 53 45 52 7c 43 4f 4e 46 49 IGSET_USER|CONFI
b790: 47 53 45 54 5f 54 4b 54 29 29 21 3d 30 0a 20 20 GSET_TKT))!=0.
b7a0: 20 20 20 20 20 26 26 20 28 63 6f 6e 66 69 67 52 && (configR
b7b0: 63 76 4d 61 73 6b 20 26 20 43 4f 4e 46 49 47 53 cvMask & CONFIGS
b7c0: 45 54 5f 4f 4c 44 46 4f 52 4d 41 54 29 21 3d 30 ET_OLDFORMAT)!=0
b7d0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 . ){.
b7e0: 20 20 69 6e 74 20 6f 76 65 72 77 72 69 74 65 20 int overwrite
b7f0: 3d 20 28 63 6f 6e 66 69 67 52 63 76 4d 61 73 6b = (configRcvMask
b800: 20 26 20 43 4f 4e 46 49 47 53 45 54 5f 4f 56 45 & CONFIGSET_OVE
b810: 52 57 52 49 54 45 29 21 3d 30 3b 0a 20 20 20 20 RWRITE)!=0;.
b820: 20 20 20 20 63 6f 6e 66 69 67 75 72 65 5f 70 72 configure_pr
b830: 65 70 61 72 65 5f 74 6f 5f 72 65 63 65 69 76 65 epare_to_receive
b840: 28 6f 76 65 72 77 72 69 74 65 29 3b 0a 20 20 20 (overwrite);.
b850: 20 20 20 7d 0a 20 20 20 20 20 20 6f 72 69 67 43 }. origC
b860: 6f 6e 66 69 67 52 63 76 4d 61 73 6b 20 3d 20 63 onfigRcvMask = c
b870: 6f 6e 66 69 67 52 63 76 4d 61 73 6b 3b 0a 20 20 onfigRcvMask;.
b880: 20 20 20 20 63 6f 6e 66 69 67 52 63 76 4d 61 73 configRcvMas
b890: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 k = 0;. }..
b8a0: 20 20 2f 2a 20 53 65 6e 64 20 63 6f 6e 66 69 67 /* Send config
b8b0: 75 72 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 uration paramete
b8c0: 72 73 20 62 65 69 6e 67 20 70 75 73 68 65 64 20 rs being pushed
b8d0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6e 66 69 */. if( confi
b8e0: 67 53 65 6e 64 4d 61 73 6b 20 29 7b 0a 20 20 20 gSendMask ){.
b8f0: 20 20 20 69 66 28 20 7a 4f 70 54 79 70 65 3d 3d if( zOpType==
b900: 30 20 29 20 7a 4f 70 54 79 70 65 20 3d 20 22 50 0 ) zOpType = "P
b910: 75 73 68 22 3b 0a 20 20 20 20 20 20 69 66 28 20 ush";. if(
b920: 63 6f 6e 66 69 67 53 65 6e 64 4d 61 73 6b 20 26 configSendMask &
b930: 20 43 4f 4e 46 49 47 53 45 54 5f 4f 4c 44 46 4f CONFIGSET_OLDFO
b940: 52 4d 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 RMAT ){.
b950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
b960: 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 e;. zName
b970: 20 3d 20 63 6f 6e 66 69 67 75 72 65 5f 66 69 72 = configure_fir
b980: 73 74 5f 6e 61 6d 65 28 63 6f 6e 66 69 67 53 65 st_name(configSe
b990: 6e 64 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 ndMask);.
b9a0: 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 29 7b while( zName ){
b9b0: 0a 20 20 20 20 20 20 20 20 20 20 73 65 6e 64 5f . send_
b9c0: 6c 65 67 61 63 79 5f 63 6f 6e 66 69 67 5f 63 61 legacy_config_ca
b9d0: 72 64 28 26 78 66 65 72 2c 20 7a 4e 61 6d 65 29 rd(&xfer, zName)
b9e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d ;. zNam
b9f0: 65 20 3d 20 63 6f 6e 66 69 67 75 72 65 5f 6e 65 e = configure_ne
ba00: 78 74 5f 6e 61 6d 65 28 63 6f 6e 66 69 67 53 65 xt_name(configSe
ba10: 6e 64 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 ndMask);.
ba20: 20 20 20 6e 43 61 72 64 53 65 6e 74 2b 2b 3b 0a nCardSent++;.
ba30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
ba40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e }else{. n
ba50: 43 61 72 64 53 65 6e 74 20 2b 3d 20 63 6f 6e 66 CardSent += conf
ba60: 69 67 75 72 65 5f 73 65 6e 64 5f 67 72 6f 75 70 igure_send_group
ba70: 28 78 66 65 72 2e 70 4f 75 74 2c 20 63 6f 6e 66 (xfer.pOut, conf
ba80: 69 67 53 65 6e 64 4d 61 73 6b 2c 20 30 29 3b 0a igSendMask, 0);.
ba90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f }. co
baa0: 6e 66 69 67 53 65 6e 64 4d 61 73 6b 20 3d 20 30 nfigSendMask = 0
bab0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
bac0: 41 70 70 65 6e 64 20 72 61 6e 64 6f 6d 6e 65 73 Append randomnes
bad0: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 s to the end of
bae0: 74 68 65 20 6d 65 73 73 61 67 65 2e 20 20 54 68 the message. Th
baf0: 69 73 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 is makes all.
bb00: 20 2a 2a 20 6d 65 73 73 61 67 65 73 20 75 6e 69 ** messages uni
bb10: 71 75 65 20 73 6f 20 74 68 61 74 20 74 68 61 74 que so that that
bb20: 20 74 68 65 20 6c 6f 67 69 6e 2d 63 61 72 64 20 the login-card
bb30: 6e 6f 6e 63 65 20 77 69 6c 6c 20 61 6c 77 61 79 nonce will alway
bb40: 73 0a 20 20 20 20 2a 2a 20 62 65 20 75 6e 69 71 s. ** be uniq
bb50: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a ue.. */. z
bb60: 52 61 6e 64 6f 6d 6e 65 73 73 20 3d 20 64 62 5f Randomness = db_
bb70: 74 65 78 74 28 30 2c 20 22 53 45 4c 45 43 54 20 text(0, "SELECT
bb80: 68 65 78 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 32 hex(randomblob(2
bb90: 30 29 29 22 29 3b 0a 20 20 20 20 62 6c 6f 62 5f 0))");. blob_
bba0: 61 70 70 65 6e 64 66 28 26 73 65 6e 64 2c 20 22 appendf(&send, "
bbb0: 23 20 25 73 5c 6e 22 2c 20 7a 52 61 6e 64 6f 6d # %s\n", zRandom
bbc0: 6e 65 73 73 29 3b 0a 20 20 20 20 66 72 65 65 28 ness);. free(
bbd0: 7a 52 61 6e 64 6f 6d 6e 65 73 73 29 3b 0a 0a 20 zRandomness);..
bbe0: 20 20 20 69 66 28 20 73 79 6e 63 46 6c 61 67 73 if( syncFlags
bbf0: 20 26 20 53 59 4e 43 5f 56 45 52 42 4f 53 45 20 & SYNC_VERBOSE
bc00: 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f ){. fossil_
bc10: 70 72 69 6e 74 28 22 77 61 69 74 69 6e 67 20 66 print("waiting f
bc20: 6f 72 20 73 65 72 76 65 72 2e 2e 2e 22 29 3b 0a or server...");.
bc30: 20 20 20 20 7d 0a 20 20 20 20 66 66 6c 75 73 68 }. fflush
bc40: 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 2f 2a (stdout);. /*
bc50: 20 45 78 63 68 61 6e 67 65 20 6d 65 73 73 61 67 Exchange messag
bc60: 65 73 20 77 69 74 68 20 74 68 65 20 73 65 72 76 es with the serv
bc70: 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 74 er */. if( ht
bc80: 74 70 5f 65 78 63 68 61 6e 67 65 28 26 73 65 6e tp_exchange(&sen
bc90: 64 2c 20 26 72 65 63 76 2c 20 28 73 79 6e 63 46 d, &recv, (syncF
bca0: 6c 61 67 73 20 26 20 53 59 4e 43 5f 43 4c 4f 4e lags & SYNC_CLON
bcb0: 45 29 3d 3d 30 20 7c 7c 20 6e 43 79 63 6c 65 3e E)==0 || nCycle>
bcc0: 30 2c 0a 20 20 20 20 20 20 20 20 4d 41 58 5f 52 0,. MAX_R
bcd0: 45 44 49 52 45 43 54 53 29 20 29 7b 0a 20 20 20 EDIRECTS) ){.
bce0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 nErr++;.
bcf0: 20 67 6f 20 3d 20 32 3b 0a 20 20 20 20 20 20 62 go = 2;. b
bd00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
bd10: 20 2f 2a 20 4f 75 74 70 75 74 20 63 75 72 72 65 /* Output curre
bd20: 6e 74 20 73 74 61 74 73 20 2a 2f 0a 20 20 20 20 nt stats */.
bd30: 69 66 28 20 73 79 6e 63 46 6c 61 67 73 20 26 20 if( syncFlags &
bd40: 53 59 4e 43 5f 56 45 52 42 4f 53 45 20 29 7b 0a SYNC_VERBOSE ){.
bd50: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 fossil_pri
bd60: 6e 74 28 7a 56 61 6c 75 65 46 6f 72 6d 61 74 2c nt(zValueFormat,
bd70: 20 22 53 65 6e 74 3a 22 2c 0a 20 20 20 20 20 20 "Sent:",.
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f blo
bd90: 62 5f 73 69 7a 65 28 26 73 65 6e 64 29 2c 20 6e b_size(&send), n
bda0: 43 61 72 64 53 65 6e 74 2b 78 66 65 72 2e 6e 47 CardSent+xfer.nG
bdb0: 69 6d 6d 65 53 65 6e 74 2b 78 66 65 72 2e 6e 49 immeSent+xfer.nI
bdc0: 47 6f 74 53 65 6e 74 2c 0a 20 20 20 20 20 20 20 GotSent,.
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 78 66 65 72 xfer
bde0: 2e 6e 46 69 6c 65 53 65 6e 74 2c 20 78 66 65 72 .nFileSent, xfer
bdf0: 2e 6e 44 65 6c 74 61 53 65 6e 74 29 3b 0a 20 20 .nDeltaSent);.
be00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e }else{. n
be10: 52 6f 75 6e 64 74 72 69 70 2b 2b 3b 0a 20 20 20 Roundtrip++;.
be20: 20 20 20 6e 41 72 74 69 66 61 63 74 53 65 6e 74 nArtifactSent
be30: 20 2b 3d 20 78 66 65 72 2e 6e 46 69 6c 65 53 65 += xfer.nFileSe
be40: 6e 74 20 2b 20 78 66 65 72 2e 6e 44 65 6c 74 61 nt + xfer.nDelta
be50: 53 65 6e 74 3b 0a 20 20 20 20 20 20 66 6f 73 73 Sent;. foss
be60: 69 6c 5f 70 72 69 6e 74 28 7a 42 72 69 65 66 46 il_print(zBriefF
be70: 6f 72 6d 61 74 2c 20 6e 52 6f 75 6e 64 74 72 69 ormat, nRoundtri
be80: 70 2c 20 6e 41 72 74 69 66 61 63 74 53 65 6e 74 p, nArtifactSent
be90: 2c 20 6e 41 72 74 69 66 61 63 74 52 63 76 64 29 , nArtifactRcvd)
bea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 61 72 ;. }. nCar
beb0: 64 53 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 6e dSent = 0;. n
bec0: 43 61 72 64 52 63 76 64 20 3d 20 30 3b 0a 20 20 CardRcvd = 0;.
bed0: 20 20 78 66 65 72 2e 6e 46 69 6c 65 53 65 6e 74 xfer.nFileSent
bee0: 20 3d 20 30 3b 0a 20 20 20 20 78 66 65 72 2e 6e = 0;. xfer.n
bef0: 44 65 6c 74 61 53 65 6e 74 20 3d 20 30 3b 0a 20 DeltaSent = 0;.
bf00: 20 20 20 78 66 65 72 2e 6e 47 69 6d 6d 65 53 65 xfer.nGimmeSe
bf10: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 66 65 72 nt = 0;. xfer
bf20: 2e 6e 49 47 6f 74 53 65 6e 74 20 3d 20 30 3b 0a .nIGotSent = 0;.
bf30: 0a 20 20 20 20 6c 61 73 74 50 63 74 44 6f 6e 65 . lastPctDone
bf40: 20 3d 20 2d 31 3b 0a 20 20 20 20 62 6c 6f 62 5f = -1;. blob_
bf50: 72 65 73 65 74 28 26 73 65 6e 64 29 3b 0a 20 20 reset(&send);.
bf60: 20 20 72 41 72 72 69 76 61 6c 54 69 6d 65 20 3d rArrivalTime =
bf70: 20 64 62 5f 64 6f 75 62 6c 65 28 30 2e 30 2c 20 db_double(0.0,
bf80: 22 53 45 4c 45 43 54 20 6a 75 6c 69 61 6e 64 61 "SELECT julianda
bf90: 79 28 27 6e 6f 77 27 29 22 29 3b 0a 0a 20 20 20 y('now')");..
bfa0: 20 2f 2a 20 53 65 6e 64 20 74 68 65 20 73 65 6e /* Send the sen
bfb0: 64 2d 70 72 69 76 61 74 65 20 70 72 61 67 6d 61 d-private pragma
bfc0: 20 69 66 20 77 65 20 61 72 65 20 74 72 79 69 6e if we are tryin
bfd0: 67 20 74 6f 20 73 79 6e 63 20 70 72 69 76 61 74 g to sync privat
bfe0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 e data */. if
bff0: 28 20 73 79 6e 63 46 6c 61 67 73 20 26 20 53 59 ( syncFlags & SY
c000: 4e 43 5f 50 52 49 56 41 54 45 20 29 7b 0a 20 20 NC_PRIVATE ){.
c010: 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 blob_append(
c020: 26 73 65 6e 64 2c 20 22 70 72 61 67 6d 61 20 73 &send, "pragma s
c030: 65 6e 64 2d 70 72 69 76 61 74 65 5c 6e 22 2c 20 end-private\n",
c040: 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -1);. }..
c050: 2f 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 /* Begin constru
c060: 63 74 69 6e 67 20 74 68 65 20 6e 65 78 74 20 6d cting the next m
c070: 65 73 73 61 67 65 20 28 77 68 69 63 68 20 6d 69 essage (which mi
c080: 67 68 74 20 6e 65 76 65 72 20 62 65 0a 20 20 20 ght never be.
c090: 20 2a 2a 20 73 65 6e 74 29 20 62 79 20 62 65 67 ** sent) by beg
c0a0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65 20 inning with the
c0b0: 70 75 6c 6c 20 6f 72 20 70 75 73 68 20 63 61 72 pull or push car
c0c0: 64 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 ds. */. if
c0d0: 28 20 73 79 6e 63 46 6c 61 67 73 20 26 20 53 59 ( syncFlags & SY
c0e0: 4e 43 5f 50 55 4c 4c 20 29 7b 0a 20 20 20 20 20 NC_PULL ){.
c0f0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 73 blob_appendf(&s
c100: 65 6e 64 2c 20 22 70 75 6c 6c 20 25 73 20 25 73 end, "pull %s %s
c110: 5c 6e 22 2c 20 7a 53 43 6f 64 65 2c 20 7a 50 43 \n", zSCode, zPC
c120: 6f 64 65 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 ode);. nCar
c130: 64 53 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 dSent++;. }.
c140: 20 20 20 69 66 28 20 73 79 6e 63 46 6c 61 67 73 if( syncFlags
c150: 20 26 20 53 59 4e 43 5f 50 55 53 48 20 29 7b 0a & SYNC_PUSH ){.
c160: 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e blob_appen
c170: 64 66 28 26 73 65 6e 64 2c 20 22 70 75 73 68 20 df(&send, "push
c180: 25 73 20 25 73 5c 6e 22 2c 20 7a 53 43 6f 64 65 %s %s\n", zSCode
c190: 2c 20 7a 50 43 6f 64 65 29 3b 0a 20 20 20 20 20 , zPCode);.
c1a0: 20 6e 43 61 72 64 53 65 6e 74 2b 2b 3b 0a 20 20 nCardSent++;.
c1b0: 20 20 7d 0a 20 20 20 20 67 6f 20 3d 20 30 3b 0a }. go = 0;.
c1c0: 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 . /* Process
c1d0: 74 68 65 20 72 65 70 6c 79 20 74 68 61 74 20 63 the reply that c
c1e0: 61 6d 65 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 ame back from th
c1f0: 65 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 e server */.
c200: 77 68 69 6c 65 28 20 62 6c 6f 62 5f 6c 69 6e 65 while( blob_line
c210: 28 26 72 65 63 76 2c 20 26 78 66 65 72 2e 6c 69 (&recv, &xfer.li
c220: 6e 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 ne) ){. if(
c230: 20 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 66 blob_buffer(&xf
c240: 65 72 2e 6c 69 6e 65 29 5b 30 5d 3d 3d 27 23 27 er.line)[0]=='#'
c250: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 ){. cons
c260: 74 20 63 68 61 72 20 2a 7a 4c 69 6e 65 20 3d 20 t char *zLine =
c270: 62 6c 6f 62 5f 62 75 66 66 65 72 28 26 78 66 65 blob_buffer(&xfe
c280: 72 2e 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 r.line);.
c290: 20 69 66 28 20 6d 65 6d 63 6d 70 28 7a 4c 69 6e if( memcmp(zLin
c2a0: 65 2c 20 22 23 20 74 69 6d 65 73 74 61 6d 70 20 e, "# timestamp
c2b0: 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 ", 12)==0 ){.
c2c0: 20 20 20 20 20 20 20 63 68 61 72 20 7a 54 69 6d char zTim
c2d0: 65 5b 32 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 e[20];.
c2e0: 20 64 6f 75 62 6c 65 20 72 44 69 66 66 3b 0a 20 double rDiff;.
c2f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
c300: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 _snprintf(sizeof
c310: 28 7a 54 69 6d 65 29 2c 20 7a 54 69 6d 65 2c 20 (zTime), zTime,
c320: 22 25 2e 31 39 73 22 2c 20 26 7a 4c 69 6e 65 5b "%.19s", &zLine[
c330: 31 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 12]);.
c340: 72 44 69 66 66 20 3d 20 64 62 5f 64 6f 75 62 6c rDiff = db_doubl
c350: 65 28 39 65 39 39 2c 20 22 53 45 4c 45 43 54 20 e(9e99, "SELECT
c360: 6a 75 6c 69 61 6e 64 61 79 28 27 25 71 27 29 20 julianday('%q')
c370: 2d 20 25 2e 31 37 67 22 2c 0a 20 20 20 20 20 20 - %.17g",.
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c390: 20 20 20 20 20 20 7a 54 69 6d 65 2c 20 72 41 72 zTime, rAr
c3a0: 72 69 76 61 6c 54 69 6d 65 29 3b 0a 20 20 20 20 rivalTime);.
c3b0: 20 20 20 20 20 20 69 66 28 20 72 44 69 66 66 3e if( rDiff>
c3c0: 39 65 39 38 20 7c 7c 20 72 44 69 66 66 3c 2d 39 9e98 || rDiff<-9
c3d0: 65 39 38 20 29 20 72 44 69 66 66 20 3d 20 30 2e e98 ) rDiff = 0.
c3e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 0;. if(
c3f0: 20 72 44 69 66 66 2a 32 34 2e 30 2a 33 36 30 30 rDiff*24.0*3600
c400: 2e 30 20 3e 3d 20 2d 28 62 6c 6f 62 5f 73 69 7a .0 >= -(blob_siz
c410: 65 28 26 72 65 63 76 29 2f 35 30 30 30 2e 30 20 e(&recv)/5000.0
c420: 2b 20 32 30 29 20 29 20 72 44 69 66 66 20 3d 20 + 20) ) rDiff =
c430: 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 0.0;. i
c440: 66 28 20 66 6f 73 73 69 6c 5f 66 61 62 73 28 72 f( fossil_fabs(r
c450: 44 69 66 66 29 3e 66 6f 73 73 69 6c 5f 66 61 62 Diff)>fossil_fab
c460: 73 28 72 53 6b 65 77 29 20 29 20 72 53 6b 65 77 s(rSkew) ) rSkew
c470: 20 3d 20 72 44 69 66 66 3b 0a 20 20 20 20 20 20 = rDiff;.
c480: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 61 72 }. nCar
c490: 64 52 63 76 64 2b 2b 3b 0a 20 20 20 20 20 20 20 dRcvd++;.
c4a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 continue;.
c4b0: 20 7d 0a 20 20 20 20 20 20 78 66 65 72 2e 6e 54 }. xfer.nT
c4c0: 6f 6b 65 6e 20 3d 20 62 6c 6f 62 5f 74 6f 6b 65 oken = blob_toke
c4d0: 6e 69 7a 65 28 26 78 66 65 72 2e 6c 69 6e 65 2c nize(&xfer.line,
c4e0: 20 78 66 65 72 2e 61 54 6f 6b 65 6e 2c 20 63 6f xfer.aToken, co
c4f0: 75 6e 74 28 78 66 65 72 2e 61 54 6f 6b 65 6e 29 unt(xfer.aToken)
c500: 29 3b 0a 20 20 20 20 20 20 6e 43 61 72 64 52 63 );. nCardRc
c510: 76 64 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 vd++;. if(
c520: 28 73 79 6e 63 46 6c 61 67 73 20 26 20 53 59 4e (syncFlags & SYN
c530: 43 5f 56 45 52 42 4f 53 45 29 21 3d 30 20 26 26 C_VERBOSE)!=0 &&
c540: 20 72 65 63 76 2e 6e 55 73 65 64 3e 30 20 29 7b recv.nUsed>0 ){
c550: 0a 20 20 20 20 20 20 20 20 70 63 74 44 6f 6e 65 . pctDone
c560: 20 3d 20 28 72 65 63 76 2e 69 43 75 72 73 6f 72 = (recv.iCursor
c570: 2a 31 30 30 29 2f 72 65 63 76 2e 6e 55 73 65 64 *100)/recv.nUsed
c580: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 ;. if( pc
c590: 74 44 6f 6e 65 21 3d 6c 61 73 74 50 63 74 44 6f tDone!=lastPctDo
c5a0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 ne ){.
c5b0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 5c 72 fossil_print("\r
c5c0: 70 72 6f 63 65 73 73 65 64 3a 20 25 64 25 25 20 processed: %d%%
c5d0: 20 20 20 20 20 20 20 20 22 2c 20 70 63 74 44 6f ", pctDo
c5e0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c ne);. l
c5f0: 61 73 74 50 63 74 44 6f 6e 65 20 3d 20 70 63 74 astPctDone = pct
c600: 44 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 Done;.
c610: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a fflush(stdout);.
c620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
c630: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 20 20 66 69 }.. /* fi
c640: 6c 65 20 55 55 49 44 20 53 49 5a 45 20 5c 6e 20 le UUID SIZE \n
c650: 43 4f 4e 54 45 4e 54 0a 20 20 20 20 20 20 2a 2a CONTENT. **
c660: 20 20 20 66 69 6c 65 20 55 55 49 44 20 44 45 4c file UUID DEL
c670: 54 41 53 52 43 20 53 49 5a 45 20 5c 6e 20 43 4f TASRC SIZE \n CO
c680: 4e 54 45 4e 54 0a 20 20 20 20 20 20 2a 2a 0a 20 NTENT. **.
c690: 20 20 20 20 20 2a 2a 20 52 65 63 65 69 76 65 20 ** Receive
c6a0: 61 20 66 69 6c 65 20 74 72 61 6e 73 6d 69 74 74 a file transmitt
c6b0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 72 76 ed from the serv
c6c0: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 er.. */.
c6d0: 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 if( blob_eq(&
c6e0: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 22 xfer.aToken[0],"
c6f0: 66 69 6c 65 22 29 20 29 7b 0a 20 20 20 20 20 20 file") ){.
c700: 20 20 78 66 65 72 5f 61 63 63 65 70 74 5f 66 69 xfer_accept_fi
c710: 6c 65 28 26 78 66 65 72 2c 20 28 73 79 6e 63 46 le(&xfer, (syncF
c720: 6c 61 67 73 20 26 20 53 59 4e 43 5f 43 4c 4f 4e lags & SYNC_CLON
c730: 45 29 21 3d 30 2c 20 30 2c 20 30 29 3b 0a 20 20 E)!=0, 0, 0);.
c740: 20 20 20 20 20 20 6e 41 72 74 69 66 61 63 74 52 nArtifactR
c750: 63 76 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c cvd++;. }el
c760: 73 65 0a 0a 20 20 20 20 20 20 2f 2a 20 20 20 63 se.. /* c
c770: 66 69 6c 65 20 55 55 49 44 20 55 53 49 5a 45 20 file UUID USIZE
c780: 43 53 49 5a 45 20 5c 6e 20 43 4f 4e 54 45 4e 54 CSIZE \n CONTENT
c790: 0a 20 20 20 20 20 20 2a 2a 20 20 20 63 66 69 6c . ** cfil
c7a0: 65 20 55 55 49 44 20 44 45 4c 54 41 53 52 43 20 e UUID DELTASRC
c7b0: 55 53 49 5a 45 20 43 53 49 5a 45 20 5c 6e 20 43 USIZE CSIZE \n C
c7c0: 4f 4e 54 45 4e 54 0a 20 20 20 20 20 20 2a 2a 0a ONTENT. **.
c7d0: 20 20 20 20 20 20 2a 2a 20 52 65 63 65 69 76 65 ** Receive
c7e0: 20 61 20 63 6f 6d 70 72 65 73 73 65 64 20 66 69 a compressed fi
c7f0: 6c 65 20 74 72 61 6e 73 6d 69 74 74 65 64 20 66 le transmitted f
c800: 72 6f 6d 20 74 68 65 20 73 65 72 76 65 72 2e 0a rom the server..
c810: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 */. i
c820: 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 f( blob_eq(&xfer
c830: 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 22 63 66 69 6c .aToken[0],"cfil
c840: 65 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 78 e") ){. x
c850: 66 65 72 5f 61 63 63 65 70 74 5f 63 6f 6d 70 72 fer_accept_compr
c860: 65 73 73 65 64 5f 66 69 6c 65 28 26 78 66 65 72 essed_file(&xfer
c870: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 , 0, 0);.
c880: 20 6e 41 72 74 69 66 61 63 74 52 63 76 64 2b 2b nArtifactRcvd++
c890: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 ;. }else..
c8a0: 20 20 20 20 20 2f 2a 20 20 20 67 69 6d 6d 65 20 /* gimme
c8b0: 55 55 49 44 0a 20 20 20 20 20 20 2a 2a 0a 20 20 UUID. **.
c8c0: 20 20 20 20 2a 2a 20 53 65 72 76 65 72 20 69 73 ** Server is
c8d0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 66 69 requesting a fi
c8e0: 6c 65 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 le. If the file
c8f0: 20 69 73 20 61 20 6d 61 6e 69 66 65 73 74 2c 20 is a manifest,
c900: 61 73 73 75 6d 65 0a 20 20 20 20 20 20 2a 2a 20 assume. **
c910: 74 68 61 74 20 74 68 65 20 73 65 72 76 65 72 20 that the server
c920: 77 69 6c 6c 20 61 6c 73 6f 20 77 61 6e 74 20 74 will also want t
c930: 6f 20 6b 6e 6f 77 20 61 6c 6c 20 6f 66 20 74 68 o know all of th
c940: 65 20 63 6f 6e 74 65 6e 74 20 66 69 6c 65 73 0a e content files.
c950: 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63 69 61 ** associa
c960: 74 65 64 20 77 69 74 68 20 74 68 65 20 6d 61 6e ted with the man
c970: 69 66 65 73 74 20 61 6e 64 20 73 65 6e 64 20 74 ifest and send t
c980: 68 6f 73 65 20 74 6f 6f 2e 0a 20 20 20 20 20 20 hose too..
c990: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f */. if( blo
c9a0: 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 b_eq(&xfer.aToke
c9b0: 6e 5b 30 5d 2c 20 22 67 69 6d 6d 65 22 29 0a 20 n[0], "gimme").
c9c0: 20 20 20 20 20 20 26 26 20 78 66 65 72 2e 6e 54 && xfer.nT
c9d0: 6f 6b 65 6e 3d 3d 32 0a 20 20 20 20 20 20 20 26 oken==2. &
c9e0: 26 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 28 26 & blob_is_uuid(&
c9f0: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 0a xfer.aToken[1]).
ca00: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 ){.
ca10: 20 69 66 28 20 73 79 6e 63 46 6c 61 67 73 20 26 if( syncFlags &
ca20: 20 53 59 4e 43 5f 50 55 53 48 20 29 7b 0a 20 20 SYNC_PUSH ){.
ca30: 20 20 20 20 20 20 20 20 69 6e 74 20 72 69 64 20 int rid
ca40: 3d 20 72 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 = rid_from_uuid(
ca50: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c &xfer.aToken[1],
ca60: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 0, 0);.
ca70: 20 20 69 66 28 20 72 69 64 20 29 20 73 65 6e 64 if( rid ) send
ca80: 5f 66 69 6c 65 28 26 78 66 65 72 2c 20 72 69 64 _file(&xfer, rid
ca90: 2c 20 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 , &xfer.aToken[1
caa0: 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d ], 0);. }
cab0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 . }else..
cac0: 20 20 20 20 2f 2a 20 20 20 69 67 6f 74 20 55 55 /* igot UU
cad0: 49 44 20 20 3f 50 52 49 56 41 54 45 46 4c 41 47 ID ?PRIVATEFLAG
cae0: 3f 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 ?. **.
caf0: 20 2a 2a 20 53 65 72 76 65 72 20 61 6e 6e 6f 75 ** Server annou
cb00: 6e 63 65 73 20 74 68 61 74 20 69 74 20 68 61 73 nces that it has
cb10: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 a particular fi
cb20: 6c 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 0a le. If this is.
cb30: 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 61 20 66 ** not a f
cb40: 69 6c 65 20 74 68 61 74 20 77 65 20 68 61 76 65 ile that we have
cb50: 20 61 6e 64 20 77 65 20 61 72 65 20 70 75 6c 6c and we are pull
cb60: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 ing, then create
cb70: 20 61 0a 20 20 20 20 20 20 2a 2a 20 70 68 61 6e a. ** phan
cb80: 74 6f 6d 20 74 6f 20 63 61 75 73 65 20 74 68 69 tom to cause thi
cb90: 73 20 66 69 6c 65 20 74 6f 20 62 65 20 72 65 71 s file to be req
cba0: 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20 6e 65 uested on the ne
cbb0: 78 74 20 63 79 63 6c 65 2e 0a 20 20 20 20 20 20 xt cycle..
cbc0: 2a 2a 20 41 6c 77 61 79 73 20 72 65 6d 65 6d 62 ** Always rememb
cbd0: 65 72 20 74 68 61 74 20 74 68 65 20 73 65 72 76 er that the serv
cbe0: 65 72 20 68 61 73 20 74 68 69 73 20 66 69 6c 65 er has this file
cbf0: 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 0a 20 so that we do.
cc00: 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 72 61 6e ** not tran
cc10: 73 6d 69 74 20 69 74 20 62 79 20 61 63 63 69 64 smit it by accid
cc20: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 ent.. **.
cc30: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 50 52 ** If the PR
cc40: 49 56 41 54 45 20 61 72 67 75 6d 65 6e 74 20 65 IVATE argument e
cc50: 78 69 73 74 73 20 61 6e 64 20 69 73 20 31 2c 20 xists and is 1,
cc60: 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 69 73 then the file is
cc70: 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 76 61 74 . ** privat
cc80: 65 2e 20 20 50 72 65 74 65 6e 64 20 69 74 20 64 e. Pretend it d
cc90: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 73 20 69 oes not exists i
cca0: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 70 75 6c f we are not pul
ccb0: 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 72 ling. ** pr
ccc0: 69 76 61 74 65 20 66 69 6c 65 73 2e 0a 20 20 20 ivate files..
ccd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 */. if(
cce0: 78 66 65 72 2e 6e 54 6f 6b 65 6e 3e 3d 32 0a 20 xfer.nToken>=2.
ccf0: 20 20 20 20 20 20 26 26 20 62 6c 6f 62 5f 65 71 && blob_eq
cd00: 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d (&xfer.aToken[0]
cd10: 2c 20 22 69 67 6f 74 22 29 0a 20 20 20 20 20 20 , "igot").
cd20: 20 26 26 20 62 6c 6f 62 5f 69 73 5f 75 75 69 64 && blob_is_uuid
cd30: 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d (&xfer.aToken[1]
cd40: 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 ). ){.
cd50: 20 20 20 69 6e 74 20 72 69 64 3b 0a 20 20 20 20 int rid;.
cd60: 20 20 20 20 69 6e 74 20 69 73 50 72 69 76 20 3d int isPriv =
cd70: 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3e 3d 33 20 xfer.nToken>=3
cd80: 26 26 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 && blob_eq(&xfer
cd90: 2e 61 54 6f 6b 65 6e 5b 32 5d 2c 22 31 22 29 3b .aToken[2],"1");
cda0: 0a 20 20 20 20 20 20 20 20 72 69 64 20 3d 20 72 . rid = r
cdb0: 69 64 5f 66 72 6f 6d 5f 75 75 69 64 28 26 78 66 id_from_uuid(&xf
cdc0: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 30 2c er.aToken[1], 0,
cdd0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 0);. if(
cde0: 20 72 69 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 rid>0 ){.
cdf0: 20 20 20 20 69 66 28 20 21 69 73 50 72 69 76 20 if( !isPriv
ce00: 29 20 63 6f 6e 74 65 6e 74 5f 6d 61 6b 65 5f 70 ) content_make_p
ce10: 75 62 6c 69 63 28 72 69 64 29 3b 0a 20 20 20 20 ublic(rid);.
ce20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 }else if( is
ce30: 50 72 69 76 20 26 26 20 21 67 2e 70 65 72 6d 2e Priv && !g.perm.
ce40: 50 72 69 76 61 74 65 20 29 7b 0a 20 20 20 20 20 Private ){.
ce50: 20 20 20 20 20 2f 2a 20 69 67 6e 6f 72 65 20 70 /* ignore p
ce60: 72 69 76 61 74 65 20 66 69 6c 65 73 20 2a 2f 0a rivate files */.
ce70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
ce80: 28 20 28 73 79 6e 63 46 6c 61 67 73 20 26 20 28 ( (syncFlags & (
ce90: 53 59 4e 43 5f 50 55 4c 4c 7c 53 59 4e 43 5f 43 SYNC_PULL|SYNC_C
cea0: 4c 4f 4e 45 29 29 21 3d 30 20 29 7b 0a 20 20 20 LONE))!=0 ){.
ceb0: 20 20 20 20 20 20 20 72 69 64 20 3d 20 63 6f 6e rid = con
cec0: 74 65 6e 74 5f 6e 65 77 28 62 6c 6f 62 5f 73 74 tent_new(blob_st
ced0: 72 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 r(&xfer.aToken[1
cee0: 5d 29 2c 20 69 73 50 72 69 76 29 3b 0a 20 20 20 ]), isPriv);.
cef0: 20 20 20 20 20 20 20 69 66 28 20 72 69 64 20 29 if( rid )
cf00: 20 6e 65 77 50 68 61 6e 74 6f 6d 20 3d 20 31 3b newPhantom = 1;
cf10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
cf20: 20 20 20 72 65 6d 6f 74 65 5f 68 61 73 28 72 69 remote_has(ri
cf30: 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a d);. }else.
cf40: 0a 0a 20 20 20 20 20 20 2f 2a 20 20 20 70 75 73 .. /* pus
cf50: 68 20 20 53 45 52 56 45 52 43 4f 44 45 20 20 50 h SERVERCODE P
cf60: 52 4f 44 55 43 54 43 4f 44 45 0a 20 20 20 20 20 RODUCTCODE.
cf70: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 68 6f **. ** Sho
cf80: 75 6c 64 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 uld only happen
cf90: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 in response to a
cfa0: 20 63 6c 6f 6e 65 2e 20 20 54 68 69 73 20 6d 65 clone. This me
cfb0: 73 73 61 67 65 20 74 65 6c 6c 73 0a 20 20 20 20 ssage tells.
cfc0: 20 20 2a 2a 20 74 68 65 20 63 6c 69 65 6e 74 20 ** the client
cfd0: 77 68 61 74 20 70 72 6f 64 75 63 74 20 74 6f 20 what product to
cfe0: 75 73 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 use for the new
cff0: 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 database..
d000: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f */. if( blo
d010: 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 b_eq(&xfer.aToke
d020: 6e 5b 30 5d 2c 22 70 75 73 68 22 29 0a 20 20 20 n[0],"push").
d030: 20 20 20 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b && xfer.nTok
d040: 65 6e 3d 3d 33 0a 20 20 20 20 20 20 20 26 26 20 en==3. &&
d050: 28 73 79 6e 63 46 6c 61 67 73 20 26 20 53 59 4e (syncFlags & SYN
d060: 43 5f 43 4c 4f 4e 45 29 21 3d 30 0a 20 20 20 20 C_CLONE)!=0.
d070: 20 20 20 26 26 20 62 6c 6f 62 5f 69 73 5f 75 75 && blob_is_uu
d080: 69 64 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b id(&xfer.aToken[
d090: 31 5d 29 0a 20 20 20 20 20 20 20 26 26 20 62 6c 1]). && bl
d0a0: 6f 62 5f 69 73 5f 75 75 69 64 28 26 78 66 65 72 ob_is_uuid(&xfer
d0b0: 2e 61 54 6f 6b 65 6e 5b 32 5d 29 0a 20 20 20 20 .aToken[2]).
d0c0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 ){. if(
d0d0: 20 62 6c 6f 62 5f 65 71 5f 73 74 72 28 26 78 66 blob_eq_str(&xf
d0e0: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 7a 53 er.aToken[1], zS
d0f0: 43 6f 64 65 2c 20 2d 31 29 20 29 7b 0a 20 20 20 Code, -1) ){.
d100: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 61 fossil_fa
d110: 74 61 6c 28 22 73 65 72 76 65 72 20 6c 6f 6f 70 tal("server loop
d120: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ");. }.
d130: 20 20 20 20 20 20 69 66 28 20 7a 50 43 6f 64 65 if( zPCode
d140: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
d150: 20 7a 50 43 6f 64 65 20 3d 20 6d 70 72 69 6e 74 zPCode = mprint
d160: 66 28 22 25 62 22 2c 20 26 78 66 65 72 2e 61 54 f("%b", &xfer.aT
d170: 6f 6b 65 6e 5b 32 5d 29 3b 0a 20 20 20 20 20 20 oken[2]);.
d180: 20 20 20 20 64 62 5f 73 65 74 28 22 70 72 6f 6a db_set("proj
d190: 65 63 74 2d 63 6f 64 65 22 2c 20 7a 50 43 6f 64 ect-code", zPCod
d1a0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d e, 0);. }
d1b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f . if( clo
d1c0: 6e 65 53 65 71 6e 6f 3e 30 20 29 20 62 6c 6f 62 neSeqno>0 ) blob
d1d0: 5f 61 70 70 65 6e 64 66 28 26 73 65 6e 64 2c 20 _appendf(&send,
d1e0: 22 63 6c 6f 6e 65 20 33 20 25 64 5c 6e 22 2c 20 "clone 3 %d\n",
d1f0: 63 6c 6f 6e 65 53 65 71 6e 6f 29 3b 0a 20 20 20 cloneSeqno);.
d200: 20 20 20 20 20 6e 43 61 72 64 53 65 6e 74 2b 2b nCardSent++
d210: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 ;. }else..
d220: 20 20 20 20 20 2f 2a 20 20 20 63 6f 6e 66 69 67 /* config
d230: 20 4e 41 4d 45 20 53 49 5a 45 20 5c 6e 20 43 4f NAME SIZE \n CO
d240: 4e 54 45 4e 54 0a 20 20 20 20 20 20 2a 2a 0a 20 NTENT. **.
d250: 20 20 20 20 20 2a 2a 20 52 65 63 65 69 76 65 20 ** Receive
d260: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 a configuration
d270: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 value from the s
d280: 65 72 76 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a erver.. **.
d290: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 ** The rec
d2a0: 65 69 76 65 64 20 63 6f 6e 66 69 67 75 72 61 74 eived configurat
d2b0: 69 6f 6e 20 73 65 74 74 69 6e 67 20 69 73 20 73 ion setting is s
d2c0: 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64 20 ilently ignored
d2d0: 69 66 20 69 74 20 77 61 73 0a 20 20 20 20 20 20 if it was.
d2e0: 2a 2a 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 ** not requested
d2f0: 20 62 79 20 61 20 70 72 69 6f 72 20 22 72 65 71 by a prior "req
d300: 63 6f 6e 66 69 67 22 20 73 65 6e 74 20 66 72 6f config" sent fro
d310: 6d 20 63 6c 69 65 6e 74 20 74 6f 20 73 65 72 76 m client to serv
d320: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 er.. */.
d330: 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 if( blob_eq(&
d340: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 22 xfer.aToken[0],"
d350: 63 6f 6e 66 69 67 22 29 20 26 26 20 78 66 65 72 config") && xfer
d360: 2e 6e 54 6f 6b 65 6e 3d 3d 33 0a 20 20 20 20 20 .nToken==3.
d370: 20 20 20 20 20 26 26 20 62 6c 6f 62 5f 69 73 5f && blob_is_
d380: 69 6e 74 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e int(&xfer.aToken
d390: 5b 32 5d 2c 20 26 73 69 7a 65 29 20 29 7b 0a 20 [2], &size) ){.
d3a0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 const cha
d3b0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 62 6c 6f 62 5f r *zName = blob_
d3c0: 73 74 72 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e str(&xfer.aToken
d3d0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 42 6c [1]);. Bl
d3e0: 6f 62 20 63 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 ob content;.
d3f0: 20 20 20 20 62 6c 6f 62 5f 7a 65 72 6f 28 26 63 blob_zero(&c
d400: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 ontent);.
d410: 20 62 6c 6f 62 5f 65 78 74 72 61 63 74 28 78 66 blob_extract(xf
d420: 65 72 2e 70 49 6e 2c 20 73 69 7a 65 2c 20 26 63 er.pIn, size, &c
d430: 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 ontent);.
d440: 20 67 2e 70 65 72 6d 2e 41 64 6d 69 6e 20 3d 20 g.perm.Admin =
d450: 67 2e 70 65 72 6d 2e 52 64 41 64 64 72 20 3d 20 g.perm.RdAddr =
d460: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 66 69 1;. confi
d470: 67 75 72 65 5f 72 65 63 65 69 76 65 28 7a 4e 61 gure_receive(zNa
d480: 6d 65 2c 20 26 63 6f 6e 74 65 6e 74 2c 20 6f 72 me, &content, or
d490: 69 67 43 6f 6e 66 69 67 52 63 76 4d 61 73 6b 29 igConfigRcvMask)
d4a0: 3b 0a 20 20 20 20 20 20 20 20 6e 43 61 72 64 52 ;. nCardR
d4b0: 63 76 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e cvd++;. n
d4c0: 41 72 74 69 66 61 63 74 52 63 76 64 2b 2b 3b 0a ArtifactRcvd++;.
d4d0: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 blob_res
d4e0: 65 74 28 26 63 6f 6e 74 65 6e 74 29 3b 0a 20 20 et(&content);.
d4f0: 20 20 20 20 20 20 62 6c 6f 62 5f 73 65 65 6b 28 blob_seek(
d500: 78 66 65 72 2e 70 49 6e 2c 20 31 2c 20 42 4c 4f xfer.pIn, 1, BLO
d510: 42 5f 53 45 45 4b 5f 43 55 52 29 3b 0a 20 20 20 B_SEEK_CUR);.
d520: 20 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 20 20 20 }else...
d530: 20 2f 2a 20 20 20 20 63 6f 6f 6b 69 65 20 54 45 /* cookie TE
d540: 58 54 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 XT. **.
d550: 20 20 2a 2a 20 54 68 65 20 73 65 72 76 65 72 20 ** The server
d560: 6d 69 67 68 74 20 69 6e 63 6c 75 64 65 20 61 20 might include a
d570: 63 6f 6f 6b 69 65 20 69 6e 20 69 74 73 20 72 65 cookie in its re
d580: 70 6c 79 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 ply. The client
d590: 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 . ** should
d5a0: 20 72 65 6d 65 6d 62 65 72 20 74 68 69 73 20 63 remember this c
d5b0: 6f 6f 6b 69 65 20 61 6e 64 20 73 65 6e 64 20 69 ookie and send i
d5c0: 74 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 65 t back to the se
d5d0: 72 76 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 6e rver. ** in
d5e0: 20 69 74 73 20 6e 65 78 74 20 71 75 65 72 79 2e its next query.
d5f0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 . **.
d600: 2a 2a 20 45 61 63 68 20 63 6f 6f 6b 69 65 20 72 ** Each cookie r
d610: 65 63 65 69 76 65 64 20 6f 76 65 72 77 72 69 74 eceived overwrit
d620: 65 73 20 74 68 65 20 70 72 69 6f 72 20 63 6f 6f es the prior coo
d630: 6b 69 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 kie from the.
d640: 20 20 20 2a 2a 20 73 61 6d 65 20 73 65 72 76 65 ** same serve
d650: 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 r.. */.
d660: 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 if( blob_eq(&x
d670: 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 20 22 fer.aToken[0], "
d680: 63 6f 6f 6b 69 65 22 29 20 26 26 20 78 66 65 72 cookie") && xfer
d690: 2e 6e 54 6f 6b 65 6e 3d 3d 32 20 29 7b 0a 20 20 .nToken==2 ){.
d6a0: 20 20 20 20 20 20 64 62 5f 73 65 74 28 22 63 6f db_set("co
d6b0: 6f 6b 69 65 22 2c 20 62 6c 6f 62 5f 73 74 72 28 okie", blob_str(
d6c0: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 &xfer.aToken[1])
d6d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 , 0);. }els
d6e0: 65 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 20 20 20 e... /*
d6f0: 70 72 69 76 61 74 65 0a 20 20 20 20 20 20 2a 2a private. **
d700: 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 . ** This c
d710: 61 72 64 20 69 6e 64 69 63 61 74 65 73 20 74 68 ard indicates th
d720: 61 74 20 74 68 65 20 6e 65 78 74 20 22 66 69 6c at the next "fil
d730: 65 22 20 6f 72 20 22 63 66 69 6c 65 22 20 77 69 e" or "cfile" wi
d740: 6c 6c 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 ll contain.
d750: 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 6e 74 ** private cont
d760: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 ent.. */.
d770: 20 20 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 if( blob_eq(
d780: 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c &xfer.aToken[0],
d790: 20 22 70 72 69 76 61 74 65 22 29 20 29 7b 0a 20 "private") ){.
d7a0: 20 20 20 20 20 20 20 78 66 65 72 2e 6e 65 78 74 xfer.next
d7b0: 49 73 50 72 69 76 61 74 65 20 3d 20 31 3b 0a 20 IsPrivate = 1;.
d7c0: 20 20 20 20 20 7d 65 6c 73 65 0a 0a 0a 20 20 20 }else...
d7d0: 20 20 20 2f 2a 20 20 20 20 63 6c 6f 6e 65 5f 73 /* clone_s
d7e0: 65 71 6e 6f 20 4e 0a 20 20 20 20 20 20 2a 2a 0a eqno N. **.
d7f0: 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 64 6f ** When do
d800: 69 6e 67 20 61 20 63 6c 6f 6e 65 2c 20 74 68 65 ing a clone, the
d810: 20 73 65 72 76 65 72 20 74 72 69 65 73 20 74 6f server tries to
d820: 20 73 65 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 send all of its
d830: 20 61 72 74 69 66 61 63 74 73 0a 20 20 20 20 20 artifacts.
d840: 20 2a 2a 20 69 6e 20 73 65 71 75 65 6e 63 65 2e ** in sequence.
d850: 20 20 54 68 69 73 20 63 61 72 64 20 69 6e 64 69 This card indi
d860: 63 61 74 65 73 20 74 68 65 20 73 65 71 75 65 6e cates the sequen
d870: 63 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 ce number of the
d880: 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 62 next. ** b
d890: 6c 6f 62 20 74 68 61 74 20 6e 65 65 64 73 20 74 lob that needs t
d8a0: 6f 20 62 65 20 73 65 6e 74 2e 20 20 49 66 20 4e o be sent. If N
d8b0: 3c 3d 30 20 74 68 61 74 20 69 6e 64 69 63 61 74 <=0 that indicat
d8c0: 65 73 20 74 68 61 74 20 61 6c 6c 20 62 6c 6f 62 es that all blob
d8d0: 73 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 s. ** have
d8e0: 62 65 65 6e 20 73 65 6e 74 2e 0a 20 20 20 20 20 been sent..
d8f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 6c */. if( bl
d900: 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 54 6f 6b ob_eq(&xfer.aTok
d910: 65 6e 5b 30 5d 2c 20 22 63 6c 6f 6e 65 5f 73 65 en[0], "clone_se
d920: 71 6e 6f 22 29 20 26 26 20 78 66 65 72 2e 6e 54 qno") && xfer.nT
d930: 6f 6b 65 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 oken==2 ){.
d940: 20 20 20 62 6c 6f 62 5f 69 73 5f 69 6e 74 28 26 blob_is_int(&
d950: 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 2c 20 xfer.aToken[1],
d960: 26 63 6c 6f 6e 65 53 65 71 6e 6f 29 3b 0a 20 20 &cloneSeqno);.
d970: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 20 }else..
d980: 20 2f 2a 20 20 20 6d 65 73 73 61 67 65 20 4d 45 /* message ME
d990: 53 53 41 47 45 0a 20 20 20 20 20 20 2a 2a 0a 20 SSAGE. **.
d9a0: 20 20 20 20 20 2a 2a 20 50 72 69 6e 74 20 61 20 ** Print a
d9b0: 6d 65 73 73 61 67 65 2e 20 20 53 69 6d 69 6c 61 message. Simila
d9c0: 72 20 74 6f 20 22 65 72 72 6f 72 22 20 62 75 74 r to "error" but
d9d0: 20 64 6f 65 73 20 6e 6f 74 20 73 74 6f 70 20 70 does not stop p
d9e0: 72 6f 63 65 73 73 69 6e 67 2e 0a 20 20 20 20 20 rocessing..
d9f0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 **. ** If
da00: 74 68 65 20 22 6c 6f 67 69 6e 20 66 61 69 6c 65 the "login faile
da10: 64 22 20 6d 65 73 73 61 67 65 20 69 73 20 73 65 d" message is se
da20: 65 6e 2c 20 63 6c 65 61 72 20 74 68 65 20 73 79 en, clear the sy
da30: 6e 63 20 70 61 73 73 77 6f 72 64 20 70 72 69 6f nc password prio
da40: 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 r. ** to th
da50: 65 20 6e 65 78 74 20 63 79 63 6c 65 2e 0a 20 20 e next cycle..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 */. if(
da70: 20 62 6c 6f 62 5f 65 71 28 26 78 66 65 72 2e 61 blob_eq(&xfer.a
da80: 54 6f 6b 65 6e 5b 30 5d 2c 22 6d 65 73 73 61 67 Token[0],"messag
da90: 65 22 29 20 26 26 20 78 66 65 72 2e 6e 54 6f 6b e") && xfer.nTok
daa0: 65 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 en==2 ){.
dab0: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 62 6c char *zMsg = bl
dac0: 6f 62 5f 74 65 72 6d 69 6e 61 74 65 28 26 78 66 ob_terminate(&xf
dad0: 65 72 2e 61 54 6f 6b 65 6e 5b 31 5d 29 3b 0a 20 er.aToken[1]);.
dae0: 20 20 20 20 20 20 20 64 65 66 6f 73 73 69 6c 69 defossili
daf0: 7a 65 28 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 ze(zMsg);.
db00: 20 20 69 66 28 20 28 73 79 6e 63 46 6c 61 67 73 if( (syncFlags
db10: 20 26 20 53 59 4e 43 5f 50 55 53 48 29 20 26 26 & SYNC_PUSH) &&
db20: 20 7a 4d 73 67 20 26 26 20 73 71 6c 69 74 65 33 zMsg && sqlite3
db30: 5f 73 74 72 67 6c 6f 62 28 22 70 75 6c 6c 20 6f _strglob("pull o
db40: 6e 6c 79 20 2a 22 2c 20 7a 4d 73 67 29 3d 3d 30 nly *", zMsg)==0
db50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 79 ){. sy
db60: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 53 59 4e 43 ncFlags &= ~SYNC
db70: 5f 50 55 53 48 3b 0a 20 20 20 20 20 20 20 20 20 _PUSH;.
db80: 20 7a 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 zMsg = 0;.
db90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
dba0: 20 7a 4d 73 67 20 26 26 20 7a 4d 73 67 5b 30 5d zMsg && zMsg[0]
dbb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f ){. fo
dbc0: 73 73 69 6c 5f 66 6f 72 63 65 5f 6e 65 77 6c 69 ssil_force_newli
dbd0: 6e 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ne();.
dbe0: 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 22 53 65 fossil_print("Se
dbf0: 72 76 65 72 20 73 61 79 73 3a 20 25 73 5c 6e 22 rver says: %s\n"
dc00: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 , zMsg);.
dc10: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a }. }else..
dc20: 20 20 20 20 20 20 2f 2a 20 20 20 20 70 72 61 67 /* prag
dc30: 6d 61 20 4e 41 4d 45 20 56 41 4c 55 45 2e 2e 2e ma NAME VALUE...
dc40: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 . **.
dc50: 2a 2a 20 54 68 65 20 73 65 72 76 65 72 20 63 61 ** The server ca
dc60: 6e 20 73 65 6e 64 20 70 72 61 67 6d 61 73 20 74 n send pragmas t
dc70: 6f 20 74 72 79 20 74 6f 20 63 6f 6e 76 65 79 20 o try to convey
dc80: 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e meta-information
dc90: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 to. ** the
dca0: 20 63 6c 69 65 6e 74 2e 20 20 54 68 65 73 65 20 client. These
dcb0: 61 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 are informationa
dcc0: 6c 20 6f 6e 6c 79 2e 20 20 55 6e 6b 6e 6f 77 6e l only. Unknown
dcd0: 20 70 72 61 67 6d 61 73 20 61 72 65 0a 20 20 20 pragmas are.
dce0: 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20 69 ** silently i
dcf0: 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f gnored.. */
dd00: 0a 20 20 20 20 20 20 69 66 28 20 62 6c 6f 62 5f . if( blob_
dd10: 65 71 28 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b eq(&xfer.aToken[
dd20: 30 5d 2c 20 22 70 72 61 67 6d 61 22 29 20 26 26 0], "pragma") &&
dd30: 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3e 3d 32 20 xfer.nToken>=2
dd40: 29 7b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 0a ){. }else..
dd50: 20 20 20 20 20 20 2f 2a 20 20 20 65 72 72 6f 72 /* error
dd60: 20 4d 45 53 53 41 47 45 0a 20 20 20 20 20 20 2a MESSAGE. *
dd70: 2a 0a 20 20 20 20 20 20 2a 2a 20 52 65 70 6f 72 *. ** Repor
dd80: 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 61 t an error and a
dd90: 62 61 6e 64 6f 6e 20 74 68 65 20 73 79 6e 63 20 bandon the sync
dda0: 73 65 73 73 69 6f 6e 2e 0a 20 20 20 20 20 20 2a session.. *
ddb0: 2a 0a 20 20 20 20 20 20 2a 2a 20 45 78 63 65 70 *. ** Excep
ddc0: 74 2c 20 77 68 65 6e 20 63 6c 6f 6e 69 6e 67 20 t, when cloning
ddd0: 77 65 20 77 69 6c 6c 20 73 6f 6d 65 74 69 6d 65 we will sometime
dde0: 73 20 67 65 74 20 61 6e 20 65 72 72 6f 72 20 6f s get an error o
ddf0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 n the. ** f
de00: 69 72 73 74 20 6d 65 73 73 61 67 65 20 65 78 63 irst message exc
de10: 68 61 6e 67 65 20 62 65 63 61 75 73 65 20 74 68 hange because th
de20: 65 20 70 72 6f 6a 65 63 74 2d 63 6f 64 65 20 69 e project-code i
de30: 73 20 75 6e 6b 6e 6f 77 6e 0a 20 20 20 20 20 20 s unknown.
de40: 2a 2a 20 61 6e 64 20 73 6f 20 74 68 65 20 6c 6f ** and so the lo
de50: 67 69 6e 20 63 61 72 64 20 6f 6e 20 74 68 65 20 gin card on the
de60: 72 65 71 75 65 73 74 20 77 61 73 20 69 6e 76 61 request was inva
de70: 6c 69 64 2e 20 20 54 68 65 20 70 72 6f 6a 65 63 lid. The projec
de80: 74 2d 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 t-code. **
de90: 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 is returned in t
dea0: 68 65 20 72 65 70 6c 79 20 62 65 66 6f 72 65 20 he reply before
deb0: 74 68 65 20 65 72 72 6f 72 20 63 61 72 64 2c 20 the error card,
dec0: 73 6f 20 73 65 63 6f 6e 64 20 61 6e 64 0a 20 20 so second and.
ded0: 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e ** subsequen
dee0: 74 20 6d 65 73 73 61 67 65 73 20 73 68 6f 75 6c t messages shoul
def0: 64 20 62 65 20 4f 4b 2e 20 20 4e 65 76 65 72 74 d be OK. Nevert
df00: 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 heless, we need
df10: 74 6f 20 69 67 6e 6f 72 65 0a 20 20 20 20 20 20 to ignore.
df20: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 61 72 ** the error car
df30: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 6d d on the first m
df40: 65 73 73 61 67 65 20 6f 66 20 61 20 63 6c 6f 6e essage of a clon
df50: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 e.. */.
df60: 20 20 69 66 28 20 62 6c 6f 62 5f 65 71 28 26 78 if( blob_eq(&x
df70: 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 5d 2c 22 65 fer.aToken[0],"e
df80: 72 72 6f 72 22 29 20 26 26 20 78 66 65 72 2e 6e rror") && xfer.n
df90: 54 6f 6b 65 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 Token==2 ){.
dfa0: 20 20 20 20 69 66 28 20 28 73 79 6e 63 46 6c 61 if( (syncFla
dfb0: 67 73 20 26 20 53 59 4e 43 5f 43 4c 4f 4e 45 29 gs & SYNC_CLONE)
dfc0: 3d 3d 30 20 7c 7c 20 6e 43 79 63 6c 65 3e 30 20 ==0 || nCycle>0
dfd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 ){. cha
dfe0: 72 20 2a 7a 4d 73 67 20 3d 20 62 6c 6f 62 5f 74 r *zMsg = blob_t
dff0: 65 72 6d 69 6e 61 74 65 28 26 78 66 65 72 2e 61 erminate(&xfer.a
e000: 54 6f 6b 65 6e 5b 31 5d 29 3b 0a 20 20 20 20 20 Token[1]);.
e010: 20 20 20 20 20 64 65 66 6f 73 73 69 6c 69 7a 65 defossilize
e020: 28 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 (zMsg);.
e030: 20 20 66 6f 73 73 69 6c 5f 66 6f 72 63 65 5f 6e fossil_force_n
e040: 65 77 6c 69 6e 65 28 29 3b 0a 20 20 20 20 20 20 ewline();.
e050: 20 20 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 fossil_print
e060: 28 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 ("Error: %s\n",
e070: 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 zMsg);.
e080: 20 69 66 28 20 66 6f 73 73 69 6c 5f 73 74 72 63 if( fossil_strc
e090: 6d 70 28 7a 4d 73 67 2c 20 22 6c 6f 67 69 6e 20 mp(zMsg, "login
e0a0: 66 61 69 6c 65 64 22 29 3d 3d 30 20 29 7b 0a 20 failed")==0 ){.
e0b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e if( n
e0c0: 43 79 63 6c 65 3c 32 20 29 7b 0a 20 20 20 20 20 Cycle<2 ){.
e0d0: 20 20 20 20 20 20 20 20 20 67 2e 75 72 6c 2e 70 g.url.p
e0e0: 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 20 20 20 asswd = 0;.
e0f0: 20 20 20 20 20 20 20 20 20 67 6f 20 3d 20 31 3b go = 1;
e100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 . i
e110: 66 28 20 67 2e 63 67 69 4f 75 74 70 75 74 3d 3d f( g.cgiOutput==
e120: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
e130: 20 20 20 20 20 67 2e 75 72 6c 2e 66 6c 61 67 73 g.url.flags
e140: 20 7c 3d 20 55 52 4c 5f 50 52 4f 4d 50 54 5f 50 |= URL_PROMPT_P
e150: 57 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 W;.
e160: 20 20 20 67 2e 75 72 6c 2e 66 6c 61 67 73 20 26 g.url.flags &
e170: 3d 20 7e 55 52 4c 5f 50 52 4f 4d 50 54 45 44 3b = ~URL_PROMPTED;
e180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
e190: 20 75 72 6c 5f 70 72 6f 6d 70 74 5f 66 6f 72 5f url_prompt_for_
e1a0: 70 61 73 73 77 6f 72 64 28 29 3b 0a 20 20 20 20 password();.
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 75 72 6c 5f url_
e1c0: 72 65 6d 65 6d 62 65 72 28 29 3b 0a 20 20 20 20 remember();.
e1d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
e1e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72 nEr
e200: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 r++;.
e210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c }. }el
e220: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 se{.
e230: 62 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 78 66 blob_appendf(&xf
e240: 65 72 2e 65 72 72 2c 20 22 73 65 72 76 65 72 20 er.err, "server
e250: 73 61 79 73 3a 20 25 73 5c 6e 22 2c 20 7a 4d 73 says: %s\n", zMs
e260: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 g);.
e270: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 nErr++;.
e280: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 }. br
e290: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 eak;. }.
e2a0: 20 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 }else..
e2b0: 20 20 2f 2a 20 55 6e 6b 6e 6f 77 6e 20 6d 65 73 /* Unknown mes
e2c0: 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 sage */. if
e2d0: 28 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 3e 30 20 ( xfer.nToken>0
e2e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 ){. if( b
e2f0: 6c 6f 62 5f 73 74 72 28 26 78 66 65 72 2e 61 54 lob_str(&xfer.aT
e300: 6f 6b 65 6e 5b 30 5d 29 5b 30 5d 3d 3d 27 3c 27 oken[0])[0]=='<'
e310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f ){. fo
e320: 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 0a 20 20 ssil_warning(.
e330: 20 20 20 20 20 20 20 20 20 20 22 73 65 72 76 65 "serve
e340: 72 20 72 65 70 6c 69 65 73 20 77 69 74 68 20 48 r replies with H
e350: 54 4d 4c 20 69 6e 73 74 65 61 64 20 6f 66 20 66 TML instead of f
e360: 6f 73 73 69 6c 20 73 79 6e 63 20 70 72 6f 74 6f ossil sync proto
e370: 63 6f 6c 3a 5c 6e 25 62 22 2c 0a 20 20 20 20 20 col:\n%b",.
e380: 20 20 20 20 20 20 20 26 72 65 63 76 0a 20 20 20 &recv.
e390: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 );.
e3a0: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 nErr++;.
e3b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
e3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 }. b
e3d0: 6c 6f 62 5f 61 70 70 65 6e 64 66 28 26 78 66 65 lob_appendf(&xfe
e3e0: 72 2e 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 r.err, "unknown
e3f0: 63 6f 6d 6d 61 6e 64 3a 20 5b 25 62 5d 5c 6e 22 command: [%b]\n"
e400: 2c 20 26 78 66 65 72 2e 61 54 6f 6b 65 6e 5b 30 , &xfer.aToken[0
e410: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 ]);. }..
e420: 20 20 20 69 66 28 20 62 6c 6f 62 5f 73 69 7a 65 if( blob_size
e430: 28 26 78 66 65 72 2e 65 72 72 29 20 29 7b 0a 20 (&xfer.err) ){.
e440: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 6f fossil_fo
e450: 72 63 65 5f 6e 65 77 6c 69 6e 65 28 29 3b 0a 20 rce_newline();.
e460: 20 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 77 61 fossil_wa
e470: 72 6e 69 6e 67 28 22 25 62 22 2c 20 26 78 66 65 rning("%b", &xfe
e480: 72 2e 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 r.err);.
e490: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 nErr++;.
e4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
e4b0: 20 20 20 20 20 62 6c 6f 62 61 72 72 61 79 5f 72 blobarray_r
e4c0: 65 73 65 74 28 78 66 65 72 2e 61 54 6f 6b 65 6e eset(xfer.aToken
e4d0: 2c 20 78 66 65 72 2e 6e 54 6f 6b 65 6e 29 3b 0a , xfer.nToken);.
e4e0: 20 20 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 blob_reset
e4f0: 28 26 78 66 65 72 2e 6c 69 6e 65 29 3b 0a 20 20 (&xfer.line);.
e500: 20 20 7d 0a 20 20 20 20 69 66 28 20 28 63 6f 6e }. if( (con
e510: 66 69 67 52 63 76 4d 61 73 6b 20 26 20 28 43 4f figRcvMask & (CO
e520: 4e 46 49 47 53 45 54 5f 55 53 45 52 7c 43 4f 4e NFIGSET_USER|CON
e530: 46 49 47 53 45 54 5f 54 4b 54 29 29 21 3d 30 0a FIGSET_TKT))!=0.
e540: 20 20 20 20 20 26 26 20 28 63 6f 6e 66 69 67 52 && (configR
e550: 63 76 4d 61 73 6b 20 26 20 43 4f 4e 46 49 47 53 cvMask & CONFIGS
e560: 45 54 5f 4f 4c 44 46 4f 52 4d 41 54 29 21 3d 30 ET_OLDFORMAT)!=0
e570: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f . ){. co
e580: 6e 66 69 67 75 72 65 5f 66 69 6e 61 6c 69 7a 65 nfigure_finalize
e590: 5f 72 65 63 65 69 76 65 28 29 3b 0a 20 20 20 20 _receive();.
e5a0: 7d 0a 20 20 20 20 6f 72 69 67 43 6f 6e 66 69 67 }. origConfig
e5b0: 52 63 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 RcvMask = 0;.
e5c0: 20 69 66 28 20 6e 43 61 72 64 52 63 76 64 3e 30 if( nCardRcvd>0
e5d0: 20 26 26 20 28 73 79 6e 63 46 6c 61 67 73 20 26 && (syncFlags &
e5e0: 20 53 59 4e 43 5f 56 45 52 42 4f 53 45 29 20 29 SYNC_VERBOSE) )
e5f0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 {. fossil_p
e600: 72 69 6e 74 28 7a 56 61 6c 75 65 46 6f 72 6d 61 rint(zValueForma
e610: 74 2c 20 22 52 65 63 65 69 76 65 64 3a 22 2c 0a t, "Received:",.
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e630: 20 20 20 62 6c 6f 62 5f 73 69 7a 65 28 26 72 65 blob_size(&re
e640: 63 76 29 2c 20 6e 43 61 72 64 52 63 76 64 2c 0a cv), nCardRcvd,.
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e660: 20 20 20 78 66 65 72 2e 6e 46 69 6c 65 52 63 76 xfer.nFileRcv
e670: 64 2c 20 78 66 65 72 2e 6e 44 65 6c 74 61 52 63 d, xfer.nDeltaRc
e680: 76 64 20 2b 20 78 66 65 72 2e 6e 44 61 6e 67 6c vd + xfer.nDangl
e690: 69 6e 67 46 69 6c 65 29 3b 0a 20 20 20 20 7d 65 ingFile);. }e
e6a0: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 lse{. fossi
e6b0: 6c 5f 70 72 69 6e 74 28 7a 42 72 69 65 66 46 6f l_print(zBriefFo
e6c0: 72 6d 61 74 2c 20 6e 52 6f 75 6e 64 74 72 69 70 rmat, nRoundtrip
e6d0: 2c 20 6e 41 72 74 69 66 61 63 74 53 65 6e 74 2c , nArtifactSent,
e6e0: 20 6e 41 72 74 69 66 61 63 74 52 63 76 64 29 3b nArtifactRcvd);
e6f0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 6c 6f 62 5f . }. blob_
e700: 72 65 73 65 74 28 26 72 65 63 76 29 3b 0a 20 20 reset(&recv);.
e710: 20 20 6e 43 79 63 6c 65 2b 2b 3b 0a 0a 20 20 20 nCycle++;..
e720: 20 2f 2a 20 49 66 20 77 65 20 72 65 63 65 69 76 /* If we receiv
e730: 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 66 ed one or more f
e740: 69 6c 65 73 20 6f 6e 20 74 68 65 20 70 72 65 76 iles on the prev
e750: 69 6f 75 73 20 65 78 63 68 61 6e 67 65 20 62 75 ious exchange bu
e760: 74 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 61 t. ** there a
e770: 72 65 20 73 74 69 6c 6c 20 70 68 61 6e 74 6f 6d re still phantom
e780: 73 2c 20 74 68 65 6e 20 67 6f 20 61 6e 6f 74 68 s, then go anoth
e790: 65 72 20 72 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f er round.. */
e7a0: 0a 20 20 20 20 6e 46 69 6c 65 52 65 63 76 20 3d . nFileRecv =
e7b0: 20 78 66 65 72 2e 6e 46 69 6c 65 52 63 76 64 20 xfer.nFileRcvd
e7c0: 2b 20 78 66 65 72 2e 6e 44 65 6c 74 61 52 63 76 + xfer.nDeltaRcv
e7d0: 64 20 2b 20 78 66 65 72 2e 6e 44 61 6e 67 6c 69 d + xfer.nDangli
e7e0: 6e 67 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20 ngFile;. if(
e7f0: 28 6e 46 69 6c 65 52 65 63 76 3e 30 20 7c 7c 20 (nFileRecv>0 ||
e800: 6e 65 77 50 68 61 6e 74 6f 6d 29 20 26 26 20 64 newPhantom) && d
e810: 62 5f 65 78 69 73 74 73 28 22 53 45 4c 45 43 54 b_exists("SELECT
e820: 20 31 20 46 52 4f 4d 20 70 68 61 6e 74 6f 6d 22 1 FROM phantom"
e830: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 20 3d 20 ) ){. go =
e840: 31 3b 0a 20 20 20 20 20 20 6d 78 50 68 61 6e 74 1;. mxPhant
e850: 6f 6d 52 65 71 20 3d 20 6e 46 69 6c 65 52 65 63 omReq = nFileRec
e860: 76 2a 32 3b 0a 20 20 20 20 20 20 69 66 28 20 6d v*2;. if( m
e870: 78 50 68 61 6e 74 6f 6d 52 65 71 3c 32 30 30 20 xPhantomReq<200
e880: 29 20 6d 78 50 68 61 6e 74 6f 6d 52 65 71 20 3d ) mxPhantomReq =
e890: 20 32 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 200;. }else
e8a0: 69 66 28 20 28 73 79 6e 63 46 6c 61 67 73 20 26 if( (syncFlags &
e8b0: 20 53 59 4e 43 5f 43 4c 4f 4e 45 29 21 3d 30 20 SYNC_CLONE)!=0
e8c0: 26 26 20 6e 46 69 6c 65 52 65 63 76 3e 30 20 29 && nFileRecv>0 )
e8d0: 7b 0a 20 20 20 20 20 20 67 6f 20 3d 20 31 3b 0a {. go = 1;.
e8e0: 20 20 20 20 7d 0a 20 20 20 20 6e 43 61 72 64 52 }. nCardR
e8f0: 63 76 64 20 3d 20 30 3b 0a 20 20 20 20 78 66 65 cvd = 0;. xfe
e900: 72 2e 6e 46 69 6c 65 52 63 76 64 20 3d 20 30 3b r.nFileRcvd = 0;
e910: 0a 20 20 20 20 78 66 65 72 2e 6e 44 65 6c 74 61 . xfer.nDelta
e920: 52 63 76 64 20 3d 20 30 3b 0a 20 20 20 20 78 66 Rcvd = 0;. xf
e930: 65 72 2e 6e 44 61 6e 67 6c 69 6e 67 46 69 6c 65 er.nDanglingFile
e940: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 = 0;.. /* If
e950: 20 77 65 20 68 61 76 65 20 6f 6e 65 20 6f 72 20 we have one or
e960: 6d 6f 72 65 20 66 69 6c 65 73 20 71 75 65 75 65 more files queue
e970: 64 20 74 6f 20 73 65 6e 64 2c 20 74 68 65 6e 20 d to send, then
e980: 67 6f 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 go. ** anothe
e990: 72 20 72 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 r round. */.
e9a0: 20 20 20 69 66 28 20 78 66 65 72 2e 6e 46 69 6c if( xfer.nFil
e9b0: 65 53 65 6e 74 2b 78 66 65 72 2e 6e 44 65 6c 74 eSent+xfer.nDelt
e9c0: 61 53 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 aSent>0 ){.
e9d0: 20 67 6f 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a go = 1;. }..
e9e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 /* If this i
e9f0: 73 20 61 20 63 6c 6f 6e 65 2c 20 74 68 65 20 67 s a clone, the g
ea00: 6f 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 o at least two r
ea10: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 69 66 28 ounds */. if(
ea20: 20 28 73 79 6e 63 46 6c 61 67 73 20 26 20 53 59 (syncFlags & SY
ea30: 4e 43 5f 43 4c 4f 4e 45 29 21 3d 30 20 26 26 20 NC_CLONE)!=0 &&
ea40: 6e 43 79 63 6c 65 3d 3d 31 20 29 20 67 6f 20 3d nCycle==1 ) go =
ea50: 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 70 1;.. /* Stop
ea60: 20 74 68 65 20 63 79 63 6c 65 20 69 66 20 74 68 the cycle if th
ea70: 65 20 73 65 72 76 65 72 20 73 65 6e 64 73 20 61 e server sends a
ea80: 20 22 63 6c 6f 6e 65 5f 73 65 71 6e 6f 20 30 22 "clone_seqno 0"
ea90: 20 63 61 72 64 20 61 6e 64 0a 20 20 20 20 2a 2a card and. **
eaa0: 20 77 65 20 68 61 76 65 20 67 6f 6e 65 20 61 74 we have gone at
eab0: 20 6c 65 61 73 74 20 74 77 6f 20 72 6f 75 6e 64 least two round
eac0: 73 2e 20 20 41 6c 77 61 79 73 20 67 6f 20 61 74 s. Always go at
ead0: 20 6c 65 61 73 74 20 74 77 6f 20 72 6f 75 6e 64 least two round
eae0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 61 20 63 6c s. ** on a cl
eaf0: 6f 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 one in order to
eb00: 62 65 20 73 75 72 65 20 74 6f 20 72 65 74 72 69 be sure to retri
eb10: 65 76 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 eve the configur
eb20: 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 66 ation. ** inf
eb30: 6f 72 6d 61 74 69 6f 6e 20 77 68 69 63 68 20 69 ormation which i
eb40: 73 20 6f 6e 6c 79 20 73 65 6e 74 20 6f 6e 20 74 s only sent on t
eb50: 68 65 20 73 65 63 6f 6e 64 20 72 6f 75 6e 64 2e he second round.
eb60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
eb70: 63 6c 6f 6e 65 53 65 71 6e 6f 3c 3d 30 20 26 26 cloneSeqno<=0 &&
eb80: 20 6e 43 79 63 6c 65 3e 31 20 29 20 67 6f 20 3d nCycle>1 ) go =
eb90: 20 30 3b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 0;. db_multi
eba0: 5f 65 78 65 63 28 22 44 52 4f 50 20 54 41 42 4c _exec("DROP TABL
ebb0: 45 20 6f 6e 72 65 6d 6f 74 65 22 29 3b 0a 20 20 E onremote");.
ebc0: 20 20 69 66 28 20 67 6f 20 29 7b 0a 20 20 20 20 if( go ){.
ebd0: 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 manifest_cross
ebe0: 6c 69 6e 6b 5f 65 6e 64 28 4d 43 5f 50 45 52 4d link_end(MC_PERM
ebf0: 49 54 5f 48 4f 4f 4b 53 29 3b 0a 20 20 20 20 7d IT_HOOKS);. }
ec00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 61 6e 69 else{. mani
ec10: 66 65 73 74 5f 63 72 6f 73 73 6c 69 6e 6b 5f 65 fest_crosslink_e
ec20: 6e 64 28 4d 43 5f 50 45 52 4d 49 54 5f 48 4f 4f nd(MC_PERMIT_HOO
ec30: 4b 53 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 65 KS);. conte
ec40: 6e 74 5f 65 6e 61 62 6c 65 5f 64 65 70 68 61 6e nt_enable_dephan
ec50: 74 6f 6d 69 7a 65 28 31 29 3b 0a 20 20 20 20 7d tomize(1);. }
ec60: 0a 20 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e . db_end_tran
ec70: 73 61 63 74 69 6f 6e 28 30 29 3b 0a 20 20 7d 3b saction(0);. };
ec80: 0a 20 20 74 72 61 6e 73 70 6f 72 74 5f 73 74 61 . transport_sta
ec90: 74 73 28 26 6e 53 65 6e 74 2c 20 26 6e 52 63 76 ts(&nSent, &nRcv
eca0: 64 2c 20 31 29 3b 0a 20 20 69 66 28 20 28 72 53 d, 1);. if( (rS
ecb0: 6b 65 77 2a 32 34 2e 30 2a 33 36 30 30 2e 30 29 kew*24.0*3600.0)
ecc0: 20 3e 20 31 30 2e 30 20 29 7b 0a 20 20 20 20 20 > 10.0 ){.
ecd0: 66 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 fossil_warning("
ece0: 2a 2a 2a 20 74 69 6d 65 20 73 6b 65 77 20 2a 2a *** time skew **
ecf0: 2a 20 73 65 72 76 65 72 20 69 73 20 66 61 73 74 * server is fast
ed00: 20 62 79 20 25 73 22 2c 0a 20 20 20 20 20 20 20 by %s",.
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 5f db_
ed20: 74 69 6d 65 73 70 61 6e 5f 6e 61 6d 65 28 72 53 timespan_name(rS
ed30: 6b 65 77 29 29 3b 0a 20 20 20 20 20 67 2e 63 6c kew));. g.cl
ed40: 6f 63 6b 53 6b 65 77 53 65 65 6e 20 3d 20 31 3b ockSkewSeen = 1;
ed50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 53 6b . }else if( rSk
ed60: 65 77 2a 32 34 2e 30 2a 33 36 30 30 2e 30 20 3c ew*24.0*3600.0 <
ed70: 20 2d 31 30 2e 30 20 29 7b 0a 20 20 20 20 20 66 -10.0 ){. f
ed80: 6f 73 73 69 6c 5f 77 61 72 6e 69 6e 67 28 22 2a ossil_warning("*
ed90: 2a 2a 20 74 69 6d 65 20 73 6b 65 77 20 2a 2a 2a ** time skew ***
eda0: 20 73 65 72 76 65 72 20 69 73 20 73 6c 6f 77 20 server is slow
edb0: 62 79 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 by %s",.
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 5f 74 db_t
edd0: 69 6d 65 73 70 61 6e 5f 6e 61 6d 65 28 2d 72 53 imespan_name(-rS
ede0: 6b 65 77 29 29 3b 0a 20 20 20 20 20 67 2e 63 6c kew));. g.cl
edf0: 6f 63 6b 53 6b 65 77 53 65 65 6e 20 3d 20 31 3b ockSkewSeen = 1;
ee00: 0a 20 20 7d 0a 0a 20 20 66 6f 73 73 69 6c 5f 66 . }.. fossil_f
ee10: 6f 72 63 65 5f 6e 65 77 6c 69 6e 65 28 29 3b 0a orce_newline();.
ee20: 20 20 66 6f 73 73 69 6c 5f 70 72 69 6e 74 28 0a fossil_print(.
ee30: 20 20 20 20 20 22 25 73 20 66 69 6e 69 73 68 65 "%s finishe
ee40: 64 20 77 69 74 68 20 25 6c 6c 64 20 62 79 74 65 d with %lld byte
ee50: 73 20 73 65 6e 74 2c 20 25 6c 6c 64 20 62 79 74 s sent, %lld byt
ee60: 65 73 20 72 65 63 65 69 76 65 64 5c 6e 22 2c 0a es received\n",.
ee70: 20 20 20 20 20 7a 4f 70 54 79 70 65 2c 20 6e 53 zOpType, nS
ee80: 65 6e 74 2c 20 6e 52 63 76 64 29 3b 0a 20 20 74 ent, nRcvd);. t
ee90: 72 61 6e 73 70 6f 72 74 5f 63 6c 6f 73 65 28 26 ransport_close(&
eea0: 67 2e 75 72 6c 29 3b 0a 20 20 74 72 61 6e 73 70 g.url);. transp
eeb0: 6f 72 74 5f 67 6c 6f 62 61 6c 5f 73 68 75 74 64 ort_global_shutd
eec0: 6f 77 6e 28 26 67 2e 75 72 6c 29 3b 0a 20 20 69 own(&g.url);. i
eed0: 66 28 20 6e 45 72 72 20 26 26 20 67 6f 3d 3d 32 f( nErr && go==2
eee0: 20 29 7b 0a 20 20 20 20 64 62 5f 6d 75 6c 74 69 ){. db_multi
eef0: 5f 65 78 65 63 28 22 44 52 4f 50 20 54 41 42 4c _exec("DROP TABL
ef00: 45 20 6f 6e 72 65 6d 6f 74 65 22 29 3b 0a 20 20 E onremote");.
ef10: 20 20 6d 61 6e 69 66 65 73 74 5f 63 72 6f 73 73 manifest_cross
ef20: 6c 69 6e 6b 5f 65 6e 64 28 4d 43 5f 50 45 52 4d link_end(MC_PERM
ef30: 49 54 5f 48 4f 4f 4b 53 29 3b 0a 20 20 20 20 63 IT_HOOKS);. c
ef40: 6f 6e 74 65 6e 74 5f 65 6e 61 62 6c 65 5f 64 65 ontent_enable_de
ef50: 70 68 61 6e 74 6f 6d 69 7a 65 28 31 29 3b 0a 20 phantomize(1);.
ef60: 20 20 20 64 62 5f 65 6e 64 5f 74 72 61 6e 73 61 db_end_transa
ef70: 63 74 69 6f 6e 28 30 29 3b 0a 20 20 7d 0a 20 20 ction(0);. }.
ef80: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a return nErr;.}.