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
24 from lib.util import print_error
27 Simple wallet daemon for webservers.
28 - generates new addresses on request
29 - private keys are not needed in order to generate new addresses. A neutralized wallet can be used (seed removed)
30 - no gap limit: use 'getnum' to know how many addresses have been created.
41 wallet_path = 'wallet_path'
49 from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCRequestHandler
50 import SimpleXMLRPCServer
52 class authHandler(SimpleJSONRPCRequestHandler):
53 def parse_request(self):
54 if SimpleXMLRPCServer.SimpleXMLRPCRequestHandler.parse_request(self):
55 if self.authenticate(self.headers):
58 self.send_error(401, 'Authentication failed')
61 def authenticate(self, headers):
62 from base64 import b64decode
63 basic, _, encoded = headers.get('Authorization').partition(' ')
64 assert basic == 'Basic', 'Only basic authentication supported'
65 x_username, _, x_password = b64decode(encoded).partition(':')
66 return username == x_username and password == x_password
73 def get_new_address():
74 a = wallet.create_new_address(False)
79 return len(wallet.addresses)
82 return wallet.master_public_key.encode('hex')
86 if __name__ == '__main__':
90 server = jsonrpclib.Server('http://%s:%s@%s:%d'%(username, password, host, port))
98 elif cmd == 'getnewaddress':
99 out = server.getnewaddress()
103 print_error("Server not running")
110 wallet.set_path(wallet_path)
114 from SocketServer import ThreadingMixIn
115 from jsonrpclib.SimpleJSONRPCServer import SimpleJSONRPCServer
116 server = SimpleJSONRPCServer(( host, port), requestHandler=authHandler)
117 server.register_function(get_new_address, 'getnewaddress')
118 server.register_function(get_num, 'getnum')
119 server.register_function(get_mpk, 'getkey')
120 server.register_function(do_stop, 'stop')
121 server.serve_forever()
123 thread.start_new_thread(server_thread, ())
124 while not stopping: time.sleep(0.1)