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);
41 * \brief Load the cokebank database
43 void Init_Cokebank(const char *Argument)
45 gBank_File = fopen(Argument, "rb+");
47 gBank_File = fopen(Argument, "wb+");
50 perror("Opening coke bank");
53 gBank_LogFile = fopen("cokebank.log", "a");
54 if( !gBank_LogFile ) gBank_LogFile = stdout;
56 fseek(gBank_File, 0, SEEK_END);
57 giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
58 fseek(gBank_File, 0, SEEK_SET);
59 gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
60 fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
64 * \brief Transfers money from one user to another
65 * \param SourceUser Source user
66 * \param DestUser Destination user
67 * \param Ammount Ammount of cents to move from \a SourceUser to \a DestUser
68 * \param Reason Reason for the transfer (essentially a comment)
69 * \return Boolean failure
71 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
73 int srcBal = Bank_GetUserBalance(SourceUser);
74 int dstBal = Bank_GetUserBalance(DestUser);
75 if( srcBal - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
77 if( dstBal + Ammount < Bank_GetMinAllowedBalance(DestUser) )
79 Bank_AlterUserBalance(DestUser, Ammount);
80 Bank_AlterUserBalance(SourceUser, -Ammount);
81 fprintf(gBank_LogFile, "ACCT #%i{%i} -= %ic [to #%i] (%s)\n", SourceUser, srcBal, Ammount, DestUser, Reason);
82 fprintf(gBank_LogFile, "ACCT #%i{%i} += %ic [from #%i] (%s)\n", DestUser, dstBal, Ammount, SourceUser, Reason);
87 * \brief Get the balance of the passed user
89 int GetBalance(int User)
91 return Bank_GetUserBalance(User);;
95 * \brief Return the name the passed user
97 char *GetUserName(int User)
100 int unixid = Bank_GetUserUnixID(User);
103 return strdup(">sales");
106 return strdup(">liability");
108 pwd = getpwuid(unixid);
109 if( !pwd ) return NULL;
111 return strdup(pwd->pw_name);
115 * \brief Get the User ID of the named user
117 int GetUserID(const char *Username)
121 if( strcmp(Username, ">sales") == 0 ) { // Pseudo account that sales are made into
124 else if( strcmp(Username, ">liability") == 0 ) { // Pseudo acount that money is added from
130 pwd = getpwnam(Username);
131 if( !pwd ) return -1;
135 // Get internal ID (or create new user)
136 ret = Bank_GetUserByUnixID(uid);
138 ret = Bank_AddUser(uid);