root / trunk / sandbox / jhb / oc2 / issuer.py

Revision 277, 5.0 kB (checked in by ocjhb, 3 years ago)

protocols removed, functionality now in wallet and issuer

  • Property svn:mime-type set to text/plain
  • Property svn:eol-style set to native
  • Property svn:executable set to *
Line 
1from entity import *
2import datetime
3import messages
4
5class Issuer(Entity):
6
7    def __init__(self,storage=None):
8        Entity.__init__(self,storage)
9        self.delay = False
10
11    def createMasterKeys(self):
12        priv,pub = occrypto.KeyFactory(1024)
13        self.storage['masterPrivKey'] = priv
14        self.storage['masterPubKey'] = pub
15
16    def makeCDD(self, currencyId,
17                      shortCurrencyId,
18                      denominations,
19                      issuerServiceLocation,
20                      options):
21
22        cdd = container.CDD()
23        cdd.standardId='http://opencoin.org/OpenCoinProtocol/jhb1'
24        cdd.currencyId = currencyId
25        cdd.shortCurrencyId = shortCurrencyId
26        cdd.denominations = denominations
27        cdd.issuerServiceLocation = issuerServiceLocation
28        cdd.options = options
29        cdd.masterPubKey = self.getMasterPubKey()
30        cdd.issuer = self.getMasterPubKey().hash()
31
32        cdds = self.storage.setdefault('cdds',[])
33        cdd.version = len(cdds)   
34        self.storage['masterPrivKey'].signContainer(cdd)
35        cdds.append(cdd)
36        return cdd
37
38    def getCDD(self,version=None):
39        cdds = self.storage['cdds']
40        if version:
41            return cdds[version]
42        else:
43            return cdds[-1]
44
45    def getMasterPubKey(self):
46        return self.storage['masterPubKey']
47
48    def _getMasterPrivKey(self):
49        return self.storage['masterPrivKey']
50
51    def signMintKeys(self,keys,
52                         cdd=None,
53                         notBefore=None,
54                         keyNotAfter=None,
55                         coinNotAfter=None):
56        if not cdd:
57            cdd = self.getCDD(shortCurrencyId)
58       
59       
60        masterKey = self._getMasterPrivKey()
61
62        for denomination,pub in keys.items():
63            mkc = container.MKC()
64            mkc.keyId = pub.hash()
65            mkc.currencyId = cdd.currencyId
66            mkc.version = cdd.version
67            mkc.denomination = denomination
68            mkc.notBefore = notBefore and notBefore or datetime.datetime.now()
69            mkc.keyNotAfter = keyNotAfter and keyNotAfter or mkc.notBefore + datetime.timedelta(365)
70            mkc.coinNotAfter = coinNotAfter and coinNotAfter or mkc.notBefore + datetime.timedelta(365)
71            mkc.publicKey = pub
72            mkc.issuer = cdd.issuer
73            masterKey.signContainer(mkc)
74            self.addMKC(cdd,mkc)
75
76        return self.getCurrentMKCs()
77
78    def addMKC(self,cdd,mkc):
79        mkclist = self.storage.setdefault('mkclist',[])
80        if len(mkclist) <= cdd.version:
81            mkclist.append({})
82        mkclist[cdd.version][mkc.denomination]=mkc   
83        keyidlist = self.storage.setdefault('keyidlist',{})
84        keyidlist[mkc.keyId] = mkc
85       
86    def getCurrentMKCs(self,version=-1):
87        return self.storage['mkclist'][version]
88
89    def getMKCById(self,keyid,default=None):
90        return self.storage.setdefault('keyidlist',{}).get(keyid,default)
91
92    def addToTransactions(self,transactionId,signatures):
93        self.storage.setdefault('transactions',{})[transactionId]=signatures
94
95    def getTransactionResult(self,transactionId):
96        if self.delay:
97            return None
98        else:           
99            return self.storage.setdefault('transactions',{}).get(transactionId,None)
100
101    def giveLatestCDD(self,message):
102        answer = messages.GiveLatestCDD()
103        answer.cdd = self.getCDD()
104        return answer
105
106
107    def giveMintKeys(self,message):
108        keys = []
109        if message.denominations:
110            keyslist = self.getCurrentMKCs()
111            for d in message.denominations:
112                keys.append(keyslist.get(d))
113        elif message.keyids:
114            for id in message.keyids:
115                keys.append(self.getKeyById(id))
116       
117        answer = messages.GiveMintKeys()
118        answer.keys = keys
119        return answer
120
121    def handleTransferRequest(self,mint,authorizer,message):
122        options = dict(message.options)
123        requesttype = options['type']
124       
125        if requesttype == 'mint':
126            authorizedMessage = authorizer.authorize(message)
127            if type(authorizedMessage) == messages.Error:
128                return messages.TransferReject()
129            else:
130                return mint.handleMintingRequest(authorizedMessage)
131       
132        elif requesttype == 'exchange':
133            return mint.handleExchangeRequest(message)
134                       
135        elif requesttype == 'redeem':
136            return mint.handleRedeemRequest(message)
137       
138        else:
139            return messages.TransferReject()
140
141    def resumeTransfer(self,message):
142        signatures = self.getTransactionResult(message.transactionId)
143        if signatures:
144            answer = messages.TransferAccept()
145            answer.signatures = signatures
146        else:
147            answer = messages.TransferDelay()
148            answer.transactionId = message.transactionId
149            answer.reason = 'issuer has no coins yet'
150        return answer
Note: See TracBrowser for help on using the browser.