978 lines
36 KiB
C#
978 lines
36 KiB
C#
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<string,string> 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($"<!doctype html><html><head><title>Login</title></head><body><form method=\"POST\" action=\"./onetimeauth\"><input type=\"submit\" value=\"Login\"><input type=\"hidden\" name=\"key\" value=\"{key}\"></form></body></html>");
|
|
|
|
}
|
|
});
|
|
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<Bot,string,bool> 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 =
|
|
/*<input type="hidden" name="message_to" value="{{ uname }}">
|
|
<input type="hidden" name="redirect_to" value="/user?name={{ uname }}">
|
|
|
|
<div class="mdl-textfield mdl-js-textfield">
|
|
<textarea class="mdl-textfield__input" type="text" rows= "6" id="sample5" name="body" ></textarea>
|
|
<label class="mdl-textfield__label" for="sample5">Message Body</label>
|
|
|
|
</div>*/
|
|
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<MyMessage>();
|
|
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<UserAccount>();
|
|
|
|
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<MyMessage>();
|
|
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<UserAccount>();
|
|
|
|
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<string> 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<long> items=new List<long>();
|
|
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<WSConnection>("/chatr-ws");
|
|
wssv.Start();
|
|
if(wsInit != null)
|
|
{
|
|
wsInit();
|
|
}
|
|
|
|
await listener.ListenAsync(token.Token);
|
|
wssv.Stop();
|
|
|
|
}
|
|
}
|
|
|
|
}
|