X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=VendServer%2FOpenDispense.py;h=5e413630f6ce6adc552f1744c303f46e019ca7de;hp=de8ff840aab669452dcce1db447ecc06504768fd;hb=f637edb6d0ea97beb255ad87685844c1eb26c89b;hpb=8cda0f578277ed1c4ce70c712d2e54311dd79e70 diff --git a/VendServer/OpenDispense.py b/VendServer/OpenDispense.py index de8ff84..5e41363 100644 --- a/VendServer/OpenDispense.py +++ b/VendServer/OpenDispense.py @@ -12,6 +12,8 @@ import os import logging import re import pwd +import base64 +import socket from subprocess import Popen, PIPE from LDAPConnector import get_uid,get_uname, set_card_id @@ -70,26 +72,33 @@ class OpenDispense(DispenseInterface): return False def authMifareCard(self, cardId): + self._loggedIn = False + self._username = None if DISPSRV_MIFARE: card_base64 = base64.b64encode(cardId) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) sock.connect(DISPENSE_ENDPOINT) - sock.write("AUTHIDENT\n") - rsp = sock.readline() + logging.debug('connected to dispsrv') + sockf = sock.makefile() + sockf.write("AUTHIDENT\n"); sockf.flush() + rsp = sockf.readline() assert "200" in rsp - sock.write("AUTHCARD %s\n" % (card_base64,)) - rsp = sock.readline() + logging.debug('authenticated') + sockf.write("AUTHCARD %s\n" % (card_base64,)); sockf.flush() + rsp = sockf.readline() if not "200" in rsp: - raise ValueError, "no UID found for card ID" - username = rsp.split('=')[1] + logging.info("Rejected card base64:%s" % (card_base64,)) + return False + username = rsp.split('=')[1].strip() + logging.info("Accepted card base64:%s for %s" % (card_base64,username,)) # Check for thier username try: # Get info from the system (by username) info = pwd.getpwnam(username) except KeyError: - logging.info('getting pin for uid %d: user not in password file'%uid) + logging.info('getting info for user \'%s\': user not in password file' % (username,)) return False else: # Get the users ID @@ -100,7 +109,7 @@ class OpenDispense(DispenseInterface): # Get info from the system (by UID) info = pwd.getpwuid(self._userid) except KeyError: - logging.info('getting pin for uid %d: user not in password file'%uid) + logging.info('getting info for uid %d: user not in password file' % (self._userid,)) return False # If we get this far all is good @@ -109,6 +118,11 @@ class OpenDispense(DispenseInterface): self._userid = info.pw_uid self._username = info.pw_name return True + def logOut(self): + self._loggedIn = False + self._disabled = False + self._userId = None + self._username = None def addCard(self, cardId): if not self.isLoggedIn(): @@ -118,14 +132,15 @@ class OpenDispense(DispenseInterface): logging.info('Enrolling card %s to uid %s (%s)' % (cardId, self._userId, self._username)) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) sock.connect(DISPENSE_ENDPOINT) - sock.write("AUTHIDENT\n") - rsp = sock.readline() + sockf = sock.makefile() + sockf.write("AUTHIDENT\n") + sockf.flush(); rsp = sockf.readline() assert "200" in rsp - sock.write("SETEUSER %s\n", self._username) - rsp = sock.readline() + sockf.write("SETEUSER %s\n" % (self._username,)) + sockf.flush(); rsp = sockf.readline() assert "200" in rsp - sock.write("CARD_ADD %s\n", card_base64) - rsp = sock.readline() + sockf.write("CARD_ADD %s\n" % (card_base64,)) + sockf.flush(); rsp = sockf.readline() if "200" in rsp: return True else: @@ -154,6 +169,7 @@ class OpenDispense(DispenseInterface): return balance def getItemInfo(self, itemId): + logging.debug("getItemInfo(%s)" % (itemId,)) itemId = OpenDispenseMapping.vendingMachineToOpenDispense(itemId) args = ('dispense', 'iteminfo', itemId) info, unused = Popen(args, close_fds=True, stdout=PIPE).communicate() @@ -190,8 +206,20 @@ class OpenDispenseMapping(): @staticmethod def vendingMachineToOpenDispense(itemId): + logging.debug("vendingMachineToOpenDispense(%s)" % (itemId,)) _mappingFile = "OpenDispenseMappings.conf" - fh = open(_mappingFile) + try: + fh = open(_mappingFile) + except IOError: + if itemId[1] == '8': + return 'coke:' + itemId[0] + elif itemId[1] == '5': + if itemId[0] == '5': + return 'door' + else: + return None + else: + return 'snack:' + itemId map = "" for line in fh: #line = line.strip()