summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtur Neumann <info@individual-it.net>2017-02-27 12:34:15 +0545
committerArtur Neumann <info@individual-it.net>2017-02-28 07:38:11 +0545
commitf1fccaca0605a5d183f78b2c39d2e09a54753787 (patch)
treeb63d877889120d12bc59e2103ad64c1568e8186b
parentd0c6179ec18d1e2c3ce86bdf03f36aaa1501c6e7 (diff)
downloadnextcloud-server-f1fccaca0605a5d183f78b2c39d2e09a54753787.tar.gz
nextcloud-server-f1fccaca0605a5d183f78b2c39d2e09a54753787.zip
better quota validation
this fixes #3634 1. fixed computerFileSize to be more picky about incorrect values 2. more tests for computerFileSize 3. use computerFileSize to validate user quota Signed-off-by: Artur Neumann <info@individual-it.net>
-rw-r--r--core/js/js.js20
-rw-r--r--core/js/tests/specs/coreSpec.js17
-rw-r--r--settings/js/users/users.js2
3 files changed, 27 insertions, 12 deletions
diff --git a/core/js/js.js b/core/js/js.js
index 3651635541a..ba831e4251d 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -1678,16 +1678,12 @@ OC.Util = {
*
*/
computerFileSize: function (string) {
- if (typeof string != 'string') {
+ if (typeof string !== 'string') {
return null;
}
var s = string.toLowerCase();
- var bytes = parseFloat(s)
-
- if (!isNaN(bytes) && isFinite(s)) {
- return bytes;
- }
+ var bytes = null;
var bytesArray = {
'b' : 1,
@@ -1703,12 +1699,18 @@ OC.Util = {
'p' : 1024 * 1024 * 1024 * 1024 * 1024
};
- var matches = s.match(/([kmgtp]?b?)$/i);
- if (matches[1]) {
- bytes = bytes * bytesArray[matches[1]];
+ var matches = s.match(/^[\s+]?([0-9]*)(\.([0-9]+))?( +)?([kmgtp]?b?)$/i);
+ if (matches !== null) {
+ bytes = parseFloat(s);
+ if (!isFinite(bytes)) {
+ return null;
+ }
} else {
return null;
}
+ if (matches[5]) {
+ bytes = bytes * bytesArray[matches[5]];
+ }
bytes = Math.round(bytes);
return bytes;
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index d83c0cd9a38..faafb4797be 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -594,8 +594,14 @@ describe('Core base tests', function() {
it('correctly parses file sizes from a human readable formated string', function() {
var data = [
['125', 125],
- ['125.25', 125.25],
+ ['125.25', 125],
+ ['125.25B', 125],
+ ['125.25 B', 125],
['0 B', 0],
+ ['99999999999999999999999999999999999999999999 B', 99999999999999999999999999999999999999999999],
+ ['0 MB', 0],
+ ['0 kB', 0],
+ ['0kB', 0],
['125 B', 125],
['125b', 125],
['125 KB', 128000],
@@ -605,7 +611,14 @@ describe('Core base tests', function() {
['119.2 GB', 127990025421],
['119.2gb', 127990025421],
['116.4 TB', 127983153473126],
- ['116.4tb', 127983153473126]
+ ['116.4tb', 127983153473126],
+ ['8776656778888777655.4tb', 9.650036181387265e+30],
+ [1234, null],
+ [-1234, null],
+ ['-1234 B', null],
+ ['B', null],
+ ['40/0', null],
+ ['40,30 kb', null],
];
for (var i = 0; i < data.length; i++) {
expect(OC.Util.computerFileSize(data[i][0])).toEqual(data[i][1]);
diff --git a/settings/js/users/users.js b/settings/js/users/users.js
index a2ccc059f15..d23bd553246 100644
--- a/settings/js/users/users.js
+++ b/settings/js/users/users.js
@@ -533,7 +533,7 @@ var UserList = {
if (quota === 'other') {
return;
}
- if ((quota !== 'default' && quota !=="none") && (isNaN(parseInt(quota, 10)) || parseInt(quota, 10) < 0)) {
+ if ((quota !== 'default' && quota !=="none") && (!OC.Util.computerFileSize(quota))) {
// the select component has added the bogus value, delete it again
$select.find('option[selected]').remove();
OC.Notification.showTemporary(t('core', 'Invalid quota value "{val}"', {val: quota}));