mirror of
https://github.com/LdesignMedia/moodle-availability_ipaddress.git
synced 2026-05-17 05:48:41 +02:00
Compare commits
48 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d56173f6b8 | ||
|
|
c9b5e6cb7d | ||
|
|
fcfa4eb773 | ||
|
|
b98a63e1f4 | ||
|
|
a836731b24 | ||
|
|
c2f5e7e22c | ||
|
|
761d643479 | ||
|
|
5ef0c811c0 | ||
|
|
6633439651 | ||
|
|
4b4fced58b | ||
|
|
8ae54193d2 | ||
|
|
26bbc1cbdb | ||
|
|
5d615ddb24 | ||
|
|
5e2566fbba | ||
|
|
96c93c4096 | ||
|
|
d302aa626a | ||
|
|
787dba81f0 | ||
|
|
f24ef270a5 | ||
|
|
0e7ec99338 | ||
|
|
3b489f3406 | ||
|
|
84ea4a9165 | ||
|
|
9d6f7e51b9 | ||
|
|
855f8fecaa | ||
|
|
30459042d7 | ||
|
|
a6b22c06e3 | ||
|
|
e44acd4a7f | ||
|
|
4754b1e03e | ||
|
|
54ac7002d8 | ||
|
|
5d25933dfb | ||
|
|
28f6d4603b | ||
|
|
527831df6b | ||
|
|
d41c96e035 | ||
|
|
29a4857d8a | ||
|
|
163ee678a5 | ||
|
|
c5a8b00380 | ||
|
|
cc43dbdf0b | ||
|
|
3ba695cb97 | ||
|
|
020dac34ba | ||
|
|
0468b49b6a | ||
|
|
aba5912e50 | ||
|
|
fbe446e53b | ||
|
|
e7e711b67b | ||
|
|
1785ee947a | ||
|
|
86dbd31b2e | ||
|
|
f1190518b8 | ||
|
|
8eb790f800 | ||
|
|
6c92077941 | ||
|
|
dc0a3aeb43 |
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
github: [MFreakNL]
|
||||
18
.github/workflows/ci.yml
vendored
Normal file
18
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# .github/workflows/ci.yml
|
||||
name: ci
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
uses: catalyst/catalyst-moodle-workflows/.github/workflows/ci.yml@main
|
||||
secrets:
|
||||
# Required if you plan to publish (uncomment the below)
|
||||
moodle_org_token: ${{ secrets.MOODLE_ORG_TOKEN }}
|
||||
with:
|
||||
# Grunt fails due to CSS styling, when needing an !important statement.
|
||||
disable_grunt: false
|
||||
disable_phpunit: true
|
||||
disable_release : false
|
||||
release_branches: main
|
||||
min_php : 7.4
|
||||
56
.travis.yml
56
.travis.yml
@@ -1,56 +0,0 @@
|
||||
language: php
|
||||
|
||||
# Workaround for fixing that Selenium server is not running and therefore javascript Behat tests are not working:
|
||||
# https://github.com/moodlerooms/moodle-plugin-ci/issues/70
|
||||
sudo: required
|
||||
|
||||
addons:
|
||||
firefox: "47.0.1"
|
||||
postgresql: "9.4"
|
||||
apt:
|
||||
packages:
|
||||
- openjdk-8-jre-headless
|
||||
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.composer/cache
|
||||
- $HOME/.npm
|
||||
|
||||
php:
|
||||
# PHP 5.6 gives errors because of the provider.php needs to be PHP7
|
||||
- 7.0
|
||||
- 7.1
|
||||
|
||||
env:
|
||||
global:
|
||||
- MOODLE_BRANCH=MOODLE_32_STABLE
|
||||
- MOODLE_BRANCH=MOODLE_35_STABLE
|
||||
- MOODLE_BRANCH=MOODLE_36_STABLE
|
||||
matrix:
|
||||
- DB=pgsql
|
||||
- DB=mysqli
|
||||
|
||||
before_install:
|
||||
- phpenv config-rm xdebug.ini
|
||||
- nvm install 8.9
|
||||
- nvm use 8.9
|
||||
- cd ../..
|
||||
- composer create-project -n --no-dev --prefer-dist moodlerooms/moodle-plugin-ci ci ^2
|
||||
- export PATH="$(cd ci/bin; pwd):$(cd ci/vendor/bin; pwd):$PATH"
|
||||
|
||||
install:
|
||||
- moodle-plugin-ci add-plugin moodlehq/moodle-local_moodlecheck
|
||||
- moodle-plugin-ci install
|
||||
|
||||
script:
|
||||
- php moodle/local/moodlecheck/cli/moodlecheck.php --path=availability/condition/ipaddress --format=text
|
||||
- moodle-plugin-ci phplint
|
||||
- moodle-plugin-ci phpcpd
|
||||
- moodle-plugin-ci phpmd
|
||||
- moodle-plugin-ci codechecker
|
||||
- moodle-plugin-ci validate
|
||||
- moodle-plugin-ci savepoints
|
||||
- moodle-plugin-ci mustache
|
||||
- moodle-plugin-ci grunt
|
||||
- moodle-plugin-ci phpunit
|
||||
- moodle-plugin-ci behat
|
||||
44
README.md
44
README.md
@@ -1,14 +1,24 @@
|
||||
## Moodle - availability ip address plugin
|
||||
Restrict access to any activity by ip-address. Most activities don't support this feature.
|
||||
Enhance activity security by restricting access based on IP address. This plugin allows you to control the availability of any chosen
|
||||
activity, making it accessible only to users from specified IP addresses.
|
||||
|
||||
## Author
|
||||

|
||||

