1 /***************************************************************************
2 begin : Tue Sep 20 2008
3 copyright : (C) 2008 by Patrick Prasse
4 copyright : (C) 2018 by Martin Preuss
5 email : patrick-oss@prasse.info
6
7 ***************************************************************************
8 * Please see toplevel file COPYING for license details *
9 ***************************************************************************/
10
11 #ifdef HAVE_CONFIG_H
12 # include <config.h>
13 #endif
14
15
16 #include "globals_l.h"
17
18 #include <gwenhywfar/text.h>
19
20 #include "aqhbci/banking/user.h"
21 #include "aqhbci/banking/account.h"
22
23
24
AH_Control_AddsubAccountFlags(AB_PROVIDER * pro,GWEN_DB_NODE * dbArgs,int argc,char ** argv,int is_add)25 int AH_Control_AddsubAccountFlags(AB_PROVIDER *pro,
26 GWEN_DB_NODE *dbArgs,
27 int argc,
28 char **argv, int is_add)
29 {
30 GWEN_DB_NODE *db;
31 AB_ACCOUNT *a=NULL;
32 int rv;
33 uint32_t aid;
34 GWEN_DB_NODE *vn;
35 uint32_t flags;
36 uint32_t bf;
37 uint32_t c=0;
38 const GWEN_ARGS args[]= {
39 {
40 GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
41 GWEN_ArgsType_Int, /* type */
42 "accountId", /* name */
43 0, /* minnum */
44 1, /* maxnum */
45 "a", /* short option */
46 "account", /* long option */
47 "Specify the unique id of the account", /* short description */
48 "Specify the unique id of the account" /* long description */
49 },
50 {
51 GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
52 GWEN_ArgsType_Char, /* type */
53 "flags", /* name */
54 1, /* minnum */
55 99, /* maxnum */
56 "f", /* short option */
57 "flags", /* long option */
58 "Specify the user flags", /* short description */
59 "Specify the user flags" /* long description */
60 },
61 {
62 GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */
63 GWEN_ArgsType_Int, /* type */
64 "help", /* name */
65 0, /* minnum */
66 0, /* maxnum */
67 "h", /* short option */
68 "help", /* long option */
69 "Show this help screen", /* short description */
70 "Show this help screen" /* long description */
71 }
72 };
73
74 db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local");
75 rv=GWEN_Args_Check(argc, argv, 1,
76 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/,
77 args,
78 db);
79 if (rv==GWEN_ARGS_RESULT_ERROR) {
80 fprintf(stderr, "ERROR: Could not parse arguments\n");
81 return 1;
82 }
83 else if (rv==GWEN_ARGS_RESULT_HELP) {
84 GWEN_BUFFER *ubuf;
85 GWEN_DB_NODE *dbTmp;
86 int i;
87
88 ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
89 if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
90 fprintf(stderr, "ERROR: Could not create help string\n");
91 return 1;
92 }
93
94 dbTmp=GWEN_DB_Group_new("flagGroup");
95 AH_Account_Flags_toDb(dbTmp, "flags", 0xffffffff);
96 GWEN_Buffer_AppendString(ubuf, "\nThe following flags are recognized:\n");
97 for (i=0; ; i++) {
98 const char *s;
99
100 s=GWEN_DB_GetCharValue(dbTmp, "flags", i, NULL);
101 if (s==NULL)
102 break;
103 GWEN_Buffer_AppendString(ubuf, "- ");
104 GWEN_Buffer_AppendString(ubuf, s);
105 GWEN_Buffer_AppendString(ubuf, "\n");
106 }
107 GWEN_DB_Group_free(dbTmp);
108
109 fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf));
110 GWEN_Buffer_free(ubuf);
111 return 0;
112 }
113
114 /* check aid */
115 aid=(uint32_t) GWEN_DB_GetIntValue(db, "accountId", 0, 0);
116 if (aid==0) {
117 fprintf(stderr, "ERROR: Invalid or missing unique account id\n");
118 return 1;
119 }
120
121 /* parse and check flags */
122 flags=AH_Account_Flags_fromDb(db, "flags");
123 for (bf=flags; bf; bf>>=1) {
124 if (bf&1)
125 c++;
126 }
127 vn=GWEN_DB_FindFirstVar(db, "flags");
128 if (GWEN_DB_Values_Count(vn)!=c) {
129 fprintf(stderr, "ERROR: Specified flag(s) unknown\n");
130 return 4;
131 }
132
133 /* get account (lock, don't unlock, so we can later call AH_Provider_EndExclUseAccount */
134 rv=AB_Provider_HasAccount(pro, aid);
135 if (rv<0) {
136 fprintf(stderr, "ERROR: Account with id %lu not found\n", (unsigned long int) aid);
137 return 2;
138 }
139 rv=AB_Provider_GetAccount(pro, aid, 1, 0, &a);
140 if (rv<0) {
141 fprintf(stderr, "ERROR: Account with id %lu not found\n", (unsigned long int) aid);
142 return 2;
143 }
144
145 /* modify account */
146 if (is_add) {
147 fprintf(stderr, "Adding flags: %08x\n", flags);
148 AH_Account_AddFlags(a, flags);
149 }
150 else {
151 fprintf(stderr, "Removing flags: %08x\n", flags);
152 AH_Account_SubFlags(a, flags);
153 }
154
155 /* unlock account */
156 rv=AB_Provider_EndExclUseAccount(pro, a, 0);
157 if (rv<0) {
158 fprintf(stderr, "ERROR: Could not unlock account (%d)\n", rv);
159 AB_Account_free(a);
160 return 4;
161 }
162 AB_Account_free(a);
163
164 return 0;
165 }
166
167
168
169
170