146 lines
4.4 KiB
C#
146 lines
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace UserPermissionTest_CS_WinForms
|
|
{
|
|
public class JsonUserRepository : IUserRepository
|
|
{
|
|
private const string UsersFile = "users.json";
|
|
private const string PermissionsFile = "permissions.json";
|
|
|
|
public List<User> LoadUsers()
|
|
{
|
|
if (!File.Exists(UsersFile))
|
|
{
|
|
var defaults = GetDefaultUsers();
|
|
SaveUsers(defaults);
|
|
return defaults;
|
|
}
|
|
|
|
try
|
|
{
|
|
string json = File.ReadAllText(UsersFile);
|
|
var users = JsonConvert.DeserializeObject<List<User>>(json);
|
|
if (users == null) return GetDefaultUsers();
|
|
|
|
// Dynamic Migration: If any loaded user has a plain text password, hash it and re-save
|
|
bool modified = false;
|
|
foreach (var user in users)
|
|
{
|
|
if (user.Password.Length != 64 || !IsHexString(user.Password))
|
|
{
|
|
user.Password = PasswordHasher.HashPassword(user.Password);
|
|
modified = true;
|
|
}
|
|
}
|
|
|
|
if (modified)
|
|
{
|
|
SaveUsers(users);
|
|
}
|
|
|
|
return users;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error reading users JSON, falling back to defaults: " + ex.Message);
|
|
return GetDefaultUsers();
|
|
}
|
|
}
|
|
|
|
private bool IsHexString(string str)
|
|
{
|
|
if (string.IsNullOrEmpty(str)) return false;
|
|
foreach (char c in str)
|
|
{
|
|
if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void SaveUsers(List<User> users)
|
|
{
|
|
try
|
|
{
|
|
string json = JsonConvert.SerializeObject(users, Formatting.Indented);
|
|
File.WriteAllText(UsersFile, json);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error writing users JSON: " + ex.Message);
|
|
}
|
|
}
|
|
|
|
public List<string> LoadPermissions()
|
|
{
|
|
if (!File.Exists(PermissionsFile))
|
|
{
|
|
var defaults = GetDefaultPermissions();
|
|
SavePermissions(defaults);
|
|
return defaults;
|
|
}
|
|
|
|
try
|
|
{
|
|
string json = File.ReadAllText(PermissionsFile);
|
|
var permissions = JsonConvert.DeserializeObject<List<string>>(json);
|
|
return permissions ?? GetDefaultPermissions();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error reading permissions JSON, falling back to defaults: " + ex.Message);
|
|
return GetDefaultPermissions();
|
|
}
|
|
}
|
|
|
|
public void SavePermissions(List<string> permissions)
|
|
{
|
|
try
|
|
{
|
|
string json = JsonConvert.SerializeObject(permissions, Formatting.Indented);
|
|
File.WriteAllText(PermissionsFile, json);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine("Error writing permissions JSON: " + ex.Message);
|
|
}
|
|
}
|
|
|
|
private List<User> GetDefaultUsers()
|
|
{
|
|
return new List<User>
|
|
{
|
|
new User
|
|
{
|
|
Username = "admin",
|
|
FullName = "System Administrator",
|
|
Password = PasswordHasher.HashPassword("admin"),
|
|
Permissions = GetDefaultPermissions()
|
|
},
|
|
new User
|
|
{
|
|
Username = "user",
|
|
FullName = "Standard User",
|
|
Password = PasswordHasher.HashPassword("user"),
|
|
Permissions = new List<string> { "View Dashboard" }
|
|
}
|
|
};
|
|
}
|
|
|
|
private List<string> GetDefaultPermissions()
|
|
{
|
|
return new List<string>
|
|
{
|
|
"View Dashboard",
|
|
"Edit Settings",
|
|
"Manage Users",
|
|
"Full Control",
|
|
"Delete Transactions"
|
|
};
|
|
}
|
|
}
|
|
}
|