Add image upload page

This commit is contained in:
Astrian Zheng 2023-10-11 16:44:53 +11:00
parent fbb1fcb566
commit 35c458b236
3 changed files with 237 additions and 269 deletions

View File

@ -21,40 +21,32 @@ using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Net.Http.Headers; using System.Net.Http.Headers;
namespace FIT5032_Assignment.Controllers namespace FIT5032_Assignment.Controllers {
{
// Endpoint Response // Endpoint Response
public class PassageUserReply public class PassageUserReply {
{
public PassageUserReplyUser User { get; set; } public PassageUserReplyUser User { get; set; }
} }
public class PassageUserReplyUser public class PassageUserReplyUser {
{
public string Email { get; set; } public string Email { get; set; }
} }
// Database // Database
public class Database1Entities : DbContext public class Database1Entities : DbContext {
{
public DbSet<Users> Users { get; set; } public DbSet<Users> Users { get; set; }
public DbSet<Credentials> Credentials { get; set; } public DbSet<Credentials> Credentials { get; set; }
public DbSet<Sessions> Sessions { get; set; } public DbSet<Sessions> Sessions { get; set; }
public DbSet<Patients> Patients { get; set; } public DbSet<Patients> Patients { get; set; }
public DbSet<Doctors> Doctors { get; set; } public DbSet<Doctors> Doctors { get; set; }
} }
public class HomeController : Controller public class HomeController : Controller {
{ public static string GetMd5Hash(string input) {
public static string GetMd5Hash(string input) using (MD5 md5 = MD5.Create()) {
{
using (MD5 md5 = MD5.Create())
{
byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder = new StringBuilder(); StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++) for (int i = 0; i < data.Length; i++) {
{
sBuilder.Append(data[i].ToString("x2")); sBuilder.Append(data[i].ToString("x2"));
} }
@ -62,8 +54,7 @@ namespace FIT5032_Assignment.Controllers
} }
} }
private static readonly HttpClient httpClient = new HttpClient(); private static readonly HttpClient httpClient = new HttpClient();
public static RsaSecurityKey LoadRsaSecurityKeyFromPem(string pem) public static RsaSecurityKey LoadRsaSecurityKeyFromPem(string pem) {
{
TextReader textReader = new StringReader(pem); TextReader textReader = new StringReader(pem);
PemReader pemReader = new PemReader(textReader); PemReader pemReader = new PemReader(textReader);
AsymmetricKeyParameter keyParameter = (AsymmetricKeyParameter)pemReader.ReadObject(); AsymmetricKeyParameter keyParameter = (AsymmetricKeyParameter)pemReader.ReadObject();
@ -74,8 +65,7 @@ namespace FIT5032_Assignment.Controllers
return new RsaSecurityKey(rsa); return new RsaSecurityKey(rsa);
} }
private String loginVerify(string token) private String loginVerify(string token) {
{
var jwtHandler = new JwtSecurityTokenHandler(); var jwtHandler = new JwtSecurityTokenHandler();
var jwtToken = jwtHandler.ReadJwtToken(token); var jwtToken = jwtHandler.ReadJwtToken(token);
@ -83,8 +73,7 @@ namespace FIT5032_Assignment.Controllers
string base64Publickey = "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJDZ0tDQVFFQTRUWEQwVEh4NnJjNXlQcXM0Skw5M01nVEgvTS95Z2s3V1pYWWsrS01XTTA0bDdzM3owRlMKODlDRE56SFJkbVpJb3RCbDgrcUJ5TUwvck5VcUhXMnJ1Uzg0dmxFaWdza2djK2RsaitCZXFsaGsySFRpQitpegpQcGdCU1FJc2YrZjdSU3dkYktFS2hRQm1La3MxVGF4YWNDUndPVWJKT1VQbjJXZmhVSHhRd0FwZGNCQWdNdHVNCld3QzJZRThGblFRZDhxc3dMTTBGQWhoSzUrdXRXY0s0bHdCVlFxUGJRaUJZYnZmWXkwYVF6UFB2V2NMR1JvR00KUVA1b1JCTmRuRzQ4Sm9Eb2tCSEJkbCt4RzM1L1U2N1BvejFKY0VVSnpWTHdIUFNHa0xyRU1OYlFrbnJSK2tHZwpnS1dWNFpvYWVOSHZVeFE3YVg3SElFMlc1UnIwRmxGUG1RSURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"; string base64Publickey = "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJDZ0tDQVFFQTRUWEQwVEh4NnJjNXlQcXM0Skw5M01nVEgvTS95Z2s3V1pYWWsrS01XTTA0bDdzM3owRlMKODlDRE56SFJkbVpJb3RCbDgrcUJ5TUwvck5VcUhXMnJ1Uzg0dmxFaWdza2djK2RsaitCZXFsaGsySFRpQitpegpQcGdCU1FJc2YrZjdSU3dkYktFS2hRQm1La3MxVGF4YWNDUndPVWJKT1VQbjJXZmhVSHhRd0FwZGNCQWdNdHVNCld3QzJZRThGblFRZDhxc3dMTTBGQWhoSzUrdXRXY0s0bHdCVlFxUGJRaUJZYnZmWXkwYVF6UFB2V2NMR1JvR00KUVA1b1JCTmRuRzQ4Sm9Eb2tCSEJkbCt4RzM1L1U2N1BvejFKY0VVSnpWTHdIUFNHa0xyRU1OYlFrbnJSK2tHZwpnS1dWNFpvYWVOSHZVeFE3YVg3SElFMlc1UnIwRmxGUG1RSURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K";
RsaSecurityKey rsaKey = LoadRsaSecurityKeyFromPem(Encoding.UTF8.GetString(Convert.FromBase64String(base64Publickey))); RsaSecurityKey rsaKey = LoadRsaSecurityKeyFromPem(Encoding.UTF8.GetString(Convert.FromBase64String(base64Publickey)));
// Valid time 3600s // Valid time 3600s
var validationParameters = new TokenValidationParameters() var validationParameters = new TokenValidationParameters() {
{
ValidIssuer = "https://auth.passage.id/v1/apps/ZHM5whW5xsZEczTn2loffzjN", ValidIssuer = "https://auth.passage.id/v1/apps/ZHM5whW5xsZEczTn2loffzjN",
ValidateAudience = false, ValidateAudience = false,
IssuerSigningKey = rsaKey, IssuerSigningKey = rsaKey,
@ -92,37 +81,24 @@ namespace FIT5032_Assignment.Controllers
ClockSkew = TimeSpan.FromSeconds(3600) ClockSkew = TimeSpan.FromSeconds(3600)
}; };
try try {
{
var claimsPrincipal = jwtHandler.ValidateToken(token, validationParameters, out var rawValidatedToken); var claimsPrincipal = jwtHandler.ValidateToken(token, validationParameters, out var rawValidatedToken);
} } catch (SecurityTokenExpiredException) {
catch (SecurityTokenExpiredException)
{
Trace.WriteLine("Token has expired"); Trace.WriteLine("Token has expired");
return null; return null;
} } catch (SecurityTokenInvalidSignatureException) {
catch (SecurityTokenInvalidSignatureException)
{
Trace.WriteLine("Token has invalid signature"); Trace.WriteLine("Token has invalid signature");
return null; return null;
} } catch (SecurityTokenInvalidIssuerException) {
catch (SecurityTokenInvalidIssuerException)
{
Trace.WriteLine("Token has invalid issuer"); Trace.WriteLine("Token has invalid issuer");
return null; return null;
} } catch (SecurityTokenInvalidAudienceException) {
catch (SecurityTokenInvalidAudienceException)
{
Trace.WriteLine("Token has invalid audience"); Trace.WriteLine("Token has invalid audience");
return null; return null;
} } catch (SecurityTokenValidationException) {
catch (SecurityTokenValidationException)
{
Trace.WriteLine("Token failed validation"); Trace.WriteLine("Token failed validation");
return null; return null;
} } catch (ArgumentException) {
catch (ArgumentException)
{
Trace.WriteLine("Token was empty or null"); Trace.WriteLine("Token was empty or null");
return null; return null;
} }
@ -134,8 +110,7 @@ namespace FIT5032_Assignment.Controllers
private Database1Entities db = new Database1Entities(); private Database1Entities db = new Database1Entities();
private string GenerateRandomString(int length) private string GenerateRandomString(int length) {
{
const string validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; const string validChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
var rng = new RNGCryptoServiceProvider(); var rng = new RNGCryptoServiceProvider();
var bytes = new byte[length]; var bytes = new byte[length];
@ -143,31 +118,24 @@ namespace FIT5032_Assignment.Controllers
return new string(bytes.Select(x => validChars[x % validChars.Length]).ToArray()); return new string(bytes.Select(x => validChars[x % validChars.Length]).ToArray());
} }
public HomeController() public HomeController() {
{
// if auth token setted, ignore // if auth token setted, ignore
if (httpClient.DefaultRequestHeaders.Authorization == null) if (httpClient.DefaultRequestHeaders.Authorization == null) {
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "vF4ch1wUf8.1cqOms9JMmUbqMGohlkJLzGDVlbF51D03fJnLfxwkn8kyAaVVjfvySufW9vXb3p3"); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "vF4ch1wUf8.1cqOms9JMmUbqMGohlkJLzGDVlbF51D03fJnLfxwkn8kyAaVVjfvySufW9vXb3p3");
} }
} }
public ActionResult Index() public ActionResult Index() {
{
// If user logged in, show user name // If user logged in, show user name
if (Request.Cookies["psg_auth_token"] != null) if (Request.Cookies["psg_auth_token"] != null) {
{
var user = loginVerify(Request.Cookies["psg_auth_token"].Value); var user = loginVerify(Request.Cookies["psg_auth_token"].Value);
if (user != null) if (user != null) {
{
var db = new Database1Entities(); var db = new Database1Entities();
var credential = db.Credentials.Where(res => (res.uniqueIdCode == user) && (res.provider == 0)); var credential = db.Credentials.Where(res => (res.uniqueIdCode == user) && (res.provider == 0));
if (credential.Count() != 0) if (credential.Count() != 0) {
{
var userUuid = credential.First().user; var userUuid = credential.First().user;
var dbUser = db.Users.Where(res => res.uuid == userUuid); var dbUser = db.Users.Where(res => res.uuid == userUuid);
if (dbUser.Count() != 0) if (dbUser.Count() != 0) {
{
ViewBag.displayname = dbUser.First().displayName; ViewBag.displayname = dbUser.First().displayName;
ViewBag.avatar = dbUser.First().avatar; ViewBag.avatar = dbUser.First().avatar;
ViewBag.role = dbUser.First().role == 1 ? "Patient" : "Doctor"; ViewBag.role = dbUser.First().role == 1 ? "Patient" : "Doctor";
@ -178,33 +146,25 @@ namespace FIT5032_Assignment.Controllers
return View(); return View();
} }
public ActionResult CreateAccount() public ActionResult CreateAccount() {
{
return View(); return View();
} }
public ActionResult LoginRedirect() public ActionResult LoginRedirect() {
{
// See cookies // See cookies
var psg_auth_token = Request.Cookies["psg_auth_token"]; var psg_auth_token = Request.Cookies["psg_auth_token"];
Trace.WriteLine(psg_auth_token.Value); Trace.WriteLine(psg_auth_token.Value);
// JWT Verify // JWT Verify
string sub = loginVerify(psg_auth_token.Value); string sub = loginVerify(psg_auth_token.Value);
if (sub == null) if (sub == null) {
{
return RedirectToAction("Login"); return RedirectToAction("Login");
} } else {
else
{
var db = new Database1Entities(); var db = new Database1Entities();
var credential = db.Credentials.Where(res => (res.uniqueIdCode == sub) && (res.provider == 0)); var credential = db.Credentials.Where(res => (res.uniqueIdCode == sub) && (res.provider == 0));
// Register: if no credential, redirect to create account // Register: if no credential, redirect to create account
if (credential.Count() == 0) if (credential.Count() == 0) {
{
return RedirectToAction("CompleteProfile"); return RedirectToAction("CompleteProfile");
} } else {
else
{
// Successful login // Successful login
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
@ -213,10 +173,8 @@ namespace FIT5032_Assignment.Controllers
// POST /ComplteteProfile // POST /ComplteteProfile
[HttpPost] [HttpPost]
public async Task<ActionResult> CompleteProfile(Models.CompleteProfileForm model) public async Task<ActionResult> CompleteProfile(Models.CompleteProfileForm model) {
{ if (!ModelState.IsValid) {
if (!ModelState.IsValid)
{
ModelState.AddModelError("fullname", "Form not valid"); ModelState.AddModelError("fullname", "Form not valid");
return View(model); return View(model);
} }
@ -224,8 +182,7 @@ namespace FIT5032_Assignment.Controllers
// Verify user is logged in // Verify user is logged in
var psg_auth_token = Request.Cookies["psg_auth_token"]; var psg_auth_token = Request.Cookies["psg_auth_token"];
var user = loginVerify(psg_auth_token.Value); var user = loginVerify(psg_auth_token.Value);
if (user == null) if (user == null) {
{
return RedirectToAction("Login"); return RedirectToAction("Login");
} }
@ -244,15 +201,13 @@ namespace FIT5032_Assignment.Controllers
// Create a new credential and a new user // Create a new credential and a new user
string userUuid = Guid.NewGuid().ToString(); string userUuid = Guid.NewGuid().ToString();
Users newDbUser = new Users Users newDbUser = new Users {
{
uuid = userUuid, uuid = userUuid,
displayName = model.fullname, displayName = model.fullname,
role = Int16.Parse(model.role), role = Int16.Parse(model.role),
avatar = avatarUrl avatar = avatarUrl
}; };
Credentials credential = new Credentials Credentials credential = new Credentials {
{
uuid = Guid.NewGuid().ToString(), uuid = Guid.NewGuid().ToString(),
user = userUuid, user = userUuid,
uniqueIdCode = user_id, uniqueIdCode = user_id,
@ -264,20 +219,16 @@ namespace FIT5032_Assignment.Controllers
db.Credentials.Add(credential); db.Credentials.Add(credential);
db.SaveChanges(); db.SaveChanges();
if (model.role == "1") if (model.role == "1") {
{
// Create patient profile // Create patient profile
db.Patients.Add(new Patients db.Patients.Add(new Patients {
{
phone = "", phone = "",
address = "", address = "",
user = userUuid, user = userUuid,
notes = "" notes = ""
}); });
db.SaveChanges(); db.SaveChanges();
} } else {
else
{
db.Doctors.Add(new Doctors db.Doctors.Add(new Doctors
{ {
user = userUuid, user = userUuid,
@ -289,15 +240,23 @@ namespace FIT5032_Assignment.Controllers
return RedirectToAction("Index"); return RedirectToAction("Index");
} }
public ActionResult InitialPasskey() public ActionResult InitialPasskey() {
{
return View(); return View();
} }
public ActionResult CompleteProfile() public ActionResult CompleteProfile() {
{
return View(); return View();
} }
public ActionResult ImageUpload() {
var user = loginVerify(Request.Cookies["psg_auth_token"].Value);
if (user != null) {
// Redirect to home page
return RedirectToAction("Index");
} else {
return View();
}
}
} }
} }

View File

@ -310,6 +310,7 @@
<Content Include="Views\Home\LoginRedirect.cshtml" /> <Content Include="Views\Home\LoginRedirect.cshtml" />
<Content Include="Views\Home\CompleteProfile.cshtml" /> <Content Include="Views\Home\CompleteProfile.cshtml" />
<Content Include="Views\Home\View.cshtml" /> <Content Include="Views\Home\View.cshtml" />
<Content Include="Views\Home\ImageUpload.cshtml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Views\Test\" /> <Folder Include="Views\Test\" />

View File

@ -0,0 +1,8 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<main aria-labelledby="title">
image upload
</main>