Skip to content

Commit

Permalink
refactor & install sqllite
Browse files Browse the repository at this point in the history
  • Loading branch information
BlenMiner committed Nov 23, 2023
1 parent 5a637f6 commit 52171b7
Show file tree
Hide file tree
Showing 7 changed files with 214 additions and 132 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
oauth.json
oauth.json
data/
1 change: 1 addition & 0 deletions 3d-pixels-server/3d-pixels-server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.0" />
<PackageReference Include="NetCoreServer" Version="6.7.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
Expand Down
23 changes: 23 additions & 0 deletions 3d-pixels-server/PixelsServer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using NetCoreServer;
using System.Net.Sockets;
using System.Net;

namespace PixelsServer
{
class PixelsServer : WsServer
{
readonly OAuthSecrets m_oauth;

public PixelsServer(OAuthSecrets oauth, IPAddress address, int port) : base(address, port)
{
m_oauth = oauth;
}

protected override TcpSession CreateSession() { return new PixelsServerSession(this, m_oauth); }

protected override void OnError(SocketError error)
{
Console.WriteLine($"Chat WebSocket server caught an error with code {error}");
}
}
}
118 changes: 118 additions & 0 deletions 3d-pixels-server/PixelsServerSession.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
using NetCoreServer;
using System.Net.Sockets;
using System.Text;
using Newtonsoft.Json.Linq;

namespace PixelsServer
{
class PixelsServerSession : WsSession
{
private readonly OAuthSecrets m_secrets;

private readonly System.Net.Http.HttpClient m_client = new System.Net.Http.HttpClient();

public PixelsServerSession(WsServer server, OAuthSecrets oauthSecrets) : base(server)
{
m_secrets = oauthSecrets;
}

public override void OnWsConnected(HttpRequest request)
{
Console.WriteLine($"Chat WebSocket session with Id {Id} connected!");

// Send invite message
string message = "Please send a message or '!' to disconnect the client!";

SendBinaryAsync(message);
}

public override void OnWsDisconnected()
{
Console.WriteLine($"Chat WebSocket session with Id {Id} disconnected!");
}

public override void OnWsReceived(byte[] buffer, long offset, long size)
{
string message = Encoding.UTF8.GetString(buffer, (int)offset, (int)size);
Console.WriteLine("Incoming: " + message);

// Multicast message to all connected sessions
((WsServer)Server).MulticastBinary(buffer, offset, size);

// If the buffer starts with '!' the disconnect the current session
if (message == "!")
Close(1000);
}

protected override void OnError(SocketError error)
{
Console.WriteLine($"Chat WebSocket session caught an error with code {error}");
}

protected override async void OnReceivedRequest(HttpRequest request)
{
var host = request.GetHeader("Host");
if (host == null) return;

var isLocalHost = host.StartsWith("localhost");
var rootUrl = $"{(isLocalHost ? "http" : "https")}://{host}";

var unescapedPathAndQuery = Uri.UnescapeDataString(request.Url).Split('?');

string urlPath = unescapedPathAndQuery[0];
string urlQuery = unescapedPathAndQuery.Length > 1 ? unescapedPathAndQuery[1] : string.Empty;

switch (request.Method)
{
case "GET":

if (urlPath == "/login")
HandleLogin(rootUrl);
else if (urlPath == "/oauth")
await HandleOAuthResponse(rootUrl, urlQuery);

break;
}
}

private void HandleLogin(string rootUrl)
{
var redirectAt = $"{rootUrl}/oauth";
var oauthUrl = OAuth.GetOAuthUrl(m_secrets.ClientID, redirectAt);
SendResponseAsync(Response.MakeRedirectResponse(oauthUrl));
}

private async Task HandleOAuthResponse(string rootUrl, string urlQuery)
{
var end = urlQuery.IndexOf('&');
var code = urlQuery[5..end];

var values = new Dictionary<string, string>
{
{ "code", code },
{ "client_id", m_secrets.ClientID },
{ "client_secret", m_secrets.ClientSecret },
{ "redirect_uri", rootUrl + "/oauth" },
{ "grant_type", "authorization_code" }
};

var content = new FormUrlEncodedContent(values);

var response = await m_client.PostAsync("https://oauth2.googleapis.com/token", content);

var json = JObject.Parse(await response.Content.ReadAsStringAsync());
var accessToken = json["access_token"]?.ToString();

if (accessToken == null)
{
SendResponseAsync(Response.MakeGetResponse("OAUTH: ERROOORRRRRRRRRR", "text/html; charset=UTF-8"));
return;
}

var userInfo = await m_client.GetAsync($"https://www.googleapis.com/oauth2/v2/userinfo?access_token={accessToken}");
var userInfoData = await userInfo.Content.ReadAsStringAsync();

SendResponseAsync(Response.MakeGetResponse("OAUTH: " + userInfoData, "text/html; charset=UTF-8"));
}
}
}
143 changes: 16 additions & 127 deletions 3d-pixels-server/Program.cs
Original file line number Diff line number Diff line change
@@ -1,134 +1,8 @@
using NetCoreServer;
using System.Net.Sockets;
using Microsoft.Data.Sqlite;
using System.Net;
using System.Text;
using Newtonsoft.Json.Linq;
using System.Net.Http.Headers;

