Exemple #1
0
        public MetaDaemonApi(RpcConfig bitsharesConfig, RpcConfig bitcoinConfig,
                             string bitsharesAccount,
                             string databaseName, string databaseUser, string databasePassword,
                             string listenAddress,
                             string bitcoinFeeAddress,
                             string bitsharesFeeAccount,
                             string adminUsernames,
                             string masterSiteUrl,
                             string masterSiteIp,
                             AsyncPump scheduler) :
            base(bitsharesConfig, bitcoinConfig, bitsharesAccount, adminUsernames,
                 databaseName, databaseUser, databasePassword)
        {
            m_bitshaaresFeeAccount = bitsharesFeeAccount;
            m_bitcoinFeeAddress    = bitcoinFeeAddress;
            m_masterSiteUrl        = masterSiteUrl.TrimEnd('/');

            m_scheduler = scheduler;

            ServicePointManager.ServerCertificateValidationCallback = Validator;

            Serialisation.Defaults();

            // don't ban on exception here because we'll only end up banning the webserver!
            m_server = new ApiServer <IDummyDaemon>(new string[] { listenAddress }, null, false, eDdosMaxRequests.Ignore, eDdosInSeconds.One);

            m_api = new SharedApi <IDummyDaemon>(m_dataAccess);
            m_server.ExceptionEvent += m_api.OnApiException;

            // only allow the main site to post to us
            m_server.SetIpLock(masterSiteIp);

            m_marketHandlers = new Dictionary <string, MarketBase>();

            // get all market pegged assets
            List <BitsharesAsset> allAssets = m_bitshares.BlockchainListAssets("", int.MaxValue);

            m_allBitsharesAssets = allAssets.ToDictionary(a => a.id);
            Dictionary <int, BitsharesAsset> peggedAssets = allAssets.Where(a => a.issuer_id <= 0).ToDictionary(a => a.id);


            // get all active markets containing those assets
            m_allDexMarkets = m_bitshares.BlockchainListMarkets().Where(m => m.last_error == null &&
                                                                        peggedAssets.ContainsKey(m.base_id) &&
                                                                        peggedAssets.ContainsKey(m.quote_id)).ToList();

            m_allCurrencies = m_dataAccess.GetAllCurrencies();

            List <MarketRow> markets = GetAllMarkets();

            foreach (MarketRow r in markets)
            {
                m_marketHandlers[r.symbol_pair] = CreateHandlerForMarket(r);
            }

            m_server.HandlePostRoute(Routes.kSubmitAddress, OnSubmitAddress, eDdosMaxRequests.Ignore, eDdosInSeconds.Ignore, false);
            m_server.HandleGetRoute(Routes.kGetAllMarkets, OnGetAllMarkets, eDdosMaxRequests.Ignore, eDdosInSeconds.Ignore, false);
        }
Exemple #2
0
        public MetaServer(string uri, string webroot,
                          string database, string databaseUser, string databasePassword,
                          bool maintenance)
        {
            RedisWrapper.Initialise("meta");
            Serialisation.Defaults();

            m_auth = new MysqlAuthenticator(database, databaseUser, databasePassword, Thread.CurrentThread.ManagedThreadId);

            m_allCurrencies = m_auth.m_Database.GetAllCurrencies();

            string[] listenOn = uri.Split(',');

            m_webAddress = listenOn.First();

                        #if MONO
            bool forwardToSsl = !Debugger.IsAttached;
                        #else
            bool forwardToSsl = false;
                        #endif

            m_server = new MetaWebServer(listenOn, webroot, m_auth, true, eDdosMaxRequests.Ten, eDdosInSeconds.One, 10, 50000, forwardToSsl);

            m_server.ExceptionEvent       += OnServerException;
            m_server.ExceptionOnWebServer += OnServerException;

            List <IHeadResource> fonts = new List <IHeadResource>();
            fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.eot", FontResource.kEmeddedOpenTypeMime, true));
            fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.svg", FontResource.kSvgMimeType, true));
            fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.ttf", FontResource.kTrueTypeMime, true));
            fonts.Add(new FontResource(webroot, "/fonts/glyphicons-halflings-regular.woff", FontResource.kWoffTypeMime, true));
            m_server.AddGlobalResources(fonts);

            if (maintenance)
            {
                m_server.m_HttpServer.ReplaceUnhandledRouteObserver(async ctx => ctx.Respond(await m_server.HandleRequest <MaintenancePage>(ctx, m_auth.Authorise(ctx)), HttpStatusCode.OK));
            }
            else
            {
                m_api = new SharedApi <IDummy>(m_auth.m_Database);

                PullInitialData();

                // forwarding routes on to actual api server
                m_server.HandlePostRoute(Routes.kSubmitAddress, OnSubmitAddress, eDdosMaxRequests.Five, eDdosInSeconds.One, true, true);
                m_server.HandlePostRoute(Routes.kGetOrderStatus, m_api.OnGetOrderStatus, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false);
                m_server.HandlePostRoute(Routes.kGetMarket, OnGetMarket, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false);
                m_server.HandlePostRoute(Routes.kGetLastTransactions, m_api.OnGetLastTransactions, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false);
                m_server.HandlePostRoute(Routes.kGetMyLastTransactions, m_api.OnGetMyLastTransactions, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false);
                m_server.HandleGetRoute(Routes.kGetAllMarkets, OnGetAllMarkets, eDdosMaxRequests.Five, eDdosInSeconds.One, true, false);
                m_server.HandleGetRoute(Routes.kProduceReport, m_api.OnProduceReport, eDdosMaxRequests.One, eDdosInSeconds.One, true, false);

                // handle push from daemons
                m_server.HandlePostRoute(Routes.kPushFees, OnPushFeeCollection, eDdosMaxRequests.Unlimited, eDdosInSeconds.Ignore, true, false);
                m_server.HandlePostRoute(Routes.kPushTransactions, OnPushTransactions, eDdosMaxRequests.Unlimited, eDdosInSeconds.Ignore, true, true);
                m_server.HandlePostRoute(Routes.kPushMarket, OnPushMarket, eDdosMaxRequests.Unlimited, eDdosInSeconds.Ignore, true, false);


                // serve the pages
                m_server.HandlePageRequest <MarketsPage>("/", eDdosMaxRequests.Five, eDdosInSeconds.One, true);
                m_server.HandlePageRequest <MainPage>("/markets/{base}/{quote}", eDdosMaxRequests.Five, eDdosInSeconds.One, true);
                m_server.HandlePageRequest <ApiPage>("/apiDocs", eDdosMaxRequests.Five, eDdosInSeconds.One, true);
                m_server.HandlePageRequest <FaqPage>("/faq", eDdosMaxRequests.Five, eDdosInSeconds.One, true);
            }
        }