3 # Electrum - lightweight Bitcoin client
4 # Copyright (C) 2011 thomasv@gitorious
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 import time, thread, sys, socket
21 # see http://code.google.com/p/jsonrpclib/
23 from wallet import Wallet
26 Simple wallet daemon for webservers.
27 - generates new addresses on request
28 - private keys are not needed in order to generate new addresses. A neutralized wallet can be used (seed removed)
29 - no gap limit: use 'getnum' to know how many addresses have been created.
40 wallet_path = 'wallet_path'
48 from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCRequestHandler
49 import SimpleXMLRPCServer
51 class authHandler(SimpleJSONRPCRequestHandler):
52 def parse_request(self):
53 if SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.parse_request(self):
54 if self.authenticate(self.headers):
57 self.send_error(401, 'Authentication failed')
60 def authenticate(self, headers):
61 from base64 import b64decode
62 basic, _, encoded = headers.get('Authorization').partition(' ')
63 assert basic == 'Basic', 'Only basic authentication supported'
64 x_username, _, x_password = b64decode(encoded).partition(':')
65 return username == x_username and password == x_password
72 def get_new_address():
73 a = wallet.create_new_address(False)
78 return len(wallet.addresses)
81 return wallet.master_public_key.encode('hex')
85 if __name__ == '__main__':
89 server = jsonrpclib.Server('http://%s:%s@%s:%d'%(username, password, host, port))
97 elif cmd == 'getnewaddress':
98 out = server.getnewaddress()
102 print "server not running"
109 wallet.set_path(wallet_path)
113 from SocketServer import ThreadingMixIn
114 from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
115 server = SimpleJSONRPCServer(( host, port), requestHandler=authHandler)
116 server.register_function(get_new_address, 'getnewaddress')
117 server.register_function(get_num, 'getnum')
118 server.register_function(get_mpk, 'getkey')
119 server.register_function(do_stop, 'stop')
120 server.serve_forever()
122 thread.start_new_thread(server_thread, ())
123 while not stopping: time.sleep(0.1)