using System; using System.IO; using System.Diagnostics; using System.Net; using Newtonsoft.Json; using Scriban; using Tesses.WebServer; using WebSocketSharp.Server; using Chatr; using System.Collections.Generic; using System.Linq; using Tesses.Chatr.Server; using System.Threading; using System.Threading.Tasks; using System.Text; public class ChatrApp { public static async Task Init(Arguments arguments,Func getPath,IPEndPoint http,WebSocketServer wssv,Action wsInit=null) { using(var token = new CancellationTokenSource()){ Console.CancelKeyPress +=(sender,e)=>{token.Cancel();}; var template_index = Template.Parse(File.ReadAllText(getPath("index.html"))); var template_user = Template.Parse(File.ReadAllText(getPath("user/index.html"))); var template_qr = Template.Parse(File.ReadAllText(getPath("device-qr/index.html"))); RouteServer svr=new RouteServer(); /*svr.Add("/dem",async(e)=>{ var data= QRCoder.PngByteQRCodeHelper.GetQRCode("Demi Lovato",QRCoder.QRCodeGenerator.ECCLevel.Q,640); await e.SendBytesAsync(data,"image/png"); });*/ svr.Add("/onetimeauth",async(e)=>{ string key; if(e.QueryParams.TryGetFirst("key",out key)) { await e.SendTextAsync($"Login
"); } }); svr.Add("/share",async(e)=>{ e.ParseBody(); StringBuilder b=new StringBuilder(); foreach(var queryParm in e.QueryParams) { foreach(var value in queryParm.Value) { b.AppendLine($"{queryParm.Key}: {value}"); } } await e.SendTextAsync(b.ToString(),"text/plain"); },"POST"); svr.Add("/onetimeauth",async(e)=>{ e.ParseBody(); string key; if(e.QueryParams.TryGetFirst("key",out key)) { string session; if(UserManagement.GetAuthCode(key,out session)) { e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={session}; Path=/"); } await e.SendRedirectAsync("/"); } },"POST"); svr.Add("/api/appconfig.json",async(e)=>{ AppConfig config = new AppConfig(e,arguments); await e.SendJsonAsync(config); }); svr.Add("/api/email",async(e)=>{ try{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { await e.SendTextAsync(res.Account.Email,"text/plain"); return; } } } }catch(Exception ex) { _=ex; } await e.SendTextAsync("[NO ACCOUNT]","text/plain"); }); svr.Add("/api/name",async(e)=>{ try{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { await e.SendTextAsync(res.Account.Name,"text/plain"); return; } } } }catch(Exception ex) { _=ex; } await e.SendTextAsync("[NO ACCOUNT]","text/plain"); }); svr.Add("/api/login2",async(e)=>{ e.ParseBody(); string username; string password; if(e.QueryParams.TryGetFirst("username",out username)) { if(e.QueryParams.TryGetFirst("password",out password)) { var res=UserManagement.Login(username,password,true); if(res.Success) { //Set-Cookie //if(rememberMe) //{ await e.SendTextAsync(res.SessionId,"text/plain"); Console.WriteLine("HI"); //}else{ // e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={res.SessionId}; Path=/"); //} //await e.SendRedirectAsync("/"); }else{ e.StatusCode=401; await e.SendTextAsync("Unauthorized"); //await e.SendRedirectAsync("/err/incorrect-password.html"); //do what you do when You Have Wrong password } } } },"POST"); svr.Add("/api/botmsg",async(e)=>{ e.ParseBody(); //enforce bot permissions e.StatusCode=400; string msg_to; if(!e.QueryParams.TryGetFirst("message_to",out msg_to)) msg_to="me"; string apiKey; if(!e.QueryParams.TryGetFirst("ApiKey",out apiKey)) return; string body; if(!e.QueryParams.TryGetFirst("body",out body)) body="[No Body]"; string destbot; if(!e.QueryParams.TryGetFirst("destbot",out destbot)) destbot=""; bool destIsBot=!string.IsNullOrWhiteSpace(destbot); bool isToMe = msg_to == "me"; var key=UserManagement.AuthenticateApiKey(apiKey); Func getIsNotMe=(b,msg_to_who)=>{ if(msg_to_who == "me") return false; if(DataBase.Accounts ==null) return true; var res=DataBase.Accounts.FindById(UserManagement.GetUserId(msg_to_who)); if(res == null) return true; return res.Id != b.UserId; }; if(key.Success && key.Bot != null) { if(!isToMe && getIsNotMe(key.Bot,msg_to) && key.Bot.Permissions.CanSendMessagesToOtherPeople) { await e.SendTextAsync("Access Denied: Can't Send To Another Person"); return;} if(destIsBot && !key.Bot.Permissions.OthersCanReceiveMessages ) {await e.SendTextAsync("Access Denied: Can't send message to another bot"); return;} Message msg=new Message(); msg.IsFromBot=true; msg.IsToBot = destIsBot; msg.SourceBotId = key.Bot.Id; msg.SourceUserId = key.Bot.UserId; msg.DestinationUserId = isToMe ? key.Bot.UserId : UserManagement.GetUserId(msg_to); if(msg.DestinationUserId == -1) { await e.SendTextAsync("Unknown destination user"); return; } if(msg.IsToBot) { var res=UserManagement.GetBotId(msg.DestinationUserId,destbot); if(res == -1) { await e.SendTextAsync("Unknown destination bot"); return; } msg.DestinationBotId=res; } msg.Content = body; UserManagement.SendMessage(msg); e.StatusCode=200; await e.SendTextAsync("Success"); return; } await e.SendTextAsync("No Source Bot"); },"POST"); svr.Add("/api/msg",async(e)=>{ e.ParseBody(); string msg_to; bool msg_to_me=true; string redirect_to; string body; if(!e.QueryParams.TryGetFirst("body",out body)) body="[No Body]"; if(!e.QueryParams.TryGetFirst("redirect_to",out redirect_to)) redirect_to="/"; long dest_id=-1; if(e.QueryParams.TryGetFirst("message_to",out msg_to)){ if(!string.IsNullOrWhiteSpace(msg_to)) { dest_id=UserManagement.GetUserId(msg_to); if(dest_id>-1) { msg_to_me=false; } } } //long dest_id = /*
*/ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { //from user Message msg=new Message(); msg.IsFromBot=false; msg.IsToBot=false; msg.SourceUserId = res.Account.Id; if(msg_to_me) msg.DestinationUserId=msg.SourceUserId; else msg.DestinationUserId=dest_id; msg.Content=body; UserManagement.SendMessage(msg); await e.SendRedirectAsync(redirect_to);return; } } } if(!msg_to_me) { var account =UserManagement.GetAnonymous(); if(account != null && account.IsCorrectPassword("4209enabled")){ Message msg=new Message(); msg.IsFromBot=false; msg.IsToBot=false; msg.SourceUserId = account.Id; // if(msg_to_me) msg.DestinationUserId=msg.SourceUserId; else msg.DestinationUserId=dest_id; msg.Content=body; UserManagement.SendMessage(msg); } } await e.SendRedirectAsync(redirect_to);return; },"POST"); //send msg from page svr.Add("/api/logout",async(e)=>{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null && res.Session != null) { string session_id=cookie[1]; UserManagement.Logout(session_id); DateTime past=new DateTime(2018,7,24,14,55,00); //some bloke Overdoses on this date e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={session_id}; Path=/; Expires={past.ToString("R")}"); } } await e.SendRedirectAsync("/"); } await e.SendRedirectAsync("/"); }); svr.Add("/apikey",async(e)=>{ //await e.SendRedirectAsync($"/apikey?name={bot.BotUserName}"); string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { string username; if(e.QueryParams.TryGetFirst("name",out username)){ Bot bot; if(DataBase.Bots !=null && (bot=DataBase.Bots.FindOne(ee=>ee.UserId==res.Account.Id && ee.BotUserName==username))!=null) { string key= File.ReadAllText(getPath("apikey/index.html")).Replace("{API_KEY}",bot.ApiKey); await e.SendTextAsync(key); return; } } } } } await e.SendTextAsync("Unauthorized user or no bot with specified username"); }); svr.Add("/user",async(e)=>{ if(DataBase.Accounts ==null) { await e.SendTextAsync("DataBase error: Accounts is null"); return; } Account account=null; string username; if(e.QueryParams.TryGetFirst("name",out username)) { account=DataBase.Accounts.FindOne(ee=>ee.Username==username); } string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { string accountName=res.Account.Name; string accountUserName=res.Account.Username; long accountUserId =res.Account.Id; if(account == null) { account = res.Account; } object logged_in=new{ Name=WebUtility.HtmlEncode(accountName), Url=$"./user?name={WebUtility.UrlEncode(accountUserName)}", Notloggedin=false, Loggedin=true, Uname=account.Username, Loggedinme=account.Id == res.Account.Id, Loggedinnotme=account.Id != res.Account.Id, Othername=WebUtility.HtmlEncode(account.Name), Opt=UserManagement.GetUserOptions(account) }; await e.SendTextAsync(template_user.Render(logged_in)); return; } } } if(account == null) { await e.SendTextAsync("No Account"); return; } await e.SendTextAsync(template_user.Render(new{ Url="./login", Name="Login", Loggedinnotme=false, Loggedinme=false, Loggedin=false, Notloggedin=true, Uname=account.Username, Othername=WebUtility.HtmlEncode(account.Name) })); //await e.SendFileAsync(getPath("user/index.html")); }); svr.Add("/api/create-bot",async(e)=>{ string cookie_txt; e.ParseBody(); if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { string botname; string botuser; string botdesc; if(e.QueryParams.TryGetFirst("botname",out botname)) { if(e.QueryParams.TryGetFirst("botuser",out botuser)) { if(e.QueryParams.TryGetFirst("botdesc",out botdesc)) { if(DataBase.Bots != null && Account.IsValidName(botname) && Account.IsValidUserName(botuser) && Account.IsValidName(botdesc)){ var bot= DataBase.Bots.FindOne(ee=>ee.BotUserName == botuser && res.Account.Id == ee.UserId); if(bot == null) { Bot b=new Bot(); b.UserId= res.Account.Id; b.BotUserName=botuser; b.BotDescription=botdesc; b.BotName = botname; b.ApiKey = Account.GetNewSalt(); b.Permissions.SetPermissionsFromForm(e); DataBase.Bots.Insert(b); await e.SendRedirectAsync($"/apikey?name={b.BotUserName}"); return; }else{ bot.Permissions.SetPermissionsFromForm(e); DataBase.Bots.Update(bot); await e.SendRedirectAsync($"/apikey?name={bot.BotUserName}"); return; } } } } } } } } },"POST"); svr.Add("/create-bot-permissions",async(e)=>{ string cookie_txt; e.ParseBody(); if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { //get botname botuser botdesc string botname; string botuser; string botdesc; if(e.QueryParams.TryGetFirst("botname",out botname)) { if(e.QueryParams.TryGetFirst("botuser",out botuser)) { if(e.QueryParams.TryGetFirst("botdesc",out botdesc)) { if(DataBase.Bots != null){ var bot= DataBase.Bots.FindOne(ee=>ee.BotUserName == botuser && res.Account.Id == ee.UserId); if(bot == null && Account.IsValidName(botname) && Account.IsValidUserName(botuser) && Account.IsValidName(botdesc)) { string page0=File.ReadAllText(getPath("create-bot-permissions/index.html")).Replace("{BOT_DESC}",botdesc).Replace("{BOT_USER}",botuser).Replace("{BOT_NAME}",botname); await e.SendTextAsync(page0); return; } } } } } } } } await e.SendTextAsync("Either your not logged in or post error"); },"POST"); svr.Add("/create-bot",async(e)=>{ await e.SendFileAsync(getPath("create-bot/index.html")); }); svr.Add("/api/user-setting",async(e)=>{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { await e.SendJsonAsync(UserManagement.GetUserOptions(res.Account)); } } } }); svr.Add("/api/user-setting",async(e)=>{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { var opt=UserManagement.GetUserOptions(res.Account); UserManagement.SetUserOptions(opt,e); await e.SendRedirectAsync($"/user?name={res.Account.Username}"); } } } },"POST"); svr.Add("/",async(e)=>{ try{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { var mymsg=new List(); foreach(var msg in UserManagement.GetMessages(res.Account,null,null)) { var msg0=new MyMessage(); msg0.Time=msg.CreationTime.ToString("R"); msg0.Body = WebUtility.HtmlEncode(msg.Content); msg0.Mine=true; mymsg.Add(msg0); } var users = new List(); foreach(var bot in UserManagement.GetMyBots(res.Account)) { var usr=new UserAccount(); usr.Hash = $"me-{bot.BotUserName}"; usr.Text = WebUtility.HtmlEncode($"{bot.BotName} (My Bot)"); foreach(var msg in UserManagement.GetMessages(res.Account,null,bot.BotUserName)) { var msg0 =new MyMessage(); msg0.Time=msg.CreationTime.ToString("R"); msg0.Mine = msg.IsToBot; msg0.Body = WebUtility.HtmlEncode(msg.Content); usr.Messages.Add(msg0); } users.Add(usr); } foreach(var otherUser in UserManagement.GetUserWithMe(res.Account)) { var usr=new UserAccount(); usr.Hash = otherUser.Username; usr.Text = WebUtility.HtmlEncode(otherUser.Name); foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username)) { var msg0=new MyMessage(); msg0.Time=msg.CreationTime.ToString("R"); msg0.Mine = msg.SourceUserId == res.Account.Id; msg0.Body = WebUtility.HtmlEncode(msg.Content); usr.Messages.Add(msg0); } users.Add(usr); foreach(var bot in UserManagement.GetBotsWithMe(res.Account,otherUser)) { var usr0 = new UserAccount(); usr0.Hash = $"{otherUser.Username}-{bot.BotUserName}"; usr0.Text = WebUtility.HtmlDecode($"{bot.BotName} ({otherUser.Name}'s Bot)"); foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username,bot.BotUserName)) { var msg0=new MyMessage(); msg0.Time=msg.CreationTime.ToString("R"); msg0.Mine = msg.SourceUserId == res.Account.Id; msg0.Body = WebUtility.HtmlEncode(msg.Content); usr0.Messages.Add(msg0); } users.Add(usr0); } } string accountName=res.Account.Name; string accountUserName =res.Account.Username; object logged_in=new{ Name=WebUtility.HtmlEncode(accountName), Url=$"./user?name={accountUserName}", Loggedin=true, Mymessages=mymsg, Users=users }; await e.SendTextAsync(template_index.Render(logged_in)); return; } } } }catch (Exception ex){ Console.WriteLine(ex); } await e.SendTextAsync(template_index.Render(new{ Url="./login", Name="Login", Loggedin=false })); }); svr.Add("/api/new-ota.txt",async(e)=>{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { DateTime expire=DateTime.Now.AddYears(1); if(e.QueryParams.TryGetFirst("expires",out cookie_txt)) { long exp; if(long.TryParse(cookie_txt,out exp)) { expire=DateTimeOffset.FromUnixTimeSeconds(exp).DateTime; } } string session=UserManagement.CreateAnotherSession(cookie[1],expire); if(!string.IsNullOrWhiteSpace(session)) { await e.SendTextAsync(UserManagement.CreateOTA(session),"text/plain");return; } // } } } e.StatusCode=401; await e.WriteHeadersAsync(); }); svr.Add("/device-qr",async(e)=>{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { string accountName=res.Account.Name; string accountUserName =res.Account.Username; //string? session=UserManagement.CreateAnotherSession(cookie[1],DateTime.Now.AddYears(1)); /* Console.WriteLine($"{e.Host}#{session}"); */ object logged_in=new{ Name=WebUtility.HtmlEncode(accountName), Url=$"./user?name={WebUtility.UrlEncode(accountUserName)}", Loggedin=true, }; await e.SendTextAsync(template_qr.Render(logged_in)); return; } } } await e.SendTextAsync(template_qr.Render(new{ Url="./login", Name="Login", Loggedin=false })); }); svr.Add("/api/state.json",async(e)=>{ try{ string cookie_txt; if(e.RequestHeaders.TryGetFirst("Cookie",out cookie_txt)) { string[] cookie=cookie_txt.Split(new char[]{'='},2); if(cookie.Length == 2 && !string.IsNullOrWhiteSpace(cookie[0]) && cookie[0].Equals("Chatr-Session") && !string.IsNullOrWhiteSpace(cookie[1])) { var res=UserManagement.Authenticate(cookie[1]); if(res.Success && res.Account != null) { var mymsg=new List(); foreach(var msg in UserManagement.GetMessages(res.Account,null,null)) { var msg0=new MyMessage(); msg0.Body = WebUtility.HtmlEncode(msg.Content); msg0.Mine=true; msg0.Time=msg.CreationTime.ToString("R"); mymsg.Add(msg0); } var users = new List(); foreach(var bot in UserManagement.GetMyBots(res.Account)) { var usr=new UserAccount(); usr.Hash = $"me-{bot.BotUserName}"; usr.Text = WebUtility.HtmlEncode($"{bot.BotName} (My Bot)"); foreach(var msg in UserManagement.GetMessages(res.Account,null,bot.BotUserName)) { var msg0 =new MyMessage(); msg0.Mine = msg.IsToBot; msg0.Body = WebUtility.HtmlEncode(msg.Content); msg0.Time=msg.CreationTime.ToString("R"); usr.Messages.Add(msg0); } users.Add(usr); } foreach(var otherUser in UserManagement.GetUserWithMe(res.Account)) { var usr=new UserAccount(); usr.Hash = otherUser.Username; usr.Text = WebUtility.HtmlEncode(otherUser.Name); foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username)) { var msg0=new MyMessage(); msg0.Mine = msg.SourceUserId == res.Account.Id; msg0.Body = WebUtility.HtmlEncode(msg.Content); msg0.Time=msg.CreationTime.ToString("R"); usr.Messages.Add(msg0); } users.Add(usr); foreach(var bot in UserManagement.GetBotsWithMe(res.Account,otherUser)) { var usr0 = new UserAccount(); usr0.Hash = $"{otherUser.Username}-{bot.BotUserName}"; usr0.Text = WebUtility.HtmlDecode($"{bot.BotName} ({otherUser.Name}'s Bot)"); foreach(var msg in UserManagement.GetMessages(res.Account,otherUser.Username,bot.BotUserName)) { var msg0=new MyMessage(); msg0.Mine = msg.SourceUserId == res.Account.Id; msg0.Body = WebUtility.HtmlEncode(msg.Content); msg0.Time=msg.CreationTime.ToString("R"); usr0.Messages.Add(msg0); } users.Add(usr0); } } string accountName=res.Account.Name; string accountUserName =res.Account.Username; object logged_in=new{ Email=res.Account.Email, Name=accountName, Url=$"/user?name={accountUserName}", Loggedin=true, Mymessages=mymsg, Users=users }; Console.WriteLine("Alternate HI"); await e.SendJsonAsync(logged_in); Console.WriteLine("SENT"); return; } } } }catch (Exception ex){ _=ex; } await e.SendJsonAsync(new{ Loggedin=false }); },"GET"); svr.Add($"/login",async(e)=>{ await e.SendFileAsync(getPath("login/index.html")); }); svr.Add($"/signup",async(e)=>{ await e.SendFileAsync(getPath("signup/index.html")); }); Action set_url=(e2)=>{ svr.Add($"/{e2}",async(e)=>{ await e.SendFileAsync(getPath(e2)); }); }; foreach(var f in File.ReadAllLines(getPath("files.txt"))) { set_url(f); } svr.Add("/api/login",async(e)=>{ e.ParseBody(); string username; string password; string rememberMeStr; bool rememberMe; if(e.QueryParams.TryGetFirst("username",out username)) { if(e.QueryParams.TryGetFirst("password",out password)) { rememberMe=(e.QueryParams.TryGetFirst("remember",out rememberMeStr) && rememberMeStr == "on"); var res=UserManagement.Login(username,password,rememberMe); if(res.Success) { //Set-Cookie if(rememberMe) { e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={res.SessionId}; Path=/; Expires={res.Expires.ToString("R")}"); }else{ e.ResponseHeaders.Add("Set-Cookie",$"{LoginResult.SessionCookieName}={res.SessionId}; Path=/"); } await e.SendRedirectAsync("/"); }else{ await e.SendRedirectAsync("/err/incorrect-password.html"); //do what you do when You Have Wrong password } } } },"POST"); svr.Add("/api/signup",async(e)=>{ e.ParseBody(); string email; string name; string username; string password; string confirm; if(e.QueryParams.TryGetFirst("email",out email)) { if(e.QueryParams.TryGetFirst("name",out name)) { if(e.QueryParams.TryGetFirst("uname",out username)) { if(e.QueryParams.TryGetFirst("password",out password)) { if(e.QueryParams.TryGetFirst("password2",out confirm)) { if(!string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(username) && !string.IsNullOrWhiteSpace(password) && !string.IsNullOrWhiteSpace(confirm)) { RegistrationResult result=UserManagement.RegisterAccount(name,username,email,password); if(result.Success) { await e.SendRedirectAsync("/"); return; }else{ object o=new{ success=false, error=result.Error }; e.StatusCode=400; await e.SendJsonAsync(o); return; } } } } } } } e.StatusCode=400; object op=new{ success=false, error="Information not filled out" }; await e.SendJsonAsync(op); },"POST"); MountableServer _mountable=new MountableServer(svr); HttpServerListener listener=new HttpServerListener(http,_mountable); Timer t=new Timer((e)=>{ try{ DateTime d=DateTime.Now; List items=new List(); if(DataBase.Sessions != null){ foreach(var s in DataBase.Sessions.FindAll()) { if(s.Expires < d) { items.Add(s.Id); } } foreach(var item in items){ DataBase.Sessions.Delete(item); } } }catch(Exception ex) { _=ex; } },null,0,600000); wssv.AddWebSocketService("/chatr-ws"); wssv.Start(); if(wsInit != null) { wsInit(); } await listener.ListenAsync(token.Token); wssv.Stop(); } } }