Propper file manager with encryption of files

This commit is contained in:
SCM6WE
2021-09-23 14:07:07 +02:00
committed by Felix Hartmann (PEA3-Fe-FI)
parent 179ce2b1bb
commit 9141efd55a
2 changed files with 131 additions and 102 deletions

View File

@@ -26,6 +26,7 @@ namespace PolyChat
private const ushort PORT = 8050; private const ushort PORT = 8050;
// Controller // Controller
private readonly MainPage UIController; private readonly MainPage UIController;
private readonly FileManager fileManager;
// Props // Props
private Dictionary<string, Connection> Connections = new Dictionary<string, Connection>(); private Dictionary<string, Connection> Connections = new Dictionary<string, Connection>();
private string OwnName = ""; private string OwnName = "";
@@ -38,9 +39,9 @@ namespace PolyChat
public Controller(MainPage uiController) public Controller(MainPage uiController)
{ {
UIController = uiController; UIController = uiController;
fileManager = new FileManager(uiController);
OwnIP = getIP(); OwnIP = getIP();
loadChats(); fileManager.loadChats();
encode("test");
Serve(); Serve();
// test // test
@@ -120,7 +121,7 @@ namespace PolyChat
// send as json // send as json
Connections[ip].SendMessage(json.ToString()); Connections[ip].SendMessage(json.ToString());
// save to logs // save to logs
SaveChats(ip, json.ToString(), DateTime.Now); fileManager.saveChats(ip, json.ToString(), DateTime.Now);
} }
private void OnMessage(string ip, JToken[] data) private void OnMessage(string ip, JToken[] data)
@@ -131,7 +132,7 @@ namespace PolyChat
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
Debug.WriteLine("RAW: " + data[0]); Debug.WriteLine("RAW: " + data[0]);
UIController.OnIncomingMessage(ip, data[0].ToString(), now); UIController.OnIncomingMessage(ip, data[0].ToString(), now);
SaveChats(ip, data[0].ToString(), now); fileManager.saveChats(ip, data[0].ToString(), now);
} }
else Debug.WriteLine("Undefined: " + data); else Debug.WriteLine("Undefined: " + data);
} }
@@ -178,106 +179,11 @@ namespace PolyChat
return null; return null;
} }
/// <summary>
/// sends chatlogs as json array to uiController wit corrosponding ip
///
/// in ui when chat is clicked connection gets established
/// </summary>
/// <param name="ip"></param>
public void loadChats()
{
//TODO: also load chatlogs when user tries to connect
//load dir and create if non existant
if (Directory.Exists("U:\\PolyChat\\Saves"))
{
Debug.WriteLine("--Path exists.--");
}
else
{
Directory.CreateDirectory("U:\\PolyChat\\Saves");
Debug.WriteLine("--Path Created--.");
}
//go through all files and send ip and json array to ui
String[] filepaths = Directory.GetFiles("U:\\PolyChat\\Saves");
if (filepaths.Length > 0)
{
Debug.WriteLine("---Loading Saves");
foreach (String path in filepaths)
{
Debug.WriteLine($"--{path}");
String jsonArr = File.ReadAllText(path);
String ip = Path.GetFileName(path);
ip = ip.Substring(0, ip.Length - 4);
Debug.WriteLine($"-{ip}");
Debug.WriteLine(jsonArr);
UIController.OnIncomingConnection(ip);
UIController.OnIncomingMessages(ip, jsonArr);
}
}
}
/// <summary>
/// Saves incoming chat message to
/// </summary>
/// <param name="ip"></param>
/// <param name="json"></param>
public void SaveChats(string ip, string json, DateTime timeStamp)
{
//Vielleicht noch so machen dass die mit gleicher ip nacheinander gemacht
//werden damit es nicht zu überschreibungen kommt vielleicth auch ganz oben oder am ende ne
//writing flag setzen oder auch in der datei selbst ne flag setzen
new Thread(() =>
{
//breaking if namechange
JObject obj = JObject.Parse(json);
if (!obj["type"].ToString().Equals("username"))
{
//adding timestamp
obj = JObject.Parse(json);
obj.Add(new JProperty("timestamp", timeStamp));
json = obj.ToString();
if (File.Exists($"U:\\PolyChat\\Saves\\{ip}.txt"))
{
Debug.WriteLine("--File allready exists--");
//check for integraty of file
string output = File.ReadAllText($"U:\\PolyChat\\Saves\\{ip}.txt");
Debug.WriteLine($"---{output}---");
if (output.Substring(0, 1).Equals("[") && output.Substring(output.Length - 1, 1).Equals("]"))
{
Debug.WriteLine("--adding new chatmessage--");
//structure intact
//save new chat
String saved = output.Substring(0, output.Length - 1);
output = saved + ", " + json + " ]";
File.Delete($"U:\\PolyChat\\Saves\\{ip}.txt");
File.WriteAllText($"U:\\PolyChat\\Saves\\{ip}.txt", output);
}
else
{
Debug.WriteLine("--Structure not intact--");
Debug.WriteLine("--redoing file--");
//structure not intact
//redo file
File.Delete($"U:\\PolyChat\\Saves\\{ip}.txt");
File.WriteAllText($"U:\\PolyChat\\Saves\\{ip}.txt", $"[ {json} ]");
}
}
else
{
Debug.WriteLine("--Creating new File--");
//setup file
File.WriteAllText($"U:\\PolyChat\\Saves\\{ip}.txt", $"[ {json} ]");
}
}
}).Start();
}
private void encode(string json) private void encode(string json)
{ {
String ecryptetText = FileManager.encrypt(json); String ecryptetText = FileManager.encrypt(json);
Debug.WriteLine(ecryptetText); Debug.WriteLine(ecryptetText);
//Debug.WriteLine(FileManager.decrypt(ecryptetText)); Debug.WriteLine(FileManager.decrypt(ecryptetText));
} }
} }
} }

