Files
QuizSystem/ClassSelect/ClassSelect/Pages/Index.cshtml.cs
Karsten Jeppesen eba66b2ad2
All checks were successful
DMA-CSD-CICD/QuizSystem/pipeline/head This commit looks good
UCN/QuizSystem/pipeline/head This commit looks good
Initial commit
2026-04-10 17:05:34 +02:00

159 lines
6.0 KiB
C#

using ClassSelect.Implementations;
using ClassSelect.Models;
using ClassSelect.OpenIDConnect;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Newtonsoft.Json;
using System.Collections;
using System.IdentityModel.Tokens.Jwt;
namespace ClassSelect.Pages
{
public class IndexModel : PageModel
{
[BindProperty]
public List<KCGroups>? availableGroups { get; set; }
[BindProperty]
public OpenIDUCNData? ucnData { get; set; }
[BindProperty]
public string UserID { get; set; }
[BindProperty]
public List<KCGroups> currentGroups { get; set; }
[BindProperty]
public bool isTeacher { get; set; }
private bool isDebug;
private string KCUserID { get; set; }
private OpenIDConnectUtils OpenIDUtils = new();
private readonly ILogger<IndexModel> _logger;
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
/// <summary>
/// Loads available Jeycloak groups, and authorizes user.
/// </summary>
/// <param name="keyCloak"></param>
private void LoadIdFromAccesstoken(KeyCloak keyCloak)
{
// load available groups from keycloak
availableGroups = keyCloak.KeyCloakGetGroups();
KCUserID = OpenIDUtils.GetJwtClaim(HttpContext, "sub");
string? ucnDataJson = OpenIDUtils.GetJwtClaim(HttpContext, "ucn");
if (ucnDataJson != null)
{
// the ucn section is available, but is it safe?
ucnData = JsonConvert.DeserializeObject<OpenIDUCNData>(ucnDataJson);
if (ucnData.theRole == null) ucnDataJson = null;
}
if (ucnDataJson == null)
{
string email = OpenIDUtils.GetJwtClaim(HttpContext, "email");
Console.WriteLine("New entity: " + email);
// Lets try to determine if student or teacher. All emails starting with a digit is a student, kajestud is a student. Others are teachers
if (email[0] >= '0' && email[0] <= '9')
{
// Student
keyCloak.KeyCloakJoinGroup(KCUserID, keyCloak.KeyCloakStudent());
keyCloak.KeyCloakJoinGroup(KCUserID, keyCloak.KeyCloakClassLess());
ucnData.theClass = new();
ucnData.theClass.Add("Please select your class");
ucnData.theRole = "student";
isTeacher = false;
}
else
{
// Teacher
keyCloak.KeyCloakJoinGroup(KCUserID, keyCloak.KeyCloakTeacher());
ucnData.theClass = new();
ucnData.theRole = "teacher";
isTeacher = true;
}
}
else
{
// the ucn section is available
ucnData = JsonConvert.DeserializeObject<OpenIDUCNData>(ucnDataJson);
if (isDebug) Console.WriteLine("userID=[{0}] ucnDataJson=[{1}]", KCUserID, ucnDataJson);
}
}
public void Common()
{
isDebug = MyConfiguration.Get()["DEBUG"] == "Y";
KeyCloak keyCloak = new();
LoadIdFromAccesstoken(keyCloak);
currentGroups = keyCloak.KeyCloakGetUsersGroups(KCUserID); //loads isTeacher value
isTeacher = keyCloak.KeyCloakIsTeacher();
if (isDebug)
{
Console.WriteLine("currentGroups.Count= " + currentGroups.Count.ToString());
if (isTeacher) Console.WriteLine("TEACHER"); else Console.WriteLine("STUDENT");
foreach (KCGroups item in currentGroups)
{
Console.WriteLine("Member of: " + item.name);
}
}
isTeacher = keyCloak.KeyCloakIsTeacher();
}
public void OnGet()
{
if (isDebug) Console.WriteLine("OnGet...");
Common();
if (isDebug) Console.WriteLine("OnGet...Done");
}
public IActionResult OnPost(string action = "ERR", string target = "ERR")
{
KeyCloak keyCloak = new();
Common();
if (isDebug) Console.WriteLine("OnPost [{0}] [{1}]", action, target);
if (action == "selectclass")
{
// Get the groups for this user
List<KCGroups> myGroups = keyCloak.KeyCloakGetUsersGroups(KCUserID);
if (isDebug) Console.WriteLine("Student: {0}", KCUserID);
if (action == "selectclass") // Students can only be associated to one class
{
keyCloak.KeyCloakLeaveGroup(KCUserID, keyCloak.KeyCloakClassLess());
foreach (KCGroups group in myGroups)
if (group.name.Contains("-CSD-"))
{
keyCloak.KeyCloakLeaveGroup(KCUserID, group.id);
if (isDebug) Console.WriteLine("{0} leaving {1}:{2}", KCUserID, group.id, group.name);
}
}
keyCloak.KeyCloakJoinGroup(KCUserID, target);
}
if (action == "toggleclass")
{
if (isTeacher)
{
if (isDebug) Console.WriteLine("toggleclass: Teacher: [{0}] [{1}]", KCUserID, target);
keyCloak.KeyCloakToggleMembership(KCUserID, target);
}
else
{
if (isDebug) Console.WriteLine("MUST BE TEACHER TO DO THIS");
}
}
if (isTeacher)
{
if (action == "logout") return Redirect("https://auth.a.ucnit.eu/realms/UCNit/protocol/openid-connect/logout");
return Redirect("/");
}
return Redirect("https://auth.a.ucnit.eu/realms/UCNit/protocol/openid-connect/logout");
}
}
}