From 37c42b4bc2f0c378b2d0ae221c1f4f64b1e0a277 Mon Sep 17 00:00:00 2001 From: Dan Marsden Date: Fri, 27 Jul 2018 21:43:35 +1200 Subject: [PATCH] Fixes #316 provide option to prevent sharing ip for this session without a timeframe. --- add_form.php | 10 ++++++---- lang/en/attendance.php | 2 +- locallib.php | 36 +++++++++++++++++++++++++++++++----- settings.php | 6 ++++-- update_form.php | 7 +++---- 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/add_form.php b/add_form.php index 67c3797..fe4bbed 100644 --- a/add_form.php +++ b/add_form.php @@ -253,18 +253,20 @@ class mod_attendance_add_form extends moodleform { $mform->hideif('subnetgrp', 'studentscanmark', 'notchecked'); $mform->hideif('subnet', 'usedefaultsubnet', 'checked'); + $mgroup3 = array(); - $mgroup3[] = & $mform->createElement('checkbox', 'preventsharedip', ''); + $options = attendance_get_sharedipoptions(); + $mgroup3[] = & $mform->createElement('select', 'preventsharedip', get_string('preventsharedip', 'attendance'), $options); $mgroup3[] = & $mform->createElement('text', 'preventsharediptime', get_string('preventsharediptime', 'attendance'), '', 'test'); - $mgroup3[] = & $mform->createElement('static', 'preventsharediptimedesc', '', - get_string('preventsharedipminutes', 'attendance')); $mform->addGroup($mgroup3, 'preventsharedgroup', get_string('preventsharedip', 'attendance'), array(' '), false); $mform->addHelpButton('preventsharedgroup', 'preventsharedip', 'attendance'); $mform->setAdvanced('preventsharedgroup'); + $mform->setType('preventsharedip', PARAM_INT); $mform->setType('preventsharediptime', PARAM_INT); $mform->hideif('preventsharedgroup', 'studentscanmark', 'notchecked'); - $mform->disabledIf('preventsharediptime', 'preventsharedip', 'notchecked'); + $mform->hideIf('preventsharediptime', 'preventsharedip', 'noteq', ATTENDANCE_SHAREDIP_MINUTES); + if (isset($pluginconfig->preventsharedip)) { $mform->setDefault('preventsharedip', $pluginconfig->preventsharedip); } diff --git a/lang/en/attendance.php b/lang/en/attendance.php index 88b5b78..88f4b4e 100644 --- a/lang/en/attendance.php +++ b/lang/en/attendance.php @@ -338,7 +338,6 @@ $string['preventsharedip'] = 'Prevent students sharing IP address'; $string['preventsharedip_help'] = 'Prevent students from using the same device (identified using IP address) to take attendance for other students.'; $string['preventsharediptime'] = 'Time to allow re-use of IP address (minutes)'; $string['preventsharediptime_help'] = 'Allow an IP address to be re-used for taking attendance in this session after this time has elapsed.'; -$string['preventsharedipminutes'] = '(minutes to release IP)'; $string['preventsharederror'] = 'Self-marking has been disabled for a session because this device appears to have been used to record attendance for another student.'; $string['priorto'] = 'The session date is prior to the course start date ({$a}) so that the new sessions scheduled before this date will be hidden (not accessible). You can change the course start date at any time (see course settings) in order to have access to earlier sessions.

