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>
18 extern int Bank_GetMinAllowedBalance(int ID);
19 extern int Bank_GetUserBalance(int ID);
20 extern int Bank_AlterUserBalance(int ID, int Delta);
21 extern int Bank_GetUserByUnixID(int UnixID);
22 extern int Bank_GetUserUnixID(int ID);
23 extern int Bank_AddUser(int UnixID);
24 extern FILE *gBank_File;
25 extern tUser *gaBank_Users;
26 extern int giBank_NumUsers;
29 void Init_Cokebank(const char *Argument);
30 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason);
31 int GetBalance(int User);
32 char *GetUserName(int User);
33 int GetUserID(const char *Username);
34 int GetUserAuth(const char *Username, const char *Password);
38 * \brief Load the cokebank database
40 void Init_Cokebank(const char *Argument)
42 gBank_File = fopen(Argument, "rb+");
44 gBank_File = fopen(Argument, "wb+");
47 perror("Opening coke bank");
50 fseek(gBank_File, 0, SEEK_END);
51 giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
52 fseek(gBank_File, 0, SEEK_SET);
53 gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
54 fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
58 * \brief Transfers money from one user to another
59 * \param SourceUser Source user
60 * \param DestUser Destination user
61 * \param Ammount Ammount of cents to move from \a SourceUser to \a DestUser
62 * \param Reason Reason for the transfer (essentially a comment)
63 * \return Boolean failure
65 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
67 if( Bank_GetUserBalance(SourceUser) - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
69 if( Bank_GetUserBalance(DestUser) + Ammount < Bank_GetMinAllowedBalance(DestUser) )
71 Bank_AlterUserBalance(DestUser, Ammount);
72 Bank_AlterUserBalance(SourceUser, -Ammount);
77 * \brief Get the balance of the passed user
79 int GetBalance(int User)
81 return Bank_GetUserBalance(User);;
85 * \brief Return the name the passed user
87 char *GetUserName(int User)
90 int unixid = Bank_GetUserUnixID(User);
93 return strdup(">sales");
96 return strdup(">liability");
98 pwd = getpwuid(unixid);
99 if( !pwd ) return NULL;
101 return strdup(pwd->pw_name);
105 * \brief Get the User ID of the named user
107 int GetUserID(const char *Username)
111 if( strcmp(Username, ">sales") == 0 ) { // Pseudo account that sales are made into
114 else if( strcmp(Username, ">liability") == 0 ) { // Pseudo acount that money is added from
120 pwd = getpwnam(Username);
121 if( !pwd ) return -1;
125 // Get internal ID (or create new user)
126 ret = Bank_GetUserByUnixID(uid);
128 ret = Bank_AddUser(uid);