namespace PixelsServer
{
class PixelsServerSession : WsSession
{
private readonly OAuthSecrets m_secrets;

private readonly System.Net.Http.HttpClient m_client = new System.Net.Http.HttpClient();

public PixelsServerSession(WsServer server, OAuthSecrets oauthSecrets) : base(server)
{
m_secrets = oauthSecrets;
}

public override void OnWsConnected(HttpRequest request)
{
Console.WriteLine($"Chat WebSocket session with Id {Id} connected!");

// Send invite message
string message = "Please send a message or '!' to disconnect the client!";

SendBinaryAsync(message);
}

public override void OnWsDisconnected()
{
Console.WriteLine($"Chat WebSocket session with Id {Id} disconnected!");
}

public override void OnWsReceived(byte[] buffer, long offset, long size)
{
string message = Encoding.UTF8.GetString(buffer, (int)offset, (int)size);
Console.WriteLine("Incoming: " + message);

// Multicast message to all connected sessions
((WsServer)Server).MulticastBinary(buffer, offset, size);

// If the buffer starts with '!' the disconnect the current session
if (message == "!")
Close(1000);
}

protected override void OnError(SocketError error)
{
Console.WriteLine($"Chat WebSocket session caught an error with code {error}");
}

protected override async void OnReceivedRequest(HttpRequest request)
{
var host = request.GetHeader("Host");
if (host == null) return;

var isLocalHost = host.StartsWith("localhost");
var rootUrl = $"{(isLocalHost ? "http" : "https")}://{host}";

var unescapedPathAndQuery = Uri.UnescapeDataString(request.Url).Split('?');

string urlPath = unescapedPathAndQuery[0];
string urlQuery = unescapedPathAndQuery.Length > 1 ? unescapedPathAndQuery[1] : string.Empty;

switch (request.Method)
{
case "GET":

if (urlPath == "/login")
{
var redirectAt = $"{rootUrl}/oauth";
var oauthUrl = OAuth.GetOAuthUrl(m_secrets.ClientID, redirectAt);
SendResponseAsync(Response.MakeRedirectResponse(oauthUrl));
}

if (urlPath == "/oauth")
{
var end = urlQuery.IndexOf('&');
var code = urlQuery[5..end];

var values = new Dictionary<string, string>
{
{ "code", code },
{ "client_id", m_secrets.ClientID },
{ "client_secret", m_secrets.ClientSecret },
{ "redirect_uri", rootUrl + "/oauth" },
{ "grant_type", "authorization_code" }
};

var content = new FormUrlEncodedContent(values);

var response = await m_client.PostAsync("https://oauth2.googleapis.com/token", content);

var json = JObject.Parse(await response.Content.ReadAsStringAsync());
var accessToken = json["access_token"]?.ToString();

if (accessToken == null)
{
SendResponseAsync(Response.MakeGetResponse("OAUTH: ERROOORRRRRRRRRR", "text/html; charset=UTF-8"));
break;
}

var userInfo = await m_client.GetAsync($"https://www.googleapis.com/oauth2/v2/userinfo?access_token={accessToken}");
var userInfoData = await userInfo.Content.ReadAsStringAsync();

SendResponseAsync(Response.MakeGetResponse("OAUTH: " + userInfoData, "text/html; charset=UTF-8"));
}

break;
}
}
}

class PixelsServer : WsServer
{
readonly OAuthSecrets m_oauth;

public PixelsServer(OAuthSecrets oauth, IPAddress address, int port) : base(address, port)
{
m_oauth = oauth;
}

protected override TcpSession CreateSession() { return new PixelsServerSession(this, m_oauth); }

protected override void OnError(SocketError error)
{
Console.WriteLine($"Chat WebSocket server caught an error with code {error}");
}
}

class Program
{
Expand All @@ -153,8 +27,23 @@ static void Main(string[] args)

var rootPath = GetRootPath();
var wwwPath = Path.Combine(rootPath, "www");
var dataPath = Path.Combine(rootPath, "data");
var oauthSecrets = OAuth.GetSecrets(args, rootPath);

Console.WriteLine($"Creating database connection");
var sqliteConnection = new SqliteConnection($"Data Source={Path.Combine(dataPath, "pixels.db")}");

try
{
sqliteConnection.Open();
}
catch (SqliteException ex)
{
Console.WriteLine($"Error opening database connection:");
Console.WriteLine(ex.Message);
return;
}

Console.WriteLine($"WebSocket server port: {PORT}");
Console.WriteLine($"WebSocket server website: http://localhost:{PORT}/index.html");

Expand Down
19 changes: 15 additions & 4 deletions www/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,28 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="main.css">
<link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet" type="text/css">
<title>Riten - 3D Pixels</title>
</head>
<body>
<!-- Start Landing Page -->
<div class="landing-page">
<header>
<div class="container">
<a href="/"><img height="32px" src="https://i.ibb.co/1JF2X3N/Riten.png"></a>
<ul class="links">
<li>Sign In</li>
</ul>
<a href="/"><img height="32px" src="https://i.ibb.co/1JF2X3N/Riten.png"></a>
<div>
<span id="login-with-google">
<button type="button" class="login-with-google-btn" >
Sign in with Google
</button>
</span>
<span id="logged-in-as">
Logged in as <b>someemail@gmail.com</b>
<a href="/logout" style="margin: 1em;">
Sign-out
</a>
</sp>
</div>
</div>
</header>
<div class="content">
Expand Down
Loading

0 comments on commit 52171b7

Please sign in to comment.