aboutsummaryrefslogtreecommitdiffstats
path: root/etherpad/src/plugins/fileUpload/models.js
diff options
context:
space:
mode:
Diffstat (limited to 'etherpad/src/plugins/fileUpload/models.js')
-rw-r--r--etherpad/src/plugins/fileUpload/models.js95
1 files changed, 95 insertions, 0 deletions
diff --git a/etherpad/src/plugins/fileUpload/models.js b/etherpad/src/plugins/fileUpload/models.js
new file mode 100644
index 0000000..f8fb563
--- /dev/null
+++ b/etherpad/src/plugins/fileUpload/models.js
@@ -0,0 +1,95 @@
+/**
+ * Copyright 2009 RedHog, Egil Möller <egil.moller@piratpartiet.se>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS-IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import("etherpad.utils.*");
+import("etherpad.globals.*");
+import("etherpad.log");
+import("sqlbase.sqlbase");
+import("sqlbase.sqlcommon");
+import("sqlbase.sqlobj");
+
+jimport("java.io.File",
+ "java.io.DataInputStream",
+ "java.io.FileInputStream",
+ "java.lang.Byte",
+ "java.io.FileReader",
+ "java.io.BufferedReader",
+ "java.security.MessageDigest",
+ "java.lang.Runtime");
+
+
+/* Normal base64 encoding, except we don't care about adding newlines */
+function base64Encode(stringArray) {
+ base64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/";
+
+ /* Pad array to nearest three byte multiple */
+ var padding = (3 - (stringArray.length % 3)) % 3;
+ var padded = java.lang.reflect.Array.newInstance(Byte.TYPE, stringArray.length + padding);
+ java.lang.System.arraycopy(stringArray, 0, padded, 0, stringArray.length);
+ stringArray = padded;
+
+ var encoded = "";
+ for (var i = 0; i < stringArray.length; i += 3) {
+ var j = (((stringArray[i] & 0xff) << 16) +
+ ((stringArray[i + 1] & 0xff) << 8) +
+ (stringArray[i + 2] & 0xff));
+ encoded = (encoded +
+ base64code.charAt((j >> 18) & 0x3f) +
+ base64code.charAt((j >> 12) & 0x3f) +
+ base64code.charAt((j >> 6) & 0x3f) +
+ base64code.charAt(j & 0x3f));
+ }
+ /* replace padding with "=" */
+ return encoded.substring(0, encoded.length - padding) + "==".substring(0, padding);
+}
+
+
+function makeSymlink(destination, source) {
+ return Runtime.getRuntime().exec(['ln', '-s', source.getPath(), destination.getPath()]).waitFor();
+}
+
+
+/* Reads a File and updates a digest with its content */
+function updateDigestFromFile(digest, file) {
+ var handle = new java.io.FileInputStream(file);
+
+ var bytes = java.lang.reflect.Array.newInstance(Byte.TYPE, 512);
+ var nbytes = 0;
+
+ while ((nbytes = handle.read(bytes, 0, 512)) != -1)
+ digest.update(bytes, 0, nbytes);
+
+ handle.close();
+}
+
+
+/* Stores a org.apache.commons.fileupload.disk.DiskFileItem permanently and returns a filename. */
+function storeFile(fileItem) {
+ var nameParts = fileItem.name.split('.');
+ var extension = nameParts[nameParts.length-1];
+
+ var digest = MessageDigest.getInstance("SHA1");
+ updateDigestFromFile(digest, fileItem.getStoreLocation());
+ var checksum = base64Encode(digest.digest());
+
+ fileItem.write(File("src/plugins/fileUpload/upload/" + checksum));
+
+ makeSymlink(
+ File("src/plugins/fileUpload/upload/" + checksum + '.' + extension),
+ File(checksum));
+
+ return checksum + '.' + extension;
+}