Explorar el Código

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>
Artur Neumann hace 7 años
padre
commit
f1fccaca06
Se han modificado 3 ficheros con 27 adiciones y 12 borrados
  1. 11 9
      core/js/js.js
  2. 15 2
      core/js/tests/specs/coreSpec.js
  3. 1 1
      settings/js/users/users.js

+ 11 - 9
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;

+ 15 - 2
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]);

+ 1 - 1
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}));