Skip to content

Commit eae4fb4

Browse files
TD-4702 Download self-assessment certificate link URL can be manipulated and able to download other user valid certificates
1 parent 7699681 commit eae4fb4

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,26 +1652,15 @@ public IActionResult CompetencySelfAssessmentCertificate(int CandidateAssessment
16521652
{
16531653
int supervisorDelegateId = 0;
16541654
var adminId = User.GetAdminId();
1655-
var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(CandidateAssessmentId);
1656-
if ((competencymaindata == null)|| ( competencymaindata.LearnerId != User.GetUserIdKnownNotNull()) || (CandidateAssessmentId == 0))
1655+
var userId = User.GetUserIdKnownNotNull();
1656+
var competencymaindata = selfAssessmentService.GetCompetencySelfAssessmentCertificate(CandidateAssessmentId);
1657+
if ((competencymaindata == null)|| ( competencymaindata.LearnerId != User.GetUserIdKnownNotNull()) || (CandidateAssessmentId == 0) || (userId != competencymaindata.LearnerId))
16571658
{
16581659
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
16591660
}
16601661
var delegateUserId = competencymaindata.LearnerId;
1661-
if (vocabulary == "Supervise")
1662-
{
1663-
var supervisorDelegateDetails = supervisorService.GetSupervisorDelegateDetailsForAdminId(adminId.Value);
1664-
var checkSupervisorDelegate = supervisorDelegateDetails.Where(x=> x.DelegateUserID == competencymaindata.LearnerId).FirstOrDefault();
1665-
if (checkSupervisorDelegate == null)
1666-
{
1667-
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
1668-
}
1669-
var supervisorDelegate = supervisorService.GetSupervisorDelegate(User.GetAdminIdKnownNotNull(), delegateUserId);
1670-
supervisorDelegateId = supervisorDelegate.ID;
1671-
}
1672-
var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList();
1662+
var recentResults = selfAssessmentService.GetMostRecentResults(competencymaindata.SelfAssessmentID, competencymaindata.LearnerDelegateAccountId).ToList();
16731663
var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId);
1674-
16751664
if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs))
16761665
{
16771666
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 401 });
@@ -1720,8 +1709,9 @@ public IActionResult CompetencySelfAssessmentCertificate(int CandidateAssessment
17201709
var model = new CompetencySelfAssessmentCertificateViewModel(competencymaindata, competencycount, vocabulary, accessors, activitySummaryCompetencySelfAssesment, sumQuestions, sumVerifiedCount, supervisorDelegateId);
17211710
return View("SelfAssessments/CompetencySelfAssessmentCertificate", model);
17221711
}
1723-
[Route("DownloadCertificate")]
1724-
public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
1712+
1713+
[Route("/LearningPortal/selfAssessments/{CandidateAssessmentId:int}/{vocabulary}/DownloadCertificate")]
1714+
public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId, string vocabulary)
17251715
{
17261716
PdfReportStatusResponse pdfReportStatusResponse = new PdfReportStatusResponse();
17271717
var delegateId = User.GetCandidateIdKnownNotNull();
@@ -1730,6 +1720,19 @@ public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
17301720
{
17311721
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
17321722
}
1723+
if (vocabulary == "Proficiencies")
1724+
{
1725+
var userId = User.GetUserIdKnownNotNull();
1726+
if(userId != competencymaindata.LearnerId ) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
1727+
1728+
}
1729+
if (vocabulary == "ProfileAssessment")
1730+
{
1731+
var adminId = User.GetAdminId();
1732+
var supervisorDelegateDetails = supervisorService.GetSupervisorDelegateDetailsForAdminId(adminId.Value);
1733+
var checkSupervisorDelegate = supervisorDelegateDetails.Where(x => x.DelegateUserID == competencymaindata.LearnerId).FirstOrDefault();
1734+
if (checkSupervisorDelegate == null) return RedirectToAction("StatusCode", "LearningSolutions", new { code = 403 });
1735+
}
17331736
var delegateUserId = competencymaindata.LearnerId;
17341737
var competencycount = selfAssessmentService.GetCompetencyCountSelfAssessmentCertificate(candidateAssessmentId);
17351738
var accessors = selfAssessmentService.GetAccessor(competencymaindata.SelfAssessmentID, competencymaindata.LearnerId);
@@ -1739,6 +1742,11 @@ public async Task<IActionResult> DownloadCertificate(int candidateAssessmentId)
17391742
var competencyIds = recentResults.Select(c => c.Id).ToArray();
17401743
var competencyFlags = frameworkService.GetSelectedCompetencyFlagsByCompetecyIds(competencyIds);
17411744
var competencies = CompetencyFilterHelper.FilterCompetencies(recentResults, competencyFlags, null);
1745+
var supervisorSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(competencymaindata.SelfAssessmentID, delegateUserId);
1746+
if (!CertificateHelper.CanViewCertificate(recentResults, supervisorSignOffs))
1747+
{
1748+
return RedirectToAction("StatusCode", "LearningSolutions", new { code = 401 });
1749+
}
17421750
foreach (var competency in competencies)
17431751
{
17441752
competency.QuestionLabel = assessment.QuestionLabel;

DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/CompetencySelfAssessmentCertificate.cshtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
<a class="nhsuk-button "
8181
asp-controller="LearningPortal"
8282
asp-route-candidateAssessmentId="@Model.CompetencySelfAssessmentCertificates.CandidateAssessmentID"
83+
asp-route-vocabulary="@Model.VocabPlural"
8384
asp-action="DownloadCertificate"
8485
role="button">
8586
Download certificate

0 commit comments

Comments
 (0)