Move app to own repo
https://github.com/nextcloud/bruteforcesettings Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>pull/2095/head
parent
ed00bab80b
commit
e09c386f70
@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<info>
|
|
||||||
<id>bruteforcesettings</id>
|
|
||||||
<name>Brute force settings</name>
|
|
||||||
<description>
|
|
||||||
This applications allows admins to configure the brute force settings.
|
|
||||||
</description>
|
|
||||||
<licence>AGPL</licence>
|
|
||||||
<author>Roeland Jago Douma</author>
|
|
||||||
<default_enable/>
|
|
||||||
<version>1.0.0</version>
|
|
||||||
<category>other</category>
|
|
||||||
<dependencies>
|
|
||||||
<nextcloud min-version="12" max-version="12" />
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<namespace>BruteForceSettings</namespace>
|
|
||||||
|
|
||||||
<settings>
|
|
||||||
<admin>OCA\BruteForceSettings\Settings\IPWhitelist</admin>
|
|
||||||
</settings>
|
|
||||||
</info>
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
return [
|
|
||||||
'routes' => [
|
|
||||||
[ 'name' => 'IPWhitelist#getAll', 'url' => '/ipwhitelist', 'verb' => 'GET' ],
|
|
||||||
[ 'name' => 'IPWhitelist#add', 'url' => '/ipwhitelist', 'verb' => 'POST' ],
|
|
||||||
[ 'name' => 'IPWhitelist#remove', 'url' => '/ipwhitelist/{id}', 'verb' => 'DELETE' ],
|
|
||||||
]
|
|
||||||
];
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
|
|
||||||
#whitelist-list {
|
|
||||||
min-width: 262px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#whitelist-list td span {
|
|
||||||
padding: 10px 15px;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
#whitelist-list .action-column {
|
|
||||||
width: 46px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#whitelist-list .action-column a {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
OCA.BruteForceSettings = OCA.BruteForceSettings || {};
|
|
||||||
|
|
||||||
OCA.BruteForceSettings.WhiteList = {
|
|
||||||
|
|
||||||
collection: null,
|
|
||||||
view: null,
|
|
||||||
|
|
||||||
init: function () {
|
|
||||||
this.collection = new OCA.BruteForceSettings.WhitelistCollection();
|
|
||||||
this.view = new OCA.BruteForceSettings.WhitelistView({
|
|
||||||
collection: this.collection
|
|
||||||
});
|
|
||||||
this.view.reload();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
$(document).ready(function() {
|
|
||||||
OCA.BruteForceSettings.WhiteList.init();
|
|
||||||
});
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
OCA.BruteForceSettings = OCA.BruteForceSettings || {};
|
|
||||||
|
|
||||||
OCA.BruteForceSettings.WhitelistCollection = OC.Backbone.Collection.extend({
|
|
||||||
model: OCA.BruteForceSettings.WhitelistModel,
|
|
||||||
|
|
||||||
url: function() {
|
|
||||||
return OC.generateUrl('/apps/bruteforcesettings/ipwhitelist');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function() {
|
|
||||||
|
|
||||||
OCA.BruteForceSettings = OCA.BruteForceSettings || {};
|
|
||||||
|
|
||||||
OCA.BruteForceSettings.WhitelistModel = OC.Backbone.Model.extend({
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
@ -1,128 +0,0 @@
|
|||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
|
|
||||||
OCA.BruteForceSettings = OCA.BruteForceSettings || {};
|
|
||||||
|
|
||||||
var TEMPLATE_WHITELIST =
|
|
||||||
'<tr data-id="{{id}}">'
|
|
||||||
+ '<td><span>{{ip}}/{{mask}}</span></td>'
|
|
||||||
+ '<td class="action-column"><span><a class="icon-delete has-tooltip" title="' + t('bruteforcesettings', 'Delete') + '"></a></span></td>'
|
|
||||||
+ '</tr>';
|
|
||||||
|
|
||||||
OCA.BruteForceSettings.WhitelistView = OC.Backbone.View.extend({
|
|
||||||
collection: null,
|
|
||||||
|
|
||||||
ipInput: undefined,
|
|
||||||
maskInput: undefined,
|
|
||||||
submit: undefined,
|
|
||||||
|
|
||||||
list: undefined,
|
|
||||||
listHeader: undefined,
|
|
||||||
|
|
||||||
initialize: function(options) {
|
|
||||||
this.collection = options.collection;
|
|
||||||
|
|
||||||
this.ipInput = $('#whitelist_ip');
|
|
||||||
this.maskInput = $('#whitelist_mask');
|
|
||||||
this.submit = $('#whitelist_submit');
|
|
||||||
this.submit.click(_.bind(this._addWhitelist, this));
|
|
||||||
|
|
||||||
this.list = $('#whitelist-list');
|
|
||||||
this.listHeader = $('#whitelist-list-header');
|
|
||||||
|
|
||||||
this.list.on('click', 'a.icon-delete', _.bind(this._onDeleteRetention, this));
|
|
||||||
this.listenTo(this.collection, 'sync', this.render);
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
reload: function() {
|
|
||||||
var _this = this;
|
|
||||||
var loadingWhitelists = this.collection.fetch();
|
|
||||||
|
|
||||||
$.when(loadingWhitelists).done(function () {
|
|
||||||
_this.render();
|
|
||||||
});
|
|
||||||
$.when(loadingWhitelists).fail(function () {
|
|
||||||
OC.Notification.showTemporary(t('bruteforcesettings', 'Error while whitelists.'));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
template: function (data) {
|
|
||||||
if (_.isUndefined(this._template)) {
|
|
||||||
this._template = Handlebars.compile(TEMPLATE_WHITELIST);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this._template(data);
|
|
||||||
},
|
|
||||||
|
|
||||||
render: function () {
|
|
||||||
var _this = this;
|
|
||||||
this.list.html('');
|
|
||||||
|
|
||||||
this.collection.forEach(function (model) {
|
|
||||||
var data = {
|
|
||||||
id: model.attributes.id,
|
|
||||||
ip: model.attributes.ip,
|
|
||||||
mask: model.attributes.mask
|
|
||||||
};
|
|
||||||
var html = _this.template(data);
|
|
||||||
var $html = $(html);
|
|
||||||
_this.list.append($html);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_onDeleteRetention: function(event) {
|
|
||||||
var $target = $(event.target);
|
|
||||||
var $row = $target.closest('tr');
|
|
||||||
var id = $row.data('id');
|
|
||||||
|
|
||||||
var whitelist = this.collection.get(id);
|
|
||||||
|
|
||||||
if (_.isUndefined(whitelist)) {
|
|
||||||
// Ignore event
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var destroyingRetention = whitelist.destroy();
|
|
||||||
|
|
||||||
$row.find('.icon-delete').tooltip('hide');
|
|
||||||
|
|
||||||
var _this = this;
|
|
||||||
$.when(destroyingRetention).fail(function () {
|
|
||||||
OC.Notification.showTemporary(t('bruteforcesettings', 'Error while deleting a whitelist'));
|
|
||||||
});
|
|
||||||
$.when(destroyingRetention).always(function () {
|
|
||||||
_this.render();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
_addWhitelist: function() {
|
|
||||||
this.collection.create({
|
|
||||||
ip: this.ipInput.val(),
|
|
||||||
mask: this.maskInput.val()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
@ -1,123 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OCA\BruteForceSettings\Controller;
|
|
||||||
|
|
||||||
use OCP\AppFramework\Controller;
|
|
||||||
use OCP\AppFramework\Http;
|
|
||||||
use OCP\AppFramework\Http\JSONResponse;
|
|
||||||
use OCP\IConfig;
|
|
||||||
use OCP\IRequest;
|
|
||||||
|
|
||||||
class IPWhitelistController extends Controller {
|
|
||||||
|
|
||||||
/** @var IConfig */
|
|
||||||
private $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* IPWhitelistController constructor.
|
|
||||||
*
|
|
||||||
* @param string $appName
|
|
||||||
* @param IRequest $request
|
|
||||||
* @param IConfig $config
|
|
||||||
*/
|
|
||||||
public function __construct($appName,
|
|
||||||
IRequest $request,
|
|
||||||
IConfig $config) {
|
|
||||||
parent::__construct($appName, $request);
|
|
||||||
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return JSONResponse
|
|
||||||
*/
|
|
||||||
public function getAll() {
|
|
||||||
$keys = $this->config->getAppKeys('bruteForce');
|
|
||||||
$keys = array_filter($keys, function($key) {
|
|
||||||
$regex = '/^whitelist_/S';
|
|
||||||
return preg_match($regex, $key) === 1;
|
|
||||||
});
|
|
||||||
|
|
||||||
$result = [];
|
|
||||||
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
$value = $this->config->getAppValue('bruteForce', $key);
|
|
||||||
$values = explode('/', $value);
|
|
||||||
|
|
||||||
$result[] = [
|
|
||||||
'id' => (int)substr($key, 10),
|
|
||||||
'ip' => $values[0],
|
|
||||||
'mask' => $values[1],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
return new JSONResponse($result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $ip
|
|
||||||
* @param int $mask
|
|
||||||
* @return JSONResponse
|
|
||||||
*/
|
|
||||||
public function add($ip, $mask) {
|
|
||||||
if (!filter_var($ip, FILTER_VALIDATE_IP) ||
|
|
||||||
(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && ($mask < 0 || $mask > 32)) ||
|
|
||||||
(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && ($mask < 0 || $mask > 128))) {
|
|
||||||
return new JSONResponse([], Http::STATUS_BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
$keys = $this->config->getAppKeys('bruteForce');
|
|
||||||
$keys = array_filter($keys, function($key) {
|
|
||||||
$regex = '/^whitelist_/S';
|
|
||||||
return preg_match($regex, $key) === 1;
|
|
||||||
});
|
|
||||||
|
|
||||||
$id = 0;
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
$tmp = (int)substr($key, 10);
|
|
||||||
if ($tmp > $id) {
|
|
||||||
$id = $tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$id++;
|
|
||||||
|
|
||||||
$value = $ip . '/' . $mask;
|
|
||||||
$this->config->setAppValue('bruteForce', 'whitelist_'.$id, $value);
|
|
||||||
return new JSONResponse([
|
|
||||||
'id' => $id,
|
|
||||||
'ip' => $ip,
|
|
||||||
'mask' => $mask,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $id
|
|
||||||
* @return JSONResponse
|
|
||||||
*/
|
|
||||||
public function remove($id) {
|
|
||||||
$this->config->deleteAppValue('bruteForce', 'whitelist_'.$id);
|
|
||||||
|
|
||||||
return new JSONResponse([]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OCA\BruteForceSettings\Settings;
|
|
||||||
|
|
||||||
use OCP\AppFramework\Http\TemplateResponse;
|
|
||||||
use OCP\Settings\ISettings;
|
|
||||||
|
|
||||||
class IPWhitelist implements ISettings {
|
|
||||||
|
|
||||||
public function getForm() {
|
|
||||||
return new TemplateResponse('bruteforcesettings', 'ipwhitelist');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSection() {
|
|
||||||
return 'security';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getPriority() {
|
|
||||||
return 50;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,49 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
script('core', [
|
|
||||||
'oc-backbone-webdav',
|
|
||||||
]);
|
|
||||||
script('bruteforcesettings', [
|
|
||||||
'IPWhitelist',
|
|
||||||
'IPWhitelistModel',
|
|
||||||
'IPWhitelistCollection',
|
|
||||||
'IPWhitelistView',
|
|
||||||
]);
|
|
||||||
style('bruteforcesettings', [
|
|
||||||
'settings'
|
|
||||||
])
|
|
||||||
|
|
||||||
/** @var \OCP\IL10N $l */
|
|
||||||
?>
|
|
||||||
<form id="IPWhiteList" class="section">
|
|
||||||
<h2><?php p($l->t('Brute force ip whitelist')); ?></h2>
|
|
||||||
|
|
||||||
<table id="whitelist-list">
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<input type="text" name="whitelist_ip" id="whitelist_ip" placeholder="1.2.3.4" style="width: 200px;" />/
|
|
||||||
<input type="number" id="whitelist_mask" name="whitelist_mask" placeholder="24" style="width: 50px;">
|
|
||||||
<input type="button" id="whitelist_submit" value="<?php p($l->t('Add')); ?>">
|
|
||||||
</form>
|
|
||||||
@ -1,151 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OCA\BruteForceSettings\Tests\Controller;
|
|
||||||
|
|
||||||
use OCA\BruteForceSettings\Controller\IPWhitelistController;
|
|
||||||
use OCP\AppFramework\Http;
|
|
||||||
use OCP\AppFramework\Http\JSONResponse;
|
|
||||||
use OCP\IConfig;
|
|
||||||
use OCP\IRequest;
|
|
||||||
use Test\TestCase;
|
|
||||||
|
|
||||||
class IPWhitelistControllerTest extends TestCase {
|
|
||||||
|
|
||||||
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
|
|
||||||
private $config;
|
|
||||||
/** @var IPWhitelistController */
|
|
||||||
private $controller;
|
|
||||||
|
|
||||||
public function setUp() {
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
$this->config = $this->createMock(IConfig::class);
|
|
||||||
$this->controller = new IPWhitelistController(
|
|
||||||
'bruteforce',
|
|
||||||
$this->createMock(IRequest::class),
|
|
||||||
$this->config
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetAll() {
|
|
||||||
$this->config->method('getAppKeys')
|
|
||||||
->with($this->equalTo('bruteForce'))
|
|
||||||
->willReturn([
|
|
||||||
'foobar',
|
|
||||||
'whitelist_0',
|
|
||||||
'whitelist_99',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->config->method('getAppValue')
|
|
||||||
->will($this->returnCallback(function($app, $key) {
|
|
||||||
if ($app !== 'bruteForce') {
|
|
||||||
$this->fail();
|
|
||||||
}
|
|
||||||
if ($key === 'whitelist_0') {
|
|
||||||
return '192.168.2.0/24';
|
|
||||||
} else if ($key === 'whitelist_99') {
|
|
||||||
return 'dead:beef:cafe::/92';
|
|
||||||
}
|
|
||||||
$this->fail();
|
|
||||||
}));
|
|
||||||
|
|
||||||
$expected = new JSONResponse([
|
|
||||||
[
|
|
||||||
'id' => 0,
|
|
||||||
'ip' => '192.168.2.0',
|
|
||||||
'mask' => '24',
|
|
||||||
],
|
|
||||||
[
|
|
||||||
'id' => 99,
|
|
||||||
'ip' => 'dead:beef:cafe::',
|
|
||||||
'mask' => '92',
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $this->controller->getAll());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function dataAdd() {
|
|
||||||
return [
|
|
||||||
['8.500.2.3', 24, false],
|
|
||||||
['1.2.3.4', 24, true],
|
|
||||||
['1.2.3.4', -1, false],
|
|
||||||
['1.2.3.4', 33, false],
|
|
||||||
|
|
||||||
['dead:nope::8', 24, false],
|
|
||||||
['1234:567:abef::1a2b', 24, true],
|
|
||||||
['1234:567:abef::1a2b', -1, false],
|
|
||||||
['1234:567:abef::1a2b', 129, false],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider dataAdd
|
|
||||||
*
|
|
||||||
* @param string $ip
|
|
||||||
* @param int $mask
|
|
||||||
* @param bool $valid
|
|
||||||
*/
|
|
||||||
public function testAdd($ip, $mask, $valid) {
|
|
||||||
if (!$valid) {
|
|
||||||
$expected = new JSONResponse([], Http::STATUS_BAD_REQUEST);
|
|
||||||
} else {
|
|
||||||
$this->config->method('getAppKeys')
|
|
||||||
->with($this->equalTo('bruteForce'))
|
|
||||||
->willReturn([
|
|
||||||
'foobar',
|
|
||||||
'whitelist_0',
|
|
||||||
'whitelist_99',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->config->expects($this->once())
|
|
||||||
->method('setAppValue')
|
|
||||||
->with(
|
|
||||||
$this->equalTo('bruteForce'),
|
|
||||||
$this->equalTo('whitelist_100'),
|
|
||||||
$this->equalTo($ip.'/'.$mask)
|
|
||||||
);
|
|
||||||
|
|
||||||
$expected = new JSONResponse([
|
|
||||||
'id' => 100,
|
|
||||||
'ip' => $ip,
|
|
||||||
'mask' => $mask,
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $this->controller->add($ip, $mask));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testRemove() {
|
|
||||||
$this->config->expects($this->once())
|
|
||||||
->method('deleteAppValue')
|
|
||||||
->with(
|
|
||||||
$this->equalTo('bruteForce'),
|
|
||||||
$this->equalTo('whitelist_42')
|
|
||||||
);
|
|
||||||
|
|
||||||
$expected = new JSONResponse([]);
|
|
||||||
$this->assertEquals($expected, $this->controller->remove(42));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace OCA\BruteForceSettings\Tests\Settings;
|
|
||||||
|
|
||||||
use OCA\BruteForceSettings\Settings\IPWhitelist;
|
|
||||||
use OCP\AppFramework\Http\TemplateResponse;
|
|
||||||
use Test\TestCase;
|
|
||||||
|
|
||||||
class IPWhitelistTest extends TestCase {
|
|
||||||
|
|
||||||
/** @var IPWhitelist */
|
|
||||||
private $settings;
|
|
||||||
|
|
||||||
public function setUp() {
|
|
||||||
parent::setUp();
|
|
||||||
|
|
||||||
$this->settings = new IPWhitelist();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetForm() {
|
|
||||||
$expected = new TemplateResponse('bruteforcesettings', 'ipwhitelist');
|
|
||||||
|
|
||||||
$this->assertEquals($expected, $this->settings->getForm());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetSection() {
|
|
||||||
$this->assertSame('security', $this->settings->getSection());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testGetPriority() {
|
|
||||||
$this->assertSame(50, $this->settings->getPriority());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,174 +0,0 @@
|
|||||||
/**
|
|
||||||
* @copyright 2016, Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
|
||||||
*
|
|
||||||
* @license GNU AGPL version 3 or any later version
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as
|
|
||||||
* published by the Free Software Foundation, either version 3 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program 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 Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
describe('OCA.BruteForceSettings.IPWhiteList tests', function() {
|
|
||||||
beforeEach(function() {
|
|
||||||
// init parameters and test table elements
|
|
||||||
$('#testArea').append(
|
|
||||||
'<table>'+
|
|
||||||
'<tbody id="whitelist-list">' +
|
|
||||||
'</tbody>' +
|
|
||||||
'</table>' +
|
|
||||||
'<input type="text" name="whitelist_ip" id="whitelist_ip" placeholder="1.2.3.4" style="width: 200px;" />/' +
|
|
||||||
'<input type="number" id="whitelist_mask" name="whitelist_mask" placeholder="24" style="width: 50px;">' +
|
|
||||||
'<input type="button" id="whitelist_submit" value="Add">'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('get intial empty', function() {
|
|
||||||
OCA.BruteForceSettings.WhiteList.init();
|
|
||||||
|
|
||||||
expect(fakeServer.requests.length).toEqual(1);
|
|
||||||
expect(fakeServer.requests[0].method).toEqual('GET');
|
|
||||||
expect(fakeServer.requests[0].url).toEqual(
|
|
||||||
OC.generateUrl('/apps/bruteforcesettings/ipwhitelist')
|
|
||||||
);
|
|
||||||
fakeServer.requests[0].respond(
|
|
||||||
200,
|
|
||||||
{ 'Content-Type': 'application/json' },
|
|
||||||
'[]'
|
|
||||||
);
|
|
||||||
|
|
||||||
expect($('#whitelist-list > tr').length).toEqual(0);
|
|
||||||
});
|
|
||||||
it('get intial filled', function() {
|
|
||||||
OCA.BruteForceSettings.WhiteList.init();
|
|
||||||
|
|
||||||
expect(fakeServer.requests.length).toEqual(1);
|
|
||||||
expect(fakeServer.requests[0].method).toEqual('GET');
|
|
||||||
expect(fakeServer.requests[0].url).toEqual(
|
|
||||||
OC.generateUrl('/apps/bruteforcesettings/ipwhitelist')
|
|
||||||
);
|
|
||||||
fakeServer.requests[0].respond(
|
|
||||||
200,
|
|
||||||
{ 'Content-Type': 'application/json' },
|
|
||||||
JSON.stringify([
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
ip: '11.22.0.0',
|
|
||||||
mask: 16
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 12,
|
|
||||||
ip: 'cafe:cafe::',
|
|
||||||
mask: 80
|
|
||||||
}
|
|
||||||
])
|
|
||||||
);
|
|
||||||
|
|
||||||
expect($('#whitelist-list > tr').length).toEqual(2);
|
|
||||||
|
|
||||||
var el1 = $($('#whitelist-list > tr').get(0));
|
|
||||||
expect(el1.data('id')).toEqual(1);
|
|
||||||
expect($(el1.find('td > span')[0]).html()).toEqual('11.22.0.0/16');
|
|
||||||
|
|
||||||
var el2 = $($('#whitelist-list > tr').get(1));
|
|
||||||
expect(el2.data('id')).toEqual(12);
|
|
||||||
expect($(el2.find('td > span')[0]).html()).toEqual('cafe:cafe::/80');
|
|
||||||
});
|
|
||||||
it('add whitelist', function() {
|
|
||||||
OCA.BruteForceSettings.WhiteList.init();
|
|
||||||
|
|
||||||
expect(fakeServer.requests.length).toEqual(1);
|
|
||||||
expect(fakeServer.requests[0].method).toEqual('GET');
|
|
||||||
expect(fakeServer.requests[0].url).toEqual(
|
|
||||||
OC.generateUrl('/apps/bruteforcesettings/ipwhitelist')
|
|
||||||
);
|
|
||||||
fakeServer.requests[0].respond(
|
|
||||||
200,
|
|
||||||
{ 'Content-Type': 'application/json' },
|
|
||||||
'[]'
|
|
||||||
);
|
|
||||||
|
|
||||||
expect($('#whitelist-list > tr').length).toEqual(0);
|
|
||||||
|
|
||||||
$('#whitelist_ip').val('2.4.8.16');
|
|
||||||
$('#whitelist_mask').val('8');
|
|
||||||
$('#whitelist_submit').click();
|
|
||||||
|
|
||||||
expect(fakeServer.requests.length).toEqual(2);
|
|
||||||
expect(fakeServer.requests[1].method).toEqual('POST');
|
|
||||||
expect(JSON.parse(fakeServer.requests[1].requestBody)).toEqual({
|
|
||||||
ip: '2.4.8.16',
|
|
||||||
mask: '8'
|
|
||||||
});
|
|
||||||
expect(fakeServer.requests[1].url).toEqual(
|
|
||||||
OC.generateUrl('/apps/bruteforcesettings/ipwhitelist')
|
|
||||||
);
|
|
||||||
fakeServer.requests[1].respond(
|
|
||||||
200,
|
|
||||||
{ 'Content-Type': 'application/json' },
|
|
||||||
JSON.stringify({
|
|
||||||
id: 99,
|
|
||||||
ip: '2.4.8.16',
|
|
||||||
mask: 8
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
expect($('#whitelist-list > tr').length).toEqual(1);
|
|
||||||
|
|
||||||
var el1 = $($('#whitelist-list > tr').get(0));
|
|
||||||
expect(el1.data('id')).toEqual(99);
|
|
||||||
expect($(el1.find('td > span')[0]).html()).toEqual('2.4.8.16/8');
|
|
||||||
});
|
|
||||||
it('delete whitelist', function() {
|
|
||||||
OCA.BruteForceSettings.WhiteList.init();
|
|
||||||
|
|
||||||
expect(fakeServer.requests.length).toEqual(1);
|
|
||||||
expect(fakeServer.requests[0].method).toEqual('GET');
|
|
||||||
expect(fakeServer.requests[0].url).toEqual(
|
|
||||||
OC.generateUrl('/apps/bruteforcesettings/ipwhitelist')
|
|
||||||
);
|
|
||||||
fakeServer.requests[0].respond(
|
|
||||||
200,
|
|
||||||
{ 'Content-Type': 'application/json' },
|
|
||||||
JSON.stringify([
|
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
ip: '1.2.3.4',
|
|
||||||
mask: 8
|
|
||||||
}
|
|
||||||
])
|
|
||||||
);
|
|
||||||
|
|
||||||
expect($('#whitelist-list > tr').length).toEqual(1);
|
|
||||||
|
|
||||||
var el1 = $($('#whitelist-list > tr').get(0));
|
|
||||||
expect(el1.data('id')).toEqual(1);
|
|
||||||
expect($(el1.find('td > span')[0]).html()).toEqual('1.2.3.4/8');
|
|
||||||
el1.find('.icon-delete').click();
|
|
||||||
|
|
||||||
expect(fakeServer.requests.length).toEqual(2);
|
|
||||||
expect(fakeServer.requests[1].method).toEqual('DELETE');
|
|
||||||
expect(fakeServer.requests[1].url).toEqual(
|
|
||||||
OC.generateUrl('/apps/bruteforcesettings/ipwhitelist/1')
|
|
||||||
);
|
|
||||||
|
|
||||||
fakeServer.requests[1].respond(
|
|
||||||
200,
|
|
||||||
{ 'Content-Type': 'application/json' },
|
|
||||||
'[]'
|
|
||||||
);
|
|
||||||
|
|
||||||
expect($('#whitelist-list > tr').length).toEqual(0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
Loading…
Reference in New Issue