Payment IDs can now be deterministic or non-deterministic

Also add a site salt to create them, so a given user ID will yield
different payment IDs for different sites.
This commit is contained in:
moneromooo
2015-03-09 18:46:55 +00:00
parent fa581fac00
commit 5daa9d89fc
3 changed files with 25 additions and 12 deletions
+12 -5
View File
@@ -12,7 +12,13 @@ Calling raw module functions is undocumented and subject to change.
* Initialization: * Initialization:
monero=Monero(daemon_host,daemon_port,wallet_host,wallet_port,redis_host,redis_port) monero=Monero(daemon_host,daemon_port,wallet_host,wallet_port,redis_host,redis_port,site_salt)
Site salt is a string that's specific to your particular use.
It should be random but constant. Its intent is to cause the
same recipient identifier to map to different payment IDs for
two different users of monero-python. It is recommended to
hard code some random string in the call.
* Checking the current balance: * Checking the current balance:
@@ -27,15 +33,16 @@ Calling raw module functions is undocumented and subject to change.
* Create a new payment ID for a recipient: * Create a new payment ID for a recipient:
payment_id=monero.GetPaymentID(recipient) payment_id=monero.GetPaymentID(recipient,deterministic=True)
recipient is a string representing a user, destination, etc. The recipient is a string representing a user, destination, etc. The
semantics of it are left to the API user. Numbers can be used if semantics of it are left to the API user. Numbers can be used if
they're passed as strings. CheckForDeposits and other such functions they're passed as strings. CheckForDeposits and other such functions
will return that recipient when the associated payment ID is found will return that recipient when the associated payment ID is found
in a transaction. in a transaction.
Payment IDs are deterministic, so asking for a payment ID for a Payment IDs can be deterministic (so asking for a payment ID for a
given recipient will always yield the same payment ID. given recipient will always yield the same payment ID) or not (so
multiple calls to GetPaymentID will yield different Payment IDs).
* Get the recipient corresponding to a payment ID: * Get the recipient corresponding to a payment ID:
@@ -43,7 +50,7 @@ Calling raw module functions is undocumented and subject to change.
Returns the recipient associated with the given payment ID, or None Returns the recipient associated with the given payment ID, or None
if there is none. If there is one, it is the string that was passed if there is none. If there is one, it is the string that was passed
to a previous call to GetPaymentID. to a previous call to GetPaymentID which returned this payment ID.
* Check for new deposits: * Check for new deposits:
+4 -3
View File
@@ -33,18 +33,19 @@ import redisdb
import payment import payment
class Monero: class Monero:
def __init__(self,daemon_host,daemon_port,wallet_host,wallet_port,redis_host,redis_port): def __init__(self,daemon_host,daemon_port,wallet_host,wallet_port,redis_host,redis_port,site_salt):
redisdb.connect_to_redis(redis_host,redis_port) redisdb.connect_to_redis(redis_host,redis_port)
self.daemon_host=daemon_host self.daemon_host=daemon_host
self.daemon_port=daemon_port self.daemon_port=daemon_port
self.wallet_host=wallet_host self.wallet_host=wallet_host
self.wallet_port=wallet_port self.wallet_port=wallet_port
self.site_salt=site_salt
def GetWalletBalance(self): def GetWalletBalance(self):
return utils.RetrieveWalletBalance(self.wallet_host,self.wallet_port) return utils.RetrieveWalletBalance(self.wallet_host,self.wallet_port)
def GetPaymentID(self,recipient): def GetPaymentID(self,recipient,deterministic=True):
return utils.GetPaymentIDFromUserID(recipient) return utils.GetPaymentIDFromUserID(recipient,deterministic,self.site_salt)
def GetRecipient(self,payment_id): def GetRecipient(self,payment_id):
return utils.GetUserIDFromPaymentID(payment_id) return utils.GetUserIDFromPaymentID(payment_id)
+9 -4
View File
@@ -34,6 +34,7 @@ import json
import httplib import httplib
import time import time
import string import string
from Crypto.Random.random import getrandbits
from decimal import * from decimal import *
from log import log_error, log_warn, log_info, log_log from log import log_error, log_warn, log_info, log_log
from redisdb import * from redisdb import *
@@ -45,11 +46,15 @@ cached_wallet_balance=None
cached_wallet_unlocked_balance=None cached_wallet_unlocked_balance=None
cached_wallet_balance_timestamp=None cached_wallet_balance_timestamp=None
def GetPaymentIDFromUserID(user_id): def GetPaymentIDFromUserID(user_id,deterministic,site_salt=''):
salt="nveuweaiirv-" salt="nveuweaiirv-"+site_salt+'-'
p = hashlib.sha256(salt+user_id).hexdigest() if deterministic:
s = salt + user_id
else:
s = salt + str(getrandbits(128)) + '-' + user_id
p = hashlib.sha256(s).hexdigest()
try: try:
redis_hset("paymentid",p,link.identity()) redis_hset("paymentid",p,user_id)
except Exception,e: except Exception,e:
log_error('GetPaymentIDFromUserID: failed to set payment ID for %s to redis: %s' % (user_id,str(e))) log_error('GetPaymentIDFromUserID: failed to set payment ID for %s to redis: %s' % (user_id,str(e)))
return p return p