Entry
แงแแแแแคแแ แ แแแจแแ แแแแฌแงแ, แ แแชแ แแแแแแแ แจแแแแแแแแแแ แแแขแแ แ แแแ แกแแ แแแกแแก แแแแแแแแ. แแก แ แแฆแแช แขแแแแแ แแก แแกแแแแกแ แฃแแแ แงแแคแแแแงแ, แแแแ แแ IT hangout-แแกแแแแก. แคแฃแแฅแชแแแแแแแแ แฃแแแแฃแ แแกแแ แแแ แขแแแแ, แแแ แแแแกแขแ แแ แแแแแ, แแแกแแแ แแ แแคแแแก แแ แแแแแแแฎแแ แ แแแแแแ แกแแแแแฎแแ, แแแ แซแแ, แแแแแแแกแแฃแแ แแก แแแแแแแ แแ แแแแจแแ แแแแก แแแคแแ แแแแแแแ แแ แแฎแแ แแแชแแแแแแแ.
แแฅ แฃแแแ แแแแแแแแ แแ แชแแขแ แฉแแแก แจแแกแแฎแแแแช แแแกแแฃแแ แ, แ แแแ แแแแแแแแจแ แฃแคแ แ แแแแแแ แแแฎแแแก, แ แแขแแ แแแแแแแแ แแกแแแ แแแแแฏแแแ แแแแแแแแ แแแแจแ.
แแแแแแแ แกแแแแแแจแ แกแขแฃแแแแจแ แขแแฅแแแแฃแ แ แจแแแกแ แฃแแแแแแก แแแแแชแแแก แแแแแแแ, แฉแแแ C# แแ แแแ แแแแ แแแแก แแแแแชแแแแแแ แแคแฃแซแแแแแแ แแฎแแแแ แกแแ แแแขแแแแก แแ แฃแขแแแแขแแแแก แแแฌแแ แแก Unity-แกแแแแก แแ, แแแ แแ แแแแกแ, แแแแ แแแแแก แแแฌแงแแแแแแแแแแแ แแแแแแ แแแแแก แแฃแจแแแแแกแแแแก แแแแแแแขแแแแก แจแแฅแแแแแ. แแ แกแแแงแแ แแก แแแ แแ, แแ แฏแแ แแ แแแแ แฉแแแแ แแ แจแแแแแ แแแแแแแงแแแแแแ แแกแแแ แจแแกแแซแแแแแแแ.
แแแฌแแแ 1: แฉแแ แฉแแก แแ แแขแแขแแแแ แแแ
แแแก แจแแแแแ แ แแช แแแแแแฌแงแแแขแ แ แแแแ แ แแฅแแแแ แแก แกแแ แแแกแ, แแแแแฌแงแ แแแแฎแแ แชแแแแแแแก แแแ แแแแขแแแแก แซแแแแ. แฃแแแ แขแแแแกแ แแแ แแฅแแแแ แ แแแแ แกแแฎแแก แแแ แแแแแฌแงแแแขแแก แแแแแ, แ แแแแแแแแแช, แ แแแแ แช แแฃแก แแแแแฃแกแแ, แจแแซแแแแ แฉแแแแ แแแฅแแแแแแก แแแแแแแแก แแ แแแแแ แกแแฅแแแก แแแแฎแแแแแก แกแแแแแแแแแแแก แชแแแแฃแ แแกแแแแก.
แแแแ แแ แแก แแ แแ แแก แกแแแแขแแ แแกแ, แแ แแแแจแ แแแ แแแแแแ แ แแแแแฌแแแแ แแ แแแ แ แแแ แแแแแแแฎแ แแ แแแแขแแ แแแแแฌแงแ แแแ แขแแฅแแแแแแแแแแกแ แแ แแแแแแ แฃแ แแแแ แแแแแก แแแแแแแแแก แจแแกแฌแแแแ.
แแแแแแ C#.Net-แแ แกแขแแขแแแแแกแ แแ แแแแฃแแแแขแแชแแแก แแแฎแแแ แแแแฌแงแ. แแฅ แแแแแแ แแแแแแแแแก แจแแกแ แฃแแแแแก แกแฎแแแแแกแฎแแ แแแ. แฅแกแแแแแ แฃแ แแแแ แแฅแแแแแแแก แแ แแแแแ แแแฅแแแแแแ แแ แกแแแแแก, แกแ แฃแแคแแกแแแแแ แแแแแฌแงแแแขแแแแแแแแแแ, แ แแแแ แแชแแ ASP.Net แแ Azure แกแแ แแแกแแแ, TcpHttp แแแแจแแ แแแแแ แแแ แแแแแ แ แฃแ แแแแ แแฅแแแแแแแแแ.
ASP-แแแ แแแ แแแแ แแชแแแแแแแก แจแแแแแ, แแ แแแจแแแแ แแแแแฃแฅแแ, แฉแแแ แแแ แแ, แซแแแแแ แ แแฃแแ แแแแแฌแงแแแขแแแแแ แแงแ แฉแแแแ แกแแ แแแกแแกแแแแก. แฉแแแ แแ แแแแแแแงแแแแแ แแ แแแแขแคแแ แแแก แจแแกแแซแแแแแแแแแแก แแแกแแแแแกแแช, แแแแขแแ แแแแแแ แซแแแ แซแแแแ. แแ แฉแแแแแ แแแฉแแแ TCP แแ Http แแแแแแข-แกแแ แแแ แก แจแแ แแก. แแฅ, แฐแแแ แแแ, แฌแแแแฌแงแแ แกแขแแขแแแก , แแฌแงแแแแแ แแ แแแแแชแแแก แจแแแแแ, แแแแแแฌแงแแแขแ แคแแแฃแกแแ แแแ แแแแแแแแแแแแ TCP แแแแจแแ แแแแแ แฃแ แแแแ แแฅแแแแแแแแ, แ แแขแแแฆแแช แแคแแฅแ แแแแ, แ แแ http แแ แแแแชแแแแ แแ แแก-แแแแขแคแแ แแฃแแ แแแแแฌแงแแแขแแก แจแแฅแแแแก แกแแจแฃแแแแแแก.
แกแแ แแแ แแก แแแ แแแแ แแแ แกแแ แแแแชแแแแ แแแแจแแ แแแแก แแแ แแแแก, แแแ แแแแ แแแก แกแขแแขแแแฃแ แ แจแแแแแ แกแแก แแแแกแแฎแฃแ แแแแก แแ แแแแฎแแแ แแแแแก แแแแแชแแแแ แแแแแก แฉแแแแแแ. แแ แแแแฌแงแแแแแแแแก แแแแแแฌแงแแแขแ แแแแจแแแ แคแฃแแฅแชแแแแแแ แกแแแขแแแ แแฃแจแแแแแกแแแแก, แ แแแ แแแแแแแแแแแ แจแแแแซแแแก แแฅ แแแแแแแแจแแ แ แแแแแแแชแแแก แแแแฃแจแแแแแ แแแแ แแแแแ แแ ios-แแ.
แแฅ แแ แแก แ แแแแแแแแ แแแแ
แซแแ แแแแแ แแแแ, แ แแแแแแช แแฆแแแก แแแแแแขแแแก แแแฃแแแแแแแ แชแแแแจแ:
using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;
namespace ClearServer
{
class Server
{
TcpListener Listener;
public Server(int Port)
{
Listener = new TcpListener(IPAddress.Any, Port);
Listener.Start();
while (true)
{
TcpClient Client = Listener.AcceptTcpClient();
Thread Thread = new Thread(new ParameterizedThreadStart(ClientThread));
Thread.Start(Client);
}
}
static void ClientThread(Object StateInfo)
{
new Client((TcpClient)StateInfo);
}
~Server()
{
if (Listener != null)
{
Listener.Stop();
}
}
static void Main(string[] args)
{
DatabaseWorker sqlBase = DatabaseWorker.GetInstance;
new Server(80);
}
}
}แแแแแ แแแแแแขแแก แแแแแฃแจแแแแแแแ:
using System; using System.IO; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; namespace ClearServer { class Client { public Client(TcpClient Client) { string Message = ""; byte[] Buffer = new byte[1024]; int Count; while ((Count = Client.GetStream().Read(Buffer, 0, Buffer.Length)) > 0) { Message += Encoding.UTF8.GetString(Buffer, 0, Count); if (Message.IndexOf("rnrn") >= 0 || Message.Length > 4096) { Console.WriteLine(Message); break; } } Match ReqMatch = Regex.Match(Message, @"^w+s+([^s?]+)[^s]*s+HTTP/.*|"); if (ReqMatch == Match.Empty) { ErrorWorker.SendError(Client, 400); return; } string RequestUri = ReqMatch.Groups[1].Value; RequestUri = Uri.UnescapeDataString(RequestUri); if (RequestUri.IndexOf("..") >= 0) { ErrorWorker.SendError(Client, 400); return; } if (RequestUri.EndsWith("/")) { RequestUri += "index.html"; } string FilePath =quot;D:/Web/TestSite{RequestUri}";
if (!File.Exists(FilePath))
{
ErrorWorker.SendError(Client, 404);
return;
}string Extension = RequestUri.Substring(RequestUri.LastIndexOf('.'));
string ContentType = "";
switch (Extension)
{
case ".htm":
case ".html":
ContentType = "text/html";
break;
case ".css":
ContentType = "text/css";
break;
case ".js":
ContentType = "text/javascript";
break;
case ".jpg":
ContentType = "image/jpeg";
break;
case ".jpeg":
case ".png":
case ".gif":
ContentType =quot;image/{Extension.Substring(1)}";
break;
default:
if (Extension.Length > 1)
{
ContentType =quot;application/{Extension.Substring(1)}";
}
else
{
ContentType = "application/unknown";
}
break;
}FileStream FS;
try
{
FS = new FileStream(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (Exception)
{
ErrorWorker.SendError(Client, 500);
return;
}string Headers =
quot;HTTP/1.1 200 OKnContent-Type: {ContentType}nContent-Length: {FS.Length}nn";
byte[] HeadersBuffer = Encoding.ASCII.GetBytes(Headers);
Client.GetStream().Write(HeadersBuffer, 0, HeadersBuffer.Length);while (FS.Position < FS.Length)
{
Count = FS.Read(Buffer, 0, Buffer.Length);
Client.GetStream().Write(Buffer, 0, Count);
}FS.Close();
Client.Close();
}
}
}
แแ แแแ แแแแ แแแแแชแแแแ แแแแ, แ แแแแแแช แแแแแฃแแแ แแแแแแแแ แแ SQL-แแ:using System; using System.Data.Linq; namespace ClearServer { class DatabaseWorker { private static DatabaseWorker instance; public static DatabaseWorker GetInstance { get { if (instance == null) instance = new DatabaseWorker(); return instance; } } private DatabaseWorker() { string connectionStr = databasePath; using (DataContext db = new DataContext(connectionStr)) { Table<User> users = db.GetTable<User>(); foreach (var item in users) { Console.WriteLine(quot;{item.login} {item.password}");
}
}
}
}
}
แ แแแแ แช แฎแแแแแ, แแก แแแ แกแแ แชแแขแแแ แแแแกแฎแแแแแแแ แกแขแแขแแแกแแแ. แคแแฅแขแแแ แแแแ, แแฅ แแแแแแขแ แแฎแแแแ แแแแ แแแแแก แฉแแขแแแ แแแ แแแแแแฃแขแแ แแก แกแแฅแแฆแแแแแแแ แแ แแแแแชแแแแ แแแแแจแ (แ แแช, แกแฎแแแแ แจแแ แแก, แแ แแแ แกแแแจแ แแ แแฃแจแแแแแ, แแ แแกแฌแแ แ แแแแจแแ แแก แแ แฅแแขแแฅแขแฃแ แแก แแแแ).แแแแ 2
แกแแ แแแ แแก แขแแกแขแแ แแแแก แจแแแแแ แแแแแแ แแแกแแแแแแแ, แ แแ แแก แจแแกแแแแจแแแแ แแแแแกแแแแแ แแฅแแแแแแ (แกแแแแแแ แ: แแ แ), แฉแแแแ แกแแ แแแกแแกแแแแก, แแกแ แ แแ, แแ แแแฅแขแแ แแแแฌแงแ แแแแแแแก แจแแซแแแ.
แแขแแแแแ แแแแ, แแฎแแแ แแแแฃแแแแ แแแแแฉแแแ แแ แกแแ แแแ แแก แคแฃแแฅแชแแแแแแ แแแคแแ แแแแแ. แกแแ แแแ แแ แจแแแซแแแ แกแแขแแกแขแ แแแแแแ แแ ssl แแแแจแแ แแก แแแจแแคแแ แ.แชแแขแ แแแขแ แแแแ, แ แแแแแแช แแฆแฌแแ แก แกแแ แแแ แแก แแแแแแแก แแ แแแแแแขแแแแก แแแแฃแจแแแแแแก
แกแแ แแแ แแก แแแแแฎแแแแฃแแ แแแ แกแแ, แกแแ แขแแคแแแแขแแก แแแแแงแแแแแแก แฉแแแแแแ.using System; using System.Net; using System.Net.Sockets; using System.Reflection; using System.Security; using System.Security.Cryptography.X509Certificates; using System.Security.Permissions; using System.Security.Policy; using System.Threading; namespace ClearServer { sealed class Server { readonly bool ServerRunning = true; readonly TcpListener sslListner; public static X509Certificate serverCertificate = null; Server() { serverCertificate = X509Certificate.CreateFromSignedFile(@"C:sslitinder.online.crt"); sslListner = new TcpListener(IPAddress.Any, 443); sslListner.Start(); Console.WriteLine("Starting server.." + serverCertificate.Subject + "n" + Assembly.GetExecutingAssembly().Location); while (ServerRunning) { TcpClient SslClient = sslListner.AcceptTcpClient(); Thread SslThread = new Thread(new ParameterizedThreadStart(ClientThread)); SslThread.Start(SslClient); } } static void ClientThread(Object StateInfo) { new Client((TcpClient)StateInfo); } ~Server() { if (sslListner != null) { sslListner.Stop(); } } public static void Main(string[] args) { if (AppDomain.CurrentDomain.IsDefaultAppDomain()) { Console.WriteLine("Switching another domain"); new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase }; var current = AppDomain.CurrentDomain; var strongNames = new StrongName[0]; var domain = AppDomain.CreateDomain( "ClearServer", null, current.SetupInformation, new PermissionSet(PermissionState.Unrestricted), strongNames); domain.ExecuteAssembly(Assembly.GetExecutingAssembly().Location); } new Server(); } } }แแกแแแ แแฎแแแ แแแแแแขแแก แแแแแฃแจแแแแแแแ แแแขแแ แแแแชแแ ssl-แแก แกแแจแฃแแแแแแ:
using ClearServer.Core.Requester; using System; using System.Net.Security; using System.Net.Sockets; namespace ClearServer { public class Client { public Client(TcpClient Client) { SslStream SSlClientStream = new SslStream(Client.GetStream(), false); try { SSlClientStream.AuthenticateAsServer(Server.serverCertificate, clientCertificateRequired: false, checkCertificateRevocation: true); } catch (Exception e) { Console.WriteLine( "---------------------------------------------------------------------n" +quot;|{DateTime.Now:g}n|------------n|{Client.Client.RemoteEndPoint}n|------------n|Exception: {e.Message}n|------------n|Authentication failed - closing the connection.n" +
"---------------------------------------------------------------------n");
SSlClientStream.Close();
Client.Close();
}
new RequestContext(SSlClientStream, Client);
}}
}
แแแแ แแ แ แแแแแ แกแแ แแแ แ แแฃแจแแแแก แแฅแกแแแฃแแแฃแ แแ TCP แแแแจแแ แแ, แแฃแชแแแแแแแแ แแแแฃแแแก แจแแฅแแแ, แ แแแแแแช แแแแแชแแแแก แแแแฎแแแแแก แแแแขแแฅแกแขแก. แแ แแแแแแฌแงแแแขแ, แ แแ แแฅ แจแแกแแคแแ แแกแแ แแแ แกแแ แ, แ แแแแแแช แแแงแแคแก แแแแแแขแแก แแแแฎแแแแแก แชแแแแแฃแ แแแฌแแแแแแ, แ แแแแแแแแแแช แจแแแแซแแแ แฃแ แแแแ แแฅแแแแแแ, แ แแแ แแแแแแขแก แแแแชแ แกแแญแแ แ แแแกแฃแฎแแแ.แแแ แกแแ แ
using ClearServer.Core.UserController; using ReServer.Core.Classes; using System; using System.Collections.Generic; using System.Linq; using System.Net.Security; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; namespace ClearServer.Core.Requester { public class RequestContext { public string Message = ""; private readonly byte[] buffer = new byte[1024]; public string RequestMethod; public string RequestUrl; public User RequestProfile; public User CurrentUser = null; public List<RequestValues> HeadersValues; public List<RequestValues> FormValues; private TcpClient TcpClient; private event Action<SslStream, RequestContext> OnRead = RequestHandler.OnHandle; DatabaseWorker databaseWorker = new DatabaseWorker(); public RequestContext(SslStream ClientStream, TcpClient Client) { this.TcpClient = Client; try { ClientStream.BeginRead(buffer, 0, buffer.Length, ClientRead, ClientStream); } catch { return; } } private void ClientRead(IAsyncResult ar) { SslStream ClientStream = (SslStream)ar.AsyncState; if (ar.IsCompleted) { Message = Encoding.UTF8.GetString(buffer); Message = Uri.UnescapeDataString(Message); Console.WriteLine(quot;n{DateTime.Now:g} Client IP:{TcpClient.Client.RemoteEndPoint}n{Message}");
RequestParse();
HeadersValues = HeaderValues();
FormValues = ContentValues();
UserParse();
ProfileParse();
OnRead?.Invoke(ClientStream, this);
}
}private void RequestParse()
{
Match methodParse = Regex.Match(Message, @"(^w+)s+([^s?]+)[^s]*s+HTTP/.*|");
RequestMethod = methodParse.Groups[1].Value.Trim();
RequestUrl = methodParse.Groups[2].Value.Trim();
}
private void UserParse()
{
string cookie;
try
{
if (HeadersValues.Any(x => x.Name.Contains("Cookie")))
{
cookie = HeadersValues.FirstOrDefault(x => x.Name.Contains("Cookie")).Value;
try
{
CurrentUser = databaseWorker.CookieValidate(cookie);
}
catch { }
}
}
catch { }}
private List<RequestValues> HeaderValues()
{
var values = new List<RequestValues>();
var parse = Regex.Matches(Message, @"(.*?): (.*?)n");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim()
});
}
return values;
}private void ProfileParse()
{
if (RequestUrl.Contains("@"))
{
RequestProfile = databaseWorker.FindUser(RequestUrl.Substring(2));
RequestUrl = "/profile";
}
}
private List<RequestValues> ContentValues()
{
var values = new List<RequestValues>();
var output = Message.Trim('n').Split().Last();
var parse = Regex.Matches(output, @"([^&].*?)=([^&]*b)");
foreach (Match match in parse)
{
values.Add(new RequestValues()
{
Name = match.Groups[1].Value.Trim(),
Value = match.Groups[2].Value.Trim().Replace('+', ' ')
});
}
return values;
}
}
}
แแแกแ แแ แกแ แแแแแแแ แแแแก แแแแจแ, แ แแ แ แแแฃแแแ แฃแแ แแแแแแแแฅแแแแแแแก แแแฎแแแ แแแแ แแแแฎแแแแแก แแแฌแแแแแแ แแแงแแคแ. แแแแแแขแแกแแแ แแแฆแแแ แจแแขแงแแแแแแแแก, แแแ แฉแแแ แแแ แแแ แกแขแ แแฅแแแก, แ แแแแแแช แจแแแชแแแก แแแแแแก แแ แแแแฎแแแแแก url-แก. แจแแแแแ แฉแแแ แแแแแฎแฃแแแแ แกแแแแฃแ แแแก, แ แแแแแแกแแช แแแขแแ แแแ แแแกแแแแก แคแแ แแแจแ HeaderName = Content แแ แแกแแแ แแแแฃแแแแ, แแกแแแแก แแ แกแแแแแแก แจแแแแฎแแแแแจแ, แแแแแฎแแแ แจแแแแแ แกแก (แแแแแแแแแ, querystring), แ แแแแแกแแช แแกแแแ แแแขแแ แแแ แแกแแแแก แแแกแแแจแ. แแแ แแ แแแแกแ, แแแ แกแแ แ แแฆแแแแฉแแแก, แแ แแก แแฃ แแ แ แแแแแแแแแแแ แแแแแแขแ แแแขแแ แแแแแฃแแ แแ แแแแฎแแแก แแแก แแแแแชแแแแแก. แแแขแแ แแแแแฃแแ แแแแแแขแแแแก แงแแแแ แแแแฎแแแแ แจแแแชแแแก แแแขแแ แแแแชแแแก แฐแแจแก, แ แแแแแแช แแแแฎแแแ แฅแฃแฅแ-แคแแแแแแแแจแ, แ แแก แฌแงแแแแแแแแช แจแแกแแซแแแแแแแ แจแแแแแแแ แกแแแฃแจแแ แแแแแแแก แแแแแงแแคแ แแ แ แขแแแแก แแแแแแขแแกแแแแก แแ แกแฌแแ แ แแแกแฃแฎแแก แแแชแแแ.แแกแ, แแแขแแ แ, แแแแแแ แคแฃแแฅแชแแ, แ แแแแแแช แฃแแแ แแแแแแแแแก แชแแแแแฃแ แแแแฃแแจแ แแ แแแแแแแแแแก แแแแฎแแแแแแ, แ แแแแ แแชแแ "site.com/@UserName" แแแแแแแฃแ แแ แแแแแ แแ แแแฃแ แแแแฎแแแ แแแแแก แแแแ แแแแแ. แแแแฎแแแแแก แแแแฃแจแแแแแแก แจแแแแแ แแแแฅแแแแแแแ แจแแแแแแ แแแแฃแแแแ.
แแแแ 3. แกแแฎแแแฃแ แแก แแแงแแแแแ, แฏแแญแแแก แจแแแแแแ
แ แแแแ แช แแ แแแ แกแแ แ แแแแกแ แฃแแแแก, แแแแแจแจแ แจแแแแก แแแแแฃแจแแแแแแแ, แ แแแแแแช แแแแแขแแแแ แแแแแแแแแแก แแซแแแแก แกแแ แแแ แก แแ แงแแคแก แแแแขแ แแแก แแ แแแฌแแแแ.
แแแ แขแแแ แแแแแฃแจแแแแแแแ
using ClearServer.Core.UserController; using System.Net.Security; namespace ClearServer.Core.Requester { public class RequestHandler { public static void OnHandle(SslStream ClientStream, RequestContext context) { if (context.CurrentUser != null) { new AuthUserController(ClientStream, context); } else { new NonAuthUserController(ClientStream, context); }; } } }แกแแแแแแแแแแจแ, แแแแฎแแแ แแแแแก แแแขแแ แแแแชแแแก แแฎแแแแ แแ แแ แจแแแแฌแแแแแ, แ แแก แจแแแแแแแช แแฌแงแแแ แแแแฎแแแแแก แแแแฃแจแแแแแ.
แแแแแแขแแก แแแแขแ แแแแ แแแ
แแฃ แแแแฎแแแ แแแแแ แแ แแ แแก แแแขแแ แแแแแฃแแ, แแแจแแ แแแกแแแแก แคแฃแแฅแชแแแแแ แแแ แแคแฃแซแแแแ แแฎแแแแ แแแแฎแแแ แแแแแก แแ แแคแแแแแแก แฉแแแแแแแก แแ แแแขแแ แแแแชแแแก แ แแแแกแขแ แแชแแแก แคแแแฏแแ แแก. แแแขแแ แแแแแฃแแ แแแแฎแแแ แแแแแก แแแแ แแแแฎแแแแแแ แแ แแแแแ แแ แแแแแแงแฃแ แแแ, แแแแขแแ แแแกแ แแฃแแแแ แแแแก แแแแแแก แแแ แแฎแแแแ.แแ แแแแขแแ แแแแแฃแแ แแแแฎแแแ แแแแแ
using ClearServer.Core.Requester; using System.IO; using System.Net.Security; namespace ClearServer.Core.UserController { internal class NonAuthUserController { private readonly SslStream ClientStream; private readonly RequestContext Context; private readonly WriteController WriteController; private readonly AuthorizationController AuthorizationController; private readonly string ViewPath = "C:/Users/drdre/source/repos/ClearServer/View"; public NonAuthUserController(SslStream clientStream, RequestContext context) { this.ClientStream = clientStream; this.Context = context; this.WriteController = new WriteController(clientStream); this.AuthorizationController = new AuthorizationController(clientStream, context); ResourceLoad(); } void ResourceLoad() { string[] blockextension = new string[] {"cshtml", "html", "htm"}; bool block = false; foreach (var item in blockextension) { if (Context.RequestUrl.Contains(item)) { block = true; break; } } string FilePath = ""; string Header = ""; var RazorController = new RazorController(Context, ClientStream); switch (Context.RequestMethod) { case "GET": switch (Context.RequestUrl) { case "/": FilePath = ViewPath + "/loginForm.html"; Header =quot;HTTP/1.1 200 OKnContent-Type: text/html";
WriteController.DefaultWriter(Header, FilePath);
break;
case "/profile":
RazorController.ProfileLoader(ViewPath);
break;
default:
//ะฒ ะดะฐะฝะฝะพะผ ะฑะปะพะบะต ะบะพะดะฐ ะฟัะพะธัั ะพะดะธั ะพััะตัะตะฝะธะต ะทะฐะฟัะพัะพะฒ ะบ ัะตัะฒะตัั ะฟะพ ะฟััะผะพะผั ะฐะดัะตัั ัััะฐะฝะธัั ะฒะธะดะฐ site.com/page.html
if (!File.Exists(ViewPath + Context.RequestUrl) | block)
{
RazorController.ErrorLoader(404);}
else if (Path.HasExtension(Context.RequestUrl) && File.Exists(ViewPath + Context.RequestUrl))
{
Header = WriteController.ContentType(Context.RequestUrl);
FilePath = ViewPath + Context.RequestUrl;
WriteController.DefaultWriter(Header, FilePath);
}
break;
}
break;case "POST":
AuthorizationController.MethodRecognizer();
break;}
}
}
}
แแ แ แ แแฅแแ แฃแแแ, แแแแฎแแแ แแแแแแ แฃแแแ แแแแฆแแก แแแแ แแแแแก แแแ แแแแฃแแ แจแแแแแ แกแ, แแแแขแแ แแแกแฃแฎแแแแกแแแแก แแ แแก แจแแแแแแ แแแแฃแแ, แ แแแแแแช แแแกแฃแฎแแกแแแแแแแแ แ แแกแฃแ แกแแแแก แแแแฎแแแแแแ แแแกแฃแฎแแก แแแชแแแแแ.WriterController
using System; using System.IO; using System.Net.Security; using System.Text; namespace ClearServer.Core.UserController { public class WriteController { SslStream ClientStream; public WriteController(SslStream ClientStream) { this.ClientStream = ClientStream; } public void DefaultWriter(string Header, string FilePath) { FileStream fileStream; try { fileStream = new FileStream(FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); Header =quot;{Header}nContent-Length: {fileStream.Length}nn";
ClientStream.Write(Encoding.UTF8.GetBytes(Header));
byte[] response = new byte[fileStream.Length];
fileStream.BeginRead(response, 0, response.Length, OnFileRead, response);
}
catch { }
}public string ContentType(string Uri)
{
string extension = Path.GetExtension(Uri);
string Header = "HTTP/1.1 200 OKnContent-Type:";
switch (extension)
{
case ".html":
case ".htm":
returnquot;{Header} text/html";
case ".css":
returnquot;{Header} text/css";
case ".js":
returnquot;{Header} text/javascript";
case ".jpg":
case ".jpeg":
case ".png":
case ".gif":
returnquot;{Header} image/{extension}";
default:
if (extension.Length > 1)
{
returnquot;{Header} application/" + extension.Substring(1);
}
else
{
returnquot;{Header} application/unknown";
}
}
}public void OnFileRead(IAsyncResult ar)
{
if (ar.IsCompleted)
{
var file = (byte[])ar.AsyncState;
ClientStream.BeginWrite(file, 0, file.Length, OnClientSend, null);
}
}public void OnClientSend(IAsyncResult ar)
{
if (ar.IsCompleted)
{
ClientStream.Close();
}
}
}
แแแแ แแ แแแแกแแแแแก, แ แแ แแแแฎแแแ แแแแแก แแฉแแแแแแแแ แแแกแ แแ แแคแแแ แแ แกแฎแแ แแแแฎแแแ แแแแแแแก แแ แแคแแแแแ, แแแแแแฌแงแแแขแ แแแแแแแงแแแแแแแ RazorEngine, แฃแคแ แ แกแฌแแ แแ แแแกแ แแแฌแแแ. แแก แแกแแแ แแแแชแแแก แชแฃแแ แแแแฎแแแแแแแก แแแแฃแจแแแแแแก แแ แจแแกแแแแแแกแ แจแแชแแแแแก แแแแแก แแแชแแแแก.RazorController
using ClearServer.Core.Requester; using RazorEngine; using RazorEngine.Templating; using System; using System.IO; using System.Net; using System.Net.Security; namespace ClearServer.Core.UserController { internal class RazorController { private RequestContext Context; private SslStream ClientStream; dynamic PageContent; public RazorController(RequestContext context, SslStream clientStream) { this.Context = context; this.ClientStream = clientStream; } public void ProfileLoader(string ViewPath) { string Filepath = ViewPath + "/profile.cshtml"; if (Context.RequestProfile != null) { if (Context.CurrentUser != null && Context.RequestProfile.login == Context.CurrentUser.login) { try { PageContent = new { isAuth = true, Name = Context.CurrentUser.name, Login = Context.CurrentUser.login, Skills = Context.CurrentUser.skills }; ClientSend(Filepath, Context.CurrentUser.login); } catch (Exception e) { Console.WriteLine(e); } } else { try { PageContent = new { isAuth = false, Name = Context.RequestProfile.name, Login = Context.RequestProfile.login, Skills = Context.RequestProfile.skills }; ClientSend(Filepath, "PublicProfile:"+ Context.RequestProfile.login); } catch (Exception e) { Console.WriteLine(e); } } } else { ErrorLoader(404); } } public void ErrorLoader(int Code) { try { PageContent = new { ErrorCode = Code, Message = ((HttpStatusCode)Code).ToString() }; string ErrorPage = "C:/Users/drdre/source/repos/ClearServer/View/Errors/ErrorPage.cshtml"; ClientSend(ErrorPage, Code.ToString()); } catch { } } private void ClientSend(string FilePath, string Key) { var template = File.ReadAllText(FilePath); var result = Engine.Razor.RunCompile(template, Key, null, (object)PageContent); byte[] buffer = System.Text.Encoding.UTF8.GetBytes(result); ClientStream.BeginWrite(buffer, 0, buffer.Length, OnClientSend, ClientStream); } private void OnClientSend(IAsyncResult ar) { if (ar.IsCompleted) { ClientStream.Close(); } } } }แแ แ แ แแฅแแ แฃแแแ, แแแแกแแแแแก, แ แแ แแแขแแ แแแแแฃแแ แแแแฎแแแ แแแแแแแก แแแแแแแฌแแแแแ แแแฃแจแแแก, แกแแญแแ แแ แแแขแแ แแแแชแแ. แแแขแแ แแแแชแแแก แแแแฃแแ แฃแ แแแแ แแฅแแแแแแก แแแแแชแแแแ แแแแแกแแแ. แกแแแขแแ แแ แกแแแฃแแ แคแแ แแแแแแแ แแแฆแแแฃแแ แแแแแชแแแแแ แแแแแแแแแแ แแแแขแแฅแกแขแแแแ, แแแแฎแแแ แแแแแ แแแแฎแแแ แแ แกแแแแชแแแแ แแฆแแแก แฅแฃแฅแ-แคแแแแแแก แแ แกแแ แแแกแแ แฌแแแแแแก.
แแแขแแ แแแแชแแแก แแแแฃแแ
using ClearServer.Core.Cookies; using ClearServer.Core.Requester; using ClearServer.Core.Security; using System; using System.Linq; using System.Net.Security; using System.Text; namespace ClearServer.Core.UserController { internal class AuthorizationController { private SslStream ClientStream; private RequestContext Context; private UserCookies cookies; private WriteController WriteController; DatabaseWorker DatabaseWorker; RazorController RazorController; PasswordHasher PasswordHasher; public AuthorizationController(SslStream clientStream, RequestContext context) { ClientStream = clientStream; Context = context; DatabaseWorker = new DatabaseWorker(); WriteController = new WriteController(ClientStream); RazorController = new RazorController(context, clientStream); PasswordHasher = new PasswordHasher(); } internal void MethodRecognizer() { if (Context.FormValues.Count == 2 && Context.FormValues.Any(x => x.Name == "password")) Authorize(); else if (Context.FormValues.Count == 3 && Context.FormValues.Any(x => x.Name == "regPass")) Registration(); else { RazorController.ErrorLoader(401); } } private void Authorize() { var values = Context.FormValues; var user = new User() { login = values[0].Value, password = PasswordHasher.PasswordHash(values[1].Value) }; user = DatabaseWorker.UserAuth(user); if (user != null) { cookies = new UserCookies(user.login, user.password); user.cookie = cookies.AuthCookie; DatabaseWorker.UserUpdate(user); var response = Encoding.UTF8.GetBytes(quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {cookies.AuthCookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);}
else
{
RazorController.ErrorLoader(401);}
}private void Registration()
{
var values = Context.FormValues;
var user = new User()
{
name = values[0].Value,
login = values[1].Value,
password = PasswordHasher.PasswordHash(values[2].Value),
};
cookies = new UserCookies(user.login, user.password);
user.cookie = cookies.AuthCookie;
if (DatabaseWorker.LoginValidate(user.login))
{
Console.WriteLine("User ready");
Console.WriteLine(quot;{user.password} {user.password.Trim().Length}");
DatabaseWorker.UserRegister(user);
var response = Encoding.UTF8.GetBytes(quot;HTTP/1.1 301 Moved PermanentlynLocation: /@{user.login}nSet-Cookie: {user.cookie}; Expires={DateTime.Now.AddDays(2):R}; Secure; HttpOnlynn");
ClientStream.BeginWrite(response, 0, response.Length, WriteController.OnClientSend, null);
}
else
{
RazorController.ErrorLoader(401);
}
}
}
}
แแ แแแแแชแแแแ แแแแ แแกแ แแแแแแงแฃแ แแแ:แฒแแแแชแแแแ แแแแ
using ClearServer.Core.UserController; using System; using System.Data.Linq; using System.Linq; namespace ClearServer { class DatabaseWorker { private readonly Table<User> users = null; private readonly DataContext DataBase = null; private const string connectionStr = @"ะฟัััะบะฑะฐะทะต"; public DatabaseWorker() { DataBase = new DataContext(connectionStr); users = DataBase.GetTable<User>(); } public User UserAuth(User User) { try { var user = users.SingleOrDefault(t => t.login.ToLower() == User.login.ToLower() && t.password == User.password); if (user != null) return user; else return null; } catch (Exception) { return null; } } public void UserRegister(User user) { try { users.InsertOnSubmit(user); DataBase.SubmitChanges(); Console.WriteLine(quot;User{user.name} with id {user.uid} added");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}}
public bool LoginValidate(string login)
{
if (users.Any(x => x.login.ToLower() == login.ToLower()))
{
Console.WriteLine("Login already exists");
return false;
}
return true;
}
public void UserUpdate(User user)
{
var UserToUpdate = users.FirstOrDefault(x => x.uid == user.uid);
UserToUpdate = user;
DataBase.SubmitChanges();
Console.WriteLine(quot;User {UserToUpdate.name} with id {UserToUpdate.uid} updated");
foreach (var item in users)
{
Console.WriteLine(item.login + "n");
}
}
public User CookieValidate(string CookieInput)
{
User user = null;
try
{
user = users.SingleOrDefault(x => x.cookie == CookieInput);
}
catch
{
return null;
}
if (user != null) return user;
else return null;
}
public User FindUser(string login)
{
User user = null;
try
{
user = users.Single(x => x.login.ToLower() == login.ToLower());
if (user != null)
{
return user;
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
}
}
แแ แงแแแแแคแแ แ แแฃแจแแแแก, แ แแแแ แช แกแแแแแก แแแฅแแแแแแ, แแแขแแ แแแแชแแ แแ แกแแ แแแแกแขแ แแชแแ แกแแแฃแจแแแแแ, แกแแ แแแกแแ แฌแแแแแแก แแแแแแแแฃแ แ แคแฃแแฅแชแแแแแ แแแ แฃแแแ แฎแแแแแกแแฌแแแแแแ แแ แแ แแ แแแฌแแ แแ แแแแแแแชแแ แแ แจแแแแแ แแแ แงแแแแแคแแ แ แซแแ แแแแแ แคแฃแแฅแชแแแแแ, แ แแกแแแแกแแช แงแแแแแคแแ แ แแแแแแแ.แแแแ 4
แแ แแแแขแคแแ แแแแ แแ แ แแแแแแแชแแแก แแแฌแแ แแก แจแ แแแแก แฎแแ แฏแแแแก แจแแกแแแชแแ แแแแแ แแแแแแฌแงแแแขแ แจแแแแฅแแแ แแ แแก-แแแแขแคแแ แแ Xamarin.Forms-แแ. แแแแแ แแ แแฎแแ, แแแแก แฌแงแแแแแแ, แ แแ แแก แแ แแก C#-แจแ. แจแแแฅแแแแ แกแแขแแกแขแ แแแแแแแชแแ, แ แแแแแแช แฃแแ แแแแ แแแแแแแแก แแแแแชแแแแแก แกแแ แแแ แแ, แแ แ แกแแแแขแแ แแกแ แแแแแแขแจแ แฌแแแแแ. แแแฌแงแแแแแแแแก แแแแฎแแแแแกแแแแก, แแแกแแ แแแแแ, แแแแแงแแแ แแก HttpClient-แแ แแ แแแแแแงแแ แ แกแแ แแแ แแ HttpRequestMessage, แ แแแแแแช แจแแแชแแแก แแแแแชแแแแแก แแแขแแ แแแแชแแแก แคแแ แแแแแ json แคแแ แแแขแจแ. แแแแแ แแขแฃแแก แแ แแคแ แแก แแแแแแแแแก แแแ แแจแ แแแแฎแกแแแ แกแแ แแแ แแก แแฃแ แแแแ แแ แแแแฎแ แแฎแแแแ แแแฌแงแแแแแแแแแแ แงแแแแ แแแแแชแแแแ. แแกแฃแแฃแฅแ แกแแกแฃแแแแ, แชแแแแแแ แแแ แงแแแแแคแ แแก แจแแกแแฎแแ, แ แแช แแแแแแแ แแแแ 3 แแแแ แแก แแแแแแแแแแแจแ แแแฆแแแแ แกแแฆแแแแก แแแแแแแแแแแจแ. แแแแแแแแแแ แแแแแชแแแแแแก แกแแกแฌแแ แแก แจแแกแแแแฌแแแแแแ แแ แจแแแแ แแแ แกแแขแแกแขแ แกแแ แแแ แ HttpListner-แแ. แแแก แจแแแแแ แ แแช แแแแแฆแ แจแแแแแแ แแแแฎแแแแ แแแกแแ, แแ แแแแจแแแ แแก แแแแแก แ แแแแแแแแ แกแขแ แแฅแแแจแ, แแแแแฆแ KeyValuePair แแแแแชแแแแแ แคแแ แแแแแ. แจแแแแแฎแแแก แแแแแแแ แจแแแชแแ แแ แแ แฎแแแแแแ.
แแแแแฌแงแ แจแแแแแแแ แขแแกแขแแ แแแ, แแก แแแ แ แแ แแงแ แแแฎแกแแแแแ, แแแแ แแ แฌแแแ แกแแ แแแ แแ แแแแแช แแแแแงแแแ แแแแกแแแแขแแแแ แแแแแฃแแ แฉแแขแ. แแก แกแแแแแแ แแแ แแแ แแฃแจแแแแแ, แแแแ แแ Tcp-แแก แกแแจแฃแแแแแแ แฃแ แแแแ แแฅแแแแแแแก แแ แแแชแแแ แแแแแ แแฃแแแแแ แแงแ, แแแแแแขแ แแแแแแขแ แแงแ แกแแญแแ แ แแแแกแแแแแก, แ แแ แกแฌแแ แแ แแแแแฃแแแงแ แแ แ แแแแฎแแแ แแแแแก แฃแ แแแแ แแฅแแแแแแ แแแ แแกแแแแแแแชแแแก แแฆแ แแชแฎแแแกแแแ แแ แแแ. แแก แแแแชแแแก แแแแจแแ แแก แแแแแ แแแแก แแแแฎแแแแแก แแแแแแแก แแ แแแกแฃแฎแแก แจแแแ แแแแแแก RFC 6455 แแ แแขแแแแแแก แแแแแงแแแแแแ. แแแแขแแ, แกแแขแแกแขแ แกแแ แแแ แแ แแแแแแฌแงแแแขแ แจแแแแฅแแแ แแแ แขแแแ แแแแกแแแแขแแก แแแแจแแ แ. แแฎแแแแ แแแขแแ แแกแแก แแแแ.
แฉแแแแก แแแแจแแ แ
private static async void HandleWebsocket(HttpListenerContext context) { var socketContext = await context.AcceptWebSocketAsync(null); var socket = socketContext.WebSocket; Locker.EnterWriteLock(); try { Clients.Add(socket); } finally { Locker.ExitWriteLock(); } while (true) { var buffer = new ArraySegment<byte>(new byte[1024]); var result = await socket.ReceiveAsync(buffer, CancellationToken.None); var str = Encoding.Default.GetString(buffer); Console.WriteLine(str); for (int i = 0; i < Clients.Count; i++) { WebSocket client = Clients[i]; try { if (client.State == WebSocketState.Open) { await client.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } } catch (ObjectDisposedException) { Locker.EnterWriteLock(); try { Clients.Remove(client); i--; } finally { Locker.ExitWriteLock(); } } } } }แแ แแแฃแจแแแ. แกแแ แแแ แแ แแแแแ แแแแงแแแ แแแแจแแ แ, แจแแฅแแแ แแแกแฃแฎแแก แแแกแแฆแแแ. แแ แแ แแ แแแแแฌแแ แชแแแแ แกแแ แแแ แแก แ แแแแกแขแ แแชแแแก แแแแคแแแฃแ แแชแแ ssl-แแก แกแแจแฃแแแแแแ, แกแแแแแ แแกแแ แกแแกแขแแแแก แฃแแแ แแแงแแแแแฃแแ แฐแฅแแแแแก แกแแ แแแคแแแแขแ แกแแญแแ แ แแแ แขแแ.
แแแฌแงแแแแแแแแก แแฎแแ แแก แแ แกแแแขแแก แแฎแแ แแก, แแ แแ แแแแแแขแแ แแแชแแแแ แจแแขแงแแแแแแแแแ, แแก แงแแแแแคแแ แ แแงแ แฉแแฌแแ แแแ. แแ แแ แแก แฃแแแ แแแแแ แ แแแ แกแแ แ, แ แแแแแแช แแแแแแแก แกแแ แแแ แก, แแ แชแแ แแ แแก แแ แแงแ แกแแญแแ แ. แ แแแแแ แแแแก แแ แ 200 ms-แแแ 40-30ms-แแแ แจแแแชแแ แแ. แแ แแ แแแแแแ แแ แแแแแ แ แกแฌแแ แแแแแฌแงแแแขแแแแแแแแ.
แแแแแงแแ แแ แกแแ แแแ แแก แแแแแแแแ แ แแแแฎแแ แชแแแแแแ Tcp-แแ แแ แแแแแฌแแ แแ แงแแแแแคแแ แ Http-แแก แฅแแแจ. แแฎแแ แแ แแแฅแขแ แ แแแแแแแแแก แแขแแแแแ, แแแแ แแ แฃแ แแแแ แแฅแแแแแแแก แกแ แฃแแแแ แแแแกแฎแแแแแแฃแแ แแ แแแชแแแแแแก แแแฎแแแแแ. แแแฌแงแแแแแแแแแแกแ แแ แกแแแขแแก แแฃแจแแแแ แกแแแฅแ แแแแแแแฃแแแ แแ แแแแแ แแฃแแแ แแ แแฅแแก แกแแแ แแ แแแแชแแคแชแแ, แแ แแแแแ แแ แแแแกแฎแแแแแแแ, แ แแ แแแฌแงแแแแแแแแแก แแ แกแญแแ แแแแแ html แแแแ แแแแแก แแแแแ แแ แแแ.
แแแแแงแแแแแก
"แคแแ แแก แ แแ แแ แแชแแแ, แแแแ แฌแงแแแจแ แแ แฉแแแแ" แแคแแฅแ แแ, แแฃแจแแแแแก แแแฌแงแแแแแแ แฃแคแ แ แแแแคแแแ แฃแแแ แแแแแกแแแฆแแ แ แแแแแแแ แแ แแแแชแแแแแ, แแกแแแ แฉแแแฃแฆแ แแแแแ แกแฎแแแแแกแฎแแ แแแแแแขแแแแ แแแแ แแแแแ แแแแก แกแแญแแ แ แขแแฅแแแแแแแแแแกแ แแ แแแแแแแแแก แจแแกแฌแแแแแก. แแ แแแฅแขแ แฃแแแ แแแกแแกแ แฃแแก แฃแแฎแแแแแแแ, แแแแ แแ แแฅแแแ แแแแแ แฃแแแ แแ แแแกแแฃแแ แ แแแแแ, แแฃ แ แแแแ แแแแแคแฃแญแ แแแ แแแแฃแแ แ แแ แแกแแ. แแแแ แ แ แแ แแแกแฌแแแแ แแแแแแแแ แแแแก แแ แแชแแกแจแ, แแแแ แแ แแแแแแแแจแ แแแแแ แแแแ แแ แกแแกแฌแแแแ. แแฃ แแฅแแแแ แฌแแแแแแฎแแ, แแแแแแแ แ แแ แแแแฎแฃแแแแ.
แฌแงแแ แ: www.habr.com

