3 * UCC (University [of WA] Computer Club) Electronic Accounting System
5 * cokebank.c - Coke-Bank management
7 * This file is licenced under the 3-clause BSD Licence. See the file COPYING
14 #include <openssl/sha.h>
17 #define HACK_TPG_NOAUTH 1
20 extern int Bank_GetMinAllowedBalance(int ID);
21 extern int Bank_GetUserBalance(int ID);
22 extern int Bank_AlterUserBalance(int ID, int Delta);
23 extern int Bank_GetUserByUnixID(int UnixID);
24 extern int Bank_GetUserUnixID(int ID);
25 extern int Bank_AddUser(int UnixID);
26 extern FILE *gBank_File;
27 extern tUser *gaBank_Users;
28 extern int giBank_NumUsers;
31 void Init_Cokebank(const char *Argument);
32 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason);
33 int GetBalance(int User);
34 char *GetUserName(int User);
35 int GetUserID(const char *Username);
36 int GetUserAuth(const char *Username, const char *Password);
40 * \brief Load the cokebank database
42 void Init_Cokebank(const char *Argument)
44 gBank_File = fopen(Argument, "rb+");
46 gBank_File = fopen(Argument, "wb+");
49 perror("Opening coke bank");
52 fseek(gBank_File, 0, SEEK_END);
53 giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
54 fseek(gBank_File, 0, SEEK_SET);
55 gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
56 fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
60 * \brief Transfers money from one user to another
61 * \param SourceUser Source user
62 * \param DestUser Destination user
63 * \param Ammount Ammount of cents to move from \a SourceUser to \a DestUser
64 * \param Reason Reason for the transfer (essentially a comment)
65 * \return Boolean failure
67 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
69 if( Bank_GetUserBalance(SourceUser) - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
71 if( Bank_GetUserBalance(DestUser) + Ammount < Bank_GetMinAllowedBalance(DestUser) )
73 Bank_AlterUserBalance(DestUser, Ammount);
74 Bank_AlterUserBalance(SourceUser, -Ammount);
79 * \brief Get the balance of the passed user
81 int GetBalance(int User)
83 return Bank_GetUserBalance(User);;
87 * \brief Return the name the passed user
89 char *GetUserName(int User)
92 int unixid = Bank_GetUserUnixID(User);
95 return strdup(">sales");
98 return strdup(">liability");
100 pwd = getpwuid(unixid);
101 if( !pwd ) return NULL;
103 return strdup(pwd->pw_name);
107 * \brief Get the User ID of the named user
109 int GetUserID(const char *Username)
113 if( strcmp(Username, ">sales") == 0 ) { // Pseudo account that sales are made into
116 else if( strcmp(Username, ">liability") == 0 ) { // Pseudo acount that money is added from
122 pwd = getpwnam(Username);
123 if( !pwd ) return -1;
127 // Get internal ID (or create new user)
128 ret = Bank_GetUserByUnixID(uid);
130 ret = Bank_AddUser(uid);