2017-02-20 16:13:21 +01:00
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
// This file is part of Parity.
// Parity is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Parity is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
2017-04-03 11:13:51 +02:00
extern crate byteorder ;
2017-02-20 16:13:21 +01:00
#[ macro_use ]
extern crate log ;
2017-04-03 11:13:51 +02:00
#[ macro_use ]
extern crate futures ;
extern crate futures_cpupool ;
2017-02-20 16:13:21 +01:00
extern crate hyper ;
2017-07-19 10:35:17 +02:00
#[ macro_use ]
extern crate lazy_static ;
2017-02-20 16:13:21 +01:00
extern crate parking_lot ;
2017-07-06 11:26:14 +02:00
extern crate rustc_hex ;
2017-04-03 11:13:51 +02:00
extern crate serde ;
extern crate serde_json ;
#[ macro_use ]
extern crate serde_derive ;
2017-10-02 15:27:31 +02:00
extern crate tiny_keccak ;
2017-04-08 11:26:16 +02:00
extern crate tokio_io ;
2017-04-03 11:13:51 +02:00
extern crate tokio_core ;
extern crate tokio_service ;
extern crate tokio_proto ;
2017-02-20 16:13:21 +01:00
extern crate url ;
2017-04-03 17:46:51 +02:00
extern crate ethcore ;
2017-09-06 20:47:45 +02:00
extern crate ethcore_bytes as bytes ;
2017-02-20 16:13:21 +01:00
extern crate ethcore_util as util ;
2017-09-04 16:36:49 +02:00
extern crate ethcore_bigint as bigint ;
2017-04-25 21:34:03 +02:00
extern crate ethcore_logger as logger ;
2017-02-20 16:13:21 +01:00
extern crate ethcrypto ;
extern crate ethkey ;
2017-11-20 13:18:31 +01:00
extern crate ethsync ;
2017-04-03 17:46:51 +02:00
extern crate native_contracts ;
2017-11-10 19:04:55 +01:00
extern crate keccak_hash as hash ;
2017-10-10 20:01:27 +02:00
extern crate kvdb ;
2017-10-12 15:36:27 +02:00
extern crate kvdb_rocksdb ;
2017-02-20 16:13:21 +01:00
2017-03-13 12:54:56 +01:00
mod key_server_cluster ;
2017-02-20 16:13:21 +01:00
mod types ;
2017-10-16 17:12:02 +02:00
mod traits ;
2017-02-20 16:13:21 +01:00
mod acl_storage ;
mod key_server ;
mod key_storage ;
2017-04-03 11:13:51 +02:00
mod serialization ;
2017-07-19 10:35:17 +02:00
mod key_server_set ;
2017-07-25 08:24:54 +02:00
mod node_key_pair ;
2017-11-14 12:26:31 +01:00
mod listener ;
2017-02-20 16:13:21 +01:00
2017-04-03 17:46:51 +02:00
use std ::sync ::Arc ;
use ethcore ::client ::Client ;
2017-11-20 13:18:31 +01:00
use ethsync ::SyncProvider ;
2017-04-03 17:46:51 +02:00
2017-07-06 14:02:10 +02:00
pub use types ::all ::{ ServerKeyId , EncryptedDocumentKey , RequestSignature , Public ,
2017-04-25 21:34:03 +02:00
Error , NodeAddress , ServiceConfiguration , ClusterConfiguration } ;
2017-07-25 08:24:54 +02:00
pub use traits ::{ NodeKeyPair , KeyServer } ;
pub use self ::node_key_pair ::{ PlainNodeKeyPair , KeyStoreNodeKeyPair } ;
2017-02-20 16:13:21 +01:00
/// Start new key server instance
2017-11-20 13:18:31 +01:00
pub fn start ( client : Arc < Client > , sync : Arc < SyncProvider > , self_key_pair : Arc < NodeKeyPair > , config : ServiceConfiguration ) -> Result < Box < KeyServer > , Error > {
2017-07-27 14:48:07 +02:00
let acl_storage : Arc < acl_storage ::AclStorage > = if config . acl_check_enabled {
2017-11-20 13:18:31 +01:00
acl_storage ::OnChainAclStorage ::new ( & client /* , &sync */ ) // TODO: return false until fully synced
2017-07-27 14:48:07 +02:00
} else {
Arc ::new ( acl_storage ::DummyAclStorage ::default ( ) )
} ;
2017-11-20 13:18:31 +01:00
let key_server_set = key_server_set ::OnChainKeyServerSet ::new ( & client , /* &sync, */ config . cluster_config . nodes . clone ( ) ) ? ; // TODO: return empty set until fully synced
2017-04-03 11:13:51 +02:00
let key_storage = Arc ::new ( key_storage ::PersistentKeyStorage ::new ( & config ) ? ) ;
2017-11-22 09:43:01 +01:00
let key_server = Arc ::new ( key_server ::KeyServerImpl ::new ( & config . cluster_config , key_server_set . clone ( ) , self_key_pair . clone ( ) , acl_storage , key_storage . clone ( ) ) ? ) ;
2017-11-22 08:05:14 +01:00
let cluster = key_server . cluster ( ) ;
2017-11-14 12:26:31 +01:00
let http_listener = match config . listener_address {
Some ( listener_address ) = > Some ( listener ::http_listener ::KeyServerHttpListener ::start ( listener_address , key_server . clone ( ) ) ? ) ,
None = > None ,
} ;
2017-11-22 09:43:01 +01:00
let contract_listener = listener ::service_contract_listener ::ServiceContractListener ::new ( listener ::service_contract_listener ::ServiceContractListenerParams {
client : Arc ::downgrade ( & client ) ,
sync : Arc ::downgrade ( & sync ) ,
key_server : key_server . clone ( ) ,
self_key_pair : self_key_pair ,
key_servers_set : key_server_set ,
cluster : cluster ,
key_storage : key_storage ,
} ) ;
2017-11-15 08:42:13 +01:00
let listener = listener ::Listener ::new ( key_server , http_listener , Some ( contract_listener ) ) ;
2017-02-20 16:13:21 +01:00
Ok ( Box ::new ( listener ) )
}