]> source.dussan.org Git - nextcloud-server.git/commitdiff
better quota validation
authorArtur Neumann <info@individual-it.net>
Mon, 27 Feb 2017 06:49:15 +0000 (12:34 +0545)
committerArtur Neumann <info@individual-it.net>
Tue, 28 Feb 2017 01:53:11 +0000 (07:38 +0545)
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>
core/js/js.js
core/js/tests/specs/coreSpec.js
settings/js/users/users.js

index 3651635541a30f2d281b4391e43b9f30f8252509..ba831e4251d3800b2ae2ccd1289bcb15d82a3132 100644 (file)
@@ -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;
index d83c0cd9a3831c709def2f8af329f3a2fb314633..faafb4797be215dc6c52a67bc0453464920dea6b 100644 (file)
@@ -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]);
index a2ccc059f15aca46ab633fcf16408154451f129a..d23bd553246f4c00377852582af5d5c84e595d3f 100644 (file)
@@ -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}));