. /** * Handles verifying the code for a certificate. * * @package mod_htmlcert * @copyright 2017 Mark Nelson , 2021 Klaus-Uwe Mitterer * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ // This file does not need require_login because capability to verify can be granted to guests, skip codechecker here. // @codingStandardsIgnoreLine require_once('../../config.php'); $contextid = optional_param('contextid', context_system::instance()->id, PARAM_INT); $code = optional_param('code', '', PARAM_ALPHANUM); // The code for the certificate we are verifying. $qrcode = optional_param('qrcode', false, PARAM_BOOL); $context = context::instance_by_id($contextid); // Set up the page. $pageurl = new moodle_url('/mod/htmlcert/verify_certificate.php', array('contextid' => $contextid)); if ($code) { $pageurl->param('code', $code); } // Ok, a certificate was specified. if ($context->contextlevel != CONTEXT_SYSTEM) { $cm = get_coursemodule_from_id('htmlcert', $context->instanceid, 0, false, MUST_EXIST); $course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST); $htmlcert = $DB->get_record('htmlcert', array('id' => $cm->instance), '*', MUST_EXIST); // Check if we are allowing anyone to verify, if so, no need to check login, or permissions. if (!$htmlcert->verifyany) { // Need to be logged in. require_login($course, false, $cm); // Ok, now check the user has the ability to verify certificates. require_capability('mod/htmlcert:verifycertificate', $context); } else { $PAGE->set_cm($cm, $course); } $title = $htmlcert->name; $heading = format_string($title); $checkallofsite = false; } else { $title = $SITE->fullname; $heading = $title; $checkallofsite = true; } \mod_htmlcert\page_helper::page_setup($pageurl, $context, $title); // Additional page setup. if ($context->contextlevel == CONTEXT_SYSTEM) { $PAGE->navbar->add(get_string('verifycertificate', 'htmlcert')); } if ($checkallofsite) { // If the 'verifyallcertificates' is not set and the user does not have the capability 'mod/htmlcert:verifyallcertificates' // then show them a message letting them know they can not proceed. $verifyallcertificates = get_config('htmlcert', 'verifyallcertificates'); $canverifyallcertificates = has_capability('mod/htmlcert:verifyallcertificates', $context); if (!$verifyallcertificates && !$canverifyallcertificates) { echo $OUTPUT->header(); echo $OUTPUT->heading($heading); echo $OUTPUT->notification(get_string('cannotverifyallcertificates', 'htmlcert')); echo $OUTPUT->footer(); exit(); } } // The form we are using to verify these codes. $form = new \mod_htmlcert\verify_certificate_form($pageurl); if ($code) { $result = new stdClass(); $result->issues = array(); // Ok, now check if the code is valid. $userfields = \mod_htmlcert\helper::get_all_user_name_fields('u'); $sql = "SELECT ci.id, u.id as userid, $userfields, co.id as courseid, co.fullname as coursefullname, c.id as certificateid, c.name as certificatename, c.verifyany FROM {htmlcert} c JOIN {htmlcert_issues} ci ON c.id = ci.htmlcertid JOIN {course} co ON c.course = co.id JOIN {user} u ON ci.userid = u.id WHERE ci.code = :code"; if ($checkallofsite) { // Only people with the capability to verify all the certificates can verify any. if (!$canverifyallcertificates) { $sql .= " AND c.verifyany = 1"; } $params = ['code' => $code]; } else { $sql .= " AND c.id = :htmlcertid"; $params = ['code' => $code, 'htmlcertid' => $htmlcert->id]; } // It is possible (though unlikely) that there is the same code for issued certificates. if ($issues = $DB->get_records_sql($sql, $params)) { $result->success = true; $result->issues = $issues; } else { // Can't find it, let's say it's not verified. $result->success = false; } } echo $OUTPUT->header(); echo $OUTPUT->heading($heading); // Don't show the form if we are coming from a QR code. if (!$qrcode) { echo $form->display(); } if (isset($result)) { $renderer = $PAGE->get_renderer('mod_htmlcert'); $result = new \mod_htmlcert\output\verify_certificate_results($result); echo $renderer->render($result); } echo $OUTPUT->footer();