+/// UID: User ID (must be valid)
+/// username: Optional username
+bool authenticate(tClient* Client, int UID, const char* username)
+{
+ Client->UID = UID;
+
+ int flags = Bank_GetFlags(Client->UID);
+ if( flags & USER_FLAG_DISABLED ) {
+ Client->UID = -1;
+ sendf(Client->Socket, "403 Authentication failure: account disabled\n");
+ return false;
+ }
+ // You can't be an internal account
+ if( flags & USER_FLAG_INTERNAL ) {
+ if(giDebugLevel)
+ Debug(Client, "IDENT auth as '%s', not allowed", username);
+ Client->UID = -1;
+ sendf(Client->Socket, "403 Authentication failure: that account is internal\n");
+ return false;
+ }
+
+ // Save username
+ if(Client->Username != username)
+ {
+ if(Client->Username)
+ {
+ free(Client->Username);
+ }
+
+ // Fetch username (if not provided)
+ if( username )
+ {
+ Client->Username = strdup(username);
+ }
+ else
+ {
+ Client->Username = Bank_GetAcctName(UID);
+ }
+ }
+
+ Client->bIsAuthed = 1;
+
+ if(giDebugLevel)
+ Debug(Client, "Auto authenticated as '%s' (%i)", Client->Username, Client->UID);
+ return true;
+}
+bool require_auth(tClient* Client)
+{
+ // Check authentication
+ if( !Client->bIsAuthed ) {
+ sendf(Client->Socket, "401 Not Authenticated\n");
+ return false;
+ }
+ return true;
+}
+