示例#1
0
文件: PoroServer.cs 项目: Kaotic/Poro
        public PoroServer(PoroServerSettings settings)
        {
            _settings = settings;

            //Create the Authentication Server to handle login requests and client page
            _auth = new AuthServer(HandleWebServ, _settings.AuthLocations);

            //Load the certificate store for the RTMPS server
            var certificateStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);

            certificateStore.Open(OpenFlags.MaxAllowed);

            //Remove last certificate in case it wasn't deleted on close
            foreach (var cert in certificateStore.Certificates)
            {
                if (cert.IssuerName.Name == string.Format("CN={0}", _settings.RTMPSHost))
                {
                    certificateStore.Remove(cert);
                }
            }

            //Generate new certificate for this run and add it to the store.
            var _rtmpsCert = CertGen.CreateSelfSignedCertificate(_settings.RTMPSHost);

            certificateStore.Add(_rtmpsCert);
            certificateStore.Close();

            //Generate the SerializationContext
            _context = new SerializationContext();
            var structures = Assembly.GetExecutingAssembly().GetTypes().Where(x => String.Equals(x.Namespace, "PoroLib.Structures", StringComparison.Ordinal));

            foreach (Type ObjectType in structures)
            {
                _context.Register(ObjectType);
            }

            //Create the RTMPS server with the context and certificate
            _server = new RtmpServer(new IPEndPoint(IPAddress.Parse(_settings.RTMPSHost), _settings.RTMPSPort), _context, _rtmpsCert);
            _server.ClientCommandReceieved += ClientCommandReceieved;
            _server.ClientMessageReceived  += ClientMessageReceived;

            //Set up the handler
            _handler = new MessageHandler();
            _handler.Register("LoginService");
            _handler.Register("MatchmakerService");
            _handler.Register("ClientFacadeService");
            _handler.Register("InventoryService");
            _handler.Register("MasteryBookService");
            _handler.Register("SummonerRuneService");
            _handler.Register("PlayerPreferencesService");
            _handler.Register("LcdsGameInvitationService");
            _handler.Register("SummonerTeamService");

            //Set up the forwarder
            _forwarder = new MessageForwarder(_context);

            //Set up the property redirector
            _redirector = new PropertyRedirector(_settings);

            //Set up the data loader
            _data = new DataLoader();
            _redirector.PatcherFound += new PropertyRedirector.PatcherFoundHandler(_data.LoadData);

            //Set up the user server
            _users = new UserHandler();
        }
示例#2
0
文件: PoroServer.cs 项目: Kaotic/Poro
        public async Task <object> HandleWebServ(HttpListenerRequest request)
        {
            if (request.RawUrl.Contains("login-queue"))
            {
                return("{\"status\":\"LOGIN\"}");
            }
            else if (request.RawUrl.StartsWith("/api"))
            {
                return(await HandleAPI(request));
            }
            else
            {
                string ReadURL = request.RawUrl;
                if (ReadURL == "/")
                {
                    ReadURL = "/index.html";
                }
                if (ReadURL == "/favicon.ico")
                {
                    return("");
                }

                string ContentType   = AuthServer.SetContentType(request.RawUrl);
                string RequestedFile = ReadURL.Split('/').Last();

#if !FILESYSTEM
                using (var db = new LiteEngine("poro.dat"))
                {
                    var file = db.FileStorage.FindById(RequestedFile);

                    if (file == null)
                    {
                        return("404");
                    }

                    var stream = file.OpenRead();

                    using (var memoryStream = new MemoryStream())
                    {
                        stream.CopyTo(memoryStream);
                        byte[] bytes = memoryStream.ToArray();
                        if (ContentType.StartsWith("image"))
                        {
                            return(bytes);
                        }
                        else
                        {
                            return(Encoding.Default.GetString(bytes));
                        }
                    }
                }
#endif

#if FILESYSTEM
                //Uncomment to create poro.dat

                /*var x = File.OpenRead(FileURL);
                 * using (var db = new LiteEngine("poro.dat"))
                 * {
                 *  var file = db.FileStorage.FindById(RequestedFile);
                 *
                 *  if (file == null)
                 *  {
                 *      db.FileStorage.Upload(RequestedFile, x);
                 *  }
                 * }*/

                string FileURL = string.Format("app/web{0}", ReadURL);

                if (ContentType.StartsWith("image"))
                {
                    return(File.ReadAllBytes(FileURL));
                }
                else
                {
                    return(File.ReadAllText(FileURL));
                }
#endif
            }
        }