Fossil

Hex Artifact Content
Login

Artifact b52151a38f9ebc5632d9ae76dd8b017e0932ddf6:


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;.}.