User enumeration implemented
[tpg/opendispense2.git] / src / cokebank_basic / main.c
1 /*
2  * OpenDispense 2 
3  * UCC (University [of WA] Computer Club) Electronic Accounting System
4  *
5  * cokebank.c - Coke-Bank management
6  *
7  * This file is licenced under the 3-clause BSD Licence. See the file COPYING
8  * for full details.
9  */
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <string.h>
13 #include <openssl/sha.h>
14 #include "common.h"
15
16 // === PROTOTYPES ===
17 void    Init_Cokebank(const char *Argument);
18  int    Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason);
19  int    GetBalance(int User);
20 char    *GetUserName(int User);
21  int    GetUserID(const char *Username); 
22  int    GetUserAuth(const char *Username, const char *Password);
23  int    GetMaxID(void);
24
25 // === GLOBALS ===
26 FILE    *gBank_LogFile;
27
28 // === CODE ===
29 /**
30  * \brief Load the cokebank database
31  */
32 void Init_Cokebank(const char *Argument)
33 {
34         gBank_File = fopen(Argument, "rb+");
35         if( !gBank_File ) {
36                 gBank_File = fopen(Argument, "wb+");
37         }
38         if( !gBank_File ) {
39                 perror("Opening coke bank");
40         }
41
42         gBank_LogFile = fopen("cokebank.log", "a");
43         if( !gBank_LogFile )    gBank_LogFile = stdout;
44
45         fseek(gBank_File, 0, SEEK_END);
46         giBank_NumUsers = ftell(gBank_File) / sizeof(gaBank_Users[0]);
47         fseek(gBank_File, 0, SEEK_SET);
48         gaBank_Users = malloc( giBank_NumUsers * sizeof(gaBank_Users[0]) );
49         fread(gaBank_Users, sizeof(gaBank_Users[0]), giBank_NumUsers, gBank_File);
50 }
51
52 /**
53  * \brief Transfers money from one user to another
54  * \param SourceUser    Source user
55  * \param DestUser      Destination user
56  * \param Ammount       Ammount of cents to move from \a SourceUser to \a DestUser
57  * \param Reason        Reason for the transfer (essentially a comment)
58  * \return Boolean failure
59  */
60 int Transfer(int SourceUser, int DestUser, int Ammount, const char *Reason)
61 {
62          int    srcBal = Bank_GetUserBalance(SourceUser);
63          int    dstBal = Bank_GetUserBalance(DestUser);
64         
65         if( srcBal - Ammount < Bank_GetMinAllowedBalance(SourceUser) )
66                 return 1;
67         if( dstBal + Ammount < Bank_GetMinAllowedBalance(DestUser) )
68                 return 1;
69         Bank_AlterUserBalance(DestUser, Ammount);
70         Bank_AlterUserBalance(SourceUser, -Ammount);
71         fprintf(gBank_LogFile, "ACCT #%i{%i} -= %ic [to #%i] (%s)\n", SourceUser, srcBal, Ammount, DestUser, Reason);
72         fprintf(gBank_LogFile, "ACCT #%i{%i} += %ic [from #%i] (%s)\n", DestUser, dstBal, Ammount, SourceUser, Reason);
73         return 0;
74 }
75
76 int GetFlags(int User)
77 {
78         return Bank_GetUserFlags(User);
79 }
80
81 /**
82  * \brief Get the balance of the passed user
83  */
84 int GetBalance(int User)
85 {
86         return Bank_GetUserBalance(User);;
87 }
88
89 /**
90  * \brief Return the name the passed user
91  */
92 char *GetUserName(int User)
93 {
94         return Bank_GetUserName(User);
95 }
96
97 /**
98  * \brief Get the User ID of the named user
99  */
100 int GetUserID(const char *Username)
101 {
102          int    ret;
103
104         // Get internal ID (or create new user)
105         ret = Bank_GetUserByName(Username);
106         if( ret == -1 ) {
107                 ret = Bank_AddUser(Username);
108         }
109
110         return ret;
111 }
112
113 int GetMaxID(void)
114 {
115         return giBank_NumUsers;
116 }
117

UCC git Repository :: git.ucc.asn.au