From 56c71dd4bfb77ebb5b0e007da36cf30df42a8d3a Mon Sep 17 00:00:00 2001 From: Jonathan Rehm Date: Sat, 30 Sep 2017 10:51:20 -0700 Subject: [PATCH 1/8] Disable bookmarking when anonymous users are reading --- cps/static/js/reading/epub.js | 9 +++++++-- cps/templates/read.html | 3 ++- cps/web.py | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cps/static/js/reading/epub.js b/cps/static/js/reading/epub.js index 5a72d767..169c207f 100644 --- a/cps/static/js/reading/epub.js +++ b/cps/static/js/reading/epub.js @@ -10,8 +10,13 @@ restore: true, bookmarks: calibre.bookmark ? [calibre.bookmark] : [] }); - reader.on("reader:bookmarked", updateBookmark.bind(reader, "add")); - reader.on("reader:unbookmarked", updateBookmark.bind(reader, "remove")); + + if (calibre.useBookmarks) { + reader.on("reader:bookmarked", updateBookmark.bind(reader, "add")); + reader.on("reader:unbookmarked", updateBookmark.bind(reader, "remove")); + } else { + $("#bookmark, #show-Bookmarks").remove(); + } /** * @param {string} action - Add or remove bookmark diff --git a/cps/templates/read.html b/cps/templates/read.html index 2fb214f3..d972c2f6 100644 --- a/cps/templates/read.html +++ b/cps/templates/read.html @@ -83,7 +83,8 @@ cssPath: "{{ url_for('static', filename='css/') }}", bookUrl: "{{ url_for('static', filename=bookid) }}/", bookmarkUrl: "{{ url_for('bookmark', book_id=bookid, book_format='EPUB') }}", - bookmark: "{{ bookmark.bookmark_key if bookmark != None }}" + bookmark: "{{ bookmark.bookmark_key if bookmark != None }}", + useBookmarks: {{ g.user.is_authenticated | tojson }} }; diff --git a/cps/web.py b/cps/web.py index 5873bad8..35096070 100755 --- a/cps/web.py +++ b/cps/web.py @@ -1779,7 +1779,9 @@ def read_book(book_id, book_format): book_dir = os.path.join(config.get_main_dir, "cps", "static", str(book_id)) if not os.path.exists(book_dir): os.mkdir(book_dir) - bookmark = ub.session.query(ub.Bookmark).filter(ub.and_(ub.Bookmark.user_id == int(current_user.id), + bookmark = None + if current_user.is_authenticated: + bookmark = ub.session.query(ub.Bookmark).filter(ub.and_(ub.Bookmark.user_id == int(current_user.id), ub.Bookmark.book_id == book_id, ub.Bookmark.format == book_format.upper())).first() if book_format.lower() == "epub": From 1eb10be2536e5a6757abfd1bf53e1ae671dcea47 Mon Sep 17 00:00:00 2001 From: OzzieIsaacs Date: Sun, 8 Oct 2017 10:41:43 +0200 Subject: [PATCH 2/8] Code cosmetics comic reader --- cps/static/js/archive.js | 24 ++-- cps/static/js/io.js | 34 ++--- cps/static/js/unrar.js | 102 +++++++------- cps/static/js/untar.js | 241 +++++++++++++++++----------------- cps/static/js/unzip.js | 147 +++++++++++---------- cps/templates/email_edit.html | 2 +- cps/templates/index.html | 4 +- 7 files changed, 281 insertions(+), 273 deletions(-) diff --git a/cps/static/js/archive.js b/cps/static/js/archive.js index 6650e1f7..28aae182 100644 --- a/cps/static/js/archive.js +++ b/cps/static/js/archive.js @@ -8,6 +8,8 @@ * Copyright(c) 2011 Google Inc. */ +/* global bitjs */ + var bitjs = bitjs || {}; bitjs.archive = bitjs.archive || {}; @@ -15,7 +17,7 @@ bitjs.archive = bitjs.archive || {}; // =========================================================================== // Stolen from Closure because it's the best way to do Java-like inheritance. - bitjs.base = function(me, optMethodName, var_args) { + bitjs.base = function(me, optMethodName, varArgs) { var caller = arguments.callee.caller; if (caller.superClass_) { // This is a constructor. Call the superclass constructor. @@ -48,10 +50,10 @@ bitjs.archive = bitjs.archive || {}; }; bitjs.inherits = function(childCtor, parentCtor) { /** @constructor */ - function tempCtor() {}; - tempCtor.prototype = parentCtor.prototype; + function TempCtor() {} + TempCtor.prototype = parentCtor.prototype; childCtor.superClass_ = parentCtor.prototype; - childCtor.prototype = new tempCtor(); + childCtor.prototype = new TempCtor(); childCtor.prototype.constructor = childCtor; }; // =========================================================================== @@ -141,12 +143,12 @@ bitjs.archive = bitjs.archive || {}; * Progress event. */ bitjs.archive.UnarchiveProgressEvent = function( - currentFilename, - currentFileNumber, - currentBytesUnarchivedInFile, - currentBytesUnarchived, - totalUncompressedBytesInArchive, - totalFilesInArchive) + currentFilename, + currentFileNumber, + currentBytesUnarchivedInFile, + currentBytesUnarchived, + totalUncompressedBytesInArchive, + totalFilesInArchive) { bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.PROGRESS); @@ -296,7 +298,7 @@ bitjs.archive = bitjs.archive || {}; }; this.worker_.onmessage = function(e) { - if (typeof e.data == "string") { + if (typeof e.data === "string") { // Just log any strings the workers pump our way. console.log(e.data); } else { diff --git a/cps/static/js/io.js b/cps/static/js/io.js index fdff6308..6cc4d81c 100644 --- a/cps/static/js/io.js +++ b/cps/static/js/io.js @@ -9,6 +9,8 @@ * Copyright(c) 2011 antimatter15 */ +/* global bitjs, Uint8Array */ + var bitjs = bitjs || {}; bitjs.io = bitjs.io || {}; @@ -58,16 +60,16 @@ bitjs.io = bitjs.io || {}; * @return {number} The peeked bits, as an unsigned number. */ bitjs.io.BitStream.prototype.peekBitsLtr = function(n, movePointers) { - if (n <= 0 || typeof n != typeof 1) { + if (n <= 0 || typeof n !== typeof 1) { return 0; } - movePointers = movePointers || false, - bytePtr = this.bytePtr, - bitPtr = this.bitPtr, - result = 0, - bitsIn = 0, - bytes = this.bytes; + var movePointers = movePointers || false; + var bytePtr = this.bytePtr; + var bitPtr = this.bitPtr; + var result = 0; + var bitsIn = 0; + var bytes = this.bytes; // keep going until we have no more bits left to peek at // TODO: Consider putting all bits from bytes we will need into a variable and then @@ -123,11 +125,11 @@ bitjs.io = bitjs.io || {}; return 0; } - var movePointers = movePointers || false, - bytePtr = this.bytePtr, - bitPtr = this.bitPtr, - result = 0, - bytes = this.bytes; + var movePointers = movePointers || false; + var bytePtr = this.bytePtr; + var bitPtr = this.bitPtr; + var result = 0; + var bytes = this.bytes; // keep going until we have no more bits left to peek at // TODO: Consider putting all bits from bytes we will need into a variable and then @@ -138,7 +140,7 @@ bitjs.io = bitjs.io || {}; if (bytePtr >= bytes.length) { throw "Error! Overflowed the bit stream! n=" + n + ", bytePtr=" + bytePtr + ", bytes.length=" + bytes.length + ", bitPtr=" + bitPtr; - return -1; + // return -1; } var numBitsLeftInThisByte = (8 - bitPtr); @@ -207,8 +209,8 @@ bitjs.io = bitjs.io || {}; } movePointers = movePointers || false; - var bytePtr = this.bytePtr, - bitPtr = this.bitPtr; + var bytePtr = this.bytePtr; + // var bitPtr = this.bitPtr; var result = this.bytes.subarray(bytePtr, bytePtr + n); @@ -255,7 +257,7 @@ bitjs.io = bitjs.io || {}; */ bitjs.io.ByteStream.prototype.peekNumber = function(n) { // TODO: return error if n would go past the end of the stream? - if (n <= 0 || typeof n !== typeof 1){ + if (n <= 0 || typeof n !== typeof 1) { return -1; } diff --git a/cps/static/js/unrar.js b/cps/static/js/unrar.js index fc2f1266..f32fd6fa 100644 --- a/cps/static/js/unrar.js +++ b/cps/static/js/unrar.js @@ -8,7 +8,7 @@ * * http://kthoom.googlecode.com/hg/docs/unrar.html */ -/* global bitjs */ +/* global bitjs, importScripts */ // This file expects to be invoked as a Worker (see onmessage below). importScripts("io.js"); @@ -42,23 +42,23 @@ var postProgress = function() { // shows a byte value as its hex representation var nibble = "0123456789ABCDEF"; var byteValueToHexString = function(num) { - return nibble[num>>4] + nibble[num&0xF]; + return nibble[num>>4] + nibble[num & 0xF]; }; var twoByteValueToHexString = function(num) { - return nibble[(num>>12)&0xF] + nibble[(num>>8)&0xF] + nibble[(num>>4)&0xF] + nibble[num&0xF]; + return nibble[(num>>12) & 0xF] + nibble[(num>>8) & 0xF] + nibble[(num>>4) & 0xF] + nibble[num & 0xF]; }; // Volume Types -var MARK_HEAD = 0x72, - MAIN_HEAD = 0x73, +// MARK_HEAD = 0x72; +var MAIN_HEAD = 0x73, FILE_HEAD = 0x74, - COMM_HEAD = 0x75, - AV_HEAD = 0x76, - SUB_HEAD = 0x77, - PROTECT_HEAD = 0x78, - SIGN_HEAD = 0x79, - NEWSUB_HEAD = 0x7a, + // COMM_HEAD = 0x75, + // AV_HEAD = 0x76, + // SUB_HEAD = 0x77, + // PROTECT_HEAD = 0x78, + // SIGN_HEAD = 0x79, + // NEWSUB_HEAD = 0x7a, ENDARC_HEAD = 0x7b; // bstream is a bit stream @@ -66,7 +66,7 @@ var RarVolumeHeader = function(bstream) { var headPos = bstream.bytePtr; // byte 1,2 - info("Rar Volume Header @"+bstream.bytePtr); + info("Rar Volume Header @" + bstream.bytePtr); this.crc = bstream.readBits(16); info(" crc=" + this.crc); @@ -147,7 +147,7 @@ var RarVolumeHeader = function(bstream) { this.HighPackSize = 0; this.HighUnpSize = 0; if (this.unpackedSize == 0xffffffff) { - this.HighUnpSize = 0x7fffffff + this.HighUnpSize = 0x7fffffff; this.unpackedSize = 0xffffffff; } } @@ -160,7 +160,7 @@ var RarVolumeHeader = function(bstream) { // read in filename this.filename = bstream.readBytes(this.nameSize); - for (var _i = 0, _s = ''; _i < this.filename.length; _i++) { + for (var _i = 0, _s = ""; _i < this.filename.length ; _i++) { _s += String.fromCharCode(this.filename[_i]); } @@ -177,14 +177,16 @@ var RarVolumeHeader = function(bstream) { // this is adapted straight out of arcread.cpp, Archive::ReadHeader() for (var I = 0; I < 4; ++I) { - var rmode = extTimeFlags >> ((3-I)*4); + var rmode = extTimeFlags >> ((3 - I) * 4); if ((rmode & 8)==0) continue; - if (I!=0) + if (I!=0) { bstream.readBits(16); - var count = (rmode&3); - for (var J = 0; J < count; ++J) - bstream.readBits(8); + } + var count = (rmode & 3); + for (var J = 0; J < count; ++J) { + bstream.readBits(8); + } } } @@ -193,7 +195,7 @@ var RarVolumeHeader = function(bstream) { } - while(headPos + this.headSize > bstream.bytePtr) bstream.readBits(1); + while (headPos + this.headSize > bstream.bytePtr) bstream.readBits(1); info("Found FILE_HEAD with packSize=" + this.packSize + ", unpackedSize= " + this.unpackedSize + ", hostOS=" + this.hostOS + ", unpVer=" + this.unpVer + ", method=" + this.method + ", filename=" + this.filename); @@ -206,24 +208,24 @@ var RarVolumeHeader = function(bstream) { } }; -var BLOCK_LZ = 0, - BLOCK_PPM = 1; +var BLOCK_LZ = 0; + // BLOCK_PPM = 1; -var rLDecode = [0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224], - rLBits = [0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5], - rDBitLengthCounts = [4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,0,12], - rSDDecode = [0,4,8,16,32,64,128,192], +var rLDecode = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224], + rLBits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5], + rDBitLengthCounts = [4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 0, 12], + rSDDecode = [0, 4, 8, 16, 32, 64, 128, 192], rSDBits = [2,2,3, 4, 5, 6, 6, 6]; var rDDecode = [0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, - 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, - 4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304, - 131072, 196608, 262144, 327680, 393216, 458752, 524288, 589824, - 655360, 720896, 786432, 851968, 917504, 983040]; + 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, + 4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304, + 131072, 196608, 262144, 327680, 393216, 458752, 524288, 589824, + 655360, 720896, 786432, 851968, 917504, 983040]; var rDBits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, - 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, - 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]; + 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, + 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]; var rLOW_DIST_REP_COUNT = 16; @@ -232,35 +234,35 @@ var rNC = 299, rLDC = 17, rRC = 28, rBC = 20, - rHUFF_TABLE_SIZE = (rNC+rDC+rRC+rLDC); + rHUFF_TABLE_SIZE = (rNC + rDC + rRC + rLDC); var UnpBlockType = BLOCK_LZ; var UnpOldTable = new Array(rHUFF_TABLE_SIZE); var BD = { //bitdecode - DecodeLen: new Array(16), - DecodePos: new Array(16), - DecodeNum: new Array(rBC) + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rBC) }; var LD = { //litdecode - DecodeLen: new Array(16), - DecodePos: new Array(16), - DecodeNum: new Array(rNC) + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rNC) }; var DD = { //distdecode - DecodeLen: new Array(16), - DecodePos: new Array(16), - DecodeNum: new Array(rDC) + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rDC) }; var LDD = { //low dist decode - DecodeLen: new Array(16), - DecodePos: new Array(16), - DecodeNum: new Array(rLDC) + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rLDC) }; var RD = { //rep decode - DecodeLen: new Array(16), - DecodePos: new Array(16), - DecodeNum: new Array(rRC) + DecodeLen: new Array(16), + DecodePos: new Array(16), + DecodeNum: new Array(rRC) }; var rBuffer; @@ -742,7 +744,7 @@ function unpack(v) { rBuffer = new bitjs.io.ByteBuffer(v.header.unpackedSize); - info("Unpacking "+v.filename+" RAR v"+Ver); + info("Unpacking " + v.filename+" RAR v" + Ver); switch(Ver) { case 15: // rar 1.5 compression @@ -816,7 +818,7 @@ var unrar = function(arrayBuffer) { postMessage(new bitjs.archive.UnarchiveStartEvent()); var bstream = new bitjs.io.BitStream(arrayBuffer, false /* rtl */); - + var header = new RarVolumeHeader(bstream); if (header.crc == 0x6152 && header.headType == 0x72 && diff --git a/cps/static/js/untar.js b/cps/static/js/untar.js index 928245fa..defed7d7 100644 --- a/cps/static/js/untar.js +++ b/cps/static/js/untar.js @@ -7,11 +7,10 @@ * * TAR format: http://www.gnu.org/software/automake/manual/tar/Standard.html */ -/* global bitjs */ // This file expects to be invoked as a Worker (see onmessage below). -importScripts("io.js"); -importScripts("archive.js"); +importScripts('io.js'); +importScripts('archive.js'); // Progress variables. var currentFilename = ""; @@ -23,147 +22,147 @@ var totalFilesInArchive = 0; // Helper functions. var info = function(str) { - postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); + postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); }; var err = function(str) { - postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); + postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); }; var postProgress = function() { - postMessage(new bitjs.archive.UnarchiveProgressEvent( - currentFilename, - currentFileNumber, - currentBytesUnarchivedInFile, - currentBytesUnarchived, - totalUncompressedBytesInArchive, - totalFilesInArchive)); + postMessage(new bitjs.archive.UnarchiveProgressEvent( + currentFilename, + currentFileNumber, + currentBytesUnarchivedInFile, + currentBytesUnarchived, + totalUncompressedBytesInArchive, + totalFilesInArchive)); }; // Removes all characters from the first zero-byte in the string onwards. var readCleanString = function(bstr, numBytes) { - var str = bstr.readString(numBytes); - var zIndex = str.indexOf(String.fromCharCode(0)); - return zIndex !== -1 ? str.substr(0, zIndex) : str; + var str = bstr.readString(numBytes); + var zIndex = str.indexOf(String.fromCharCode(0)); + return zIndex != -1 ? str.substr(0, zIndex) : str; }; // takes a ByteStream and parses out the local file information var TarLocalFile = function(bstream) { - this.isValid = false; - - // Read in the header block - this.name = readCleanString(bstream, 100); - this.mode = readCleanString(bstream, 8); - this.uid = readCleanString(bstream, 8); - this.gid = readCleanString(bstream, 8); - this.size = parseInt(readCleanString(bstream, 12), 8); - this.mtime = readCleanString(bstream, 12); - this.chksum = readCleanString(bstream, 8); - this.typeflag = readCleanString(bstream, 1); - this.linkname = readCleanString(bstream, 100); - this.maybeMagic = readCleanString(bstream, 6); - - if (this.maybeMagic === "ustar") { - this.version = readCleanString(bstream, 2); - this.uname = readCleanString(bstream, 32); - this.gname = readCleanString(bstream, 32); - this.devmajor = readCleanString(bstream, 8); - this.devminor = readCleanString(bstream, 8); - this.prefix = readCleanString(bstream, 155); - - if (this.prefix.length) { - this.name = this.prefix + this.name; - } - bstream.readBytes(12); // 512 - 500 - } else { - bstream.readBytes(255); // 512 - 257 - } + this.isValid = false; + + // Read in the header block + this.name = readCleanString(bstream, 100); + this.mode = readCleanString(bstream, 8); + this.uid = readCleanString(bstream, 8); + this.gid = readCleanString(bstream, 8); + this.size = parseInt(readCleanString(bstream, 12), 8); + this.mtime = readCleanString(bstream, 12); + this.chksum = readCleanString(bstream, 8); + this.typeflag = readCleanString(bstream, 1); + this.linkname = readCleanString(bstream, 100); + this.maybeMagic = readCleanString(bstream, 6); + + if (this.maybeMagic == "ustar") { + this.version = readCleanString(bstream, 2); + this.uname = readCleanString(bstream, 32); + this.gname = readCleanString(bstream, 32); + this.devmajor = readCleanString(bstream, 8); + this.devminor = readCleanString(bstream, 8); + this.prefix = readCleanString(bstream, 155); + + if (this.prefix.length) { + this.name = this.prefix + this.name; + } + bstream.readBytes(12); // 512 - 500 + } else { + bstream.readBytes(255); // 512 - 257 + } - // Done header, now rest of blocks are the file contents. - this.filename = this.name; - this.fileData = null; - - info("Untarring file '" + this.filename + "'"); - info(" size = " + this.size); - info(" typeflag = " + this.typeflag); - - // A regular file. - if (this.typeflag === 0) { - info(" This is a regular file."); - var sizeInBytes = parseInt(this.size); - this.fileData = new Uint8Array(bstream.bytes.buffer, bstream.ptr, this.size); - if (this.name.length > 0 && this.size > 0 && this.fileData && this.fileData.buffer) { - this.isValid = true; - } - - bstream.readBytes(this.size); - - // Round up to 512-byte blocks. - var remaining = 512 - this.size % 512; - if (remaining > 0 && remaining < 512) { - bstream.readBytes(remaining); - } - } else if (this.typeflag === 5) { - info(" This is a directory."); - } + // Done header, now rest of blocks are the file contents. + this.filename = this.name; + this.fileData = null; + + info("Untarring file '" + this.filename + "'"); + info(" size = " + this.size); + info(" typeflag = " + this.typeflag); + + // A regular file. + if (this.typeflag == 0) { + info(" This is a regular file."); + var sizeInBytes = parseInt(this.size); + this.fileData = new Uint8Array(bstream.bytes.buffer, bstream.ptr, this.size); + if (this.name.length > 0 && this.size > 0 && this.fileData && this.fileData.buffer) { + this.isValid = true; + } + + bstream.readBytes(this.size); + + // Round up to 512-byte blocks. + var remaining = 512 - this.size % 512; + if (remaining > 0 && remaining < 512) { + bstream.readBytes(remaining); + } + } else if (this.typeflag == 5) { + info(" This is a directory.") + } }; // Takes an ArrayBuffer of a tar file in // returns null on error // returns an array of DecompressedFile objects on success var untar = function(arrayBuffer) { - currentFilename = ""; - currentFileNumber = 0; - currentBytesUnarchivedInFile = 0; - currentBytesUnarchived = 0; - totalUncompressedBytesInArchive = 0; - totalFilesInArchive = 0; - - postMessage(new bitjs.archive.UnarchiveStartEvent()); - var bstream = new bitjs.io.ByteStream(arrayBuffer); - var localFiles = []; - - // While we don't encounter an empty block, keep making TarLocalFiles. - while (bstream.peekNumber(4) !== 0) { - var oneLocalFile = new TarLocalFile(bstream); - if (oneLocalFile && oneLocalFile.isValid) { - localFiles.push(oneLocalFile); - totalUncompressedBytesInArchive += oneLocalFile.size; - } - } - totalFilesInArchive = localFiles.length; - - // got all local files, now sort them - localFiles.sort(function(a, b) { - var aname = a.filename.toLowerCase(); - var bname = b.filename.toLowerCase(); - return aname > bname ? 1 : -1; - }); - - // report # files and total length - if (localFiles.length > 0) { - postProgress(); - } - - // now do the shipping of each file - for (var i = 0; i < localFiles.length; ++i) { - var localfile = localFiles[i]; - info("Sending file '" + localfile.filename + "' up"); - - // update progress - currentFilename = localfile.filename; - currentFileNumber = i; - currentBytesUnarchivedInFile = localfile.size; - currentBytesUnarchived += localfile.size; - postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); - postProgress(); - } - + currentFilename = ""; + currentFileNumber = 0; + currentBytesUnarchivedInFile = 0; + currentBytesUnarchived = 0; + totalUncompressedBytesInArchive = 0; + totalFilesInArchive = 0; + + postMessage(new bitjs.archive.UnarchiveStartEvent()); + var bstream = new bitjs.io.ByteStream(arrayBuffer); + var localFiles = []; + + // While we don't encounter an empty block, keep making TarLocalFiles. + while (bstream.peekNumber(4) != 0) { + var oneLocalFile = new TarLocalFile(bstream); + if (oneLocalFile && oneLocalFile.isValid) { + localFiles.push(oneLocalFile); + totalUncompressedBytesInArchive += oneLocalFile.size; + } + } + totalFilesInArchive = localFiles.length; + + // got all local files, now sort them + localFiles.sort(function(a,b) { + var aname = a.filename.toLowerCase(); + var bname = b.filename.toLowerCase(); + return aname > bname ? 1 : -1; + }); + + // report # files and total length + if (localFiles.length > 0) { + postProgress(); + } + + // now do the shipping of each file + for (var i = 0; i < localFiles.length; ++i) { + var localfile = localFiles[i]; + info("Sending file '" + localfile.filename + "' up"); + + // update progress + currentFilename = localfile.filename; + currentFileNumber = i; + currentBytesUnarchivedInFile = localfile.size; + currentBytesUnarchived += localfile.size; + postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); postProgress(); + } + + postProgress(); - postMessage(new bitjs.archive.UnarchiveFinishEvent()); + postMessage(new bitjs.archive.UnarchiveFinishEvent()); }; // event.data.file has the ArrayBuffer. onmessage = function(event) { - var ab = event.data.file; - untar(ab); + var ab = event.data.file; + untar(ab); }; diff --git a/cps/static/js/unzip.js b/cps/static/js/unzip.js index 2b5be91a..18b76443 100644 --- a/cps/static/js/unzip.js +++ b/cps/static/js/unzip.js @@ -9,7 +9,7 @@ * ZIP format: http://www.pkware.com/documents/casestudies/APPNOTE.TXT * DEFLATE format: http://tools.ietf.org/html/rfc1951 */ -/* global bitjs */ +/* global bitjs, importScripts, Uint8Array */ // This file expects to be invoked as a Worker (see onmessage below). importScripts("io.js"); @@ -44,12 +44,12 @@ var zLocalFileHeaderSignature = 0x04034b50; var zArchiveExtraDataSignature = 0x08064b50; var zCentralFileHeaderSignature = 0x02014b50; var zDigitalSignatureSignature = 0x05054b50; -var zEndOfCentralDirSignature = 0x06064b50; -var zEndOfCentralDirLocatorSignature = 0x07064b50; +//var zEndOfCentralDirSignature = 0x06064b50; +//var zEndOfCentralDirLocatorSignature = 0x07064b50; // takes a ByteStream and parses out the local file information var ZipLocalFile = function(bstream) { - if (typeof bstream != typeof {} || !bstream.readNumber || typeof bstream.readNumber != typeof function(){}) { + if (typeof bstream !== typeof {} || !bstream.readNumber || typeof bstream.readNumber != typeof function() {} ) { return null; } @@ -100,7 +100,7 @@ var ZipLocalFile = function(bstream) { // "This descriptor exists only if bit 3 of the general purpose bit flag is set" // But how do you figure out how big the file data is if you don't know the compressedSize // from the header?!? - if ((this.generalPurpose & bitjs.BIT[3]) != 0) { + if ((this.generalPurpose & bitjs.BIT[3]) !== 0) { this.crc32 = bstream.readNumber(4); this.compressedSize = bstream.readNumber(4); this.uncompressedSize = bstream.readNumber(4); @@ -111,13 +111,13 @@ var ZipLocalFile = function(bstream) { ZipLocalFile.prototype.unzip = function() { // Zip Version 1.0, no compression (store only) - if (this.compressionMethod == 0 ) { - info("ZIP v"+this.version+", store only: " + this.filename + " (" + this.compressedSize + " bytes)"); + if (this.compressionMethod === 0 ) { + info("ZIP v" + this.version + ", store only: " + this.filename + " (" + this.compressedSize + " bytes)"); currentBytesUnarchivedInFile = this.compressedSize; currentBytesUnarchived += this.compressedSize; } // version == 20, compression method == 8 (DEFLATE) - else if (this.compressionMethod == 8) { + else if (this.compressionMethod === 8) { info("ZIP v2.0, DEFLATE: " + this.filename + " (" + this.compressedSize + " bytes)"); this.fileData = inflate(this.fileData, this.uncompressedSize); } @@ -144,10 +144,10 @@ var unzip = function(arrayBuffer) { var bstream = new bitjs.io.ByteStream(arrayBuffer); // detect local file header signature or return null - if (bstream.peekNumber(4) == zLocalFileHeaderSignature) { + if (bstream.peekNumber(4) === zLocalFileHeaderSignature) { var localFiles = []; // loop until we don't see any more local files - while (bstream.peekNumber(4) == zLocalFileHeaderSignature) { + while (bstream.peekNumber(4) === zLocalFileHeaderSignature) { var oneLocalFile = new ZipLocalFile(bstream); // this should strip out directories/folders if (oneLocalFile && oneLocalFile.uncompressedSize > 0 && oneLocalFile.fileData) { @@ -158,14 +158,14 @@ var unzip = function(arrayBuffer) { totalFilesInArchive = localFiles.length; // got all local files, now sort them - localFiles.sort(function(a,b) { + localFiles.sort(function(a, b) { var aname = a.filename.toLowerCase(); var bname = b.filename.toLowerCase(); return aname > bname ? 1 : -1; }); // archive extra data record - if (bstream.peekNumber(4) == zArchiveExtraDataSignature) { + if (bstream.peekNumber(4) === zArchiveExtraDataSignature) { info(" Found an Archive Extra Data Signature"); // skipping this record for now @@ -176,11 +176,11 @@ var unzip = function(arrayBuffer) { // central directory structure // TODO: handle the rest of the structures (Zip64 stuff) - if (bstream.peekNumber(4) == zCentralFileHeaderSignature) { + if (bstream.peekNumber(4) === zCentralFileHeaderSignature) { info(" Found a Central File Header"); // read all file headers - while (bstream.peekNumber(4) == zCentralFileHeaderSignature) { + while (bstream.peekNumber(4) === zCentralFileHeaderSignature) { bstream.readNumber(4); // signature bstream.readNumber(2); // version made by bstream.readNumber(2); // version needed to extract @@ -206,7 +206,7 @@ var unzip = function(arrayBuffer) { } // digital signature - if (bstream.peekNumber(4) == zDigitalSignatureSignature) { + if (bstream.peekNumber(4) === zDigitalSignatureSignature) { info(" Found a Digital Signature"); bstream.readNumber(4); @@ -231,66 +231,66 @@ var unzip = function(arrayBuffer) { // actually do the unzipping localfile.unzip(); - if (localfile.fileData != null) { + if (localfile.fileData !== null) { postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); postProgress(); } } postProgress(); postMessage(new bitjs.archive.UnarchiveFinishEvent()); - } -} + } +}; // returns a table of Huffman codes // each entry's index is its code and its value is a JavaScript object // containing {length: 6, symbol: X} function getHuffmanCodes(bitLengths) { // ensure bitLengths is an array containing at least one element - if (typeof bitLengths != typeof [] || bitLengths.length < 1) { + if (typeof bitLengths !== typeof [] || bitLengths.length < 1) { err("Error! getHuffmanCodes() called with an invalid array"); return null; } // Reference: http://tools.ietf.org/html/rfc1951#page-8 var numLengths = bitLengths.length, - bl_count = [], + blCount = [], MAX_BITS = 1; // Step 1: count up how many codes of each length we have for (var i = 0; i < numLengths; ++i) { - var length = bitLengths[i]; + var len = bitLengths[i]; // test to ensure each bit length is a positive, non-zero number - if (typeof length != typeof 1 || length < 0) { - err("bitLengths contained an invalid number in getHuffmanCodes(): " + length + " of type " + (typeof length)); + if (typeof len !== typeof 1 || len < 0) { + err("bitLengths contained an invalid number in getHuffmanCodes(): " + len + " of type " + (typeof len)); return null; } // increment the appropriate bitlength count - if (bl_count[length] == undefined) bl_count[length] = 0; + if (blCount[len] === undefined) blCount[len] = 0; // a length of zero means this symbol is not participating in the huffman coding - if (length > 0) bl_count[length]++; + if (len > 0) blCount[len]++; - if (length > MAX_BITS) MAX_BITS = length; + if (len > MAX_BITS) MAX_BITS = len; } // Step 2: Find the numerical value of the smallest code for each code length - var next_code = [], + var nextCode = [], code = 0; for (var bits = 1; bits <= MAX_BITS; ++bits) { - var length = bits-1; + var len = bits-1; // ensure undefined lengths are zero - if (bl_count[length] == undefined) bl_count[length] = 0; - code = (code + bl_count[bits-1]) << 1; - next_code[bits] = code; + if (blCount[len] == undefined) blCount[len] = 0; + code = (code + blCount[bits-1]) << 1; + nextCode[bits] = code; } // Step 3: Assign numerical values to all codes var table = {}, tableLength = 0; for (var n = 0; n < numLengths; ++n) { var len = bitLengths[n]; - if (len != 0) { - table[next_code[len]] = { length: len, symbol: n }; //, bitstring: binaryValueToString(next_code[len],len) }; + if (len !== 0) { + table[nextCode[len]] = { length: len, symbol: n }; //, bitstring: binaryValueToString(nextCode[len],len) }; tableLength++; - next_code[len]++; + nextCode[len]++; } } table.maxLength = tableLength; @@ -322,9 +322,9 @@ function getFixedLiteralTable() { if (!fixedHCtoLiteral) { var bitlengths = new Array(288); for (var i = 0; i <= 143; ++i) bitlengths[i] = 8; - for (i = 144; i <= 255; ++i) bitlengths[i] = 9; - for (i = 256; i <= 279; ++i) bitlengths[i] = 7; - for (i = 280; i <= 287; ++i) bitlengths[i] = 8; + for (var i = 144; i <= 255; ++i) bitlengths[i] = 9; + for (var i = 256; i <= 279; ++i) bitlengths[i] = 7; + for (var i = 280; i <= 287; ++i) bitlengths[i] = 8; // get huffman code table fixedHCtoLiteral = getHuffmanCodes(bitlengths); @@ -335,7 +335,9 @@ function getFixedDistanceTable() { // create once if (!fixedHCtoDistance) { var bitlengths = new Array(32); - for (var i = 0; i < 32; ++i) { bitlengths[i] = 5; } + for (var i = 0; i < 32; ++i) { + bitlengths[i] = 5; + } // get huffman code table fixedHCtoDistance = getHuffmanCodes(bitlengths); @@ -347,7 +349,7 @@ function getFixedDistanceTable() { // then return that symbol function decodeSymbol(bstream, hcTable) { var code = 0, len = 0; - var match = false; + // var match = false; // loop until we match for (;;) { @@ -389,14 +391,14 @@ var CodeLengthCodeOrder = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2 */ var LengthLookupTable = [ - [0,3], [0,4], [0,5], [0,6], - [0,7], [0,8], [0,9], [0,10], - [1,11], [1,13], [1,15], [1,17], - [2,19], [2,23], [2,27], [2,31], - [3,35], [3,43], [3,51], [3,59], - [4,67], [4,83], [4,99], [4,115], - [5,131], [5,163], [5,195], [5,227], - [0,258] + [0, 3], [0, 4], [0, 5], [0, 6], + [0, 7], [0, 8], [0, 9], [0, 10], + [1, 11], [1, 13], [1, 15], [1, 17], + [2, 19], [2, 23], [2, 27], [2, 31], + [3, 35], [3, 43], [3, 51], [3, 59], + [4, 67], [4, 83], [4, 99], [4, 115], + [5, 131], [5, 163], [5, 195], [5, 227], + [0, 258] ]; /* Extra Extra Extra @@ -414,20 +416,20 @@ var LengthLookupTable = [ 9 3 25-32 19 8 769-1024 29 13 24577-32768 */ var DistLookupTable = [ - [0,1], [0,2], [0,3], [0,4], - [1,5], [1,7], - [2,9], [2,13], - [3,17], [3,25], - [4,33], [4,49], - [5,65], [5,97], - [6,129], [6,193], - [7,257], [7,385], - [8,513], [8,769], - [9,1025], [9,1537], - [10,2049], [10,3073], - [11,4097], [11,6145], - [12,8193], [12,12289], - [13,16385], [13,24577] + [0, 1], [0, 2], [0, 3], [0, 4], + [1, 5], [1, 7], + [2, 9], [2, 13], + [3, 17], [3, 25], + [4, 33], [4, 49], + [5, 65], [5, 97], + [6, 129], [6, 193], + [7, 257], [7, 385], + [8, 513], [8, 769], + [9, 1025], [9, 1537], + [10, 2049], [10, 3073], + [11, 4097], [11, 6145], + [12, 8193], [12, 12289], + [13, 16385], [13, 24577] ]; function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) { @@ -457,7 +459,7 @@ function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) { } else { // end of block reached - if (symbol == 256) { + if (symbol === 256) { break; } else { @@ -504,12 +506,13 @@ function inflate(compressedData, numDecompressedBytes) { compressedData.byteOffset, compressedData.byteLength); var buffer = new bitjs.io.ByteBuffer(numDecompressedBytes); - var numBlocks = 0, blockSize = 0; + var numBlocks = 0; + var blockSize = 0; // block format: http://tools.ietf.org/html/rfc1951#page-9 do { - var bFinal = bstream.readBits(1), - bType = bstream.readBits(2); + var bFinal = bstream.readBits(1); + var bType = bstream.readBits(2); blockSize = 0; ++numBlocks; // no compression @@ -524,17 +527,17 @@ function inflate(compressedData, numDecompressedBytes) { blockSize = len; } // fixed Huffman codes - else if(bType == 1) { + else if(bType === 1) { blockSize = inflateBlockData(bstream, getFixedLiteralTable(), getFixedDistanceTable(), buffer); } // dynamic Huffman codes - else if(bType == 2) { + else if(bType === 2) { var numLiteralLengthCodes = bstream.readBits(5) + 257; var numDistanceCodes = bstream.readBits(5) + 1, numCodeLengthCodes = bstream.readBits(4) + 4; // populate the array of code length codes (first de-compaction) - var codeLengthsCodeLengths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; + var codeLengthsCodeLengths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (var i = 0; i < numCodeLengthCodes; ++i) { codeLengthsCodeLengths[ CodeLengthCodeOrder[i] ] = bstream.readBits(3); } @@ -566,19 +569,19 @@ function inflate(compressedData, numDecompressedBytes) { literalCodeLengths.push(symbol); prevCodeLength = symbol; } - else if (symbol == 16) { + else if (symbol === 16) { var repeat = bstream.readBits(2) + 3; while (repeat--) { literalCodeLengths.push(prevCodeLength); } } - else if (symbol == 17) { + else if (symbol === 17) { var repeat = bstream.readBits(3) + 3; while (repeat--) { literalCodeLengths.push(0); } } - else if (symbol == 18) { + else if (symbol === 18) { var repeat = bstream.readBits(7) + 11; while (repeat--) { literalCodeLengths.push(0); @@ -605,7 +608,7 @@ function inflate(compressedData, numDecompressedBytes) { currentBytesUnarchived += blockSize; postProgress(); - } while (bFinal != 1); + } while (bFinal !== 1); // we are done reading blocks if the bFinal bit was set for this block // return the buffer data bytes diff --git a/cps/templates/email_edit.html b/cps/templates/email_edit.html index 42596a9a..8cb939e4 100644 --- a/cps/templates/email_edit.html +++ b/cps/templates/email_edit.html @@ -33,7 +33,7 @@ - {{_('Back')}} + {{_('Back')}} diff --git a/cps/templates/index.html b/cps/templates/index.html index c78d090a..bcffec6c 100755 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -6,7 +6,7 @@
{% for entry in random %} -
+
{% if entry.has_cover %} @@ -42,7 +42,7 @@
{% if entries[0] %} {% for entry in entries %} -
+
- {% if g.user.is_authenticated or g.user.is_anonymous() %} + {% if g.user.is_authenticated() or g.user.is_anonymous() %}