3 * UCC (University [of WA] Computer Club) Electronic Accounting System
4 * - Cokebank (Basic Version)
6 * bank.c - Actual bank database
8 * This file is licenced under the 3-clause BSD Licence. See the file COPYING
19 #define USE_UNIX_GROUPS 1
22 static int GetUnixID(const char *Username);
30 int Bank_GetUserByName(const char *Username)
34 uid = GetUnixID(Username);
36 // Expensive search :(
37 for( i = 0; i < giBank_NumUsers; i ++ )
39 if( gaBank_Users[i].UnixID == uid )
46 int Bank_GetUserBalance(int ID)
48 if( ID < 0 || ID >= giBank_NumUsers )
51 return gaBank_Users[ID].Balance;
54 int Bank_GetUserFlags(int ID)
56 if( ID < 0 || ID >= giBank_NumUsers )
59 // TODO: Implement checking the PAM groups and status instead, then
60 // fall back on the database. (and update if there is a difference)
63 if( gaBank_Users[ID].UnixID == 0 ) {
64 gaBank_Users[ID].Flags &= ~USER_FLAG_TYPEMASK;
65 gaBank_Users[ID].Flags |= USER_TYPE_WHEEL;
69 if( gaBank_Users[ID].UnixID > 0 )
76 pwd = getpwuid( gaBank_Users[ID].UnixID );
78 // Check for additions to the "coke" group
79 grp = getgrnam("coke");
81 for( i = 0; grp->gr_mem[i]; i ++ )
83 if( strcmp(grp->gr_mem[i], pwd->pw_name) == 0 )
85 gaBank_Users[ID].Flags &= ~USER_FLAG_TYPEMASK;
86 gaBank_Users[ID].Flags |= USER_TYPE_COKE;
91 // Check for additions to the "wheel" group
92 grp = getgrnam("wheel");
94 for( i = 0; grp->gr_mem[i]; i ++ )
96 if( strcmp(grp->gr_mem[i], pwd->pw_name) == 0 )
98 gaBank_Users[ID].Flags &= ~USER_FLAG_TYPEMASK;
99 gaBank_Users[ID].Flags |= USER_TYPE_WHEEL;
106 return gaBank_Users[ID].Flags;
109 int Bank_SetUserFlags(int ID, int Mask, int Value)
112 if( ID < 0 || ID >= giBank_NumUsers )
115 // Silently ignore changes to root and meta accounts
116 if( gaBank_Users[ID].UnixID <= 0 ) return 0;
118 gaBank_Users[ID].Flags &= Mask;
119 gaBank_Users[ID].Flags |= Value;
124 int Bank_AlterUserBalance(int ID, int Delta)
127 if( ID < 0 || ID >= giBank_NumUsers )
131 gaBank_Users[ID].Balance += Delta;
134 fseek(gBank_File, ID*sizeof(gaBank_Users[0]), SEEK_SET);
135 fwrite(&gaBank_Users[ID], sizeof(gaBank_Users[0]), 1, gBank_File);
140 int Bank_SetUserBalance(int ID, int Value)
143 if( ID < 0 || ID >= giBank_NumUsers )
147 gaBank_Users[ID].Balance = Value;
150 fseek(gBank_File, ID*sizeof(gaBank_Users[0]), SEEK_SET);
151 fwrite(&gaBank_Users[ID], sizeof(gaBank_Users[0]), 1, gBank_File);
156 int Bank_GetMinAllowedBalance(int ID)
158 if( ID < 0 || ID >= giBank_NumUsers )
161 switch( Bank_GetUserFlags(ID) & USER_FLAG_TYPEMASK )
163 case USER_TYPE_NORMAL: return 0;
164 case USER_TYPE_COKE: return -2000;
165 case USER_TYPE_WHEEL: return -10000;
166 case USER_TYPE_GOD: return INT_MIN;
172 * \brief Create a new user in our database
174 int Bank_AddUser(const char *Username)
177 int uid = GetUnixID(Username);
179 // Can has moar space plz?
180 tmp = realloc(gaBank_Users, (giBank_NumUsers+1)*sizeof(gaBank_Users[0]));
181 if( !tmp ) return -1;
185 gaBank_Users[giBank_NumUsers].UnixID = uid;
186 gaBank_Users[giBank_NumUsers].Balance = 0;
187 gaBank_Users[giBank_NumUsers].Flags = 0;
189 if( strcmp(Username, COKEBANK_DEBT_ACCT) == 0 ) {
190 gaBank_Users[giBank_NumUsers].Flags = USER_TYPE_GOD; // No minium
192 else if( strcmp(Username, "root") == 0 ) {
193 gaBank_Users[giBank_NumUsers].Flags = USER_TYPE_GOD; // No minium
197 fseek(gBank_File, giBank_NumUsers*sizeof(gaBank_Users[0]), SEEK_SET);
198 fwrite(&gaBank_Users[giBank_NumUsers], sizeof(gaBank_Users[0]), 1, gBank_File);
207 // Unix user dependent code
208 // TODO: Modify to keep its own list of usernames
210 char *Bank_GetUserName(int ID)
214 if( ID < 0 || ID >= giBank_NumUsers )
217 if( gaBank_Users[ID].UnixID == -1 )
218 return strdup(COKEBANK_SALES_ACCT);
220 if( gaBank_Users[ID].UnixID == -2 )
221 return strdup(COKEBANK_DEBT_ACCT);
223 pwd = getpwuid(gaBank_Users[ID].UnixID);
224 if( !pwd ) return NULL;
226 return strdup(pwd->pw_name);
229 static int GetUnixID(const char *Username)
233 if( strcmp(Username, COKEBANK_SALES_ACCT) == 0 ) { // Pseudo account that sales are made into
236 else if( strcmp(Username, COKEBANK_DEBT_ACCT) == 0 ) { // Pseudo acount that money is added from
242 pwd = getpwnam(Username);
243 if( !pwd ) return -1;