pwman

Hex Artifact Content
Login

Artifact 9fab975312547931e0bfc2a6374f2c39b3a9776864d87512c0de076f014c7393:


0000: 2f 2a 0a 20 2a 20 20 50 57 4d 61 6e 20 2d 20 70  /*. *  PWMan - p
0010: 61 73 73 77 6f 72 64 20 6d 61 6e 61 67 65 6d 65  assword manageme
0020: 6e 74 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  nt application. 
0030: 2a 0a 20 2a 20 20 43 6f 70 79 72 69 67 68 74 20  *. *  Copyright 
0040: 28 43 29 20 32 30 30 32 20 20 49 76 61 6e 20 4b  (C) 2002  Ivan K
0050: 65 6c 6c 79 20 3c 69 76 61 6e 40 69 76 61 6e 6b  elly <ivan@ivank
0060: 65 6c 6c 79 2e 6e 65 74 3e 0a 20 2a 0a 20 2a 20  elly.net>. *. * 
0070: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0080: 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20   free software; 
0090: 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72 69  you can redistri
00a0: 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 20 6d  bute it and/or m
00b0: 6f 64 69 66 79 0a 20 2a 20 20 69 74 20 75 6e 64  odify. *  it und
00c0: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
00d0: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20  the GNU General 
00e0: 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 61  Public License a
00f0: 73 20 70 75 62 6c 69 73 68 65 64 20 62 79 0a 20  s published by. 
0100: 2a 20 20 74 68 65 20 46 72 65 65 20 53 6f 66 74  *  the Free Soft
0110: 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 3b  ware Foundation;
0120: 20 65 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20   either version 
0130: 32 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65  2 of the License
0140: 2c 20 6f 72 0a 20 2a 20 20 28 61 74 20 79 6f 75  , or. *  (at you
0150: 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c 61  r option) any la
0160: 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 20 2a 0a  ter version.. *.
0170: 20 2a 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d   *  This program
0180: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0190: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
01a0: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
01b0: 75 6c 2c 0a 20 2a 20 20 62 75 74 20 57 49 54 48  ul,. *  but WITH
01c0: 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59  OUT ANY WARRANTY
01d0: 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74  ; without even t
01e0: 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61  he implied warra
01f0: 6e 74 79 20 6f 66 0a 20 2a 20 20 4d 45 52 43 48  nty of. *  MERCH
0200: 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49  ANTABILITY or FI
0210: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54  TNESS FOR A PART
0220: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20  ICULAR PURPOSE. 
0230: 20 53 65 65 20 74 68 65 0a 20 2a 20 20 47 4e 55   See the. *  GNU
0240: 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20   General Public 
0250: 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65  License for more
0260: 20 64 65 74 61 69 6c 73 2e 0a 20 2a 0a 20 2a 20   details.. *. * 
0270: 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65   You should have
0280: 20 72 65 63 65 69 76 65 64 20 61 20 63 6f 70 79   received a copy
0290: 20 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65   of the GNU Gene
02a0: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e  ral Public Licen
02b0: 73 65 0a 20 2a 20 20 61 6c 6f 6e 67 20 77 69 74  se. *  along wit
02c0: 68 20 74 68 69 73 20 70 72 6f 67 72 61 6d 3b 20  h this program; 
02d0: 69 66 20 6e 6f 74 2c 20 77 72 69 74 65 20 74 6f  if not, write to
02e0: 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61   the Free Softwa
02f0: 72 65 0a 20 2a 20 20 46 6f 75 6e 64 61 74 69 6f  re. *  Foundatio
0300: 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54 65 6d 70  n, Inc., 59 Temp
0310: 6c 65 20 50 6c 61 63 65 2c 20 53 75 69 74 65 20  le Place, Suite 
0320: 33 33 30 2c 20 42 6f 73 74 6f 6e 2c 20 4d 41 20  330, Boston, MA 
0330: 20 30 32 31 31 31 2d 31 33 30 37 20 20 55 53 41   02111-1307  USA
0340: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c  . */..#include <
0350: 70 77 6d 61 6e 2e 68 3e 0a 23 69 6e 63 6c 75 64  pwman.h>.#includ
0360: 65 20 3c 67 6e 75 70 67 2e 68 3e 0a 23 69 6e 63  e <gnupg.h>.#inc
0370: 6c 75 64 65 20 3c 75 69 2e 68 3e 0a 23 69 6e 63  lude <ui.h>.#inc
0380: 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e 0a 23  lude <errno.h>.#
0390: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
03a0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69  h>.#include <uni
03b0: 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  std.h>.#include 
03c0: 3c 6c 69 62 78 6d 6c 2f 74 72 65 65 2e 68 3e 0a  <libxml/tree.h>.
03d0: 23 69 6e 63 6c 75 64 65 20 3c 6c 69 62 78 6d 6c  #include <libxml
03e0: 2f 70 61 72 73 65 72 2e 68 3e 0a 0a 69 6e 74 20  /parser.h>..int 
03f0: 70 77 69 6e 64 65 78 20 3d 20 30 3b 0a 65 78 74  pwindex = 0;.ext
0400: 65 72 6e 20 69 6e 74 20 65 72 72 6e 6f 3b 0a 76  ern int errno;.v
0410: 6f 69 64 20 70 77 6c 69 73 74 5f 66 72 65 65 5f  oid pwlist_free_
0420: 70 77 28 50 77 2a 29 3b 0a 0a 0a 50 57 4c 69 73  pw(Pw*);...PWLis
0430: 74 20 2a 0a 70 77 6c 69 73 74 5f 6e 65 77 28 63  t *.pwlist_new(c
0440: 68 61 72 20 2a 6e 61 6d 65 29 0a 7b 0a 09 50 57  har *name).{..PW
0450: 4c 69 73 74 20 2a 6e 65 77 3b 0a 09 6e 65 77 20  List *new;..new 
0460: 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  = malloc( sizeof
0470: 28 50 57 4c 69 73 74 29 20 29 3b 0a 09 6e 65 77  (PWList) );..new
0480: 2d 3e 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28  ->name = malloc(
0490: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a  STRING_MEDIUM);.
04a0: 09 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 6e 61  .strncpy(new->na
04b0: 6d 65 2c 20 6e 61 6d 65 2c 20 53 54 52 49 4e 47  me, name, STRING
04c0: 5f 4d 45 44 49 55 4d 29 3b 0a 09 6e 65 77 2d 3e  _MEDIUM);..new->
04d0: 70 61 72 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 09  parent = NULL;..
04e0: 6e 65 77 2d 3e 6c 69 73 74 20 3d 20 4e 55 4c 4c  new->list = NULL
04f0: 3b 0a 09 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 4e  ;..new->next = N
0500: 55 4c 4c 3b 0a 09 6e 65 77 2d 3e 73 75 62 6c 69  ULL;..new->subli
0510: 73 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 64 65 62  sts = NULL;..deb
0520: 75 67 28 22 6e 65 77 5f 70 77 6c 69 73 74 3a 20  ug("new_pwlist: 
0530: 25 73 22 2c 20 6e 61 6d 65 29 3b 0a 0a 09 72 65  %s", name);...re
0540: 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 69 6e 74  turn new;.}..int
0550: 0a 70 77 6c 69 73 74 5f 69 6e 69 74 28 29 0a 7b  .pwlist_init().{
0560: 0a 09 70 77 69 6e 64 65 78 20 3d 20 30 3b 0a 09  ..pwindex = 0;..
0570: 70 77 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09  pwlist = NULL;..
0580: 63 75 72 72 65 6e 74 5f 70 77 5f 73 75 62 6c 69  current_pw_subli
0590: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 72 65 74 75  st = NULL;..retu
05a0: 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 0a 70 77  rn 0;.}..int .pw
05b0: 6c 69 73 74 5f 66 72 65 65 28 50 57 4c 69 73 74  list_free(PWList
05c0: 20 2a 6f 6c 64 29 0a 7b 0a 09 50 77 20 2a 63 75   *old).{..Pw *cu
05d0: 72 72 65 6e 74 2c 20 2a 6e 65 78 74 3b 0a 09 50  rrent, *next;..P
05e0: 57 4c 69 73 74 20 2a 63 75 72 6c 69 73 74 2c 20  WList *curlist, 
05f0: 2a 6e 6c 69 73 74 3b 0a 0a 09 69 66 28 6f 6c 64  *nlist;...if(old
0600: 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 72 65 74   == NULL){...ret
0610: 75 72 6e 20 30 3b 0a 09 7d 0a 09 66 6f 72 28 63  urn 0;..}..for(c
0620: 75 72 72 65 6e 74 20 3d 20 6f 6c 64 2d 3e 6c 69  urrent = old->li
0630: 73 74 3b 20 63 75 72 72 65 6e 74 20 21 3d 20 4e  st; current != N
0640: 55 4c 4c 3b 20 63 75 72 72 65 6e 74 20 3d 20 6e  ULL; current = n
0650: 65 78 74 29 7b 0a 09 09 6e 65 78 74 20 3d 20 63  ext){...next = c
0660: 75 72 72 65 6e 74 2d 3e 6e 65 78 74 3b 0a 0a 09  urrent->next;...
0670: 09 70 77 6c 69 73 74 5f 66 72 65 65 5f 70 77 28  .pwlist_free_pw(
0680: 63 75 72 72 65 6e 74 29 3b 0a 09 7d 0a 09 66 6f  current);..}..fo
0690: 72 28 63 75 72 6c 69 73 74 20 3d 20 6f 6c 64 2d  r(curlist = old-
06a0: 3e 73 75 62 6c 69 73 74 73 3b 20 63 75 72 6c 69  >sublists; curli
06b0: 73 74 20 21 3d 20 4e 55 4c 4c 3b 20 63 75 72 6c  st != NULL; curl
06c0: 69 73 74 20 3d 20 6e 6c 69 73 74 29 7b 0a 09 09  ist = nlist){...
06d0: 6e 6c 69 73 74 20 3d 20 63 75 72 6c 69 73 74 2d  nlist = curlist-
06e0: 3e 6e 65 78 74 3b 0a 0a 09 09 70 77 6c 69 73 74  >next;....pwlist
06f0: 5f 66 72 65 65 28 63 75 72 6c 69 73 74 29 3b 0a  _free(curlist);.
0700: 09 7d 0a 09 0a 09 66 72 65 65 28 6f 6c 64 2d 3e  .}....free(old->
0710: 6e 61 6d 65 29 3b 0a 09 66 72 65 65 28 6f 6c 64  name);..free(old
0720: 29 3b 0a 09 6f 6c 64 20 3d 20 4e 55 4c 4c 3b 0a  );..old = NULL;.
0730: 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e  .return 0;.}..in
0740: 74 0a 70 77 6c 69 73 74 5f 66 72 65 65 5f 61 6c  t.pwlist_free_al
0750: 6c 28 29 0a 7b 0a 09 70 77 6c 69 73 74 5f 66 72  l().{..pwlist_fr
0760: 65 65 28 70 77 6c 69 73 74 29 3b 0a 09 72 65 74  ee(pwlist);..ret
0770: 75 72 6e 20 30 3b 0a 7d 0a 0a 50 77 2a 0a 70 77  urn 0;.}..Pw*.pw
0780: 6c 69 73 74 5f 6e 65 77 5f 70 77 28 29 0a 7b 0a  list_new_pw().{.
0790: 09 50 77 20 2a 6e 65 77 3b 0a 09 6e 65 77 20 3d  .Pw *new;..new =
07a0: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 50   malloc(sizeof(P
07b0: 77 29 29 3b 0a 09 6e 65 77 2d 3e 69 64 20 3d 20  w));..new->id = 
07c0: 30 3b 0a 09 6e 65 77 2d 3e 6e 61 6d 65 20 3d 20  0;..new->name = 
07d0: 6d 61 6c 6c 6f 63 28 53 54 52 49 4e 47 5f 4d 45  malloc(STRING_ME
07e0: 44 49 55 4d 29 3b 0a 09 6e 65 77 2d 3e 68 6f 73  DIUM);..new->hos
07f0: 74 20 3d 20 6d 61 6c 6c 6f 63 28 53 54 52 49 4e  t = malloc(STRIN
0800: 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 6e 65 77 2d  G_MEDIUM);..new-
0810: 3e 75 73 65 72 20 3d 20 6d 61 6c 6c 6f 63 28 53  >user = malloc(S
0820: 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09  TRING_MEDIUM);..
0830: 6e 65 77 2d 3e 70 61 73 73 77 64 20 3d 20 6d 61  new->passwd = ma
0840: 6c 6c 6f 63 28 53 54 52 49 4e 47 5f 53 48 4f 52  lloc(STRING_SHOR
0850: 54 29 3b 0a 09 6e 65 77 2d 3e 6c 61 75 6e 63 68  T);..new->launch
0860: 20 3d 20 6d 61 6c 6c 6f 63 28 53 54 52 49 4e 47   = malloc(STRING
0870: 5f 4c 4f 4e 47 29 3b 0a 0a 09 6d 65 6d 73 65 74  _LONG);...memset
0880: 28 6e 65 77 2d 3e 6e 61 6d 65 2c 20 30 2c 20 53  (new->name, 0, S
0890: 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09  TRING_MEDIUM);..
08a0: 6d 65 6d 73 65 74 28 6e 65 77 2d 3e 68 6f 73 74  memset(new->host
08b0: 2c 20 30 2c 20 53 54 52 49 4e 47 5f 4d 45 44 49  , 0, STRING_MEDI
08c0: 55 4d 29 3b 0a 09 6d 65 6d 73 65 74 28 6e 65 77  UM);..memset(new
08d0: 2d 3e 75 73 65 72 2c 20 30 2c 20 53 54 52 49 4e  ->user, 0, STRIN
08e0: 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 6d 65 6d 73  G_MEDIUM);..mems
08f0: 65 74 28 6e 65 77 2d 3e 70 61 73 73 77 64 2c 20  et(new->passwd, 
0900: 30 2c 20 53 54 52 49 4e 47 5f 53 48 4f 52 54 29  0, STRING_SHORT)
0910: 3b 0a 09 6d 65 6d 73 65 74 28 6e 65 77 2d 3e 6c  ;..memset(new->l
0920: 61 75 6e 63 68 2c 20 30 2c 20 53 54 52 49 4e 47  aunch, 0, STRING
0930: 5f 4c 4f 4e 47 29 3b 0a 09 0a 09 72 65 74 75 72  _LONG);....retur
0940: 6e 20 6e 65 77 3b 0a 7d 0a 0a 76 6f 69 64 0a 70  n new;.}..void.p
0950: 77 6c 69 73 74 5f 66 72 65 65 5f 70 77 28 50 77  wlist_free_pw(Pw
0960: 20 2a 6f 6c 64 29 0a 7b 0a 09 66 72 65 65 28 6f   *old).{..free(o
0970: 6c 64 2d 3e 6e 61 6d 65 29 3b 0a 09 66 72 65 65  ld->name);..free
0980: 28 6f 6c 64 2d 3e 75 73 65 72 29 3b 0a 09 66 72  (old->user);..fr
0990: 65 65 28 6f 6c 64 2d 3e 68 6f 73 74 29 3b 0a 09  ee(old->host);..
09a0: 66 72 65 65 28 6f 6c 64 2d 3e 70 61 73 73 77 64  free(old->passwd
09b0: 29 3b 0a 09 66 72 65 65 28 6f 6c 64 2d 3e 6c 61  );..free(old->la
09c0: 75 6e 63 68 29 3b 0a 09 66 72 65 65 28 6f 6c 64  unch);..free(old
09d0: 29 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 6c 69 73 74  );.}..int.pwlist
09e0: 5f 63 68 61 6e 67 65 5f 69 74 65 6d 5f 6f 72 64  _change_item_ord
09f0: 65 72 28 50 77 2a 20 70 77 2c 20 50 57 4c 69 73  er(Pw* pw, PWLis
0a00: 74 20 2a 70 61 72 65 6e 74 2c 20 69 6e 74 20 6d  t *parent, int m
0a10: 6f 76 65 55 70 29 20 7b 0a 09 50 77 20 2a 69 74  oveUp) {..Pw *it
0a20: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 50 77 20 2a  er = NULL;..Pw *
0a30: 70 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 50  pprev = NULL;..P
0a40: 77 20 2a 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a  w *prev = NULL;.
0a50: 09 50 77 20 2a 6e 65 78 74 20 3d 20 4e 55 4c 4c  .Pw *next = NULL
0a60: 3b 0a 09 50 77 20 2a 6e 6e 65 78 74 20 3d 20 4e  ;..Pw *nnext = N
0a70: 55 4c 4c 3b 0a 0a 09 2f 2f 20 46 69 6e 64 20 75  ULL;...// Find u
0a80: 73 2c 20 69 6e 20 6f 75 72 20 70 61 72 65 6e 74  s, in our parent
0a90: 73 20 6c 69 73 74 20 6f 66 20 63 68 69 6c 64 72  s list of childr
0aa0: 65 6e 0a 09 66 6f 72 28 69 74 65 72 20 3d 20 70  en..for(iter = p
0ab0: 61 72 65 6e 74 2d 3e 6c 69 73 74 3b 20 69 74 65  arent->list; ite
0ac0: 72 20 21 3d 20 4e 55 4c 4c 3b 20 69 74 65 72 20  r != NULL; iter 
0ad0: 3d 20 69 74 65 72 2d 3e 6e 65 78 74 29 7b 0a 09  = iter->next){..
0ae0: 09 69 66 28 69 74 65 72 20 3d 3d 20 70 77 29 20  .if(iter == pw) 
0af0: 7b 0a 09 09 09 2f 2f 20 47 72 61 62 20 74 68 65  {....// Grab the
0b00: 20 6e 65 78 74 20 6f 6e 65 2c 20 61 6e 64 20 74   next one, and t
0b10: 68 65 20 6f 6e 65 20 61 66 74 65 72 0a 09 09 09  he one after....
0b20: 6e 65 78 74 20 3d 20 70 77 2d 3e 6e 65 78 74 3b  next = pw->next;
0b30: 0a 09 09 09 69 66 28 6e 65 78 74 20 21 3d 20 4e  ....if(next != N
0b40: 55 4c 4c 29 20 7b 0a 09 09 09 09 6e 6e 65 78 74  ULL) {.....nnext
0b50: 20 3d 20 6e 65 78 74 2d 3e 6e 65 78 74 3b 0a 09   = next->next;..
0b60: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 6e  ..} else {.....n
0b70: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  next = NULL;....
0b80: 7d 0a 0a 09 09 09 2f 2f 20 57 68 69 63 68 20 77  }.....// Which w
0b90: 61 79 20 64 6f 20 77 65 20 6e 65 65 64 20 74 6f  ay do we need to
0ba0: 20 73 68 75 66 66 6c 65 3f 0a 09 09 09 69 66 28   shuffle?....if(
0bb0: 6d 6f 76 65 55 70 29 20 7b 0a 09 09 09 09 2f 2f  moveUp) {.....//
0bc0: 20 55 70 20 74 68 65 20 6c 69 73 74 2c 20 69 66   Up the list, if
0bd0: 20 77 65 20 63 61 6e 0a 09 09 09 09 69 66 28 70   we can.....if(p
0be0: 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 20 7b 20 62  rev == NULL) { b
0bf0: 72 65 61 6b 3b 20 7d 0a 0a 09 09 09 09 2f 2f 20  reak; }......// 
0c00: 41 72 65 20 77 65 20 67 6f 69 6e 67 20 74 6f 20  Are we going to 
0c10: 74 68 65 20 74 6f 70 3f 0a 09 09 09 09 69 66 28  the top?.....if(
0c20: 70 72 65 76 20 3d 3d 20 70 61 72 65 6e 74 2d 3e  prev == parent->
0c30: 6c 69 73 74 29 20 7b 0a 09 09 09 09 09 70 61 72  list) {......par
0c40: 65 6e 74 2d 3e 6c 69 73 74 20 3d 20 70 77 3b 0a  ent->list = pw;.
0c50: 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 20 3d 20  .....pw->next = 
0c60: 70 72 65 76 3b 0a 09 09 09 09 09 70 72 65 76 2d  prev;......prev-
0c70: 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 09 09  >next = next;...
0c80: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
0c90: 70 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20 70 77  pprev->next = pw
0ca0: 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 20  ;......pw->next 
0cb0: 3d 20 70 72 65 76 3b 0a 09 09 09 09 09 70 72 65  = prev;......pre
0cc0: 76 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  v->next = next;.
0cd0: 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75 72 6e  ....}.....return
0ce0: 20 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a   1;....} else {.
0cf0: 09 09 09 09 2f 2f 20 44 6f 77 6e 20 74 68 65 20  ....// Down the 
0d00: 6c 69 73 74 2c 20 69 66 20 77 65 20 63 61 6e 0a  list, if we can.
0d10: 09 09 09 09 69 66 28 6e 65 78 74 20 3d 3d 20 4e  ....if(next == N
0d20: 55 4c 4c 29 20 7b 20 62 72 65 61 6b 3b 20 7d 0a  ULL) { break; }.
0d30: 0a 09 09 09 09 2f 2f 20 57 65 72 65 20 77 65 20  .....// Were we 
0d40: 61 74 20 74 68 65 20 74 6f 70 3f 0a 09 09 09 09  at the top?.....
0d50: 69 66 28 70 77 20 3d 3d 20 70 61 72 65 6e 74 2d  if(pw == parent-
0d60: 3e 6c 69 73 74 29 20 7b 0a 09 09 09 09 09 70 61  >list) {......pa
0d70: 72 65 6e 74 2d 3e 6c 69 73 74 20 3d 20 6e 65 78  rent->list = nex
0d80: 74 3b 0a 09 09 09 09 09 6e 65 78 74 2d 3e 6e 65  t;......next->ne
0d90: 78 74 20 3d 20 70 77 3b 0a 09 09 09 09 09 70 77  xt = pw;......pw
0da0: 2d 3e 6e 65 78 74 20 3d 20 6e 6e 65 78 74 3b 0a  ->next = nnext;.
0db0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
0dc0: 09 09 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20 6e  ..prev->next = n
0dd0: 65 78 74 3b 0a 09 09 09 09 09 6e 65 78 74 2d 3e  ext;......next->
0de0: 6e 65 78 74 20 3d 20 70 77 3b 0a 09 09 09 09 09  next = pw;......
0df0: 70 77 2d 3e 6e 65 78 74 20 3d 20 6e 6e 65 78 74  pw->next = nnext
0e00: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75  ;.....}.....retu
0e10: 72 6e 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 20 65  rn 1;....}...} e
0e20: 6c 73 65 20 7b 0a 09 09 09 2f 2f 20 55 70 64 61  lse {....// Upda
0e30: 74 65 20 74 68 65 20 72 75 6e 6e 69 6e 67 20 6c  te the running l
0e40: 69 73 74 20 6f 66 20 70 72 65 76 20 61 6e 64 20  ist of prev and 
0e50: 70 70 72 65 76 0a 09 09 09 70 70 72 65 76 20 3d  pprev....pprev =
0e60: 20 70 72 65 76 3b 0a 09 09 09 70 72 65 76 20 3d   prev;....prev =
0e70: 20 69 74 65 72 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   iter;...}..}...
0e80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74  return 0;.}..int
0e90: 0a 70 77 6c 69 73 74 5f 63 68 61 6e 67 65 5f 6c  .pwlist_change_l
0ea0: 69 73 74 5f 6f 72 64 65 72 28 50 57 4c 69 73 74  ist_order(PWList
0eb0: 20 2a 70 77 2c 20 69 6e 74 20 6d 6f 76 65 55 70   *pw, int moveUp
0ec0: 29 20 7b 0a 09 2f 2f 20 47 72 61 62 20 74 68 65  ) {..// Grab the
0ed0: 20 70 61 72 65 6e 74 2c 20 61 73 73 75 6d 69 6e   parent, assumin
0ee0: 67 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 09  g there is one..
0ef0: 50 57 4c 69 73 74 20 2a 70 61 72 65 6e 74 20 3d  PWList *parent =
0f00: 20 70 77 2d 3e 70 61 72 65 6e 74 3b 0a 09 69 66   pw->parent;..if
0f10: 28 70 61 72 65 6e 74 3d 3d 4e 55 4c 4c 29 20 7b  (parent==NULL) {
0f20: 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 0a 0a 09   return 0; }....
0f30: 2f 2f 20 46 69 6e 64 20 75 73 0a 09 50 57 4c 69  // Find us..PWLi
0f40: 73 74 20 2a 69 74 65 72 20 3d 20 4e 55 4c 4c 3b  st *iter = NULL;
0f50: 0a 09 50 57 4c 69 73 74 20 2a 70 70 72 65 76 20  ..PWList *pprev 
0f60: 3d 20 4e 55 4c 4c 3b 0a 09 50 57 4c 69 73 74 20  = NULL;..PWList 
0f70: 2a 70 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 50  *prev = NULL;..P
0f80: 57 4c 69 73 74 20 2a 6e 65 78 74 20 3d 20 4e 55  WList *next = NU
0f90: 4c 4c 3b 0a 09 50 57 4c 69 73 74 20 2a 6e 6e 65  LL;..PWList *nne
0fa0: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2f 20  xt = NULL;...// 
0fb0: 46 69 6e 64 20 75 73 2c 20 69 6e 20 6f 75 72 20  Find us, in our 
0fc0: 70 61 72 65 6e 74 73 20 6c 69 73 74 20 6f 66 20  parents list of 
0fd0: 63 68 69 6c 64 72 65 6e 0a 09 66 6f 72 28 69 74  children..for(it
0fe0: 65 72 20 3d 20 70 61 72 65 6e 74 2d 3e 73 75 62  er = parent->sub
0ff0: 6c 69 73 74 73 3b 20 69 74 65 72 20 21 3d 20 4e  lists; iter != N
1000: 55 4c 4c 3b 20 69 74 65 72 20 3d 20 69 74 65 72  ULL; iter = iter
1010: 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28 69 74  ->next){...if(it
1020: 65 72 20 3d 3d 20 70 77 29 20 7b 0a 09 09 09 2f  er == pw) {..../
1030: 2f 20 47 72 61 62 20 74 68 65 20 6e 65 78 74 20  / Grab the next 
1040: 6f 6e 65 2c 20 61 6e 64 20 74 68 65 20 6f 6e 65  one, and the one
1050: 20 61 66 74 65 72 0a 09 09 09 6e 65 78 74 20 3d   after....next =
1060: 20 70 77 2d 3e 6e 65 78 74 3b 0a 09 09 09 69 66   pw->next;....if
1070: 28 6e 65 78 74 20 21 3d 20 4e 55 4c 4c 29 20 7b  (next != NULL) {
1080: 0a 09 09 09 09 6e 6e 65 78 74 20 3d 20 6e 65 78  .....nnext = nex
1090: 74 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d 20 65 6c  t->next;....} el
10a0: 73 65 20 7b 0a 09 09 09 09 6e 6e 65 78 74 20 3d  se {.....nnext =
10b0: 20 4e 55 4c 4c 3b 0a 09 09 09 7d 0a 0a 09 09 09   NULL;....}.....
10c0: 2f 2f 20 57 68 69 63 68 20 77 61 79 20 64 6f 20  // Which way do 
10d0: 77 65 20 6e 65 65 64 20 74 6f 20 73 68 75 66 66  we need to shuff
10e0: 6c 65 3f 0a 09 09 09 69 66 28 6d 6f 76 65 55 70  le?....if(moveUp
10f0: 29 20 7b 0a 09 09 09 09 2f 2f 20 55 70 20 74 68  ) {.....// Up th
1100: 65 20 6c 69 73 74 2c 20 69 66 20 77 65 20 63 61  e list, if we ca
1110: 6e 0a 09 09 09 09 69 66 28 70 72 65 76 20 3d 3d  n.....if(prev ==
1120: 20 4e 55 4c 4c 29 20 7b 20 62 72 65 61 6b 3b 20   NULL) { break; 
1130: 7d 0a 0a 09 09 09 09 2f 2f 20 41 72 65 20 77 65  }......// Are we
1140: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 74 6f   going to the to
1150: 70 3f 0a 09 09 09 09 69 66 28 70 72 65 76 20 3d  p?.....if(prev =
1160: 3d 20 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73  = parent->sublis
1170: 74 73 29 20 7b 0a 09 09 09 09 09 70 61 72 65 6e  ts) {......paren
1180: 74 2d 3e 73 75 62 6c 69 73 74 73 20 3d 20 70 77  t->sublists = pw
1190: 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 74 20  ;......pw->next 
11a0: 3d 20 70 72 65 76 3b 0a 09 09 09 09 09 70 72 65  = prev;......pre
11b0: 76 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  v->next = next;.
11c0: 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
11d0: 09 09 70 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20  ..pprev->next = 
11e0: 70 77 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78  pw;......pw->nex
11f0: 74 20 3d 20 70 72 65 76 3b 0a 09 09 09 09 09 70  t = prev;......p
1200: 72 65 76 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74  rev->next = next
1210: 3b 0a 09 09 09 09 7d 0a 09 09 09 09 72 65 74 75  ;.....}.....retu
1220: 72 6e 20 31 3b 0a 09 09 09 7d 20 65 6c 73 65 20  rn 1;....} else 
1230: 7b 0a 09 09 09 09 2f 2f 20 44 6f 77 6e 20 74 68  {.....// Down th
1240: 65 20 6c 69 73 74 2c 20 69 66 20 77 65 20 63 61  e list, if we ca
1250: 6e 0a 09 09 09 09 69 66 28 6e 65 78 74 20 3d 3d  n.....if(next ==
1260: 20 4e 55 4c 4c 29 20 7b 20 62 72 65 61 6b 3b 20   NULL) { break; 
1270: 7d 0a 0a 09 09 09 09 2f 2f 20 57 65 72 65 20 77  }......// Were w
1280: 65 20 61 74 20 74 68 65 20 74 6f 70 3f 0a 09 09  e at the top?...
1290: 09 09 69 66 28 70 77 20 3d 3d 20 70 61 72 65 6e  ..if(pw == paren
12a0: 74 2d 3e 73 75 62 6c 69 73 74 73 29 20 7b 0a 09  t->sublists) {..
12b0: 09 09 09 09 70 61 72 65 6e 74 2d 3e 73 75 62 6c  ....parent->subl
12c0: 69 73 74 73 20 3d 20 6e 65 78 74 3b 0a 09 09 09  ists = next;....
12d0: 09 09 6e 65 78 74 2d 3e 6e 65 78 74 20 3d 20 70  ..next->next = p
12e0: 77 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65 78 74  w;......pw->next
12f0: 20 3d 20 6e 6e 65 78 74 3b 0a 09 09 09 09 7d 20   = nnext;.....} 
1300: 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 72 65 76  else {......prev
1310: 2d 3e 6e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 09  ->next = next;..
1320: 09 09 09 09 6e 65 78 74 2d 3e 6e 65 78 74 20 3d  ....next->next =
1330: 20 70 77 3b 0a 09 09 09 09 09 70 77 2d 3e 6e 65   pw;......pw->ne
1340: 78 74 20 3d 20 6e 6e 65 78 74 3b 0a 09 09 09 09  xt = nnext;.....
1350: 7d 0a 09 09 09 09 72 65 74 75 72 6e 20 31 3b 0a  }.....return 1;.
1360: 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
1370: 09 09 09 2f 2f 20 55 70 64 61 74 65 20 74 68 65  ...// Update the
1380: 20 72 75 6e 6e 69 6e 67 20 6c 69 73 74 20 6f 66   running list of
1390: 20 70 72 65 76 20 61 6e 64 20 70 70 72 65 76 0a   prev and pprev.
13a0: 09 09 09 70 70 72 65 76 20 3d 20 70 72 65 76 3b  ...pprev = prev;
13b0: 0a 09 09 09 70 72 65 76 20 3d 20 69 74 65 72 3b  ....prev = iter;
13c0: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
13d0: 20 30 3b 0a 7d 0a 0a 76 6f 69 64 0a 70 77 6c 69   0;.}..void.pwli
13e0: 73 74 5f 72 65 6e 61 6d 65 5f 69 74 65 6d 28 50  st_rename_item(P
13f0: 77 2a 20 70 77 69 74 65 6d 2c 20 63 68 61 72 2a  w* pwitem, char*
1400: 20 6e 65 77 5f 6e 61 6d 65 29 20 7b 0a 09 73 74   new_name) {..st
1410: 72 6e 63 70 79 28 70 77 69 74 65 6d 2d 3e 6e 61  rncpy(pwitem->na
1420: 6d 65 2c 20 6e 65 77 5f 6e 61 6d 65 2c 20 53 54  me, new_name, ST
1430: 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 7d 0a  RING_MEDIUM);.}.
1440: 76 6f 69 64 0a 70 77 6c 69 73 74 5f 72 65 6e 61  void.pwlist_rena
1450: 6d 65 5f 73 75 62 6c 69 73 74 28 50 57 4c 69 73  me_sublist(PWLis
1460: 74 20 2a 70 77 6c 69 73 74 2c 20 63 68 61 72 2a  t *pwlist, char*
1470: 20 6e 65 77 5f 6e 61 6d 65 29 20 7b 0a 09 73 74   new_name) {..st
1480: 72 6e 63 70 79 28 70 77 6c 69 73 74 2d 3e 6e 61  rncpy(pwlist->na
1490: 6d 65 2c 20 6e 65 77 5f 6e 61 6d 65 2c 20 53 54  me, new_name, ST
14a0: 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 7d 0a  RING_MEDIUM);.}.
14b0: 0a 69 6e 74 0a 70 77 6c 69 73 74 5f 61 64 64 28  .int.pwlist_add(
14c0: 50 57 4c 69 73 74 20 2a 70 61 72 65 6e 74 2c 20  PWList *parent, 
14d0: 63 68 61 72 2a 20 6e 61 6d 65 2c 20 63 68 61 72  char* name, char
14e0: 2a 20 68 6f 73 74 2c 20 63 68 61 72 2a 20 75 73  * host, char* us
14f0: 65 72 2c 20 63 68 61 72 2a 20 70 61 73 73 77 64  er, char* passwd
1500: 2c 20 63 68 61 72 2a 20 6c 61 75 6e 63 68 29 0a  , char* launch).
1510: 7b 0a 09 50 77 2a 20 6e 65 77 20 3d 20 70 77 6c  {..Pw* new = pwl
1520: 69 73 74 5f 6e 65 77 5f 70 77 28 29 3b 0a 09 0a  ist_new_pw();...
1530: 09 6e 65 77 2d 3e 69 64 20 3d 20 70 77 69 6e 64  .new->id = pwind
1540: 65 78 2b 2b 3b 0a 09 73 74 72 6e 63 70 79 28 6e  ex++;..strncpy(n
1550: 65 77 2d 3e 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20  ew->name, name, 
1560: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a  STRING_MEDIUM);.
1570: 09 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 68 6f  .strncpy(new->ho
1580: 73 74 2c 20 68 6f 73 74 2c 20 53 54 52 49 4e 47  st, host, STRING
1590: 5f 4d 45 44 49 55 4d 29 3b 0a 09 73 74 72 6e 63  _MEDIUM);..strnc
15a0: 70 79 28 6e 65 77 2d 3e 75 73 65 72 2c 20 75 73  py(new->user, us
15b0: 65 72 2c 20 53 54 52 49 4e 47 5f 4d 45 44 49 55  er, STRING_MEDIU
15c0: 4d 29 3b 0a 09 73 74 72 6e 63 70 79 28 6e 65 77  M);..strncpy(new
15d0: 2d 3e 70 61 73 73 77 64 2c 20 70 61 73 73 77 64  ->passwd, passwd
15e0: 2c 20 53 54 52 49 4e 47 5f 53 48 4f 52 54 29 3b  , STRING_SHORT);
15f0: 0a 09 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 6c  ..strncpy(new->l
1600: 61 75 6e 63 68 2c 20 6c 61 75 6e 63 68 2c 20 53  aunch, launch, S
1610: 54 52 49 4e 47 5f 4c 4f 4e 47 29 3b 0a 0a 09 70  TRING_LONG);...p
1620: 77 6c 69 73 74 5f 61 64 64 5f 70 74 72 28 70 61  wlist_add_ptr(pa
1630: 72 65 6e 74 2c 20 6e 65 77 29 3b 0a 0a 09 72 65  rent, new);...re
1640: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 0a  turn 0;.}..int .
1650: 70 77 6c 69 73 74 5f 61 64 64 5f 73 75 62 6c 69  pwlist_add_subli
1660: 73 74 28 50 57 4c 69 73 74 20 2a 70 61 72 65 6e  st(PWList *paren
1670: 74 2c 20 50 57 4c 69 73 74 20 2a 6e 65 77 29 0a  t, PWList *new).
1680: 7b 0a 09 50 57 4c 69 73 74 20 2a 63 75 72 72 65  {..PWList *curre
1690: 6e 74 3b 0a 0a 09 63 75 72 72 65 6e 74 20 3d 20  nt;...current = 
16a0: 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 74 73  parent->sublists
16b0: 3b 0a 09 6e 65 77 2d 3e 70 61 72 65 6e 74 20 3d  ;..new->parent =
16c0: 20 70 61 72 65 6e 74 3b 0a 09 6e 65 77 2d 3e 63   parent;..new->c
16d0: 75 72 72 65 6e 74 5f 69 74 65 6d 20 3d 20 31 3b  urrent_item = 1;
16e0: 0a 0a 09 69 66 28 63 75 72 72 65 6e 74 20 3d 3d  ...if(current ==
16f0: 20 4e 55 4c 4c 29 7b 0a 09 09 64 65 62 75 67 28   NULL){...debug(
1700: 22 61 64 64 5f 70 77 5f 73 75 62 6c 69 73 74 3a  "add_pw_sublist:
1710: 20 63 75 72 72 65 6e 74 20 3d 20 4e 55 4c 4c 22   current = NULL"
1720: 29 3b 0a 09 09 70 61 72 65 6e 74 2d 3e 73 75 62  );...parent->sub
1730: 6c 69 73 74 73 20 3d 20 6e 65 77 3b 0a 09 09 6e  lists = new;...n
1740: 65 77 2d 3e 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  ew->next = NULL;
1750: 0a 09 09 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a  ...return 0;..}.
1760: 09 77 68 69 6c 65 28 63 75 72 72 65 6e 74 2d 3e  .while(current->
1770: 6e 65 78 74 20 21 3d 20 4e 55 4c 4c 29 7b 0a 09  next != NULL){..
1780: 09 63 75 72 72 65 6e 74 20 3d 20 63 75 72 72 65  .current = curre
1790: 6e 74 2d 3e 6e 65 78 74 3b 0a 09 7d 0a 09 63 75  nt->next;..}..cu
17a0: 72 72 65 6e 74 2d 3e 6e 65 78 74 20 3d 20 6e 65  rrent->next = ne
17b0: 77 3b 0a 09 6e 65 77 2d 3e 6e 65 78 74 20 3d 20  w;..new->next = 
17c0: 4e 55 4c 4c 3b 0a 0a 09 72 65 74 75 72 6e 20 30  NULL;...return 0
17d0: 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 5f  ;.}..int.pwlist_
17e0: 61 64 64 5f 70 74 72 28 50 57 4c 69 73 74 20 2a  add_ptr(PWList *
17f0: 6c 69 73 74 2c 20 50 77 20 2a 6e 65 77 29 0a 7b  list, Pw *new).{
1800: 0a 09 50 77 20 2a 63 75 72 72 65 6e 74 3b 0a 09  ..Pw *current;..
1810: 0a 09 69 66 28 6c 69 73 74 20 3d 3d 20 4e 55 4c  ..if(list == NUL
1820: 4c 29 7b 0a 09 09 64 65 62 75 67 28 22 61 64 64  L){...debug("add
1830: 5f 70 77 5f 70 74 72 20 3a 20 42 61 64 20 50 77  _pw_ptr : Bad Pw
1840: 4c 69 73 74 22 29 3b 0a 09 09 72 65 74 75 72 6e  List");...return
1850: 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 6e 65 77 20   -1;..}..if(new 
1860: 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 64 65 62 75  == NULL){...debu
1870: 67 28 22 61 64 64 5f 70 77 5f 70 74 72 20 3a 20  g("add_pw_ptr : 
1880: 42 61 64 20 50 77 22 29 3b 0a 09 09 72 65 74 75  Bad Pw");...retu
1890: 72 6e 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 6c 69  rn -1;..}..if(li
18a0: 73 74 2d 3e 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c  st->list == NULL
18b0: 29 7b 0a 09 09 6c 69 73 74 2d 3e 6c 69 73 74 20  ){...list->list 
18c0: 3d 20 6e 65 77 3b 0a 09 09 6e 65 77 2d 3e 6e 65  = new;...new->ne
18d0: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 09 09 72 65 74  xt = NULL;...ret
18e0: 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09 64 65 62 75  urn 0;..}...debu
18f0: 67 28 22 61 64 64 5f 70 77 5f 70 74 72 3a 20 61  g("add_pw_ptr: a
1900: 64 64 20 74 6f 20 6c 69 73 74 22 29 3b 0a 09 63  dd to list");..c
1910: 75 72 72 65 6e 74 20 3d 20 6c 69 73 74 2d 3e 6c  urrent = list->l
1920: 69 73 74 3b 0a 09 77 68 69 6c 65 28 63 75 72 72  ist;..while(curr
1930: 65 6e 74 2d 3e 6e 65 78 74 20 21 3d 20 4e 55 4c  ent->next != NUL
1940: 4c 29 7b 0a 09 09 63 75 72 72 65 6e 74 20 3d 20  L){...current = 
1950: 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 3b 0a 09  current->next;..
1960: 7d 0a 09 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74  }..current->next
1970: 20 3d 20 6e 65 77 3b 0a 09 6e 65 77 2d 3e 6e 65   = new;..new->ne
1980: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 72 65 74  xt = NULL;...ret
1990: 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 0a  urn 0;.}..void .
19a0: 70 77 6c 69 73 74 5f 64 65 74 61 63 68 5f 70 77  pwlist_detach_pw
19b0: 28 50 57 4c 69 73 74 20 2a 6c 69 73 74 2c 20 50  (PWList *list, P
19c0: 77 20 2a 70 77 29 0a 7b 0a 09 50 77 20 2a 69 74  w *pw).{..Pw *it
19d0: 65 72 2c 20 2a 70 72 65 76 3b 0a 0a 09 70 72 65  er, *prev;...pre
19e0: 76 20 3d 20 4e 55 4c 4c 3b 0a 09 66 6f 72 28 69  v = NULL;..for(i
19f0: 74 65 72 20 3d 20 6c 69 73 74 2d 3e 6c 69 73 74  ter = list->list
1a00: 3b 20 69 74 65 72 20 21 3d 20 4e 55 4c 4c 3b 20  ; iter != NULL; 
1a10: 69 74 65 72 20 3d 20 69 74 65 72 2d 3e 6e 65 78  iter = iter->nex
1a20: 74 29 7b 0a 09 09 0a 09 09 69 66 28 69 74 65 72  t){......if(iter
1a30: 20 3d 3d 20 70 77 29 7b 0a 09 09 09 69 66 28 70   == pw){....if(p
1a40: 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09  rev == NULL){...
1a50: 09 09 6c 69 73 74 2d 3e 6c 69 73 74 20 3d 20 69  ..list->list = i
1a60: 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d 20  ter->next;....} 
1a70: 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 65 76 2d  else {.....prev-
1a80: 3e 6e 65 78 74 20 3d 20 69 74 65 72 2d 3e 6e 65  >next = iter->ne
1a90: 78 74 3b 0a 09 09 09 7d 0a 09 09 09 62 72 65 61  xt;....}....brea
1aa0: 6b 3b 0a 09 09 7d 0a 09 09 70 72 65 76 20 3d 20  k;...}...prev = 
1ab0: 69 74 65 72 3b 0a 09 7d 0a 7d 0a 0a 76 6f 69 64  iter;..}.}..void
1ac0: 20 0a 70 77 6c 69 73 74 5f 64 65 6c 65 74 65 5f   .pwlist_delete_
1ad0: 70 77 28 50 57 4c 69 73 74 20 2a 6c 69 73 74 2c  pw(PWList *list,
1ae0: 20 50 77 20 2a 70 77 29 0a 7b 0a 09 50 77 20 2a   Pw *pw).{..Pw *
1af0: 69 74 65 72 2c 20 2a 70 72 65 76 3b 0a 0a 09 70  iter, *prev;...p
1b00: 72 65 76 20 3d 20 4e 55 4c 4c 3b 0a 09 66 6f 72  rev = NULL;..for
1b10: 28 69 74 65 72 20 3d 20 6c 69 73 74 2d 3e 6c 69  (iter = list->li
1b20: 73 74 3b 20 69 74 65 72 20 21 3d 20 4e 55 4c 4c  st; iter != NULL
1b30: 3b 20 69 74 65 72 20 3d 20 69 74 65 72 2d 3e 6e  ; iter = iter->n
1b40: 65 78 74 29 7b 0a 09 09 0a 09 09 69 66 28 69 74  ext){......if(it
1b50: 65 72 20 3d 3d 20 70 77 29 7b 0a 09 09 09 69 66  er == pw){....if
1b60: 28 70 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a  (prev == NULL){.
1b70: 09 09 09 09 6c 69 73 74 2d 3e 6c 69 73 74 20 3d  ....list->list =
1b80: 20 69 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 09 09   iter->next;....
1b90: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70 72 65  } else {.....pre
1ba0: 76 2d 3e 6e 65 78 74 20 3d 20 69 74 65 72 2d 3e  v->next = iter->
1bb0: 6e 65 78 74 3b 0a 09 09 09 7d 0a 09 09 09 70 77  next;....}....pw
1bc0: 6c 69 73 74 5f 66 72 65 65 5f 70 77 28 69 74 65  list_free_pw(ite
1bd0: 72 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  r);....break;...
1be0: 7d 0a 09 09 70 72 65 76 20 3d 20 69 74 65 72 3b  }...prev = iter;
1bf0: 0a 09 7d 0a 7d 0a 0a 76 6f 69 64 20 0a 70 77 6c  ..}.}..void .pwl
1c00: 69 73 74 5f 64 65 74 61 63 68 5f 73 75 62 6c 69  ist_detach_subli
1c10: 73 74 28 50 57 4c 69 73 74 20 2a 70 61 72 65 6e  st(PWList *paren
1c20: 74 2c 20 50 57 4c 69 73 74 20 2a 6f 6c 64 29 0a  t, PWList *old).
1c30: 7b 0a 09 50 57 4c 69 73 74 20 2a 69 74 65 72 2c  {..PWList *iter,
1c40: 20 2a 70 72 65 76 3b 0a 0a 09 70 72 65 76 20 3d   *prev;...prev =
1c50: 20 4e 55 4c 4c 3b 0a 09 66 6f 72 28 69 74 65 72   NULL;..for(iter
1c60: 20 3d 20 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69   = parent->subli
1c70: 73 74 73 3b 20 69 74 65 72 20 21 3d 20 4e 55 4c  sts; iter != NUL
1c80: 4c 3b 20 69 74 65 72 20 3d 20 69 74 65 72 2d 3e  L; iter = iter->
1c90: 6e 65 78 74 29 7b 0a 0a 09 09 69 66 28 69 74 65  next){....if(ite
1ca0: 72 20 3d 3d 20 6f 6c 64 29 7b 0a 09 09 09 69 66  r == old){....if
1cb0: 28 70 72 65 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a  (prev == NULL){.
1cc0: 09 09 09 09 70 61 72 65 6e 74 2d 3e 73 75 62 6c  ....parent->subl
1cd0: 69 73 74 73 20 3d 20 69 74 65 72 2d 3e 6e 65 78  ists = iter->nex
1ce0: 74 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  t;....} else {..
1cf0: 09 09 09 70 72 65 76 2d 3e 6e 65 78 74 20 3d 20  ...prev->next = 
1d00: 69 74 65 72 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d  iter->next;....}
1d10: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
1d20: 09 70 72 65 76 20 3d 20 69 74 65 72 3b 0a 09 7d  .prev = iter;..}
1d30: 0a 7d 0a 0a 76 6f 69 64 0a 70 77 6c 69 73 74 5f  .}..void.pwlist_
1d40: 64 65 6c 65 74 65 5f 73 75 62 6c 69 73 74 28 50  delete_sublist(P
1d50: 57 4c 69 73 74 20 2a 70 61 72 65 6e 74 2c 20 50  WList *parent, P
1d60: 57 4c 69 73 74 20 2a 6f 6c 64 29 0a 7b 0a 09 50  WList *old).{..P
1d70: 57 4c 69 73 74 20 2a 69 74 65 72 2c 20 2a 70 72  WList *iter, *pr
1d80: 65 76 3b 0a 0a 09 70 72 65 76 20 3d 20 4e 55 4c  ev;...prev = NUL
1d90: 4c 3b 0a 09 66 6f 72 28 69 74 65 72 20 3d 20 70  L;..for(iter = p
1da0: 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 74 73 3b  arent->sublists;
1db0: 20 69 74 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 69   iter != NULL; i
1dc0: 74 65 72 20 3d 20 69 74 65 72 2d 3e 6e 65 78 74  ter = iter->next
1dd0: 29 7b 0a 0a 09 09 69 66 28 69 74 65 72 20 3d 3d  ){....if(iter ==
1de0: 20 6f 6c 64 29 7b 0a 09 09 09 69 66 28 70 72 65   old){....if(pre
1df0: 76 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 09 09  v == NULL){.....
1e00: 70 61 72 65 6e 74 2d 3e 73 75 62 6c 69 73 74 73  parent->sublists
1e10: 20 3d 20 69 74 65 72 2d 3e 6e 65 78 74 3b 0a 09   = iter->next;..
1e20: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 70  ..} else {.....p
1e30: 72 65 76 2d 3e 6e 65 78 74 20 3d 20 69 74 65 72  rev->next = iter
1e40: 2d 3e 6e 65 78 74 3b 0a 09 09 09 7d 0a 09 09 09  ->next;....}....
1e50: 70 77 6c 69 73 74 5f 66 72 65 65 28 69 74 65 72  pwlist_free(iter
1e60: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  );....break;...}
1e70: 0a 09 09 70 72 65 76 20 3d 20 69 74 65 72 3b 0a  ...prev = iter;.
1e80: 09 7d 0a 7d 0a 0a 76 6f 69 64 20 0a 70 77 6c 69  .}.}..void .pwli
1e90: 73 74 5f 77 72 69 74 65 5f 6e 6f 64 65 28 78 6d  st_write_node(xm
1ea0: 6c 4e 6f 64 65 50 74 72 20 72 6f 6f 74 2c 20 50  lNodePtr root, P
1eb0: 77 2a 20 70 77 29 0a 7b 0a 09 78 6d 6c 4e 6f 64  w* pw).{..xmlNod
1ec0: 65 50 74 72 20 6e 6f 64 65 3b 0a 0a 09 2f 2f 20  ePtr node;...// 
1ed0: 57 65 20 6e 65 65 64 20 74 6f 20 65 73 63 61 70  We need to escap
1ee0: 65 20 74 68 65 20 73 74 72 69 6e 67 73 20 62 65  e the strings be
1ef0: 66 6f 72 65 20 73 74 6f 72 69 6e 67 20 74 68 65  fore storing the
1f00: 6d 0a 09 2f 2f 20 4f 74 68 65 72 77 69 73 65 2c  m..// Otherwise,
1f10: 20 73 70 65 63 69 61 6c 20 63 68 61 72 61 63 74   special charact
1f20: 65 72 73 20 28 65 73 70 65 63 69 61 6c 6c 79 20  ers (especially 
1f30: 26 29 20 77 69 6c 6c 0a 09 2f 2f 20 20 65 6e 64  &) will..//  end
1f40: 20 75 70 20 62 72 6f 6b 65 6e 21 0a 09 78 6d 6c   up broken!..xml
1f50: 43 68 61 72 20 2a 65 73 63 61 70 65 64 4e 61 6d  Char *escapedNam
1f60: 65 20 3d 20 0a 09 09 78 6d 6c 45 6e 63 6f 64 65  e = ...xmlEncode
1f70: 53 70 65 63 69 61 6c 43 68 61 72 73 28 72 6f 6f  SpecialChars(roo
1f80: 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 68 61 72  t->doc, (xmlChar
1f90: 2a 29 70 77 2d 3e 6e 61 6d 65 29 3b 0a 09 78 6d  *)pw->name);..xm
1fa0: 6c 43 68 61 72 20 2a 65 73 63 61 70 65 64 48 6f  lChar *escapedHo
1fb0: 73 74 20 3d 0a 09 09 78 6d 6c 45 6e 63 6f 64 65  st =...xmlEncode
1fc0: 53 70 65 63 69 61 6c 43 68 61 72 73 28 72 6f 6f  SpecialChars(roo
1fd0: 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 68 61 72  t->doc, (xmlChar
1fe0: 2a 29 70 77 2d 3e 68 6f 73 74 29 3b 0a 09 78 6d  *)pw->host);..xm
1ff0: 6c 43 68 61 72 20 2a 65 73 63 61 70 65 64 55 73  lChar *escapedUs
2000: 65 72 20 3d 0a 09 09 78 6d 6c 45 6e 63 6f 64 65  er =...xmlEncode
2010: 53 70 65 63 69 61 6c 43 68 61 72 73 28 72 6f 6f  SpecialChars(roo
2020: 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43 68 61 72  t->doc, (xmlChar
2030: 2a 29 70 77 2d 3e 75 73 65 72 29 3b 0a 09 78 6d  *)pw->user);..xm
2040: 6c 43 68 61 72 20 2a 65 73 63 61 70 65 64 50 61  lChar *escapedPa
2050: 73 73 77 64 20 3d 20 0a 09 09 78 6d 6c 45 6e 63  sswd = ...xmlEnc
2060: 6f 64 65 53 70 65 63 69 61 6c 43 68 61 72 73 28  odeSpecialChars(
2070: 72 6f 6f 74 2d 3e 64 6f 63 2c 20 28 78 6d 6c 43  root->doc, (xmlC
2080: 68 61 72 2a 29 70 77 2d 3e 70 61 73 73 77 64 29  har*)pw->passwd)
2090: 3b 0a 09 78 6d 6c 43 68 61 72 20 2a 65 73 63 61  ;..xmlChar *esca
20a0: 70 65 64 4c 61 75 6e 63 68 20 3d 0a 09 09 78 6d  pedLaunch =...xm
20b0: 6c 45 6e 63 6f 64 65 53 70 65 63 69 61 6c 43 68  lEncodeSpecialCh
20c0: 61 72 73 28 72 6f 6f 74 2d 3e 64 6f 63 2c 20 28  ars(root->doc, (
20d0: 78 6d 6c 43 68 61 72 2a 29 70 77 2d 3e 6c 61 75  xmlChar*)pw->lau
20e0: 6e 63 68 29 3b 0a 0a 09 2f 2f 20 42 75 69 6c 64  nch);...// Build
20f0: 20 74 68 65 20 65 6e 74 72 79 20 61 6e 64 20 61   the entry and a
2100: 64 64 20 69 6e 20 6f 75 72 20 28 65 73 63 61 70  dd in our (escap
2110: 65 64 29 20 63 6f 6e 74 65 6e 74 73 0a 09 6e 6f  ed) contents..no
2120: 64 65 20 3d 20 78 6d 6c 4e 65 77 43 68 69 6c 64  de = xmlNewChild
2130: 28 72 6f 6f 74 2c 20 4e 55 4c 4c 2c 20 28 78 6d  (root, NULL, (xm
2140: 6c 43 68 61 72 2a 29 22 50 77 49 74 65 6d 22 2c  lChar*)"PwItem",
2150: 20 4e 55 4c 4c 29 3b 0a 0a 09 78 6d 6c 4e 65 77   NULL);...xmlNew
2160: 43 68 69 6c 64 28 6e 6f 64 65 2c 20 4e 55 4c 4c  Child(node, NULL
2170: 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 6e 61 6d  , (xmlChar*)"nam
2180: 65 22 2c 20 65 73 63 61 70 65 64 4e 61 6d 65 29  e", escapedName)
2190: 3b 0a 09 78 6d 6c 4e 65 77 43 68 69 6c 64 28 6e  ;..xmlNewChild(n
21a0: 6f 64 65 2c 20 4e 55 4c 4c 2c 20 28 78 6d 6c 43  ode, NULL, (xmlC
21b0: 68 61 72 2a 29 22 68 6f 73 74 22 2c 20 65 73 63  har*)"host", esc
21c0: 61 70 65 64 48 6f 73 74 29 3b 0a 09 78 6d 6c 4e  apedHost);..xmlN
21d0: 65 77 43 68 69 6c 64 28 6e 6f 64 65 2c 20 4e 55  ewChild(node, NU
21e0: 4c 4c 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 75  LL, (xmlChar*)"u
21f0: 73 65 72 22 2c 20 65 73 63 61 70 65 64 55 73 65  ser", escapedUse
2200: 72 29 3b 0a 09 78 6d 6c 4e 65 77 43 68 69 6c 64  r);..xmlNewChild
2210: 28 6e 6f 64 65 2c 20 4e 55 4c 4c 2c 20 28 78 6d  (node, NULL, (xm
2220: 6c 43 68 61 72 2a 29 22 70 61 73 73 77 64 22 2c  lChar*)"passwd",
2230: 20 65 73 63 61 70 65 64 50 61 73 73 77 64 29 3b   escapedPasswd);
2240: 0a 09 78 6d 6c 4e 65 77 43 68 69 6c 64 28 6e 6f  ..xmlNewChild(no
2250: 64 65 2c 20 4e 55 4c 4c 2c 20 28 78 6d 6c 43 68  de, NULL, (xmlCh
2260: 61 72 2a 29 22 6c 61 75 6e 63 68 22 2c 20 65 73  ar*)"launch", es
2270: 63 61 70 65 64 4c 61 75 6e 63 68 29 3b 0a 0a 09  capedLaunch);...
2280: 2f 2f 20 46 69 6e 61 6c 6c 79 2c 20 77 65 20 6e  // Finally, we n
2290: 65 65 64 20 74 6f 20 66 72 65 65 20 61 6c 6c 20  eed to free all 
22a0: 6f 75 72 20 65 73 63 61 70 65 64 20 76 65 72 73  our escaped vers
22b0: 69 6f 6e 73 20 6e 6f 77 20 77 65 27 72 65 20 64  ions now we're d
22c0: 6f 6e 65 0a 09 78 6d 6c 46 72 65 65 28 65 73 63  one..xmlFree(esc
22d0: 61 70 65 64 4e 61 6d 65 29 3b 0a 09 78 6d 6c 46  apedName);..xmlF
22e0: 72 65 65 28 65 73 63 61 70 65 64 48 6f 73 74 29  ree(escapedHost)
22f0: 3b 0a 09 78 6d 6c 46 72 65 65 28 65 73 63 61 70  ;..xmlFree(escap
2300: 65 64 55 73 65 72 29 3b 0a 09 78 6d 6c 46 72 65  edUser);..xmlFre
2310: 65 28 65 73 63 61 70 65 64 50 61 73 73 77 64 29  e(escapedPasswd)
2320: 3b 0a 09 78 6d 6c 46 72 65 65 28 65 73 63 61 70  ;..xmlFree(escap
2330: 65 64 4c 61 75 6e 63 68 29 3b 0a 7d 0a 0a 76 6f  edLaunch);.}..vo
2340: 69 64 0a 70 77 6c 69 73 74 5f 77 72 69 74 65 28  id.pwlist_write(
2350: 78 6d 6c 4e 6f 64 65 50 74 72 20 70 61 72 65 6e  xmlNodePtr paren
2360: 74 2c 20 50 57 4c 69 73 74 20 2a 6c 69 73 74 29  t, PWList *list)
2370: 0a 7b 0a 09 78 6d 6c 4e 6f 64 65 50 74 72 20 6e  .{..xmlNodePtr n
2380: 6f 64 65 3b 0a 09 50 77 20 2a 69 74 65 72 3b 0a  ode;..Pw *iter;.
2390: 09 50 57 4c 69 73 74 20 2a 70 77 6c 69 74 65 72  .PWList *pwliter
23a0: 3b 0a 09 0a 09 6e 6f 64 65 20 3d 20 78 6d 6c 4e  ;....node = xmlN
23b0: 65 77 43 68 69 6c 64 28 70 61 72 65 6e 74 2c 20  ewChild(parent, 
23c0: 4e 55 4c 4c 2c 20 28 78 6d 6c 43 68 61 72 2a 29  NULL, (xmlChar*)
23d0: 22 50 77 4c 69 73 74 22 2c 20 4e 55 4c 4c 29 3b  "PwList", NULL);
23e0: 0a 09 78 6d 6c 53 65 74 50 72 6f 70 28 6e 6f 64  ..xmlSetProp(nod
23f0: 65 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 6e 61  e, (xmlChar*)"na
2400: 6d 65 22 2c 20 28 78 6d 6c 43 68 61 72 2a 29 6c  me", (xmlChar*)l
2410: 69 73 74 2d 3e 6e 61 6d 65 29 3b 0a 09 0a 09 66  ist->name);....f
2420: 6f 72 28 69 74 65 72 20 3d 20 6c 69 73 74 2d 3e  or(iter = list->
2430: 6c 69 73 74 3b 20 69 74 65 72 20 21 3d 20 4e 55  list; iter != NU
2440: 4c 4c 3b 20 69 74 65 72 20 3d 20 69 74 65 72 2d  LL; iter = iter-
2450: 3e 6e 65 78 74 29 7b 0a 09 09 70 77 6c 69 73 74  >next){...pwlist
2460: 5f 77 72 69 74 65 5f 6e 6f 64 65 28 6e 6f 64 65  _write_node(node
2470: 2c 20 69 74 65 72 29 3b 0a 09 7d 0a 09 66 6f 72  , iter);..}..for
2480: 28 70 77 6c 69 74 65 72 20 3d 20 6c 69 73 74 2d  (pwliter = list-
2490: 3e 73 75 62 6c 69 73 74 73 3b 20 70 77 6c 69 74  >sublists; pwlit
24a0: 65 72 20 21 3d 20 4e 55 4c 4c 3b 20 70 77 6c 69  er != NULL; pwli
24b0: 74 65 72 20 3d 20 70 77 6c 69 74 65 72 2d 3e 6e  ter = pwliter->n
24c0: 65 78 74 29 7b 0a 09 09 70 77 6c 69 73 74 5f 77  ext){...pwlist_w
24d0: 72 69 74 65 28 6e 6f 64 65 2c 20 70 77 6c 69 74  rite(node, pwlit
24e0: 65 72 29 3b 0a 09 7d 0a 7d 0a 0a 69 6e 74 0a 70  er);..}.}..int.p
24f0: 77 6c 69 73 74 5f 77 72 69 74 65 5f 66 69 6c 65  wlist_write_file
2500: 28 29 0a 7b 0a 09 63 68 61 72 20 76 65 72 73 5b  ().{..char vers[
2510: 35 5d 3b 0a 09 78 6d 6c 44 6f 63 50 74 72 20 64  5];..xmlDocPtr d
2520: 6f 63 3b 0a 09 78 6d 6c 4e 6f 64 65 50 74 72 20  oc;..xmlNodePtr 
2530: 72 6f 6f 74 3b 0a 0a 09 69 66 28 6f 70 74 69 6f  root;...if(optio
2540: 6e 73 2d 3e 72 65 61 64 6f 6e 6c 79 29 7b 0a 09  ns->readonly){..
2550: 09 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a 0a 09  .return 0;..}...
2560: 69 66 28 21 70 77 6c 69 73 74 29 7b 0a 09 09 64  if(!pwlist){...d
2570: 65 62 75 67 28 22 77 72 69 74 65 5f 66 69 6c 65  ebug("write_file
2580: 3a 20 62 61 64 20 70 61 73 73 77 6f 72 64 20 66  : bad password f
2590: 69 6c 65 22 29 3b 0a 09 09 75 69 5f 73 74 61 74  ile");...ui_stat
25a0: 75 73 6c 69 6e 65 5f 6d 73 67 28 22 42 61 64 20  usline_msg("Bad 
25b0: 70 61 73 73 77 6f 72 64 20 6c 69 73 74 22 29 3b  password list");
25c0: 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d  ...return -1;..}
25d0: 0a 09 73 6e 70 72 69 6e 74 66 28 76 65 72 73 2c  ..snprintf(vers,
25e0: 20 35 2c 20 22 25 64 22 2c 20 46 46 5f 56 45 52   5, "%d", FF_VER
25f0: 53 49 4f 4e 29 3b 0a 09 64 6f 63 20 3d 20 78 6d  SION);..doc = xm
2600: 6c 4e 65 77 44 6f 63 28 28 78 6d 6c 43 68 61 72  lNewDoc((xmlChar
2610: 2a 29 22 31 2e 30 22 29 3b 0a 09 0a 09 72 6f 6f  *)"1.0");....roo
2620: 74 20 3d 20 78 6d 6c 4e 65 77 44 6f 63 4e 6f 64  t = xmlNewDocNod
2630: 65 28 64 6f 63 2c 20 4e 55 4c 4c 2c 20 28 78 6d  e(doc, NULL, (xm
2640: 6c 43 68 61 72 2a 29 22 50 57 4d 61 6e 5f 50 61  lChar*)"PWMan_Pa
2650: 73 73 77 6f 72 64 4c 69 73 74 22 2c 20 4e 55 4c  sswordList", NUL
2660: 4c 29 3b 0a 0a 09 78 6d 6c 53 65 74 50 72 6f 70  L);...xmlSetProp
2670: 28 72 6f 6f 74 2c 20 28 78 6d 6c 43 68 61 72 2a  (root, (xmlChar*
2680: 29 22 76 65 72 73 69 6f 6e 22 2c 20 28 78 6d 6c  )"version", (xml
2690: 43 68 61 72 2a 29 76 65 72 73 29 3b 0a 09 70 77  Char*)vers);..pw
26a0: 6c 69 73 74 5f 77 72 69 74 65 28 72 6f 6f 74 2c  list_write(root,
26b0: 20 70 77 6c 69 73 74 29 3b 0a 0a 09 78 6d 6c 44   pwlist);...xmlD
26c0: 6f 63 53 65 74 52 6f 6f 74 45 6c 65 6d 65 6e 74  ocSetRootElement
26d0: 28 64 6f 63 2c 20 72 6f 6f 74 29 3b 0a 0a 09 67  (doc, root);...g
26e0: 6e 75 70 67 5f 77 72 69 74 65 28 64 6f 63 2c 20  nupg_write(doc, 
26f0: 6f 70 74 69 6f 6e 73 2d 3e 67 70 67 5f 69 64 2c  options->gpg_id,
2700: 20 6f 70 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f   options->passwo
2710: 72 64 5f 66 69 6c 65 29 3b 0a 09 0a 09 78 6d 6c  rd_file);....xml
2720: 46 72 65 65 44 6f 63 28 64 6f 63 29 3b 0a 09 72  FreeDoc(doc);..r
2730: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 76 6f 69 64  eturn 0;.}..void
2740: 0a 70 77 6c 69 73 74 5f 72 65 61 64 5f 6e 6f 64  .pwlist_read_nod
2750: 65 28 78 6d 6c 4e 6f 64 65 50 74 72 20 70 61 72  e(xmlNodePtr par
2760: 65 6e 74 2c 20 50 57 4c 69 73 74 20 2a 6c 69 73  ent, PWList *lis
2770: 74 29 0a 7b 0a 09 50 77 2a 20 6e 65 77 3b 0a 09  t).{..Pw* new;..
2780: 78 6d 6c 4e 6f 64 65 50 74 72 20 6e 6f 64 65 3b  xmlNodePtr node;
2790: 0a 09 63 68 61 72 20 2a 74 65 78 74 3b 0a 09 0a  ..char *text;...
27a0: 09 6e 65 77 20 3d 20 70 77 6c 69 73 74 5f 6e 65  .new = pwlist_ne
27b0: 77 5f 70 77 28 29 3b 0a 0a 09 66 6f 72 28 6e 6f  w_pw();...for(no
27c0: 64 65 20 3d 20 70 61 72 65 6e 74 2d 3e 63 68 69  de = parent->chi
27d0: 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 3d 20 4e  ldren; node != N
27e0: 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e 6f 64 65  ULL; node = node
27f0: 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28 21 6e  ->next){...if(!n
2800: 6f 64 65 20 7c 7c 20 21 6e 6f 64 65 2d 3e 6e 61  ode || !node->na
2810: 6d 65 29 7b 0a 09 09 09 64 65 62 75 67 28 22 4d  me){....debug("M
2820: 65 73 73 65 64 20 75 70 20 78 6d 6c 20 6e 6f 64  essed up xml nod
2830: 65 22 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66  e");...} else if
2840: 28 20 73 74 72 63 6d 70 28 28 63 68 61 72 2a 29  ( strcmp((char*)
2850: 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 22 6e 61 6d  node->name, "nam
2860: 65 22 29 20 3d 3d 20 30 29 7b 0a 09 09 09 74 65  e") == 0){....te
2870: 78 74 20 3d 20 28 63 68 61 72 2a 29 78 6d 6c 4e  xt = (char*)xmlN
2880: 6f 64 65 47 65 74 43 6f 6e 74 65 6e 74 28 6e 6f  odeGetContent(no
2890: 64 65 29 3b 0a 09 09 09 69 66 28 74 65 78 74 29  de);....if(text)
28a0: 20 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e 6e 61   strncpy(new->na
28b0: 6d 65 2c 20 74 65 78 74 2c 20 53 54 52 49 4e 47  me, text, STRING
28c0: 5f 4d 45 44 49 55 4d 29 3b 0a 09 09 7d 20 65 6c  _MEDIUM);...} el
28d0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 28 63  se if( strcmp((c
28e0: 68 61 72 2a 29 6e 6f 64 65 2d 3e 6e 61 6d 65 2c  har*)node->name,
28f0: 20 22 75 73 65 72 22 29 20 3d 3d 20 30 29 7b 0a   "user") == 0){.
2900: 09 09 09 74 65 78 74 20 3d 20 28 63 68 61 72 2a  ...text = (char*
2910: 29 78 6d 6c 4e 6f 64 65 47 65 74 43 6f 6e 74 65  )xmlNodeGetConte
2920: 6e 74 28 6e 6f 64 65 29 3b 0a 09 09 09 69 66 28  nt(node);....if(
2930: 74 65 78 74 29 20 73 74 72 6e 63 70 79 28 6e 65  text) strncpy(ne
2940: 77 2d 3e 75 73 65 72 2c 20 74 65 78 74 2c 20 53  w->user, text, S
2950: 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09  TRING_MEDIUM);..
2960: 09 7d 20 65 6c 73 65 20 69 66 28 20 73 74 72 63  .} else if( strc
2970: 6d 70 28 28 63 68 61 72 2a 29 6e 6f 64 65 2d 3e  mp((char*)node->
2980: 6e 61 6d 65 2c 20 22 70 61 73 73 77 64 22 29 20  name, "passwd") 
2990: 3d 3d 20 30 29 7b 0a 09 09 09 74 65 78 74 20 3d  == 0){....text =
29a0: 20 28 63 68 61 72 2a 29 78 6d 6c 4e 6f 64 65 47   (char*)xmlNodeG
29b0: 65 74 43 6f 6e 74 65 6e 74 28 6e 6f 64 65 29 3b  etContent(node);
29c0: 0a 09 09 09 69 66 28 74 65 78 74 29 20 73 74 72  ....if(text) str
29d0: 6e 63 70 79 28 6e 65 77 2d 3e 70 61 73 73 77 64  ncpy(new->passwd
29e0: 2c 20 74 65 78 74 2c 20 53 54 52 49 4e 47 5f 53  , text, STRING_S
29f0: 48 4f 52 54 29 3b 0a 09 09 7d 20 65 6c 73 65 20  HORT);...} else 
2a00: 69 66 28 20 73 74 72 63 6d 70 28 28 63 68 61 72  if( strcmp((char
2a10: 2a 29 6e 6f 64 65 2d 3e 6e 61 6d 65 2c 20 22 68  *)node->name, "h
2a20: 6f 73 74 22 29 20 3d 3d 20 30 29 7b 0a 09 09 09  ost") == 0){....
2a30: 74 65 78 74 20 3d 20 28 63 68 61 72 2a 29 78 6d  text = (char*)xm
2a40: 6c 4e 6f 64 65 47 65 74 43 6f 6e 74 65 6e 74 28  lNodeGetContent(
2a50: 6e 6f 64 65 29 3b 0a 09 09 09 69 66 28 74 65 78  node);....if(tex
2a60: 74 29 20 73 74 72 6e 63 70 79 28 6e 65 77 2d 3e  t) strncpy(new->
2a70: 68 6f 73 74 2c 20 74 65 78 74 2c 20 53 54 52 49  host, text, STRI
2a80: 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a 09 09 7d 20  NG_MEDIUM);...} 
2a90: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
2aa0: 28 63 68 61 72 2a 29 6e 6f 64 65 2d 3e 6e 61 6d  (char*)node->nam
2ab0: 65 2c 20 22 6c 61 75 6e 63 68 22 29 20 3d 3d 20  e, "launch") == 
2ac0: 30 29 7b 0a 09 09 09 74 65 78 74 20 3d 20 28 63  0){....text = (c
2ad0: 68 61 72 2a 29 78 6d 6c 4e 6f 64 65 47 65 74 43  har*)xmlNodeGetC
2ae0: 6f 6e 74 65 6e 74 28 6e 6f 64 65 29 3b 0a 09 09  ontent(node);...
2af0: 09 69 66 28 74 65 78 74 29 20 73 74 72 6e 63 70  .if(text) strncp
2b00: 79 28 6e 65 77 2d 3e 6c 61 75 6e 63 68 2c 20 74  y(new->launch, t
2b10: 65 78 74 2c 20 53 54 52 49 4e 47 5f 4c 4f 4e 47  ext, STRING_LONG
2b20: 29 3b 0a 09 09 7d 20 0a 09 7d 0a 09 70 77 6c 69  );...} ..}..pwli
2b30: 73 74 5f 61 64 64 5f 70 74 72 28 6c 69 73 74 2c  st_add_ptr(list,
2b40: 20 6e 65 77 29 3b 0a 7d 0a 0a 69 6e 74 0a 70 77   new);.}..int.pw
2b50: 6c 69 73 74 5f 72 65 61 64 28 78 6d 6c 4e 6f 64  list_read(xmlNod
2b60: 65 50 74 72 20 70 61 72 65 6e 74 2c 20 50 57 4c  ePtr parent, PWL
2b70: 69 73 74 20 2a 70 61 72 65 6e 74 5f 6c 69 73 74  ist *parent_list
2b80: 29 0a 7b 0a 09 78 6d 6c 4e 6f 64 65 50 74 72 20  ).{..xmlNodePtr 
2b90: 6e 6f 64 65 3b 0a 09 50 57 4c 69 73 74 20 2a 6e  node;..PWList *n
2ba0: 65 77 3b 0a 0a 09 63 68 61 72 20 6e 61 6d 65 5b  ew;...char name[
2bb0: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 5d 3b 0a  STRING_MEDIUM];.
2bc0: 09 69 66 28 21 70 61 72 65 6e 74 20 7c 7c 20 21  .if(!parent || !
2bd0: 70 61 72 65 6e 74 2d 3e 6e 61 6d 65 29 7b 0a 09  parent->name){..
2be0: 09 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d  .ui_statusline_m
2bf0: 73 67 28 22 4d 65 73 73 65 64 20 75 70 20 78 6d  sg("Messed up xm
2c00: 6c 20 6e 6f 64 65 22 29 3b 0a 09 09 72 65 74 75  l node");...retu
2c10: 72 6e 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 73 74  rn -1;..}..if(st
2c20: 72 63 6d 70 28 28 63 68 61 72 2a 29 70 61 72 65  rcmp((char*)pare
2c30: 6e 74 2d 3e 6e 61 6d 65 2c 22 50 77 4c 69 73 74  nt->name,"PwList
2c40: 22 29 20 3d 3d 20 30 29 7b 0a 09 09 73 74 72 6e  ") == 0){...strn
2c50: 63 70 79 28 6e 61 6d 65 2c 20 78 6d 6c 47 65 74  cpy(name, xmlGet
2c60: 50 72 6f 70 28 70 61 72 65 6e 74 2c 20 28 78 6d  Prop(parent, (xm
2c70: 6c 43 68 61 72 2a 29 22 6e 61 6d 65 22 29 2c 20  lChar*)"name"), 
2c80: 53 54 52 49 4e 47 5f 4d 45 44 49 55 4d 29 3b 0a  STRING_MEDIUM);.
2c90: 09 09 6e 65 77 20 3d 20 70 77 6c 69 73 74 5f 6e  ..new = pwlist_n
2ca0: 65 77 28 6e 61 6d 65 29 3b 0a 0a 09 09 66 6f 72  ew(name);....for
2cb0: 28 6e 6f 64 65 20 3d 20 70 61 72 65 6e 74 2d 3e  (node = parent->
2cc0: 63 68 69 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21  children; node !
2cd0: 3d 20 4e 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e  = NULL; node = n
2ce0: 6f 64 65 2d 3e 6e 65 78 74 29 7b 0a 09 09 09 69  ode->next){....i
2cf0: 66 28 21 6e 6f 64 65 20 7c 7c 20 21 6e 6f 64 65  f(!node || !node
2d00: 2d 3e 6e 61 6d 65 29 7b 0a 09 09 09 09 64 65 62  ->name){.....deb
2d10: 75 67 28 22 72 65 61 64 5f 70 77 6c 69 73 74 3a  ug("read_pwlist:
2d20: 20 6d 65 73 73 65 64 20 75 70 20 63 68 69 6c 64   messed up child
2d30: 20 6e 6f 64 65 22 29 3b 0a 09 09 09 7d 20 65 6c   node");....} el
2d40: 73 65 20 69 66 28 73 74 72 63 6d 70 28 6e 6f 64  se if(strcmp(nod
2d50: 65 2d 3e 6e 61 6d 65 2c 20 22 50 77 4c 69 73 74  e->name, "PwList
2d60: 22 29 20 3d 3d 20 30 29 7b 0a 09 09 09 09 70 77  ") == 0){.....pw
2d70: 6c 69 73 74 5f 72 65 61 64 28 6e 6f 64 65 2c 20  list_read(node, 
2d80: 6e 65 77 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  new);....} else 
2d90: 69 66 28 73 74 72 63 6d 70 28 6e 6f 64 65 2d 3e  if(strcmp(node->
2da0: 6e 61 6d 65 2c 20 22 50 77 49 74 65 6d 22 29 20  name, "PwItem") 
2db0: 3d 3d 20 30 29 7b 0a 09 09 09 09 70 77 6c 69 73  == 0){.....pwlis
2dc0: 74 5f 72 65 61 64 5f 6e 6f 64 65 28 6e 6f 64 65  t_read_node(node
2dd0: 2c 20 6e 65 77 29 3b 0a 09 09 09 7d 0a 09 09 7d  , new);....}...}
2de0: 0a 09 7d 0a 0a 09 69 66 28 70 61 72 65 6e 74 5f  ..}...if(parent_
2df0: 6c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09  list == NULL){..
2e00: 09 70 77 6c 69 73 74 20 3d 20 6e 65 77 3b 0a 09  .pwlist = new;..
2e10: 09 63 75 72 72 65 6e 74 5f 70 77 5f 73 75 62 6c  .current_pw_subl
2e20: 69 73 74 20 3d 20 70 77 6c 69 73 74 3b 0a 0a 09  ist = pwlist;...
2e30: 09 70 77 6c 69 73 74 2d 3e 63 75 72 72 65 6e 74  .pwlist->current
2e40: 5f 69 74 65 6d 20 3d 20 30 3b 0a 09 7d 20 65 6c  _item = 0;..} el
2e50: 73 65 20 7b 0a 09 09 70 77 6c 69 73 74 5f 61 64  se {...pwlist_ad
2e60: 64 5f 73 75 62 6c 69 73 74 28 70 61 72 65 6e 74  d_sublist(parent
2e70: 5f 6c 69 73 74 2c 20 6e 65 77 29 3b 0a 09 7d 0a  _list, new);..}.
2e80: 09 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e  .return 0;.}..in
2e90: 74 0a 70 77 6c 69 73 74 5f 72 65 61 64 5f 66 69  t.pwlist_read_fi
2ea0: 6c 65 28 29 0a 7b 0a 20 20 20 20 63 68 61 72 20  le().{.    char 
2eb0: 66 6e 5b 53 54 52 49 4e 47 5f 4c 4f 4e 47 5d 3b  fn[STRING_LONG];
2ec0: 0a 09 63 68 61 72 20 2a 62 75 66 3b 0a 09 69 6e  ..char *buf;..in
2ed0: 74 20 69 20 3d 20 30 3b 0a 09 69 6e 74 20 67 6e  t i = 0;..int gn
2ee0: 75 70 67 5f 77 6f 72 6b 65 64 20 3d 20 30 3b 0a  upg_worked = 0;.
2ef0: 09 78 6d 6c 4e 6f 64 65 50 74 72 20 6e 6f 64 65  .xmlNodePtr node
2f00: 2c 20 72 6f 6f 74 3b 0a 09 78 6d 6c 44 6f 63 50  , root;..xmlDocP
2f10: 74 72 20 64 6f 63 3b 0a 0a 09 2f 2f 20 48 61 76  tr doc;...// Hav
2f20: 65 20 74 68 65 20 64 65 66 69 6e 65 64 20 61 20  e the defined a 
2f30: 66 69 6c 65 20 79 65 74 3f 0a 09 69 66 28 21 6f  file yet?..if(!o
2f40: 70 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f 72 64  ptions->password
2f50: 5f 66 69 6c 65 29 7b 0a 09 09 72 65 74 75 72 6e  _file){...return
2f60: 20 2d 31 3b 0a 09 7d 0a 09 2f 2f 20 44 6f 20 77   -1;..}..// Do w
2f70: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
2f80: 20 61 20 6e 65 77 20 66 69 6c 65 3f 0a 09 73 6e   a new file?..sn
2f90: 70 72 69 6e 74 66 28 66 6e 2c 20 53 54 52 49 4e  printf(fn, STRIN
2fa0: 47 5f 4c 4f 4e 47 2c 20 22 25 73 22 2c 20 6f 70  G_LONG, "%s", op
2fb0: 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f 72 64 5f  tions->password_
2fc0: 66 69 6c 65 29 3b 0a 09 69 66 28 61 63 63 65 73  file);..if(acces
2fd0: 73 28 66 6e 2c 20 46 5f 4f 4b 29 20 21 3d 20 30  s(fn, F_OK) != 0
2fe0: 29 7b 0a 09 09 75 69 5f 73 74 61 74 75 73 6c 69  ){...ui_statusli
2ff0: 6e 65 5f 6d 73 67 28 22 44 61 74 61 62 61 73 65  ne_msg("Database
3000: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 63 72 65 61   not found, crea
3010: 74 65 64 2e 20 50 72 65 73 73 20 61 6e 79 20 6b  ted. Press any k
3020: 65 79 20 74 6f 20 62 65 67 69 6e 20 20 22 29 3b  ey to begin  ");
3030: 20 67 65 74 63 68 28 29 3b 0a 09 09 72 65 74 75   getch();...retu
3040: 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2f 20 54  rn -1;..}...// T
3050: 72 79 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 66  ry to load the f
3060: 69 6c 65 0a 09 67 6e 75 70 67 5f 77 6f 72 6b 65  ile..gnupg_worke
3070: 64 20 3d 20 67 6e 75 70 67 5f 72 65 61 64 28 6f  d = gnupg_read(o
3080: 70 74 69 6f 6e 73 2d 3e 70 61 73 73 77 6f 72 64  ptions->password
3090: 5f 66 69 6c 65 2c 20 26 64 6f 63 29 3b 09 0a 0a  _file, &doc);...
30a0: 09 2f 2f 20 44 69 64 20 69 74 20 77 6f 72 6b 3f  .// Did it work?
30b0: 0a 09 69 66 28 67 6e 75 70 67 5f 77 6f 72 6b 65  ..if(gnupg_worke
30c0: 64 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 75  d != 0) {...retu
30d0: 72 6e 20 67 6e 75 70 67 5f 77 6f 72 6b 65 64 3b  rn gnupg_worked;
30e0: 0a 09 7d 0a 09 0a 09 69 66 28 21 64 6f 63 29 7b  ..}....if(!doc){
30f0: 0a 09 09 75 69 5f 73 74 61 74 75 73 6c 69 6e 65  ...ui_statusline
3100: 5f 6d 73 67 28 22 42 61 64 20 78 6d 6c 20 44 61  _msg("Bad xml Da
3110: 74 61 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d  ta");...return -
3120: 31 3b 0a 09 7d 0a 09 72 6f 6f 74 20 3d 20 78 6d  1;..}..root = xm
3130: 6c 44 6f 63 47 65 74 52 6f 6f 74 45 6c 65 6d 65  lDocGetRootEleme
3140: 6e 74 28 64 6f 63 29 3b 0a 09 69 66 28 21 72 6f  nt(doc);..if(!ro
3150: 6f 74 20 7c 7c 20 21 72 6f 6f 74 2d 3e 6e 61 6d  ot || !root->nam
3160: 65 09 7c 7c 20 28 73 74 72 63 6d 70 28 28 63 68  e.|| (strcmp((ch
3170: 61 72 2a 29 72 6f 6f 74 2d 3e 6e 61 6d 65 2c 20  ar*)root->name, 
3180: 22 50 57 4d 61 6e 5f 50 61 73 73 77 6f 72 64 4c  "PWMan_PasswordL
3190: 69 73 74 22 29 20 21 3d 20 30 29 20 29 7b 0a 09  ist") != 0) ){..
31a0: 09 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d  .ui_statusline_m
31b0: 73 67 28 22 42 61 64 6c 79 20 46 6f 72 6d 65 64  sg("Badly Formed
31c0: 20 70 61 73 73 77 6f 72 64 20 64 61 74 61 22 29   password data")
31d0: 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a 09  ;...return -1;..
31e0: 7d 0a 09 69 66 28 20 62 75 66 20 3d 20 78 6d 6c  }..if( buf = xml
31f0: 47 65 74 50 72 6f 70 28 72 6f 6f 74 2c 20 28 78  GetProp(root, (x
3200: 6d 6c 43 68 61 72 2a 29 22 76 65 72 73 69 6f 6e  mlChar*)"version
3210: 22 29 20 29 7b 0a 09 09 69 20 3d 20 61 74 6f 69  ") ){...i = atoi
3220: 28 20 62 75 66 20 29 3b 0a 09 7d 20 65 6c 73 65  ( buf );..} else
3230: 20 7b 0a 09 09 69 20 3d 20 30 3b 0a 09 7d 0a 09   {...i = 0;..}..
3240: 69 66 28 69 20 3c 20 46 46 5f 56 45 52 53 49 4f  if(i < FF_VERSIO
3250: 4e 29 7b 0a 09 09 75 69 5f 73 74 61 74 75 73 6c  N){...ui_statusl
3260: 69 6e 65 5f 6d 73 67 28 22 50 61 73 73 77 6f 72  ine_msg("Passwor
3270: 64 20 46 69 6c 65 20 69 6e 20 6f 6c 64 65 72 20  d File in older 
3280: 66 6f 72 6d 61 74 2c 20 75 73 65 20 63 6f 6e 76  format, use conv
3290: 65 72 74 5f 70 77 64 62 22 29 3b 0a 09 09 72 65  ert_pwdb");...re
32a0: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 0a 09 66 6f  turn -1;..}...fo
32b0: 72 28 6e 6f 64 65 20 3d 20 72 6f 6f 74 2d 3e 63  r(node = root->c
32c0: 68 69 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 3d  hildren; node !=
32d0: 20 4e 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e 6f   NULL; node = no
32e0: 64 65 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28  de->next){...if(
32f0: 73 74 72 63 6d 70 28 6e 6f 64 65 2d 3e 6e 61 6d  strcmp(node->nam
3300: 65 2c 20 22 50 77 4c 69 73 74 22 29 20 3d 3d 20  e, "PwList") == 
3310: 30 29 7b 0a 09 09 09 70 77 6c 69 73 74 5f 72 65  0){....pwlist_re
3320: 61 64 28 6e 6f 64 65 2c 20 4e 55 4c 4c 29 3b 0a  ad(node, NULL);.
3330: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
3340: 7d 0a 09 78 6d 6c 46 72 65 65 44 6f 63 28 64 6f  }..xmlFreeDoc(do
3350: 63 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 7d  c);..return 0;.}
3360: 0a 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 5f 64 6f  ...int.pwlist_do
3370: 5f 65 78 70 6f 72 74 28 50 57 4c 69 73 74 20 2a  _export(PWList *
3380: 70 77 6c 69 73 74 2c 20 50 77 20 2a 70 77 29 0a  pwlist, Pw *pw).
3390: 7b 0a 09 63 68 61 72 20 76 65 72 73 5b 35 5d 3b  {..char vers[5];
33a0: 0a 09 63 68 61 72 20 66 69 6c 65 5b 53 54 52 49  ..char file[STRI
33b0: 4e 47 5f 4c 4f 4e 47 5d 3b 0a 09 69 6e 74 20 6d  NG_LONG];..int m
33c0: 61 78 5f 69 64 5f 6e 75 6d 20 3d 20 35 2c 20 69  ax_id_num = 5, i
33d0: 3d 30 2c 20 76 61 6c 69 64 5f 69 64 73 20 3d 20  =0, valid_ids = 
33e0: 30 3b 0a 09 63 68 61 72 20 2a 69 64 73 5b 6d 61  0;..char *ids[ma
33f0: 78 5f 69 64 5f 6e 75 6d 5d 3b 0a 09 0a 09 78 6d  x_id_num];....xm
3400: 6c 44 6f 63 50 74 72 20 64 6f 63 3b 0a 09 78 6d  lDocPtr doc;..xm
3410: 6c 4e 6f 64 65 50 74 72 20 72 6f 6f 74 3b 0a 0a  lNodePtr root;..
3420: 09 69 66 28 21 70 77 6c 69 73 74 20 26 26 20 21  .if(!pwlist && !
3430: 70 77 29 20 7b 0a 09 09 64 65 62 75 67 28 22 65  pw) {...debug("e
3440: 78 70 6f 72 74 5f 70 61 73 73 77 64 3a 20 62 61  xport_passwd: ba
3450: 64 20 70 61 73 73 77 6f 72 64 22 29 3b 0a 09 09  d password");...
3460: 75 69 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d 73  ui_statusline_ms
3470: 67 28 22 42 61 64 20 70 61 73 73 77 6f 72 64 22  g("Bad password"
3480: 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a  );...return -1;.
3490: 09 7d 0a 0a 09 2f 2f 20 57 65 20 6e 65 65 64 20  .}...// We need 
34a0: 74 68 65 20 49 44 73 20 74 6f 20 64 65 66 61 75  the IDs to defau
34b0: 6c 74 20 74 6f 20 65 6d 70 74 79 20 73 74 72 69  lt to empty stri
34c0: 6e 67 73 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c  ngs..for(i=0; i<
34d0: 6d 61 78 5f 69 64 5f 6e 75 6d 3b 20 69 2b 2b 29  max_id_num; i++)
34e0: 20 7b 0a 09 09 69 64 73 5b 69 5d 20 3d 20 6d 61   {...ids[i] = ma
34f0: 6c 6c 6f 63 28 53 54 52 49 4e 47 5f 4c 4f 4e 47  lloc(STRING_LONG
3500: 29 3b 0a 09 09 73 6e 70 72 69 6e 74 66 28 69 64  );...snprintf(id
3510: 73 5b 69 5d 2c 20 53 54 52 49 4e 47 5f 4c 4f 4e  s[i], STRING_LON
3520: 47 2c 20 22 22 29 3b 0a 09 7d 0a 0a 09 2f 2f 20  G, "");..}...// 
3530: 46 65 74 63 68 20 74 68 65 20 49 44 73 0a 09 67  Fetch the IDs..g
3540: 6e 75 70 67 5f 67 65 74 5f 69 64 73 28 69 64 73  nupg_get_ids(ids
3550: 2c 6d 61 78 5f 69 64 5f 6e 75 6d 29 3b 0a 0a 09  ,max_id_num);...
3560: 2f 2f 20 43 68 65 63 6b 20 77 65 20 72 65 61 6c  // Check we real
3570: 6c 79 20 67 6f 74 20 6f 6e 65 0a 09 66 6f 72 28  ly got one..for(
3580: 69 3d 30 3b 20 69 3c 6d 61 78 5f 69 64 5f 6e 75  i=0; i<max_id_nu
3590: 6d 3b 20 69 2b 2b 29 20 7b 0a 09 09 69 66 28 69  m; i++) {...if(i
35a0: 64 73 5b 69 5d 5b 30 5d 20 21 3d 20 30 29 20 7b  ds[i][0] != 0) {
35b0: 0a 09 09 09 76 61 6c 69 64 5f 69 64 73 2b 2b 3b  ....valid_ids++;
35c0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 28 76 61 6c  ...}..}...if(val
35d0: 69 64 5f 69 64 73 20 3d 3d 20 30 29 7b 0a 09 09  id_ids == 0){...
35e0: 64 65 62 75 67 28 22 65 78 70 6f 72 74 5f 70 61  debug("export_pa
35f0: 73 73 77 64 3a 20 63 61 6e 63 65 6c 20 62 65 63  sswd: cancel bec
3600: 61 75 73 65 20 69 64 20 69 73 20 62 6c 61 6e 6b  ause id is blank
3610: 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b  ");...return -1;
3620: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 64 65 62  ..} else {...deb
3630: 75 67 28 22 65 78 70 6f 72 74 69 6e 67 20 74 6f  ug("exporting to
3640: 20 25 64 20 69 64 73 22 2c 20 76 61 6c 69 64 5f   %d ids", valid_
3650: 69 64 73 29 3b 0a 09 7d 0a 09 0a 09 67 6e 75 70  ids);..}....gnup
3660: 67 5f 67 65 74 5f 66 69 6c 65 6e 61 6d 65 28 66  g_get_filename(f
3670: 69 6c 65 2c 20 27 77 27 29 3b 0a 0a 09 64 65 62  ile, 'w');...deb
3680: 75 67 28 22 65 78 70 6f 72 74 5f 70 61 73 73 77  ug("export_passw
3690: 64 3a 20 63 6f 6e 73 74 72 75 63 74 20 78 6d 6c  d: construct xml
36a0: 20 64 6f 63 22 29 3b 0a 09 73 6e 70 72 69 6e 74   doc");..snprint
36b0: 66 28 76 65 72 73 2c 20 35 2c 20 22 25 64 22 2c  f(vers, 5, "%d",
36c0: 20 46 46 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 64   FF_VERSION);..d
36d0: 6f 63 20 3d 20 78 6d 6c 4e 65 77 44 6f 63 28 28  oc = xmlNewDoc((
36e0: 78 6d 6c 43 68 61 72 2a 29 22 31 2e 30 22 29 3b  xmlChar*)"1.0");
36f0: 0a 09 0a 09 72 6f 6f 74 20 3d 20 78 6d 6c 4e 65  ....root = xmlNe
3700: 77 44 6f 63 4e 6f 64 65 28 64 6f 63 2c 20 4e 55  wDocNode(doc, NU
3710: 4c 4c 2c 20 28 78 6d 6c 43 68 61 72 2a 29 22 50  LL, (xmlChar*)"P
3720: 57 4d 61 6e 5f 45 78 70 6f 72 74 22 2c 20 4e 55  WMan_Export", NU
3730: 4c 4c 29 3b 0a 0a 09 78 6d 6c 53 65 74 50 72 6f  LL);...xmlSetPro
3740: 70 28 72 6f 6f 74 2c 20 22 76 65 72 73 69 6f 6e  p(root, "version
3750: 22 2c 20 76 65 72 73 29 3b 0a 09 0a 20 20 20 69  ", vers);...   i
3760: 66 28 70 77 6c 69 73 74 29 20 7b 0a 20 20 20 20  f(pwlist) {.    
3770: 20 20 70 77 6c 69 73 74 5f 77 72 69 74 65 28 72    pwlist_write(r
3780: 6f 6f 74 2c 20 70 77 6c 69 73 74 29 3b 0a 20 20  oot, pwlist);.  
3790: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
37a0: 70 77 6c 69 73 74 5f 77 72 69 74 65 5f 6e 6f 64  pwlist_write_nod
37b0: 65 28 72 6f 6f 74 2c 20 70 77 29 3b 0a 20 20 20  e(root, pw);.   
37c0: 7d 0a 0a 09 78 6d 6c 44 6f 63 53 65 74 52 6f 6f  }...xmlDocSetRoo
37d0: 74 45 6c 65 6d 65 6e 74 28 64 6f 63 2c 20 72 6f  tElement(doc, ro
37e0: 6f 74 29 3b 0a 0a 09 67 6e 75 70 67 5f 77 72 69  ot);...gnupg_wri
37f0: 74 65 5f 6d 61 6e 79 28 64 6f 63 2c 20 69 64 73  te_many(doc, ids
3800: 2c 20 6d 61 78 5f 69 64 5f 6e 75 6d 2c 20 66 69  , max_id_num, fi
3810: 6c 65 29 3b 0a 09 0a 09 78 6d 6c 46 72 65 65 44  le);....xmlFreeD
3820: 6f 63 28 64 6f 63 29 3b 0a 0a 09 2f 2f 20 41 6c  oc(doc);...// Al
3830: 6c 20 64 6f 6e 65 2e 0a 09 2f 2f 20 46 72 65 65  l done...// Free
3840: 20 6f 75 72 20 49 44 20 73 74 72 75 63 74 75 72   our ID structur
3850: 65 73 0a 09 66 6f 72 28 69 3d 30 3b 20 69 3c 6d  es..for(i=0; i<m
3860: 61 78 5f 69 64 5f 6e 75 6d 3b 20 69 2b 2b 29 20  ax_id_num; i++) 
3870: 7b 0a 09 09 66 72 65 65 28 69 64 73 5b 69 5d 29  {...free(ids[i])
3880: 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e 20 30  ;..}....return 0
3890: 3b 0a 7d 0a 0a 69 6e 74 0a 70 77 6c 69 73 74 5f  ;.}..int.pwlist_
38a0: 65 78 70 6f 72 74 5f 70 61 73 73 77 64 28 50 77  export_passwd(Pw
38b0: 20 2a 70 77 29 0a 7b 0a 20 20 20 72 65 74 75 72   *pw).{.   retur
38c0: 6e 20 70 77 6c 69 73 74 5f 64 6f 5f 65 78 70 6f  n pwlist_do_expo
38d0: 72 74 28 4e 55 4c 4c 2c 20 70 77 29 3b 0a 7d 0a  rt(NULL, pw);.}.
38e0: 69 6e 74 0a 70 77 6c 69 73 74 5f 65 78 70 6f 72  int.pwlist_expor
38f0: 74 5f 6c 69 73 74 28 50 57 4c 69 73 74 20 2a 70  t_list(PWList *p
3900: 77 6c 69 73 74 29 0a 7b 0a 20 20 20 72 65 74 75  wlist).{.   retu
3910: 72 6e 20 70 77 6c 69 73 74 5f 64 6f 5f 65 78 70  rn pwlist_do_exp
3920: 6f 72 74 28 70 77 6c 69 73 74 2c 20 4e 55 4c 4c  ort(pwlist, NULL
3930: 29 3b 0a 7d 0a 0a 0a 69 6e 74 0a 70 77 6c 69 73  );.}...int.pwlis
3940: 74 5f 69 6d 70 6f 72 74 5f 70 61 73 73 77 64 28  t_import_passwd(
3950: 29 0a 7b 0a 09 63 68 61 72 20 66 69 6c 65 5b 53  ).{..char file[S
3960: 54 52 49 4e 47 5f 4c 4f 4e 47 5d 2c 20 2a 62 75  TRING_LONG], *bu
3970: 66 3b 0a 09 69 6e 74 20 69 20 3d 20 30 3b 0a 09  f;..int i = 0;..
3980: 78 6d 6c 4e 6f 64 65 50 74 72 20 6e 6f 64 65 2c  xmlNodePtr node,
3990: 20 72 6f 6f 74 3b 0a 09 78 6d 6c 44 6f 63 50 74   root;..xmlDocPt
39a0: 72 20 64 6f 63 3b 0a 0a 09 67 6e 75 70 67 5f 67  r doc;...gnupg_g
39b0: 65 74 5f 66 69 6c 65 6e 61 6d 65 28 66 69 6c 65  et_filename(file
39c0: 2c 20 27 72 27 29 3b 0a 0a 09 67 6e 75 70 67 5f  , 'r');...gnupg_
39d0: 72 65 61 64 28 66 69 6c 65 2c 20 26 64 6f 63 29  read(file, &doc)
39e0: 3b 09 0a 09 0a 09 69 66 28 21 64 6f 63 29 7b 0a  ;.....if(!doc){.
39f0: 09 09 64 65 62 75 67 28 22 69 6d 70 6f 72 74 5f  ..debug("import_
3a00: 70 61 73 73 77 64 3a 20 62 61 64 20 64 61 74 61  passwd: bad data
3a10: 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b  ");...return -1;
3a20: 0a 09 7d 0a 09 72 6f 6f 74 20 3d 20 78 6d 6c 44  ..}..root = xmlD
3a30: 6f 63 47 65 74 52 6f 6f 74 45 6c 65 6d 65 6e 74  ocGetRootElement
3a40: 28 64 6f 63 29 3b 0a 09 69 66 28 21 72 6f 6f 74  (doc);..if(!root
3a50: 20 7c 7c 20 21 72 6f 6f 74 2d 3e 6e 61 6d 65 09   || !root->name.
3a60: 7c 7c 20 28 73 74 72 63 6d 70 28 28 63 68 61 72  || (strcmp((char
3a70: 2a 29 72 6f 6f 74 2d 3e 6e 61 6d 65 2c 20 22 50  *)root->name, "P
3a80: 57 4d 61 6e 5f 45 78 70 6f 72 74 22 29 20 21 3d  WMan_Export") !=
3a90: 20 30 29 20 29 7b 0a 09 09 75 69 5f 73 74 61 74   0) ){...ui_stat
3aa0: 75 73 6c 69 6e 65 5f 6d 73 67 28 22 42 61 64 6c  usline_msg("Badl
3ab0: 79 20 46 6f 72 6d 65 64 20 70 61 73 73 77 6f 72  y Formed passwor
3ac0: 64 20 64 61 74 61 22 29 3b 0a 09 09 72 65 74 75  d data");...retu
3ad0: 72 6e 20 2d 31 3b 0a 09 7d 0a 09 69 66 28 20 62  rn -1;..}..if( b
3ae0: 75 66 20 3d 20 78 6d 6c 47 65 74 50 72 6f 70 28  uf = xmlGetProp(
3af0: 72 6f 6f 74 2c 20 28 78 6d 6c 43 68 61 72 2a 29  root, (xmlChar*)
3b00: 22 76 65 72 73 69 6f 6e 22 29 20 29 7b 0a 09 09  "version") ){...
3b10: 69 20 3d 20 61 74 6f 69 28 20 62 75 66 20 29 3b  i = atoi( buf );
3b20: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 20 3d  ..} else {...i =
3b30: 20 30 3b 0a 09 7d 0a 09 69 66 28 69 20 3c 20 46   0;..}..if(i < F
3b40: 46 5f 56 45 52 53 49 4f 4e 29 7b 0a 09 09 75 69  F_VERSION){...ui
3b50: 5f 73 74 61 74 75 73 6c 69 6e 65 5f 6d 73 67 28  _statusline_msg(
3b60: 22 50 61 73 73 77 6f 72 64 20 45 78 70 6f 72 74  "Password Export
3b70: 20 46 69 6c 65 20 69 6e 20 6f 6c 64 65 72 20 66   File in older f
3b80: 6f 72 6d 61 74 2c 20 75 73 65 20 63 6f 6e 76 65  ormat, use conve
3b90: 72 74 5f 70 77 64 62 22 29 3b 0a 09 09 72 65 74  rt_pwdb");...ret
3ba0: 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 0a 09 66 6f  urn -1;..}....fo
3bb0: 72 28 6e 6f 64 65 20 3d 20 72 6f 6f 74 2d 3e 63  r(node = root->c
3bc0: 68 69 6c 64 72 65 6e 3b 20 6e 6f 64 65 20 21 3d  hildren; node !=
3bd0: 20 4e 55 4c 4c 3b 20 6e 6f 64 65 20 3d 20 6e 6f   NULL; node = no
3be0: 64 65 2d 3e 6e 65 78 74 29 7b 0a 09 09 69 66 28  de->next){...if(
3bf0: 73 74 72 63 6d 70 28 6e 6f 64 65 2d 3e 6e 61 6d  strcmp(node->nam
3c00: 65 2c 20 22 50 77 4c 69 73 74 22 29 20 3d 3d 20  e, "PwList") == 
3c10: 30 29 7b 0a 09 09 09 70 77 6c 69 73 74 5f 72 65  0){....pwlist_re
3c20: 61 64 28 6e 6f 64 65 2c 20 63 75 72 72 65 6e 74  ad(node, current
3c30: 5f 70 77 5f 73 75 62 6c 69 73 74 29 3b 0a 09 09  _pw_sublist);...
3c40: 09 62 72 65 61 6b 3b 0a 09 09 7d 20 65 6c 73 65  .break;...} else
3c50: 20 69 66 28 73 74 72 63 6d 70 28 6e 6f 64 65 2d   if(strcmp(node-
3c60: 3e 6e 61 6d 65 2c 20 22 50 77 49 74 65 6d 22 29  >name, "PwItem")
3c70: 20 3d 3d 20 30 29 7b 0a 09 09 09 70 77 6c 69 73   == 0){....pwlis
3c80: 74 5f 72 65 61 64 5f 6e 6f 64 65 28 6e 6f 64 65  t_read_node(node
3c90: 2c 20 63 75 72 72 65 6e 74 5f 70 77 5f 73 75 62  , current_pw_sub
3ca0: 6c 69 73 74 29 3b 0a 09 09 09 62 72 65 61 6b 3b  list);....break;
3cb0: 0a 09 09 7d 0a 09 7d 0a 09 78 6d 6c 46 72 65 65  ...}..}..xmlFree
3cc0: 44 6f 63 28 64 6f 63 29 3b 0a 09 72 65 74 75 72  Doc(doc);..retur
3cd0: 6e 20 30 3b 0a 7d 0a                             n 0;.}.