|
||||
|
||||
* Author: Luuk Verhoeven, [MFreak.nl](https://MFreak.nl/)
|
||||
* Min. required: Moodle 3.2.x
|
||||
* Supports PHP: 7.0 | 7.1
|
||||
* Author: Luuk Verhoeven, [ldesignmedia.nl](https://ldesignmedia.nl/)
|
||||
* Min. required: Moodle 4.0
|
||||
* Supports PHP: 7.4
|
||||
|
||||
[](https://travis-ci.org/MFreakNL/moodle-availability_ipaddress)
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||

|
||||

|
||||

|
||||
|
||||
## List of features
|
||||
- Supports comma separate list of ip-addresses
|
||||
@@ -22,9 +32,21 @@ Restrict access to any activity by ip-address. Most activities don't support thi
|
||||
3. Go to Site Administrator > Notification
|
||||
4. Install the plugin
|
||||
|
||||
## Usage
|
||||
|
||||
1. Add or edit an activity in a Moodle course.
|
||||
2. Go to the section "Restrict access"
|
||||
3. Click IP address in the modal
|
||||
4. There's a new input field that supports a list of comma separated ip address e.g. 127.0.0.1, 192.168.1.0/24
|
||||
1. The users with matching ip addresses can view the activity.
|
||||
5. Save the activity
|
||||
|
||||
## TODO
|
||||
- Behat tests ip validation
|
||||
|
||||
## Security
|
||||
|
||||
If you discover any security related issues, please email [luuk@MFreak.nl](mailto:luuk@MFreak.nl) instead of using the issue tracker.
|
||||
If you discover any security related issues, please email [luuk@ldesignmedia.nl](mailto:luuk@ldesignmedia.nl) instead of using the issue tracker.
|
||||
|
||||
## License
|
||||
|
||||
@@ -33,3 +55,11 @@ The GNU GENERAL PUBLIC LICENSE. Please see [License File](LICENSE) for more info
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome and will be fully credited. We accept contributions via Pull Requests on Github.
|
||||
|
||||
## Changelog
|
||||
|
||||
- 2025040400 Tested on Moodle 4.5
|
||||
- 2024072000 Tested on Moodle 4.4
|
||||
- 2022021100 Thanks for adding ip-range support @[juacas](https://github.com/juacas)
|
||||
- 2022052800 Fixed the [issue 6](https://github.com/ldesignmediaNL/moodle-availability_ipaddress/issues/6) @[hamzatamyachte](https://github.com/hamzatamyachte)
|
||||
- 2022052801 Test in Moodle 4.0 @[hamzatamyachte](https://github.com/hamzatamyachte)
|
||||
|
||||
@@ -28,8 +28,6 @@ namespace availability_ipaddress;
|
||||
|
||||
use core_availability\info;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
/**
|
||||
* Class condition
|
||||
*
|
||||
@@ -42,7 +40,7 @@ class condition extends \core_availability\condition {
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $ipaddresses = '';
|
||||
protected string $ipaddresses = '';
|
||||
|
||||
/**
|
||||
* condition constructor.
|
||||
@@ -79,18 +77,18 @@ class condition extends \core_availability\condition {
|
||||
*
|
||||
* @return bool True if available
|
||||
*/
|
||||
public function is_available($not, info $info, $grabthelot, $userid) {
|
||||
public function is_available($not, info $info, $grabthelot, $userid): bool {
|
||||
|
||||
if (empty($this->ipaddresses)) {
|
||||
return true;
|
||||
return !$not;
|
||||
}
|
||||
|
||||
// Check if ip-address matches.
|
||||
if (address_in_subnet(getremoteaddr(), trim($this->ipaddresses))) {
|
||||
return true;
|
||||
return !$not;
|
||||
}
|
||||
|
||||
return false;
|
||||
return $not;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -114,12 +112,10 @@ class condition extends \core_availability\condition {
|
||||
* @param bool $not Set true if we are inverting the condition
|
||||
* @param info $info Item we're checking
|
||||
*
|
||||
* @return string Information string (for admin) about all restrictions on
|
||||
* this item
|
||||
* @throws \coding_exception
|
||||
* @return string Information string (for admin) about all restrictions on this item
|
||||
*/
|
||||
public function get_description($full, $not, info $info) {
|
||||
return get_string('require_condition', 'availability_ipaddress');
|
||||
public function get_description($full, $not, info $info): string {
|
||||
return get_string('require_condition', 'availability_ipaddress', getremoteaddr());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -128,7 +124,7 @@ class condition extends \core_availability\condition {
|
||||
*
|
||||
* @return string Text representation of parameters
|
||||
*/
|
||||
protected function get_debug_string() {
|
||||
protected function get_debug_string(): string {
|
||||
return !empty($this->ipaddresses) ? 'ipaddresses ON' : 'ipaddresses OFF';
|
||||
}
|
||||
|
||||
@@ -142,41 +138,23 @@ class condition extends \core_availability\condition {
|
||||
*
|
||||
* @return \stdClass Object representing condition
|
||||
*/
|
||||
public static function get_json($ipaddresses) {
|
||||
return (object)[
|
||||
public static function get_json(string $ipaddresses): \stdClass {
|
||||
return (object) [
|
||||
'type' => 'ipaddress',
|
||||
'ipaddresses' => $ipaddresses,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if ip-address is valid
|
||||
*
|
||||
* @param string $ipaddresses
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function is_valid_ipaddresses($ipaddresses) {
|
||||
$ipaddresses = implode(',', $ipaddresses);
|
||||
foreach ($ipaddresses as $ipaddress) {
|
||||
if (!filter_var($ipaddress, FILTER_VALIDATE_IP)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves tree data back to a structure object.
|
||||
*
|
||||
* @return \stdClass Structure object (ready to be made into JSON format)
|
||||
*/
|
||||
public function save() {
|
||||
return (object)[
|
||||
public function save(): \stdClass {
|
||||
return (object) [
|
||||
'type' => 'ipaddress',
|
||||
'ipaddresses' => $this->ipaddresses,
|
||||
];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -25,7 +25,6 @@
|
||||
**/
|
||||
|
||||
namespace availability_ipaddress;
|
||||
defined('MOODLE_INTERNAL') || die;
|
||||
|
||||
/**
|
||||
* Class frontend
|
||||
@@ -41,24 +40,11 @@ class frontend extends \core_availability\frontend {
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function get_javascript_strings() {
|
||||
protected function get_javascript_strings(): array {
|
||||
return [
|
||||
'js:ipaddress',
|
||||
'error_ipaddress',
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Decides whether this plugin should be available in a given course. The
|
||||
* plugin can do this depending on course or system settings.
|
||||
*
|
||||
* @param \stdClass $course Course object
|
||||
* @param \cm_info $cm Course-module currently being edited (null if none)
|
||||
* @param \section_info $section Section currently being edited (null if none)
|
||||
*
|
||||
* @return bool True if there are completion criteria
|
||||
*/
|
||||
protected function allow_add($course, \cm_info $cm = null, \section_info $section = null) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
47
classes/privacy/provider.php
Normal file
47
classes/privacy/provider.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Privacy Subsystem implementation for availability_ipaddress.
|
||||
*
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*
|
||||
* @package availability_ipaddress
|
||||
* @copyright 2019-05-14 Mfreak.nl | LdesignMedia.nl - Luuk Verhoeven
|
||||
* @author Luuk Verhoeven
|
||||
**/
|
||||
|
||||
namespace availability_ipaddress\privacy;
|
||||
|
||||
/**
|
||||
* Privacy Subsystem for availability_ipaddress implementing null_provider.
|
||||
*
|
||||
* @copyright 2019-05-14 Mfreak.nl | LdesignMedia.nl - Luuk Verhoeven
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class provider implements \core_privacy\local\metadata\null_provider {
|
||||
|
||||
/**
|
||||
* Get the language string identifier with the component's language
|
||||
* file to explain why this plugin stores no data.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function get_reason(): string {
|
||||
return 'privacy:metadata';
|
||||
}
|
||||
|
||||
}
|
||||
6
environment.xml
Normal file
6
environment.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<COMPATIBILITY_MATRIX>
|
||||
<PLUGIN name="availability_ipaddress">
|
||||
<PHP version="7.4" level="required"/>
|
||||
</PLUGIN>
|
||||
</COMPATIBILITY_MATRIX>
|
||||
@@ -23,13 +23,17 @@
|
||||
* @copyright 2019-05-14 Mfreak.nl | LdesignMedia.nl - Luuk Verhoeven
|
||||
* @author Luuk Verhoeven
|
||||
**/
|
||||
|
||||
$string['pluginname'] = 'IP address';
|
||||
$string['title'] = 'IP address';
|
||||
$string['description'] = 'Restrict access by ip-address or subnet';
|
||||
$string['require_condition'] = 'Matching ip-address/subnet';
|
||||
$string['title'] = 'IP address';
|
||||
$string['require_condition'] = 'Matching ip-address/subnet. (Your IP:{$a})';
|
||||
|
||||
// Errors.
|
||||
$string['error_ipaddress'] = 'Incorrect ip-address/subnet format';
|
||||
|
||||
// Javascript strings.
|
||||
$string['js:ipaddress'] = 'Require network address';
|
||||
|
||||
// Errors.
|
||||
$string['error_ipaddress'] = 'Incorrect ip-address/subnet format';
|
||||
// Privacy provider.
|
||||
$string['privacy:metadata'] = 'The restriction by activity ipaddress plugin does not store any personal data.';
|
||||
|
||||
@@ -27,7 +27,8 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->component = 'availability_ipaddress';
|
||||
$plugin->version = 2019051500;
|
||||
$plugin->release = 'v3.5.0';
|
||||
$plugin->version = 2025040401;
|
||||
$plugin->release = '4.5.1';
|
||||
$plugin->requires = 2016120500;
|
||||
$plugin->maturity = MATURITY_BETA;
|
||||
$plugin->maturity = MATURITY_STABLE;
|
||||
$plugin->supported = [400, 405];
|
||||
|
||||
@@ -19,19 +19,17 @@ M.availability_ipaddress = M.availability_ipaddress || {};
|
||||
// Advanced ip-address regex for validating.
|
||||
M.availability_ipaddress.v4 = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]' +
|
||||
'[0-9]|[1-9][0-9]|[0-9])){3}';
|
||||
M.availability_ipaddress.v6 = '((?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:)|(?:[0-9a-fA-F]{1,4}:){6}(?:(?:25[0-5]|2[0-4]' +
|
||||
'[0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|:[0-9a-fA-F]{1,4}|:)' +
|
||||
'|(?:[0-9a-fA-F]{1,4}:){5}(?::(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]' +
|
||||
'|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,2}|:)|(?:[0-9a-fA-F]{1,4}:){4}(?:' +
|
||||
'(:[0-9a-fA-F]{1,4}){0,1}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]' +
|
||||
'|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,3}|:)|(?:[0-9a-fA-F]{1,4}:){3}(?:(:[0-9a-fA-F]{1,4}){0,2}:(?:25[0-5]|2[0-4]' +
|
||||
'[0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|' +
|
||||
'(:[0-9a-fA-F]{1,4}){1,4}|:)|(?:[0-9a-fA-F]{1,4}:){2}(?:(:[0-9a-fA-F]{1,4}){0,3}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|' +
|
||||
'[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,5}|:)|' +
|
||||
'(?:[0-9a-fA-F]{1,4}:){1}(?:(:[0-9a-fA-F]{1,4}){0,4}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.' +
|
||||
'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,6}|:)|(?::((?::[0-9a-fA-F]{1,4}){0,5}' +
|
||||
':(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|' +
|
||||
'(?::[0-9a-fA-F]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?';
|
||||
M.availability_ipaddress.v6 = "^((?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]" +
|
||||
"\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}" +
|
||||
"(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4})" +
|
||||
"{1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(:[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]" +
|
||||
"|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(:[a-fA-F\\d]{1,4}){0,2}:" +
|
||||
"(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,4}|:)|" +
|
||||
"(?:[a-fA-F\\d]{1,4}:){2}(?:(:[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]" +
|
||||
"\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(:[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]" +
|
||||
"|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,6}|:)|(?::" +
|
||||
"((?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}" +
|
||||
"|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?";
|
||||
|
||||
/**
|
||||
* @class M.availability_ipaddress.form
|
||||
@@ -47,7 +45,7 @@ M.availability_ipaddress.form = Y.Object(M.core_availability.plugin);
|
||||
*/
|
||||
M.availability_ipaddress.form.initInner = function() {
|
||||
"use strict";
|
||||
Y.log('M.availability_ipaddress');
|
||||
Y.log('M.availability_ipaddress 1.10');
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -55,27 +53,29 @@ M.availability_ipaddress.form.initInner = function() {
|
||||
* dot or comma).
|
||||
*
|
||||
* @method getValue
|
||||
* @param {string} field
|
||||
* @param {object} node
|
||||
* @return {Number|String} Value of field as number or string if not valid
|
||||
*/
|
||||
M.availability_ipaddress.form.getValue = function(field, node) {
|
||||
"use strict";
|
||||
// Get field value.
|
||||
var value = node.one('input[name=' + field + ']').get('value');
|
||||
Y.log('ip_address:', value);
|
||||
Y.log('ip_address:' + value);
|
||||
|
||||
// If it is not a valid positive number, return false.
|
||||
if (M.availability_ipaddress.validate_ipaddress(value)) {
|
||||
if (M.availability_ipaddress.validateIpaddress(value)) {
|
||||
Y.log('Valid ip-address');
|
||||
return value;
|
||||
}
|
||||
|
||||
Y.log('getValue failed:', value);
|
||||
return value;
|
||||
};
|
||||
|
||||
/**
|
||||
* getNode
|
||||
* @param json
|
||||
* Get node
|
||||
*
|
||||
* @param {object} json
|
||||
* @returns {*}
|
||||
*/
|
||||
M.availability_ipaddress.form.getNode = function(json) {
|
||||
@@ -112,38 +112,65 @@ M.availability_ipaddress.form.getNode = function(json) {
|
||||
};
|
||||
|
||||
/**
|
||||
* validate_ipaddress
|
||||
* Validate ipaddresses
|
||||
*
|
||||
* @param {string[]} ipaddresses
|
||||
* @returns {boolean}
|
||||
*/
|
||||
M.availability_ipaddress.validate_ipaddress = function(ipaddresses) {
|
||||
M.availability_ipaddress.validateIpaddress = function(ipaddresses) {
|
||||
'use strict';
|
||||
|
||||
Y.log(ipaddresses);
|
||||
ipaddresses = ipaddresses.split(',');
|
||||
for (var i in ipaddresses) {
|
||||
|
||||
// Test normal ip format.
|
||||
if (new RegExp("(?:".concat(M.availability_ipaddress.v4, ")|(?:").concat(M.availability_ipaddress.v6, ")"), "g")
|
||||
// Strict ipv4 check.
|
||||
if (new RegExp(/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/gm)
|
||||
.test(ipaddresses[i])) {
|
||||
Y.log('Correct ipv4');
|
||||
continue;
|
||||
}
|
||||
|
||||
var ipv4Regex = new RegExp(
|
||||
'^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)' +
|
||||
'(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}-' +
|
||||
'([0-1]?[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]){1}$',
|
||||
'gm'
|
||||
);
|
||||
|
||||
if (ipv4Regex.test(ipaddresses[i])) {
|
||||
Y.log('Correct ipv4 range.');
|
||||
continue;
|
||||
}
|
||||
|
||||
if (new RegExp(M.availability_ipaddress.v6)
|
||||
.test(ipaddresses[i])) {
|
||||
Y.log('Correct ipv6');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Test subnet with a regex.
|
||||
if (new RegExp("(?:".concat(M.availability_ipaddress.v4 + "\\/(3[0-2]|[12]?[0-9])", ")|(?:")
|
||||
.concat(M.availability_ipaddress.v6 + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])", ")"), "g")
|
||||
if (new RegExp("^(?:".concat(M.availability_ipaddress.v4 + "\\/(3[0-2]|[12]?[0-9])|(1\\*)", ")|(?:")
|
||||
.concat(M.availability_ipaddress.v6 + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])", ")?\\/gm"))
|
||||
.test(ipaddresses[i])) {
|
||||
Y.log('Correct subnet');
|
||||
continue;
|
||||
}
|
||||
|
||||
Y.log('Incorrect ip', ipaddresses[i]);
|
||||
Y.log('Incorrect ip');
|
||||
return false;
|
||||
}
|
||||
|
||||
Y.log('Valid ipaddresses', ipaddresses);
|
||||
Y.log('Valid ipaddresses');
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* FillValue
|
||||
*
|
||||
* @param {object} value
|
||||
* @param {object} node
|
||||
*/
|
||||
M.availability_ipaddress.form.fillValue = function(value, node) {
|
||||
// This function gets passed the node (from above) and a value
|
||||
// object. Within that object, it must set up the correct values
|
||||
@@ -153,15 +180,21 @@ M.availability_ipaddress.form.fillValue = function(value, node) {
|
||||
value.ipaddresses = this.getValue('ipaddresses', node);
|
||||
};
|
||||
|
||||
/**
|
||||
* FillErrors
|
||||
* @param {object} errors
|
||||
* @param {object} node
|
||||
*/
|
||||
M.availability_ipaddress.form.fillErrors = function(errors, node) {
|
||||
"use strict";
|
||||
var value = {};
|
||||
this.fillValue(value, node);
|
||||
|
||||
// Basic ipaddresses checks.
|
||||
if (M.availability_ipaddress.validate_ipaddress(value.ipaddresses) === false) {
|
||||
if (M.availability_ipaddress.validateIpaddress(value.ipaddresses) === false) {
|
||||
errors.push('availability_ipaddress:error_ipaddress');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}, '@VERSION@', {"requires": ["base", "node", "event", "moodle-core_availability-form"]});
|
||||
|
||||
@@ -1 +1 @@
|
||||
YUI.add("moodle-availability_ipaddress-form",function(e,t){M.availability_ipaddress=M.availability_ipaddress||{},M.availability_ipaddress.v4="(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}",M.availability_ipaddress.v6="((?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:)|(?:[0-9a-fA-F]{1,4}:){6}(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|:[0-9a-fA-F]{1,4}|:)|(?:[0-9a-fA-F]{1,4}:){5}(?::(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,2}|:)|(?:[0-9a-fA-F]{1,4}:){4}(?:(:[0-9a-fA-F]{1,4}){0,1}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,3}|:)|(?:[0-9a-fA-F]{1,4}:){3}(?:(:[0-9a-fA-F]{1,4}){0,2}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,4}|:)|(?:[0-9a-fA-F]{1,4}:){2}(?:(:[0-9a-fA-F]{1,4}){0,3}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,5}|:)|(?:[0-9a-fA-F]{1,4}:){1}(?:(:[0-9a-fA-F]{1,4}){0,4}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,6}|:)|(?::((?::[0-9a-fA-F]{1,4}){0,5}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(?::[0-9a-fA-F]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?",M.availability_ipaddress.form=e.Object(M.core_availability.plugin),M.availability_ipaddress.form.initInner=function(){"use strict";},M.availability_ipaddress.form.getValue=function(e,t){"use strict";var n=t.one("input[name="+e+"]").get("value");return M.availability_ipaddress.validate_ipaddress(n)?n:n},M.availability_ipaddress.form.getNode=function(t){"use strict";var n,r,i,s;return s="ipaddresses"+M.availability_ipaddress.form.instId,M.availability_ipaddress.form.instId+=1,n="",n+='<span class="availability-group"><label for="'+s+'"><span class="p-r-1">'+M.util.get_string("title","availability_ipaddress")+" </span></label>",n+='<input type="text" placeholder="192.168.178.1,231.54.211.0/20,231.3.56.211" name="ipaddresses" id="'+s+'">',r=e.Node.create('<span class="form-inline">'+n+"</span>"),t.ipaddresses!==undefined&&r.one("input[name=ipaddresses]").set("value",t.ipaddresses),M.availability_ipaddress.form.addedEvents||(M.availability_ipaddress.form.addedEvents=!0,i=e.one(".availability-field"),i.delegate("valuechange",function(){M.core_availability.form.update()},".availability_ipaddress input[name=ipaddresses]")),r},M.availability_ipaddress.validate_ipaddress=function(e){"use strict";e=e.split(",");for(var t in e){if((new RegExp("(?:".concat(M.availability_ipaddress.v4,")|(?:").concat(M.availability_ipaddress.v6,")"),"g")).test(e[t]))continue;if((new RegExp("(?:".concat(M.availability_ipaddress.v4+"\\/(3[0-2]|[12]?[0-9])",")|(?:").concat(M.availability_ipaddress.v6+"\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])",")"),"g")).test(e[t]))continue;return!1}return!0},M.availability_ipaddress.form.fillValue=function(e,t){e.ipaddresses=this.getValue("ipaddresses",t)},M.availability_ipaddress.form.fillErrors=function(e,t){"use strict";var n={};this.fillValue(n,t),M.availability_ipaddress.validate_ipaddress(n.ipaddresses)===!1&&e.push("availability_ipaddress:error_ipaddress")}},"@VERSION@",{requires:["base","node","event","moodle-core_availability-form"]});
|
||||
YUI.add("moodle-availability_ipaddress-form",function(e,d){M.availability_ipaddress=M.availability_ipaddress||{},M.availability_ipaddress.v4="(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}",M.availability_ipaddress.v6="^((?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(:[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(:[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,4}|:)|(?:[a-fA-F\\d]{1,4}:){2}(?:(:[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(:[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,6}|:)|(?::((?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?",M.availability_ipaddress.form=e.Object(M.core_availability.plugin),M.availability_ipaddress.form.initInner=function(){},M.availability_ipaddress.form.getValue=function(d,a){"use strict";d=a.one("input[name="+d+"]").get("value");return M.availability_ipaddress.validateIpaddress(d),d},M.availability_ipaddress.form.getNode=function(d){"use strict";var a,i="ipaddresses"+M.availability_ipaddress.form.instId;return M.availability_ipaddress.form.instId+=1,a="",a+='<span class="availability-group"><label for="'+i+'"><span class="p-r-1">'+M.util.get_string("title","availability_ipaddress")+" </span></label>",i=e.Node.create('<span class="form-inline">'+(a+='<input type="text" placeholder="192.168.178.1,231.54.211.0/20,231.3.56.211" name="ipaddresses" id="'+i+'">')+"</span>"),d.ipaddresses!==undefined&&i.one("input[name=ipaddresses]").set("value",d.ipaddresses),M.availability_ipaddress.form.addedEvents||(M.availability_ipaddress.form.addedEvents=!0,e.one(".availability-field").delegate("valuechange",function(){M.core_availability.form.update()},".availability_ipaddress input[name=ipaddresses]")),i},M.availability_ipaddress.validateIpaddress=function(d){"use strict";for(var a in d=d.split(","))if(!(new RegExp(/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/gm).test(d[a])||new RegExp("^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}-([0-1]?[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]){1}$","gm").test(d[a])||new RegExp(M.availability_ipaddress.v6).test(d[a])||new RegExp("^(?:".concat(M.availability_ipaddress.v4+"\\/(3[0-2]|[12]?[0-9])|(1\\*)",")|(?:").concat(M.availability_ipaddress.v6+"\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])",")?\\/gm")).test(d[a])))return!1;return!0},M.availability_ipaddress.form.fillValue=function(d,a){d.ipaddresses=this.getValue("ipaddresses",a)},M.availability_ipaddress.form.fillErrors=function(d,a){"use strict";var i={};this.fillValue(i,a),!1===M.availability_ipaddress.validateIpaddress(i.ipaddresses)&&d.push("availability_ipaddress:error_ipaddress")}},"@VERSION@",{requires:["base","node","event","moodle-core_availability-form"]});
|
||||
@@ -19,19 +19,17 @@ M.availability_ipaddress = M.availability_ipaddress || {};
|
||||
// Advanced ip-address regex for validating.
|
||||
M.availability_ipaddress.v4 = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]' +
|
||||
'[0-9]|[1-9][0-9]|[0-9])){3}';
|
||||
M.availability_ipaddress.v6 = '((?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:)|(?:[0-9a-fA-F]{1,4}:){6}(?:(?:25[0-5]|2[0-4]' +
|
||||
'[0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|:[0-9a-fA-F]{1,4}|:)' +
|
||||
'|(?:[0-9a-fA-F]{1,4}:){5}(?::(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]' +
|
||||
'|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,2}|:)|(?:[0-9a-fA-F]{1,4}:){4}(?:' +
|
||||
'(:[0-9a-fA-F]{1,4}){0,1}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]' +
|
||||
'|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,3}|:)|(?:[0-9a-fA-F]{1,4}:){3}(?:(:[0-9a-fA-F]{1,4}){0,2}:(?:25[0-5]|2[0-4]' +
|
||||
'[0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|' +
|
||||
'(:[0-9a-fA-F]{1,4}){1,4}|:)|(?:[0-9a-fA-F]{1,4}:){2}(?:(:[0-9a-fA-F]{1,4}){0,3}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|' +
|
||||
'[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,5}|:)|' +
|
||||
'(?:[0-9a-fA-F]{1,4}:){1}(?:(:[0-9a-fA-F]{1,4}){0,4}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.' +
|
||||
'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,6}|:)|(?::((?::[0-9a-fA-F]{1,4}){0,5}' +
|
||||
':(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|' +
|
||||
'(?::[0-9a-fA-F]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?';
|
||||
M.availability_ipaddress.v6 = "^((?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]" +
|
||||
"\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}" +
|
||||
"(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4})" +
|
||||
"{1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(:[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]" +
|
||||
"|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(:[a-fA-F\\d]{1,4}){0,2}:" +
|
||||
"(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,4}|:)|" +
|
||||
"(?:[a-fA-F\\d]{1,4}:){2}(?:(:[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]" +
|
||||
"\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(:[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]" +
|
||||
"|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,6}|:)|(?::" +
|
||||
"((?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}" +
|
||||
"|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?";
|
||||
|
||||
/**
|
||||
* @class M.availability_ipaddress.form
|
||||
@@ -54,6 +52,8 @@ M.availability_ipaddress.form.initInner = function() {
|
||||
* dot or comma).
|
||||
*
|
||||
* @method getValue
|
||||
* @param {string} field
|
||||
* @param {object} node
|
||||
* @return {Number|String} Value of field as number or string if not valid
|
||||
*/
|
||||
M.availability_ipaddress.form.getValue = function(field, node) {
|
||||
@@ -62,7 +62,7 @@ M.availability_ipaddress.form.getValue = function(field, node) {
|
||||
var value = node.one('input[name=' + field + ']').get('value');
|
||||
|
||||
// If it is not a valid positive number, return false.
|
||||
if (M.availability_ipaddress.validate_ipaddress(value)) {
|
||||
if (M.availability_ipaddress.validateIpaddress(value)) {
|
||||
return value;
|
||||
}
|
||||
|
||||
@@ -70,8 +70,9 @@ M.availability_ipaddress.form.getValue = function(field, node) {
|
||||
};
|
||||
|
||||
/**
|
||||
* getNode
|
||||
* @param json
|
||||
* Get node
|
||||
*
|
||||
* @param {object} json
|
||||
* @returns {*}
|
||||
*/
|
||||
M.availability_ipaddress.form.getNode = function(json) {
|
||||
@@ -108,26 +109,42 @@ M.availability_ipaddress.form.getNode = function(json) {
|
||||
};
|
||||
|
||||
/**
|
||||
* validate_ipaddress
|
||||
* Validate ipaddresses
|
||||
*
|
||||
* @param {string[]} ipaddresses
|
||||
* @returns {boolean}
|
||||
*/
|
||||
M.availability_ipaddress.validate_ipaddress = function(ipaddresses) {
|
||||
M.availability_ipaddress.validateIpaddress = function(ipaddresses) {
|
||||
'use strict';
|
||||
|
||||
ipaddresses = ipaddresses.split(',');
|
||||
for (var i in ipaddresses) {
|
||||
|
||||
// Test normal ip format.
|
||||
if (new RegExp("(?:".concat(M.availability_ipaddress.v4, ")|(?:").concat(M.availability_ipaddress.v6, ")"), "g")
|
||||
// Strict ipv4 check.
|
||||
if (new RegExp(/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/gm)
|
||||
.test(ipaddresses[i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var ipv4Regex = new RegExp(
|
||||
'^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)' +
|
||||
'(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}-' +
|
||||
'([0-1]?[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]){1}$',
|
||||
'gm'
|
||||
);
|
||||
|
||||
if (ipv4Regex.test(ipaddresses[i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (new RegExp(M.availability_ipaddress.v6)
|
||||
.test(ipaddresses[i])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Test subnet with a regex.
|
||||
if (new RegExp("(?:".concat(M.availability_ipaddress.v4 + "\\/(3[0-2]|[12]?[0-9])", ")|(?:")
|
||||
.concat(M.availability_ipaddress.v6 + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])", ")"), "g")
|
||||
if (new RegExp("^(?:".concat(M.availability_ipaddress.v4 + "\\/(3[0-2]|[12]?[0-9])|(1\\*)", ")|(?:")
|
||||
.concat(M.availability_ipaddress.v6 + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])", ")?\\/gm"))
|
||||
.test(ipaddresses[i])) {
|
||||
continue;
|
||||
}
|
||||
@@ -138,6 +155,12 @@ M.availability_ipaddress.validate_ipaddress = function(ipaddresses) {
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* FillValue
|
||||
*
|
||||
* @param {object} value
|
||||
* @param {object} node
|
||||
*/
|
||||
M.availability_ipaddress.form.fillValue = function(value, node) {
|
||||
// This function gets passed the node (from above) and a value
|
||||
// object. Within that object, it must set up the correct values
|
||||
@@ -147,15 +170,21 @@ M.availability_ipaddress.form.fillValue = function(value, node) {
|
||||
value.ipaddresses = this.getValue('ipaddresses', node);
|
||||
};
|
||||
|
||||
/**
|
||||
* FillErrors
|
||||
* @param {object} errors
|
||||
* @param {object} node
|
||||
*/
|
||||
M.availability_ipaddress.form.fillErrors = function(errors, node) {
|
||||
"use strict";
|
||||
var value = {};
|
||||
this.fillValue(value, node);
|
||||
|
||||
// Basic ipaddresses checks.
|
||||
if (M.availability_ipaddress.validate_ipaddress(value.ipaddresses) === false) {
|
||||
if (M.availability_ipaddress.validateIpaddress(value.ipaddresses) === false) {
|
||||
errors.push('availability_ipaddress:error_ipaddress');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
}, '@VERSION@', {"requires": ["base", "node", "event", "moodle-core_availability-form"]});
|
||||
|
||||
88
yui/src/form/js/form.js
vendored
88
yui/src/form/js/form.js
vendored
@@ -17,19 +17,17 @@ M.availability_ipaddress = M.availability_ipaddress || {};
|
||||
// Advanced ip-address regex for validating.
|
||||
M.availability_ipaddress.v4 = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9]' +
|
||||
'[0-9]|[1-9][0-9]|[0-9])){3}';
|
||||
M.availability_ipaddress.v6 = '((?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:)|(?:[0-9a-fA-F]{1,4}:){6}(?:(?:25[0-5]|2[0-4]' +
|
||||
'[0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|:[0-9a-fA-F]{1,4}|:)' +
|
||||
'|(?:[0-9a-fA-F]{1,4}:){5}(?::(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]' +
|
||||
'|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,2}|:)|(?:[0-9a-fA-F]{1,4}:){4}(?:' +
|
||||
'(:[0-9a-fA-F]{1,4}){0,1}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]' +
|
||||
'|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,3}|:)|(?:[0-9a-fA-F]{1,4}:){3}(?:(:[0-9a-fA-F]{1,4}){0,2}:(?:25[0-5]|2[0-4]' +
|
||||
'[0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|' +
|
||||
'(:[0-9a-fA-F]{1,4}){1,4}|:)|(?:[0-9a-fA-F]{1,4}:){2}(?:(:[0-9a-fA-F]{1,4}){0,3}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|' +
|
||||
'[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,5}|:)|' +
|
||||
'(?:[0-9a-fA-F]{1,4}:){1}(?:(:[0-9a-fA-F]{1,4}){0,4}:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.' +
|
||||
'(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|(:[0-9a-fA-F]{1,4}){1,6}|:)|(?::((?::[0-9a-fA-F]{1,4}){0,5}' +
|
||||
':(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|' +
|
||||
'(?::[0-9a-fA-F]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?';
|
||||
M.availability_ipaddress.v6 = "^((?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]" +
|
||||
"\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}" +
|
||||
"(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4})" +
|
||||
"{1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(:[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]" +
|
||||
"|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(:[a-fA-F\\d]{1,4}){0,2}:" +
|
||||
"(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,4}|:)|" +
|
||||
"(?:[a-fA-F\\d]{1,4}:){2}(?:(:[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]" +
|
||||
"\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(:[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]" +
|
||||
"|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(:[a-fA-F\\d]{1,4}){1,6}|:)|(?::" +
|
||||
"((?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}" +
|
||||
"|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(%[0-9a-zA-Z]{1,})?";
|
||||
|
||||
/**
|
||||
* @class M.availability_ipaddress.form
|
||||
@@ -45,7 +43,7 @@ M.availability_ipaddress.form = Y.Object(M.core_availability.plugin);
|
||||
*/
|
||||
M.availability_ipaddress.form.initInner = function() {
|
||||
"use strict";
|
||||
Y.log('M.availability_ipaddress');
|
||||
Y.log('M.availability_ipaddress 1.10');
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -53,27 +51,29 @@ M.availability_ipaddress.form.initInner = function() {
|
||||
* dot or comma).
|
||||
*
|
||||
* @method getValue
|
||||
* @param {string} field
|
||||
* @param {object} node
|
||||
* @return {Number|String} Value of field as number or string if not valid
|
||||
*/
|
||||
M.availability_ipaddress.form.getValue = function(field, node) {
|
||||
"use strict";
|
||||
// Get field value.
|
||||
var value = node.one('input[name=' + field + ']').get('value');
|
||||
Y.log('ip_address:', value);
|
||||
Y.log('ip_address:' + value);
|
||||
|
||||
// If it is not a valid positive number, return false.
|
||||
if (M.availability_ipaddress.validate_ipaddress(value)) {
|
||||
if (M.availability_ipaddress.validateIpaddress(value)) {
|
||||
Y.log('Valid ip-address');
|
||||
return value;
|
||||
}
|
||||
|
||||
Y.log('getValue failed:', value);
|
||||
return value;
|
||||
};
|
||||
|
||||
/**
|
||||
* getNode
|
||||
* @param json
|
||||
* Get node
|
||||
*
|
||||
* @param {object} json
|
||||
* @returns {*}
|
||||
*/
|
||||
M.availability_ipaddress.form.getNode = function(json) {
|
||||
@@ -110,38 +110,65 @@ M.availability_ipaddress.form.getNode = function(json) {
|
||||
};
|
||||
|
||||
/**
|
||||
* validate_ipaddress
|
||||
* Validate ipaddresses
|
||||
*
|
||||
* @param {string[]} ipaddresses
|
||||
* @returns {boolean}
|
||||
*/
|
||||
M.availability_ipaddress.validate_ipaddress = function(ipaddresses) {
|
||||
M.availability_ipaddress.validateIpaddress = function(ipaddresses) {
|
||||
'use strict';
|
||||
|
||||
Y.log(ipaddresses);
|
||||
ipaddresses = ipaddresses.split(',');
|
||||
for (var i in ipaddresses) {
|
||||
|
||||
// Test normal ip format.
|
||||
if (new RegExp("(?:".concat(M.availability_ipaddress.v4, ")|(?:").concat(M.availability_ipaddress.v6, ")"), "g")
|
||||
// Strict ipv4 check.
|
||||
if (new RegExp(/^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$/gm)
|
||||
.test(ipaddresses[i])) {
|
||||
Y.log('Correct ipv4');
|
||||
continue;
|
||||
}
|
||||
|
||||
var ipv4Regex = new RegExp(
|
||||
'^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)' +
|
||||
'(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}-' +
|
||||
'([0-1]?[0-9]?[0-9]?|2[0-4][0-9]|25[0-5]){1}$',
|
||||
'gm'
|
||||
);
|
||||
|
||||
if (ipv4Regex.test(ipaddresses[i])) {
|
||||
Y.log('Correct ipv4 range.');
|
||||
continue;
|
||||
}
|
||||
|
||||
if (new RegExp(M.availability_ipaddress.v6)
|
||||
.test(ipaddresses[i])) {
|
||||
Y.log('Correct ipv6');
|
||||
continue;
|
||||
}
|
||||
|
||||
// Test subnet with a regex.
|
||||
if (new RegExp("(?:".concat(M.availability_ipaddress.v4 + "\\/(3[0-2]|[12]?[0-9])", ")|(?:")
|
||||
.concat(M.availability_ipaddress.v6 + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])", ")"), "g")
|
||||
if (new RegExp("^(?:".concat(M.availability_ipaddress.v4 + "\\/(3[0-2]|[12]?[0-9])|(1\\*)", ")|(?:")
|
||||
.concat(M.availability_ipaddress.v6 + "\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])", ")?\\/gm"))
|
||||
.test(ipaddresses[i])) {
|
||||
Y.log('Correct subnet');
|
||||
continue;
|
||||
}
|
||||
|
||||
Y.log('Incorrect ip', ipaddresses[i]);
|
||||
Y.log('Incorrect ip');
|
||||
return false;
|
||||
}
|
||||
|
||||
Y.log('Valid ipaddresses', ipaddresses);
|
||||
Y.log('Valid ipaddresses');
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* FillValue
|
||||
*
|
||||
* @param {object} value
|
||||
* @param {object} node
|
||||
*/
|
||||
M.availability_ipaddress.form.fillValue = function(value, node) {
|
||||
// This function gets passed the node (from above) and a value
|
||||
// object. Within that object, it must set up the correct values
|
||||
@@ -151,13 +178,18 @@ M.availability_ipaddress.form.fillValue = function(value, node) {
|
||||
value.ipaddresses = this.getValue('ipaddresses', node);
|
||||
};
|
||||
|
||||
/**
|
||||
* FillErrors
|
||||
* @param {object} errors
|
||||
* @param {object} node
|
||||
*/
|
||||
M.availability_ipaddress.form.fillErrors = function(errors, node) {
|
||||
"use strict";
|
||||
var value = {};
|
||||
this.fillValue(value, node);
|
||||
|
||||
// Basic ipaddresses checks.
|
||||
if (M.availability_ipaddress.validate_ipaddress(value.ipaddresses) === false) {
|
||||
if (M.availability_ipaddress.validateIpaddress(value.ipaddresses) === false) {
|
||||
errors.push('availability_ipaddress:error_ipaddress');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user