Updates verification steps.
This commit is contained in:
		
							parent
							
								
									f980f9210a
								
							
						
					
					
						commit
						6a02223189
					
				@ -163,6 +163,39 @@ if logg.isEnabledFor(logging.DEBUG):
 | 
				
			|||||||
    outfunc = logg.debug
 | 
					    outfunc = logg.debug
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def send_ussd_request(address, data_dir):
 | 
				
			||||||
 | 
					    upper_address = strip_0x(address).upper()
 | 
				
			||||||
 | 
					    f = open(os.path.join(
 | 
				
			||||||
 | 
					        data_dir,
 | 
				
			||||||
 | 
					        'new',
 | 
				
			||||||
 | 
					        upper_address[:2],
 | 
				
			||||||
 | 
					        upper_address[2:4],
 | 
				
			||||||
 | 
					        upper_address + '.json',
 | 
				
			||||||
 | 
					    ), 'r'
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    o = json.load(f)
 | 
				
			||||||
 | 
					    f.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    p = Person.deserialize(o)
 | 
				
			||||||
 | 
					    phone = p.tel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    session = uuid.uuid4().hex
 | 
				
			||||||
 | 
					    data = {
 | 
				
			||||||
 | 
					        'sessionId': session,
 | 
				
			||||||
 | 
					        'serviceCode': config.get('APP_SERVICE_CODE'),
 | 
				
			||||||
 | 
					        'phoneNumber': phone,
 | 
				
			||||||
 | 
					        'text': '',
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    req = urllib.request.Request(config.get('_USSD_PROVIDER'))
 | 
				
			||||||
 | 
					    data_str = json.dumps(data)
 | 
				
			||||||
 | 
					    data_bytes = data_str.encode('utf-8')
 | 
				
			||||||
 | 
					    req.add_header('Content-Type', 'application/json')
 | 
				
			||||||
 | 
					    req.data = data_bytes
 | 
				
			||||||
 | 
					    response = urllib.request.urlopen(req)
 | 
				
			||||||
 | 
					    return response.read().decode('utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VerifierState:
 | 
					class VerifierState:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, item_keys, active_tests=None):
 | 
					    def __init__(self, item_keys, active_tests=None):
 | 
				
			||||||
@ -346,69 +379,17 @@ class Verifier:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def verify_ussd(self, address, balance=None):
 | 
					    def verify_ussd(self, address, balance=None):
 | 
				
			||||||
        upper_address = strip_0x(address).upper()
 | 
					        response_data = send_ussd_request(address, self.data_dir)
 | 
				
			||||||
        f = open(os.path.join(
 | 
					 | 
				
			||||||
            self.data_dir,
 | 
					 | 
				
			||||||
            'new',
 | 
					 | 
				
			||||||
            upper_address[:2],
 | 
					 | 
				
			||||||
            upper_address[2:4],
 | 
					 | 
				
			||||||
            upper_address + '.json',
 | 
					 | 
				
			||||||
            ), 'r'
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        o = json.load(f)
 | 
					 | 
				
			||||||
        f.close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        p = Person.deserialize(o)
 | 
					 | 
				
			||||||
        phone = p.tel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        session = uuid.uuid4().hex
 | 
					 | 
				
			||||||
        data = {
 | 
					 | 
				
			||||||
                'sessionId': session,
 | 
					 | 
				
			||||||
                'serviceCode': config.get('APP_SERVICE_CODE'),
 | 
					 | 
				
			||||||
                'phoneNumber': phone,
 | 
					 | 
				
			||||||
                'text': config.get('APP_SERVICE_CODE'),
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        req = urllib.request.Request(config.get('_USSD_PROVIDER'))
 | 
					 | 
				
			||||||
        data_str = json.dumps(data)
 | 
					 | 
				
			||||||
        data_bytes = data_str.encode('utf-8')
 | 
					 | 
				
			||||||
        req.add_header('Content-Type', 'application/json')
 | 
					 | 
				
			||||||
        req.data = data_bytes
 | 
					 | 
				
			||||||
        response = urllib.request.urlopen(req)
 | 
					 | 
				
			||||||
        response_data = response.read().decode('utf-8')
 | 
					 | 
				
			||||||
        state = response_data[:3]
 | 
					        state = response_data[:3]
 | 
				
			||||||
        out = response_data[4:]
 | 
					        out = response_data[4:]
 | 
				
			||||||
        m = '{} {}'.format(state, out[:7])
 | 
					        m = '{} {}'.format(state, out[:7])
 | 
				
			||||||
        if m != 'CON Welcome':
 | 
					        if m != 'CON Welcome':
 | 
				
			||||||
            raise VerifierError(response_data, 'ussd')
 | 
					            raise VerifierError(response_data, 'ussd')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def verify_ussd_pins(self):
 | 
					    def verify_ussd_pins(self, address, balance):
 | 
				
			||||||
        # read file with pin exports
 | 
					        response_data = send_ussd_request(address, self.data_dir)
 | 
				
			||||||
        pins_file = f'{args.userdir}/pins.csv'
 | 
					        if response_data[:11] != 'CON Balance':
 | 
				
			||||||
        exported_phone_to_pins = [tuple(row) for row in csv.reader(pins_file)]
 | 
					            raise VerifierError(response_data, 'pins')
 | 
				
			||||||
 | 
					 | 
				
			||||||
        # get columns with pins and phone numbers
 | 
					 | 
				
			||||||
        db_conn = psycopg2.connect(
 | 
					 | 
				
			||||||
            database=config.get('DATABASE_NAME'),
 | 
					 | 
				
			||||||
            host=config.get('DATABASE_HOST'),
 | 
					 | 
				
			||||||
            port=config.get('DATABASE_PORT'),
 | 
					 | 
				
			||||||
            user=config.get('DATABASE_USER'),
 | 
					 | 
				
			||||||
            password=config.get('DATABASE_PASSWORD')
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        db_cursor = db_conn.cursor()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sql = 'SELECT phone_number, password_hash FROM account'
 | 
					 | 
				
			||||||
        db_cursor.execute(sql)
 | 
					 | 
				
			||||||
        phone_to_pins = db_cursor.fetchall()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        db_cursor.close()
 | 
					 | 
				
			||||||
        db_conn.close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if Counter(exported_phone_to_pins) == Counter(phone_to_pins):
 | 
					 | 
				
			||||||
            logg.debug(f'verified {len(exported_phone_to_pins)} exported pins match {len(phone_to_pins)} imported pins in db')
 | 
					 | 
				
			||||||
        else:
 | 
					 | 
				
			||||||
            raise VerifierError('Irregular pins import', 'pins')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def verify(self, address, balance, debug_stem=None):
 | 
					    def verify(self, address, balance, debug_stem=None):
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user