1 /***************************************************************************
2 
3  ***************************************************************************
4  *          Please see toplevel file COPYING for license details           *
5  ***************************************************************************/
6 
7 #ifdef HAVE_CONFIG_H
8 # include <config.h>
9 #endif
10 
11 
12 #include "globals_l.h"
13 #include "aqhbci/banking/user.h"
14 
15 #include <gwenhywfar/gui.h>
16 #include <gwenhywfar/text.h>
17 #include <gwenhywfar/ctplugin.h>
18 
19 #include <stdarg.h>
20 #include <unistd.h>
21 
22 
AH_Control_ChangeKeys(AB_PROVIDER * pro,GWEN_DB_NODE * dbArgs,int argc,char ** argv)23 int AH_Control_ChangeKeys(AB_PROVIDER *pro, GWEN_DB_NODE *dbArgs, int argc, char **argv)
24 {
25   GWEN_DB_NODE *db = NULL;
26   int res = 0;
27   uint32_t uid = 0;
28   AB_USER *u = NULL;
29 
30   // flags, type, name, minnum, maxnum, short option, long option, short description , long description
31   const GWEN_ARGS args[] = {
32     {
33       GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "userId", 1, 1,
34       "u", "user", "user id", "user id"
35     },
36     {
37       GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "tokenType", 0, 1,
38       "t", "tokentype", "token type", "type of new crypt token (file, card)"
39     },
40     {
41       GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "tokenName", 0, 1,
42       "n", "tokenname", "token name", "name of new crypt token (filename, card-nr)"
43     },
44     {
45       GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "context", 0, 1,
46       "c", "context", "token context", "context on new token"
47     },
48     {
49       GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Char, "cryptMode", 0, 1,
50       "m", "cryptmode", "crypt mode", "crypt mode of new token (RDH, RAH)"
51     },
52     {
53       GWEN_ARGS_FLAGS_HAS_ARGUMENT, GWEN_ArgsType_Int, "cryptType", 0, 1,
54       "T", "crypttype", "crypt type", "crypt type of new token (1 - 10, depends on crypt mode)"
55     },
56     {
57       GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, GWEN_ArgsType_Int, "help",  0, 0,
58       "h", "help", "Show this help screen", "Show this help screen"
59     }
60   };
61 
62   db = GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local");
63   if (!db || ((res = GWEN_Args_Check(argc, argv, 1, 0, args, db)) == GWEN_ARGS_RESULT_ERROR)) {
64     fprintf(stderr, "ERROR: Could not parse arguments\n");
65     return 1;
66   }
67 
68   if (res == GWEN_ARGS_RESULT_HELP) {
69     GWEN_BUFFER *b = GWEN_Buffer_new(0, 1024, 0, 1);
70     if (GWEN_Args_Usage(args, b, GWEN_ArgsOutType_Txt)) {
71       fprintf(stderr, "ERROR: Could not create help string\n");
72       return 1;
73     }
74     // TODO: help text default args
75     fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(b));
76     GWEN_Buffer_free(b);
77     return 0;
78   }
79 
80   if ((uid = (uint32_t)GWEN_DB_GetIntValue(db, "userId", 0, 0)) == 0) {
81     fprintf(stderr, "ERROR: Invalid or missing unique user id\n");
82     return 1;
83   }
84 
85   if ((AB_Provider_HasUser(pro, uid) < 0) || (AB_Provider_GetUser(pro, uid, 1, 1, &u) < 0) || !u) {
86     fprintf(stderr, "ERROR: could not find user with id %ld.", (long)uid);
87     return -1;
88   }
89 
90   res = AH_Provider_ChangeUserKeys(pro, u, db, 1, 0, 0);
91 
92   AB_User_free(u);
93   return res;
94 }
95