pwman

Hex Artifact Content
Login

Artifact 192be884c0ea849b5eab936aeaecc77b420728cf4d0e584cbe197090bece4a41:


0000: 2f 2a 0a 20 2a 20 20 50 57 6d 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 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e  e <stdlib.h>.#in
0370: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
0380: 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74  .#include <unist
0390: 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  d.h>.#include <s
03a0: 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63  ys/types.h>.#inc
03b0: 6c 75 64 65 20 3c 73 79 73 2f 77 61 69 74 2e 68  lude <sys/wait.h
03c0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e  >.#include <errn
03d0: 6f 2e 68 3e 0a 0a 63 68 61 72 20 2a 20 0a 6c 61  o.h>..char * .la
03e0: 75 6e 63 68 5f 66 69 6e 64 5f 72 65 70 6c 61 63  unch_find_replac
03f0: 65 28 63 68 61 72 20 2a 68 61 79 73 74 61 63 6b  e(char *haystack
0400: 2c 20 63 68 61 72 2a 20 6e 65 65 64 6c 65 2c 20  , char* needle, 
0410: 63 68 61 72 2a 20 63 6f 77 29 0a 7b 0a 09 63 68  char* cow).{..ch
0420: 61 72 20 2a 70 6f 73 3b 0a 09 69 6e 74 20 6c 65  ar *pos;..int le
0430: 6e 2c 69 3b 0a 09 63 68 61 72 20 2a 72 65 74 2c  n,i;..char *ret,
0440: 20 2a 72 65 74 5f 70 3b 0a 0a 09 70 6f 73 20 3d   *ret_p;...pos =
0450: 20 73 74 72 73 74 72 28 68 61 79 73 74 61 63 6b   strstr(haystack
0460: 2c 20 6e 65 65 64 6c 65 29 3b 0a 09 69 66 28 70  , needle);..if(p
0470: 6f 73 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 09 09 72  os == NULL){...r
0480: 65 74 75 72 6e 20 68 61 79 73 74 61 63 6b 3b 0a  eturn haystack;.
0490: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 72 65 61 6c  .}.../*.. * real
04a0: 20 75 67 6c 79 20 73 68 69 74 20 66 6f 72 20 0a   ugly shit for .
04b0: 09 20 2a 20 72 65 70 6c 61 63 69 6e 67 20 74 68  . * replacing th
04c0: 65 20 73 74 72 69 6e 67 73 0a 09 20 2a 2f 0a 09  e strings.. */..
04d0: 6c 65 6e 20 3d 20 28 73 74 72 6c 65 6e 28 68 61  len = (strlen(ha
04e0: 79 73 74 61 63 6b 29 20 2d 20 73 74 72 6c 65 6e  ystack) - strlen
04f0: 28 6e 65 65 64 6c 65 29 29 20 2b 20 73 74 72 6c  (needle)) + strl
0500: 65 6e 28 63 6f 77 29 20 2b 20 31 3b 0a 09 72 65  en(cow) + 1;..re
0510: 74 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 29 3b  t = malloc(len);
0520: 0a 09 72 65 74 5f 70 20 3d 20 72 65 74 3b 0a 09  ..ret_p = ret;..
0530: 69 20 3d 20 70 6f 73 20 2d 20 26 68 61 79 73 74  i = pos - &hayst
0540: 61 63 6b 5b 30 5d 3b 0a 09 73 74 72 6e 63 70 79  ack[0];..strncpy
0550: 28 72 65 74 5f 70 2c 20 68 61 79 73 74 61 63 6b  (ret_p, haystack
0560: 2c 20 69 29 3b 0a 09 72 65 74 5f 70 20 2b 3d 20  , i);..ret_p += 
0570: 69 3b 0a 09 73 74 72 63 70 79 28 72 65 74 5f 70  i;..strcpy(ret_p
0580: 2c 20 63 6f 77 29 3b 0a 09 72 65 74 5f 70 20 2b  , cow);..ret_p +
0590: 3d 20 73 74 72 6c 65 6e 28 63 6f 77 29 3b 0a 09  = strlen(cow);..
05a0: 70 6f 73 20 2b 3d 20 73 74 72 6c 65 6e 28 6e 65  pos += strlen(ne
05b0: 65 64 6c 65 29 3b 0a 09 73 74 72 63 70 79 28 72  edle);..strcpy(r
05c0: 65 74 5f 70 2c 20 70 6f 73 29 3b 0a 0a 09 72 65  et_p, pos);...re
05d0: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 69 6e 74  turn ret;.}..int
05e0: 20 0a 6c 61 75 6e 63 68 5f 65 78 65 63 75 74 65   .launch_execute
05f0: 28 63 68 61 72 20 2a 63 6d 64 29 20 7b 0a 09 69  (char *cmd) {..i
0600: 6e 74 20 70 69 64 2c 20 73 74 61 74 75 73 3b 0a  nt pid, status;.
0610: 09 63 68 61 72 20 2a 61 72 67 76 5b 34 5d 3b 0a  .char *argv[4];.
0620: 0a 09 69 66 20 28 63 6d 64 20 3d 3d 20 4e 55 4c  ..if (cmd == NUL
0630: 4c 29 7b 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a  L){...return 1;.
0640: 09 7d 0a 09 0a 09 70 69 64 20 3d 20 66 6f 72 6b  .}....pid = fork
0650: 28 29 3b 0a 09 69 66 20 28 70 69 64 20 3d 3d 20  ();..if (pid == 
0660: 2d 31 29 7b 0a 09 09 72 65 74 75 72 6e 20 2d 31  -1){...return -1
0670: 3b 0a 09 7d 0a 09 69 66 20 28 70 69 64 20 3d 3d  ;..}..if (pid ==
0680: 20 30 29 20 7b 0a 09 09 61 72 67 76 5b 30 5d 20   0) {...argv[0] 
0690: 3d 20 22 70 77 6d 61 6e 5f 65 78 65 63 22 3b 0a  = "pwman_exec";.
06a0: 09 09 61 72 67 76 5b 31 5d 20 3d 20 22 2d 63 22  ..argv[1] = "-c"
06b0: 3b 0a 09 09 61 72 67 76 5b 32 5d 20 3d 20 63 6d  ;...argv[2] = cm
06c0: 64 3b 0a 09 09 61 72 67 76 5b 33 5d 20 3d 20 4e  d;...argv[3] = N
06d0: 55 4c 4c 3b 0a 0a 09 09 65 78 65 63 76 28 22 2f  ULL;....execv("/
06e0: 62 69 6e 2f 73 68 22 2c 20 61 72 67 76 29 3b 0a  bin/sh", argv);.
06f0: 09 09 65 78 69 74 28 31 32 37 29 3b 0a 09 7d 0a  ..exit(127);..}.
0700: 09 64 6f 20 7b 0a 09 09 69 66 20 28 77 61 69 74  .do {...if (wait
0710: 70 69 64 28 70 69 64 2c 20 26 73 74 61 74 75 73  pid(pid, &status
0720: 2c 20 30 29 20 3d 3d 20 2d 31 29 20 7b 0a 09 09  , 0) == -1) {...
0730: 09 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 49  .if (errno != EI
0740: 4e 54 52 29 7b 0a 09 09 09 09 72 65 74 75 72 6e  NTR){.....return
0750: 20 2d 31 3b 0a 09 09 09 7d 20 0a 09 09 7d 65 6c   -1;....} ...}el
0760: 73 65 20 7b 0a 09 09 09 72 65 74 75 72 6e 20 73  se {....return s
0770: 74 61 74 75 73 3b 0a 09 09 7d 0a 09 7d 20 77 68  tatus;...}..} wh
0780: 69 6c 65 28 31 29 3b 0a 7d 0a 0a 69 6e 74 0a 6c  ile(1);.}..int.l
0790: 61 75 6e 63 68 28 50 77 20 2a 70 77 29 0a 7b 0a  aunch(Pw *pw).{.
07a0: 09 69 6e 74 20 69 3b 0a 09 63 68 61 72 20 2a 63  .int i;..char *c
07b0: 6d 64 3b 0a 09 63 68 61 72 20 2a 2a 63 6d 64 5f  md;..char **cmd_
07c0: 61 72 72 61 79 3b 0a 0a 09 69 66 28 28 70 77 20  array;...if((pw 
07d0: 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 70 77 2d  == NULL) || (pw-
07e0: 3e 6c 61 75 6e 63 68 20 3d 3d 20 4e 55 4c 4c 29  >launch == NULL)
07f0: 29 7b 0a 09 09 72 65 74 75 72 6e 20 2d 31 3b 0a  ){...return -1;.
0800: 09 7d 0a 09 63 6d 64 20 3d 20 6c 61 75 6e 63 68  .}..cmd = launch
0810: 5f 66 69 6e 64 5f 72 65 70 6c 61 63 65 28 70 77  _find_replace(pw
0820: 2d 3e 6c 61 75 6e 63 68 2c 20 22 25 68 22 2c 20  ->launch, "%h", 
0830: 70 77 2d 3e 68 6f 73 74 29 3b 0a 09 63 6d 64 20  pw->host);..cmd 
0840: 3d 20 6c 61 75 6e 63 68 5f 66 69 6e 64 5f 72 65  = launch_find_re
0850: 70 6c 61 63 65 28 63 6d 64 2c 20 22 25 75 22 2c  place(cmd, "%u",
0860: 20 70 77 2d 3e 75 73 65 72 29 3b 0a 09 63 6d 64   pw->user);..cmd
0870: 20 3d 20 6c 61 75 6e 63 68 5f 66 69 6e 64 5f 72   = launch_find_r
0880: 65 70 6c 61 63 65 28 63 6d 64 2c 20 22 25 70 22  eplace(cmd, "%p"
0890: 2c 20 70 77 2d 3e 70 61 73 73 77 64 29 3b 0a 0a  , pw->passwd);..
08a0: 09 64 65 66 5f 70 72 6f 67 5f 6d 6f 64 65 28 29  .def_prog_mode()
08b0: 3b 0a 09 75 69 5f 65 6e 64 28 29 3b 0a 0a 09 69  ;..ui_end();...i
08c0: 20 3d 20 6c 61 75 6e 63 68 5f 65 78 65 63 75 74   = launch_execut
08d0: 65 28 63 6d 64 29 3b 0a 0a 09 70 75 74 73 28 22  e(cmd);...puts("
08e0: 50 72 65 73 73 20 61 6e 79 20 6b 65 79 20 74 6f  Press any key to
08f0: 20 63 6f 6e 74 69 6e 75 65 22 29 3b 0a 09 67 65   continue");..ge
0900: 74 63 68 28 29 3b 0a 09 0a 09 75 69 5f 69 6e 69  tch();....ui_ini
0910: 74 28 29 3b 0a 09 72 65 73 65 74 5f 70 72 6f 67  t();..reset_prog
0920: 5f 6d 6f 64 65 28 29 3b 0a 0a 09 72 65 74 75 72  _mode();...retur
0930: 6e 20 69 3b 0a 7d 0a                             n i;.}.