diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-11 19:34:24 +0200 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-11 19:34:24 +0200 |
commit | 9963975875836f768cc64f3a9dc00a1f33d9c07f (patch) | |
tree | 919ca3f3303ca159a56330caf87f54e5909b7da1 | |
parent | 959b8691fad5b109e17a2f358613813f209e1313 (diff) |
added more code for adding feeds and folders
-rw-r--r-- | js/Gruntfile.coffee | 4 | ||||
-rw-r--r-- | js/app/controllers/feedcontroller.coffee | 33 | ||||
-rw-r--r-- | js/app/services/bl/feedbl.coffee | 36 | ||||
-rw-r--r-- | js/config/testacular_conf.js | 1 | ||||
-rw-r--r-- | js/public/app.js | 79 | ||||
-rw-r--r-- | js/tests/services/bl/feedblSpec.coffee | 98 | ||||
-rw-r--r-- | js/vendor/md5js/md5.js | 379 | ||||
-rw-r--r-- | templates/main.php | 1 | ||||
-rw-r--r-- | templates/part.listfeed.php | 2 | ||||
-rw-r--r-- | templates/part.listfolder.php | 2 |
10 files changed, 588 insertions, 47 deletions
diff --git a/js/Gruntfile.coffee b/js/Gruntfile.coffee index 8ea32dcd4..285ee47f0 100644 --- a/js/Gruntfile.coffee +++ b/js/Gruntfile.coffee @@ -66,8 +66,8 @@ module.exports = (grunt) -> src: '<%= meta.production %>app.js' dest: '' wrapper: [ - '(function(angular, $, undefined){\n\n' - '\n})(window.angular, jQuery);' + '(function(angular, $, hex_md5, undefined){\n\n' + '\n})(window.angular, jQuery, hex_md5);' ] coffeelint: diff --git a/js/app/controllers/feedcontroller.coffee b/js/app/controllers/feedcontroller.coffee index 0860cabc5..742693253 100644 --- a/js/app/controllers/feedcontroller.coffee +++ b/js/app/controllers/feedcontroller.coffee @@ -49,28 +49,25 @@ angular.module('News').factory '_FeedController', @_$scope.addFeed = (feedUrl, parentFolderId=0) => @_$scope.feedEmptyError = false - @_$scope.feedError = false + @_$scope.feedExistsError = false - if angular.isUndefined(feedUrl) or feedUrl.trim() == '' - @_$scope.feedEmptyError = true - - if not @_$scope.feedEmptyError + try @_isAddingFeed = true - - onError = => - @_$scope.feedError = true + @_feedBl.create feedUrl, parentFolderId + # on success + , => + @_$scope.feedUrl = '' + @_isAddingFeed = false + # on error + , => @_isAddingFeed = false - - onSuccess = (data) => - if data.status == 'error' - onError() - else - @_$scope.feedUrl = '' - @_isAddingFeed = false - - @_persistence.createFeed(feedUrl.trim(), parentFolderId, - onSuccess, onError) + catch error + if error instanceof _ExistsError + @_$scope.feedExistsError = true + else + @_$scope.feedEmptyError = true + @_$scope.addFolder = (folderName) => @_$scope.folderEmptyError = false diff --git a/js/app/services/bl/feedbl.coffee b/js/app/services/bl/feedbl.coffee index b0928cccb..68b288297 100644 --- a/js/app/services/bl/feedbl.coffee +++ b/js/app/services/bl/feedbl.coffee @@ -23,9 +23,9 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. angular.module('News').factory 'FeedBl', ['_Bl', 'ShowAll', 'Persistence', 'ActiveFeed', 'FeedType', 'ItemModel', -'FeedModel', 'NewLoading', +'FeedModel', 'NewLoading', '_ExistsError', (_Bl, ShowAll, Persistence, ActiveFeed, FeedType, ItemModel, FeedModel, -NewLoading) -> +NewLoading, _ExistsError) -> class FeedBl extends _Bl @@ -125,6 +125,38 @@ NewLoading) -> return feed.link + create: (url, parentId=0, onSuccess=null, onFailure=null) -> + onSuccess or= -> + onFailure or= -> + + if angular.isUndefined(url) or url.trim() == '' + throw new Error() + + url = url.trim() + urlHash = hex_md5(url) + + if @_feedModel.getByUrlHash(urlHash) + throw new _ExistsError() + + feed = + title: url.replace( + /^(?:https?:\/\/)?(?:www\.)?([a-z0-9_\-\.]+)(?:\/.*)?$/gi, + '$1') + url: url + urlHash: urlHash + + @_feedModel.add(feed) + + success = (response) => + if response.status == 'error' + feed.error = response.msg + onFailure() + else + onSuccess() + + @_persistence.createFeed url, parentId, success + + return new FeedBl(ShowAll, FeedModel, Persistence, ActiveFeed, FeedType, ItemModel, NewLoading) diff --git a/js/config/testacular_conf.js b/js/config/testacular_conf.js index 5844f29b7..9cc769b13 100644 --- a/js/config/testacular_conf.js +++ b/js/config/testacular_conf.js @@ -36,6 +36,7 @@ files = [ 'vendor/angular/angular.js', 'vendor/angular/angular-mocks.js', 'vendor/angular-ui/angular-ui.js', + 'vendor/md5js/md5.js', '../../appframework/js/tests/stubs/owncloud.js', '../../appframework/js/public/app.js', 'tests/stubs/modules.js', diff --git a/js/public/app.js b/js/public/app.js index e6e1c6649..d5201eac4 100644 --- a/js/public/app.js +++ b/js/public/app.js @@ -1,4 +1,4 @@ -(function(angular, $, undefined){ +(function(angular, $, hex_md5, undefined){ /** * ownCloud News App - v0.0.1 @@ -287,31 +287,28 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. return _this._isAddingFeed; }; this._$scope.addFeed = function(feedUrl, parentFolderId) { - var onError, onSuccess; + var error; if (parentFolderId == null) { parentFolderId = 0; } _this._$scope.feedEmptyError = false; - _this._$scope.feedError = false; - if (angular.isUndefined(feedUrl) || feedUrl.trim() === '') { - _this._$scope.feedEmptyError = true; - } - if (!_this._$scope.feedEmptyError) { + _this._$scope.feedExistsError = false; + try { _this._isAddingFeed = true; - onError = function() { - _this._$scope.feedError = true; + return _this._feedBl.create(feedUrl, parentFolderId, function() { + _this._$scope.feedUrl = ''; return _this._isAddingFeed = false; - }; - onSuccess = function(data) { - if (data.status === 'error') { - return onError(); - } else { - _this._$scope.feedUrl = ''; - return _this._isAddingFeed = false; - } - }; - return _this._persistence.createFeed(feedUrl.trim(), parentFolderId, onSuccess, onError); + }, function() { + return _this._isAddingFeed = false; + }); + } catch (_error) { + error = _error; + if (error instanceof _ExistsError) { + return _this._$scope.feedExistsError = true; + } else { + return _this._$scope.feedEmptyError = true; + } } }; this._$scope.addFolder = function(folderName) { @@ -606,7 +603,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; angular.module('News').factory('FeedBl', [ - '_Bl', 'ShowAll', 'Persistence', 'ActiveFeed', 'FeedType', 'ItemModel', 'FeedModel', 'NewLoading', function(_Bl, ShowAll, Persistence, ActiveFeed, FeedType, ItemModel, FeedModel, NewLoading) { + '_Bl', 'ShowAll', 'Persistence', 'ActiveFeed', 'FeedType', 'ItemModel', 'FeedModel', 'NewLoading', '_ExistsError', function(_Bl, ShowAll, Persistence, ActiveFeed, FeedType, ItemModel, FeedModel, NewLoading, _ExistsError) { var FeedBl; FeedBl = (function(_super) { @@ -732,6 +729,46 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. } }; + FeedBl.prototype.create = function(url, parentId, onSuccess, onFailure) { + var feed, success, urlHash, + _this = this; + + if (parentId == null) { + parentId = 0; + } + if (onSuccess == null) { + onSuccess = null; + } + if (onFailure == null) { + onFailure = null; + } + onSuccess || (onSuccess = function() {}); + onFailure || (onFailure = function() {}); + if (angular.isUndefined(url) || url.trim() === '') { + throw new Error(); + } + url = url.trim(); + urlHash = hex_md5(url); + if (this._feedModel.getByUrlHash(urlHash)) { + throw new _ExistsError(); + } + feed = { + title: url.replace(/^(?:https?:\/\/)?(?:www\.)?([a-z0-9_\-\.]+)(?:\/.*)?$/gi, '$1'), + url: url, + urlHash: urlHash + }; + this._feedModel.add(feed); + success = function(response) { + if (response.status === 'error') { + feed.error = response.msg; + return onFailure(); + } else { + return onSuccess(); + } + }; + return this._persistence.createFeed(url, parentId, success); + }; + return FeedBl; })(_Bl); @@ -2536,4 +2573,4 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>. }).call(this); -})(window.angular, jQuery);
\ No newline at end of file +})(window.angular, jQuery, hex_md5);
\ No newline at end of file diff --git a/js/tests/services/bl/feedblSpec.coffee b/js/tests/services/bl/feedblSpec.coffee index c8ba1ec34..2b355d871 100644 --- a/js/tests/services/bl/feedblSpec.coffee +++ b/js/tests/services/bl/feedblSpec.coffee @@ -32,10 +32,11 @@ describe 'FeedBl', -> @persistence = { setFeedRead: @setFeedReadSpy getItems: @getItemsSpy + createFeed: -> } beforeEach inject (@FeedBl, @FeedModel, @ItemModel, @FeedType, - @ShowAll, @ActiveFeed) => + @ShowAll, @ActiveFeed, @_ExistsError) => @ShowAll.setShowAll(false) @ActiveFeed.handle({type: @FeedType.Folder, id:0}) @@ -213,4 +214,97 @@ describe 'FeedBl', -> link: 'test.com' @FeedModel.add(item2) - expect(@FeedBl.getFeedLink(4)).toBe('test.com')
\ No newline at end of file + expect(@FeedBl.getFeedLink(4)).toBe('test.com') + + + + it 'should not create a feed if it already exists', => + item1 = {urlHash: hex_md5('john')} + @FeedModel.add(item1) + + expect => + @FeedBl.create('john') + .toThrow(new @_ExistsError()) + + expect => + @FeedBl.create('johns') + .not.toThrow(new @_ExistsError()) + + + it 'should not create feeds that are empty', => + expect => + @FeedBl.create(' ') + .toThrow(new Error()) + + + it 'should create a feed before theres a response from the server', => + @FeedBl.create('johns') + expect(@FeedModel.size()).toBe(1) + + + it 'should set a title and an url hash to the newly crated feed', => + url = 'www.google.de' + @FeedBl.create(url) + hash = hex_md5(url) + + feed = @FeedModel.getByUrlHash(hash) + + expect(feed.title).toBe('google.de') + expect(feed.url).toBe(url) + expect(feed.urlHash).toBe(hash) + + + it 'should transform urls correctly', => + urls = [ + 'www.google.de' + 'www.google.de/' + 'google.de' + 'http://google.de' + 'http://www.google.de/' + ] + for url in urls + @FeedModel.clear() + @FeedBl.create(url) + hash = hex_md5(url) + feed = @FeedModel.getByUrlHash(hash) + expect(feed.title).toBe('google.de') + + + it 'should make a create feed request', => + @persistence.createFeed = jasmine.createSpy('add feed') + + @FeedBl.create(' johns ') + expect(@persistence.createFeed).toHaveBeenCalledWith('johns', 0, + jasmine.any(Function)) + + + it 'should call the onSuccess function on response status ok', => + onSuccess = jasmine.createSpy('Success') + @persistence.createFeed = jasmine.createSpy('add feed') + @persistence.createFeed.andCallFake (folderName, parentId, success) => + response = + status: 'ok' + success(response) + + @FeedBl.create(' johns ', 0, onSuccess) + + expect(onSuccess).toHaveBeenCalled() + + + it 'should call the handle a response error when creating a folder', => + onSuccess = jasmine.createSpy('Success') + onFailure = jasmine.createSpy('Failure') + @persistence.createFeed = jasmine.createSpy('add feed') + @persistence.createFeed.andCallFake (folderName, parentId, success) => + @response = + status: 'error' + msg: 'this is an error' + success(@response) + + @FeedBl.create(' johns ', 0, onSuccess, onFailure) + + expect(onSuccess).not.toHaveBeenCalled() + expect(onFailure).toHaveBeenCalled() + + expect(@FeedModel.getByUrlHash(hex_md5('johns')).error).toBe( + @response.msg)
\ No newline at end of file diff --git a/js/vendor/md5js/md5.js b/js/vendor/md5js/md5.js new file mode 100644 index 000000000..a8cc0eee8 --- /dev/null +++ b/js/vendor/md5js/md5.js @@ -0,0 +1,379 @@ +/* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ +var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ +var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ + +/* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ +function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); } +function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); } +function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); } +function hex_hmac_md5(k, d) + { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } +function b64_hmac_md5(k, d) + { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); } +function any_hmac_md5(k, d, e) + { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); } + +/* + * Perform a simple self-test to see if the VM is working + */ +function md5_vm_test() +{ + return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72"; +} + +/* + * Calculate the MD5 of a raw string + */ +function rstr_md5(s) +{ + return binl2rstr(binl_md5(rstr2binl(s), s.length * 8)); +} + +/* + * Calculate the HMAC-MD5, of a key and some data (raw strings) + */ +function rstr_hmac_md5(key, data) +{ + var bkey = rstr2binl(key); + if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8); + return binl2rstr(binl_md5(opad.concat(hash), 512 + 128)); +} + +/* + * Convert a raw string to a hex string + */ +function rstr2hex(input) +{ + try { hexcase } catch(e) { hexcase=0; } + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var output = ""; + var x; + for(var i = 0; i < input.length; i++) + { + x = input.charCodeAt(i); + output += hex_tab.charAt((x >>> 4) & 0x0F) + + hex_tab.charAt( x & 0x0F); + } + return output; +} + +/* + * Convert a raw string to a base-64 string + */ +function rstr2b64(input) +{ + try { b64pad } catch(e) { b64pad=''; } + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var output = ""; + var len = input.length; + for(var i = 0; i < len; i += 3) + { + var triplet = (input.charCodeAt(i) << 16) + | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0) + | (i + 2 < len ? input.charCodeAt(i+2) : 0); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > input.length * 8) output += b64pad; + else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F); + } + } + return output; +} + +/* + * Convert a raw string to an arbitrary string encoding + */ +function rstr2any(input, encoding) +{ + var divisor = encoding.length; + var i, j, q, x, quotient; + + /* Convert to an array of 16-bit big-endian values, forming the dividend */ + var dividend = Array(Math.ceil(input.length / 2)); + for(i = 0; i < dividend.length; i++) + { + dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1); + } + + /* + * Repeatedly perform a long division. The binary array forms the dividend, + * the length of the encoding is the divisor. Once computed, the quotient + * forms the dividend for the next step. All remainders are stored for later + * use. + */ + var full_length = Math.ceil(input.length * 8 / + (Math.log(encoding.length) / Math.log(2))); + var remainders = Array(full_length); + for(j = 0; j < full_length; j++) + { + quotient = Array(); + x = 0; + for(i = 0; i < dividend.length; i++) + { + x = (x << 16) + dividend[i]; + q = Math.floor(x / divisor); + x -= q * divisor; + if(quotient.length > 0 || q > 0) + quotient[quotient.length] = q; + } + remainders[j] = x; + dividend = quotient; + } + + /* Convert the remainders to the output string */ + var output = ""; + for(i = remainders.length - 1; i >= 0; i--) + output += encoding.charAt(remainders[i]); + + return output; +} + +/* + * Encode a string as utf-8. + * For efficiency, this assumes the input is valid utf-16. + */ +function str2rstr_utf8(input) +{ + var output = ""; + var i = -1; + var x, y; + + while(++i < input.length) + { + /* Decode utf-16 surrogate pairs */ + x = input.charCodeAt(i); + y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0; + if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) + { + x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF); + i++; + } + + /* Encode output as utf-8 */ + if(x <= 0x7F) + output += String.fromCharCode(x); + else if(x <= 0x7FF) + output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F), + 0x80 | ( x & 0x3F)); + else if(x <= 0xFFFF) + output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F), + 0x80 | ((x >>> 6 ) & 0x3F), + 0x80 | ( x & 0x3F)); + else if(x <= 0x1FFFFF) + output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07), + 0x80 | ((x >>> 12) & 0x3F), + 0x80 | ((x >>> 6 ) & 0x3F), + 0x80 | ( x & 0x3F)); + } + return output; +} + +/* + * Encode a string as utf-16 + */ +function str2rstr_utf16le(input) +{ + var output = ""; + for(var i = 0; i < input.length; i++) + output += String.fromCharCode( input.charCodeAt(i) & 0xFF, + (input.charCodeAt(i) >>> 8) & 0xFF); + return output; +} + +function str2rstr_utf16be(input) +{ + var output = ""; + for(var i = 0; i < input.length; i++) + output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF, + input.charCodeAt(i) & 0xFF); + return output; +} + +/* + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + */ +function rstr2binl(input) +{ + var output = Array(input.length >> 2); + for(var i = 0; i < output.length; i++) + output[i] = 0; + for(var i = 0; i < input.length * 8; i += 8) + output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32); + return output; +} + +/* + * Convert an array of little-endian words to a string + */ +function binl2rstr(input) +{ + var output = ""; + for(var i = 0; i < input.length * 32; i += 8) + output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF); + return output; +} + +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ +function binl_md5(x, len) +{ + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for(var i = 0; i < x.length; i += 16) + { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); +} + +/* + * These functions implement the four basic operations the algorithm uses. + */ +function md5_cmn(q, a, b, x, s, t) +{ + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); +} +function md5_ff(a, b, c, d, x, s, t) +{ + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); +} +function md5_gg(a, b, c, d, x, s, t) +{ + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); +} +function md5_hh(a, b, c, d, x, s, t) +{ + return md5_cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5_ii(a, b, c, d, x, s, t) +{ + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); +} + +/* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ +function safe_add(x, y) +{ + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); +} + +/* + * Bitwise rotate a 32-bit number to the left. + */ +function bit_rol(num, cnt) +{ + return (num << cnt) | (num >>> (32 - cnt)); +}
\ No newline at end of file diff --git a/templates/main.php b/templates/main.php index 109abf657..f70ade37f 100644 --- a/templates/main.php +++ b/templates/main.php @@ -3,6 +3,7 @@ \OCP\Util::addScript('appframework', 'vendor/angular/angular'); \OCP\Util::addScript('appframework', 'public/app'); +\OCP\Util::addScript('news', 'vendor/md5js/md5'); \OCP\Util::addScript('news', 'vendor/angular-ui/angular-ui'); \OCP\Util::addScript('news', 'vendor/momentjs/moment'); \OCP\Util::addScript('news', 'public/app'); diff --git a/templates/part.listfeed.php b/templates/part.listfeed.php index 42d291c61..132c1db08 100644 --- a/templates/part.listfeed.php +++ b/templates/part.listfeed.php @@ -4,7 +4,7 @@ failed: feed.error }" ng-repeat="feed in feedBl.getFeedsOfFolder(<?php p($_['folderId']); ?>)" - ng-show="feedBl.isVisible(feed.id)" + ng-show="feedBl.isVisible(feed.id) || !feed.id" data-id="{{ feed.id }}" class="feed" oc-draggable="{ diff --git a/templates/part.listfolder.php b/templates/part.listfolder.php index 9520bf42d..717a43ea3 100644 --- a/templates/part.listfolder.php +++ b/templates/part.listfolder.php @@ -6,7 +6,7 @@ failed: folder.error }" ng-repeat="folder in folderBl.getAll()" - ng-show="folderBl.isVisible(folder.id)" + ng-show="folderBl.isVisible(folder.id) || !folder.id" class="folder" data-id="{{ folder.id }}" droppable> |