Please change the session date or just click the "Add session" button again to confirm?'; $string['processingfile'] = 'Processing file'; @@ -428,6 +427,7 @@ $string['sessionupdated'] = 'Session successfully updated'; $string['set_by_student'] = 'Self-recorded'; $string['setallstatuses'] = 'Set status for all users'; $string['setallstatusesto'] = 'Set status for all users to «{$a}»'; +$string['setperiod'] = 'Specified time in minutes to release IP'; $string['settings'] = 'Settings'; $string['setunmarked'] = 'Automatically set when not marked'; $string['setunmarked_help'] = 'If enabled in the session, set this status if a student has not marked their own attendance.'; diff --git a/locallib.php b/locallib.php index d7acd12..98b9fb0 100644 --- a/locallib.php +++ b/locallib.php @@ -43,6 +43,10 @@ define('ATTENDANCE_AUTOMARK_DISABLED', 0); define('ATTENDANCE_AUTOMARK_ALL', 1); define('ATTENDANCE_AUTOMARK_CLOSE', 2); +define('ATTENDANCE_SHAREDIP_DISABLED', 0); +define('ATTENDANCE_SHAREDIP_MINUTES', 1); +define('ATTENDANCE_SHAREDIP_FORCE', 2); + // Max number of sessions available in the warnings set form to trigger warnings. define('ATTENDANCE_MAXWARNAFTER', 100); @@ -443,10 +447,18 @@ function attendance_can_student_mark($sess) { } // Check if another student has marked attendance from this IP address recently. if ($canmark && !empty($sess->preventsharedip)) { - $time = time() - ($sess->preventsharediptime * 60); - $sql = 'sessionid = ? AND studentid <> ? AND timetaken > ? AND ipaddress = ?'; - $params = array($sess->id, $USER->id, $time, getremoteaddr()); - $record = $DB->get_record_select('attendance_log', $sql, $params); + if ($sess->preventsharedip == ATTENDANCE_SHAREDIP_MINUTES) { + $time = time() - ($sess->preventsharediptime * 60); + $sql = 'sessionid = ? AND studentid <> ? AND timetaken > ? AND ipaddress = ?'; + $params = array($sess->id, $USER->id, $time, getremoteaddr()); + $record = $DB->get_record_select('attendance_log', $sql, $params); + } else { + // Assume ATTENDANCE_SHAREDIP_FORCED. + $sql = 'sessionid = ? AND studentid <> ? ipaddress = ?'; + $params = array($sess->id, $USER->id, getremoteaddr()); + $record = $DB->get_record_select('attendance_log', $sql, $params); + } + if (!empty($record)) { // Trigger an ip_shared event. $attendanceid = $DB->get_field('attendance_sessions', 'attendanceid', array('id' => $record->sessionid)); @@ -938,4 +950,18 @@ function attendance_get_automarkoptions() { } $options[ATTENDANCE_AUTOMARK_CLOSE] = get_string('automarkclose', 'attendance'); return $options; -} \ No newline at end of file +} + +/** + * Get available sharedip options. + * + * @return array + */ +function attendance_get_sharedipoptions() { + $options = array(); + $options[ATTENDANCE_SHAREDIP_DISABLED] = get_string('no'); + $options[ATTENDANCE_SHAREDIP_FORCE] = get_string('yes'); + $options[ATTENDANCE_SHAREDIP_MINUTES] = get_string('setperiod', 'attendance'); + + return $options; +} diff --git a/settings.php b/settings.php index 6d29f34..9148da6 100644 --- a/settings.php +++ b/settings.php @@ -125,8 +125,10 @@ if ($ADMIN->fulltree) { $settings->add(new admin_setting_configcheckbox('attendance/autoassignstatus', get_string('autoassignstatus', 'attendance'), '', 0)); - $settings->add(new admin_setting_configcheckbox('attendance/preventsharedip', - get_string('preventsharedip', 'attendance'), '', 0)); + $options = attendance_get_sharedipoptions(); + $settings->add(new admin_setting_configselect('attendance/preventsharedip', + get_string('preventsharedip', 'attendance'), + '', ATTENDANCE_SHAREDIP_DISABLED, $options)); $settings->add(new admin_setting_configtext('attendance/preventsharediptime', get_string('preventsharediptime', 'attendance'), get_string('preventsharediptime_help', 'attendance'), '', PARAM_RAW)); diff --git a/update_form.php b/update_form.php index 55d93eb..113f9cd 100644 --- a/update_form.php +++ b/update_form.php @@ -170,18 +170,17 @@ class mod_attendance_update_form extends moodleform { $mform->settype('automarkcompleted', PARAM_INT); $mgroup3 = array(); - $mgroup3[] = & $mform->createElement('checkbox', 'preventsharedip', ''); + $options = attendance_get_sharedipoptions(); + $mgroup3[] = & $mform->createElement('select', 'preventsharedip', get_string('preventsharedip', 'attendance'), $options); $mgroup3[] = & $mform->createElement('text', 'preventsharediptime', get_string('preventsharediptime', 'attendance'), '', 'test'); - $mgroup3[] = & $mform->createElement('static', 'preventsharediptimedesc', '', - get_string('preventsharedipminutes', 'attendance')); $mform->addGroup($mgroup3, 'preventsharedgroup', get_string('preventsharedip', 'attendance'), array(' '), false); $mform->addHelpButton('preventsharedgroup', 'preventsharedip', 'attendance'); $mform->setAdvanced('preventsharedgroup'); $mform->setType('preventsharediptime', PARAM_INT); $mform->hideif('preventsharedgroup', 'studentscanmark', 'notchecked'); - $mform->disabledIf('preventsharediptime', 'preventsharedip', 'notchecked'); + $mform->hideIf('preventsharediptime', 'preventsharedip', 'noteq', ATTENDANCE_SHAREDIP_MINUTES); } else { $mform->addElement('hidden', 'studentscanmark', '0'); $mform->settype('studentscanmark', PARAM_INT);