View File

@@ -5,12 +5,131 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.IO; using System.IO;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Diagnostics;
using System.Threading;
using Newtonsoft.Json.Linq;
namespace PolyChat.Models namespace PolyChat.Models
{ {
class FileManager class FileManager
{ {
// Controller
private readonly MainPage UIController;
public FileManager(MainPage uiController)
{
UIController = uiController;
}
/// <summary>
/// sends chatlogs as json array to uiController wit corrosponding ip
///
/// in ui when chat is clicked connection gets established
/// </summary>
/// <param name="ip"></param>
public void loadChats()
{
//load dir and create if non existant
if (Directory.Exists("U:\\PolyChat\\Saves"))
{
Debug.WriteLine("--Path exists.--");
}
else
{
Directory.CreateDirectory("U:\\PolyChat\\Saves");
Debug.WriteLine("--Path Created--.");
}
//go through all files and send ip and json array to ui
String[] filepaths = Directory.GetFiles("U:\\PolyChat\\Saves");
if (filepaths.Length > 0)
{
Debug.WriteLine("---Loading Saves");
foreach (String path in filepaths)
{
Debug.WriteLine($"--{path}");
String jsonArr = decrypt(File.ReadAllText(path));
String ip = Path.GetFileName(path);
ip = ip.Substring(0, ip.Length - 4);
Debug.WriteLine($"-{ip}");
Debug.WriteLine(jsonArr);
UIController.OnIncomingConnection(ip);
UIController.OnIncomingMessages(ip, jsonArr);
}
}
}
/// <summary>
/// Saves incoming chat message to
/// </summary>
/// <param name="ip"></param>
/// <param name="json"></param>
public void saveChats(string ip, string json, DateTime timeStamp)
{
//Vielleicht noch so machen dass die mit gleicher ip nacheinander gemacht
//werden damit es nicht zu überschreibungen kommt vielleicth auch ganz oben oder am ende ne
//writing flag setzen oder auch in der datei selbst ne flag setzen
new Thread(() =>
{
//breaking if namechange
JObject obj = JObject.Parse(json);
if (!obj["type"].ToString().Equals("username"))
{
//adding timestamp
obj = JObject.Parse(json);
obj.Add(new JProperty("timestamp", timeStamp));
json = obj.ToString();
if (File.Exists($"U:\\PolyChat\\Saves\\{ip}.txt"))
{
Debug.WriteLine("--File allready exists--");
//check for integraty of file
string output = decrypt(File.ReadAllText($"U:\\PolyChat\\Saves\\{ip}.txt"));
Debug.WriteLine($"---{output}---");
if (output.Substring(0, 1).Equals("[") && output.Substring(output.Length - 1, 1).Equals("]"))
{
Debug.WriteLine("--adding new chatmessage--");
//structure intact
//save new chat
String saved = output.Substring(0, output.Length - 1);
output = saved + ", " + json + " ]";
File.Delete($"U:\\PolyChat\\Saves\\{ip}.txt");
File.WriteAllText($"U:\\PolyChat\\Saves\\{ip}.txt", encrypt(output));
}
else
{
Debug.WriteLine("--Structure not intact--");
Debug.WriteLine("--redoing file--");
//structure not intact
//redo file
File.Delete($"U:\\PolyChat\\Saves\\{ip}.txt");
File.WriteAllText($"U:\\PolyChat\\Saves\\{ip}.txt", encrypt($"[ {json} ]"));
}
}
else
{
Debug.WriteLine("--Creating new File--");
//setup file
File.WriteAllText($"U:\\PolyChat\\Saves\\{ip}.txt", encrypt($"[ {json} ]"));
}
}
}).Start();
}
//---------------------------------------------------------------------------------------------------
//security
//---------------------------------------------------------------------------------------------------
private void genKeys()
{
}
/// <summary>
/// does exactly what it says. XD
/// </summary>
/// <param name="toEncrypt"></param>
/// <returns></returns>
public static String encrypt(String toEncrypt) public static String encrypt(String toEncrypt)
{ {
try { try {
@@ -41,7 +160,11 @@ namespace PolyChat.Models
} }
/// <summary>
/// does exactly what it says. XD
/// </summary>
/// <param name="toEncrypt"></param>
/// <returns></returns>
public static String decrypt(String toDecrypt) public static String decrypt(String toDecrypt)
{ {
try try