diff --git a/Teknik/App_Start/BundleConfig.cs b/Teknik/App_Start/BundleConfig.cs
index 6f689a7..e5c21f6 100644
--- a/Teknik/App_Start/BundleConfig.cs
+++ b/Teknik/App_Start/BundleConfig.cs
@@ -16,7 +16,7 @@ namespace Teknik
// Set if we are using Cdn
bundles.UseCdn = config.UseCdn;
- BundleTable.EnableOptimizations = false;
+ BundleTable.EnableOptimizations = true;
#if !DEBUG
BundleTable.EnableOptimizations = true;
#endif
diff --git a/Teknik/Areas/API/Controllers/APIv1Controller.cs b/Teknik/Areas/API/Controllers/APIv1Controller.cs
index 8be5e21..de13cb6 100644
--- a/Teknik/Areas/API/Controllers/APIv1Controller.cs
+++ b/Teknik/Areas/API/Controllers/APIv1Controller.cs
@@ -50,16 +50,6 @@ namespace Teknik.Areas.API.Controllers
// Scan the file to detect a virus
if (Config.UploadConfig.VirusScanEnable)
{
- // If it was encrypted client side, decrypt it
- //if (!model.encrypt && model.key != null)
- //{
- // // If the IV is set, and Key is set, then decrypt it
- // if (!string.IsNullOrEmpty(model.key) && !string.IsNullOrEmpty(model.iv))
- // {
- // // Decrypt the data
- // scanData = AES.Decrypt(scanData, model.key, model.iv);
- // }
- //}
ClamClient clam = new ClamClient(Config.UploadConfig.ClamServer, Config.UploadConfig.ClamPort);
clam.MaxStreamSize = Config.UploadConfig.MaxUploadSize;
ClamScanResult scanResult = clam.SendAndScanFile(model.file.InputStream);
@@ -90,7 +80,7 @@ namespace Teknik.Areas.API.Controllers
model.blockSize = Config.UploadConfig.BlockSize;
// Save the file data
- Upload.Models.Upload upload = Uploader.SaveFile(db, Config, model.file.InputStream, model.contentType, contentLength, model.encrypt, fileExt, model.iv, model.key, model.saveKey, model.keySize, model.blockSize);
+ Upload.Models.Upload upload = Uploader.SaveFile(db, Config, model.file.InputStream, model.contentType, contentLength, model.encrypt, fileExt, model.iv, model.key, model.keySize, model.blockSize);
if (upload != null)
{
diff --git a/Teknik/Areas/Upload/Content/Upload.css b/Teknik/Areas/Upload/Content/Upload.css
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/Teknik/Areas/Upload/Content/Upload.css
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/Teknik/Areas/Upload/Controllers/UploadController.cs b/Teknik/Areas/Upload/Controllers/UploadController.cs
index efd13dd..842e734 100644
--- a/Teknik/Areas/Upload/Controllers/UploadController.cs
+++ b/Teknik/Areas/Upload/Controllers/UploadController.cs
@@ -40,20 +40,18 @@ namespace Teknik.Areas.Upload.Controllers
Users.Models.User user = UserHelper.GetUser(db, User.Identity.Name);
if (user != null)
{
- model.SaveKey = user.UploadSettings.SaveKey;
- model.ServerSideEncrypt = user.UploadSettings.ServerSideEncrypt;
+ model.Encrypt = user.UploadSettings.Encrypt;
}
else
{
- model.SaveKey = true;
- model.ServerSideEncrypt = true;
+ model.Encrypt = false;
}
return View(model);
}
[HttpPost]
[AllowAnonymous]
- public ActionResult Upload(string fileType, string fileExt, string iv, int keySize, int blockSize, bool encrypt, bool saveKey, HttpPostedFileWrapper data, string key = null)
+ public ActionResult Upload(string fileType, string fileExt, string iv, int keySize, int blockSize, bool encrypt, HttpPostedFileWrapper data)
{
try
{
@@ -67,16 +65,6 @@ namespace Teknik.Areas.Upload.Controllers
// Scan the file to detect a virus
if (Config.UploadConfig.VirusScanEnable)
{
- // If it was encrypted client side, decrypt it
- //if (!encrypt && key != null)
- //{
- // // If the IV is set, and Key is set, then decrypt it
- // if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(iv))
- // {
- // // Decrypt the data
- // scanData = AES.Decrypt(scanData, key, iv);
- // }
- //}
ClamClient clam = new ClamClient(Config.UploadConfig.ClamServer, Config.UploadConfig.ClamPort);
clam.MaxStreamSize = Config.UploadConfig.MaxUploadSize;
ClamScanResult scanResult = clam.SendAndScanFile(data.InputStream);
@@ -94,7 +82,7 @@ namespace Teknik.Areas.Upload.Controllers
}
}
- Models.Upload upload = Uploader.SaveFile(db, Config, data.InputStream, fileType, contentLength, encrypt, fileExt, iv, key, saveKey, keySize, blockSize);
+ Models.Upload upload = Uploader.SaveFile(db, Config, data.InputStream, fileType, contentLength, encrypt, fileExt, iv, null, keySize, blockSize);
if (upload != null)
{
if (User.Identity.IsAuthenticated)
@@ -107,7 +95,7 @@ namespace Teknik.Areas.Upload.Controllers
db.SaveChanges();
}
}
- return Json(new { result = new { name = upload.Url, url = Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Url }), key = key } }, "text/plain");
+ return Json(new { result = new { name = upload.Url, url = Url.SubRouteUrl("u", "Upload.Download", new { file = upload.Url }), contentType = upload.ContentType, contentLength = StringHelper.GetBytesReadable(upload.ContentLength) } }, "text/plain");
}
return Json(new { error = new { message = "Unable to upload file" } });
}
diff --git a/Teknik/Areas/Upload/Scripts/Upload.js b/Teknik/Areas/Upload/Scripts/Upload.js
index 9f94278..115ff74 100644
--- a/Teknik/Areas/Upload/Scripts/Upload.js
+++ b/Teknik/Areas/Upload/Scripts/Upload.js
@@ -2,58 +2,13 @@
$("#upload-links").css('display', 'none', 'important');
$("#upload-links").html('');
- $("[name='saveKey']").bootstrapSwitch();
- $("[name='serverSideEncrypt']").bootstrapSwitch();
+ $("[name='encrypt']").bootstrapSwitch();
+
+ linkCopyAll($('#copy-all-button'));
});
-function linkSaveKey(selector, uploadID, key, fileID) {
- $(selector).click(function () {
- $.ajax({
- type: "POST",
- url: saveKeyToServerURL,
- data: { file: uploadID, key: key },
- success: function (html) {
- if (html.result) {
- $('#key-link-' + fileID).html('Remove Key From Server ');
- $('#upload-link-' + fileID).html('
' + html.result + '
');
- linkRemoveKey('#remove-key-link-' + fileID + '', uploadID, key, fileID);
- $('#shortenUrl-button-' + fileID).prop('disabled', false);
- }
- else {
- $("#top_msg").css('display', 'inline', 'important');
- $("#top_msg").html('× ' + html.error + '
');
- }
- }
- });
- return false;
- });
-}
-
-function linkRemoveKey(selector, uploadID, key, fileID) {
- $(selector).click(function () {
- $.ajax({
- type: "POST",
- url: removeKeyFromServerURL,
- data: { file: uploadID, key: key },
- success: function (html) {
- if (html.result) {
- $('#key-link-' + fileID).html('Save Key To Server ');
- $('#upload-link-' + fileID).html('' + html.result + '#' + key + '
');
- linkSaveKey('#save-key-link-' + fileID + '', uploadID, key, fileID);
- $('#shortenUrl-button-' + fileID).prop('disabled', false);
- }
- else {
- $("#top_msg").css('display', 'inline', 'important');
- $("#top_msg").html('× ' + html.error + '
');
- }
- }
- });
- return false;
- });
-}
-
-function linkUploadDelete(selector, uploadID) {
- $(selector).click(function () {
+function linkUploadDelete(element, uploadID) {
+ element.click(function () {
$.ajax({
type: "POST",
url: generateDeleteKeyURL,
@@ -76,17 +31,18 @@ function linkUploadDelete(selector, uploadID) {
});
}
-function linkShortenUrl(selector, fileID, url) {
- $(selector).click(function () {
- var url = $('#full-url-link-' + fileID).html();
+function linkShortenUrl(element, fileID, url) {
+ element.click(function () {
+ var url = $('#upload-panel-' + fileID).find('#upload-link').text();
$.ajax({
type: "POST",
url: shortenURL,
data: { url: url },
success: function (html) {
if (html.result) {
- $(selector).prop('disabled', true);
- $('#upload-link-' + fileID).html('' + html.result.shortUrl + '
');
+ element.prop('disabled', true);
+ $('#upload-panel-' + fileID).find('#upload-link').attr('href', html.result.shortUrl);
+ $('#upload-panel-' + fileID).find('#upload-link').text(html.result.shortUrl);
}
else {
$("#top_msg").css('display', 'inline', 'important');
@@ -98,20 +54,40 @@ function linkShortenUrl(selector, fileID, url) {
});
}
-function linkRemove(selector, fileID) {
- $(selector).click(function () {
- $('#link-' + fileID).remove();
+function linkRemove(element, fileID) {
+ element.click(function () {
+ $('#upload-panel-' + fileID).remove();
+ if ($('#upload-links').children().length == 0) {
+ $("#upload-links").css('display', 'none', 'important');
+ $('#copy-all-button').hide();
+ }
return false;
});
}
-function linkCancel(selector, fileID) {
- $(selector).click(function () {
- $('#link-' + fileID).remove();
+function linkCancel(element, fileID) {
+ element.click(function () {
+ $('#upload-panel-' + fileID).remove();
return false;
});
}
+function linkCopyAll(element) {
+ element.click(function () {
+ var allUploads = [];
+ $("div[id^='upload-panel-']").each(function () {
+ var url = $(this).find('#upload-link').text();
+ if (url !== '') {
+ allUploads.push(url);
+ }
+ });
+ if (allUploads.length > 0) {
+ var urlList = allUploads.join();
+ copyTextToClipboard(urlList);
+ }
+ });
+}
+
var fileCount = 0;
var dropZone = new Dropzone(document.body, {
@@ -125,35 +101,27 @@ var dropZone = new Dropzone(document.body, {
// Create the UI element for the new item
var fileID = fileCount;
fileCount++;
+
+ $("#upload-links").css('display', 'inline', 'important');
+ $('#copy-all-button').show();
+
+ var itemDiv = $('#upload-template').clone();
+ itemDiv.attr('id', 'upload-panel-' + fileID);
+
+ // Hide Upload Details
+ itemDiv.find('#upload-link-panel').hide();
+
+ // Assign buttons
+ linkRemove(itemDiv.find('#upload-close'), fileID);
+
+ // Set the info
+ itemDiv.find('#upload-title').html(file.name);
+
+ // Add the upload panel to the list
+ $("#upload-links").prepend(itemDiv);
+
// save ID to the file object
file.ID = fileID;
- $("#upload-links").css('display', 'inline', 'important');
- $("#upload-links").prepend(' \
- \
- ');
-
- linkRemove('#remove-link-' + fileID + '', fileID);
// Check the file size
if (file.size <= maxUploadSize) {
@@ -163,12 +131,7 @@ var dropZone = new Dropzone(document.body, {
else
{
// An error occured
- $("#progress-" + fileID).children('.progress-bar').css('width', '100%');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-success');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-striped');
- $("#progress-" + fileID).children('.progress-bar').removeClass('active');
- $("#progress-" + fileID).children('.progress-bar').addClass('progress-bar-danger');
- $("#progress-" + fileID).children('.progress-bar').html('File Too Large');
+ setProgress(fileID, 100, 'progress-bar-danger', '', 'File Too Large');
}
this.removeFile(file);
}
@@ -181,8 +144,7 @@ function encryptFile(file, callback) {
var fileExt = getFileExtension(file.name);
// Get session settings
- var saveKey = $('#saveKey').is(':checked');
- var serverSideEncrypt = $('#serverSideEncrypt').is(':checked');
+ var encrypt = $('#encrypt').is(':checked');
// Start the file reader
var reader = new FileReader();
@@ -190,28 +152,39 @@ function encryptFile(file, callback) {
// When the file has been loaded, encrypt it
reader.onload = (function (callback) {
return function (e) {
- // Create random key and iv (divide size by 8 for character length)
- var keyStr = randomString((keySize / 8), '#aA');
- var ivStr = randomString((blockSize / 8), '#aA');
- // Encrypt on the server side if they ask for it
- if (serverSideEncrypt) {
- callback(e.target.result, keyStr, ivStr, filetype, fileExt, fileID, saveKey, serverSideEncrypt);
+ // Just send straight to server if they don't want to encrypt it
+ if (!encrypt) {
+ callback(e.target.result, null, null, filetype, fileExt, fileID, encrypt);
}
else {
+ // Set variables for tracking
+ var lastTime = (new Date()).getTime();
+ var lastData = 0;
+
+ // Create random key and iv (divide size by 8 for character length)
+ var keyStr = randomString((keySize / 8), '#aA');
+ var ivStr = randomString((blockSize / 8), '#aA');
+
var worker = new Worker(GenerateBlobURL(encScriptSrc));
worker.addEventListener('message', function (e) {
switch (e.data.cmd) {
case 'progress':
- var percentComplete = Math.round(e.data.processed * 100 / e.data.total);
- $("#progress-" + fileID).children('.progress-bar').css('width', (percentComplete * (2 / 5)) + 20 + '%');
- $("#progress-" + fileID).children('.progress-bar').html(percentComplete + '% Encrypted');
+ var curTime = (new Date()).getTime();
+ var elapsedTime = (curTime - lastTime) / 1000;
+ if (elapsedTime >= 0.1) {
+ var speed = ((e.data.processed - lastData) / elapsedTime);
+ lastTime = curTime;
+ lastData = e.data.processed;
+ var percentComplete = Math.round(e.data.processed * 100 / e.data.total);
+ setProgress(fileID, percentComplete, 'progress-bar-success progress-bar-striped active', percentComplete + '%', 'Encrypting [' + getReadableBandwidthString(speed) + ']');
+ }
break;
case 'finish':
if (callback != null) {
// Finish
- callback(e.data.buffer, keyStr, ivStr, filetype, fileExt, fileID, saveKey, serverSideEncrypt);
+ callback(e.data.buffer, keyStr, ivStr, filetype, fileExt, fileID, encrypt);
}
break;
}
@@ -219,12 +192,8 @@ function encryptFile(file, callback) {
worker.onerror = function (err) {
// An error occured
- $("#progress-" + fileID).children('.progress-bar').css('width', '100%');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-success');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-striped');
- $("#progress-" + fileID).children('.progress-bar').removeClass('active');
- $("#progress-" + fileID).children('.progress-bar').addClass('progress-bar-danger');
- $("#progress-" + fileID).children('.progress-bar').html('Error Occured');
+ setProgress(fileID, 100, 'progress-bar-danger', '', 'Error Occured');
+ $('#upload-panel-' + fileID).find('.panel').addClass('panel-danger');
}
// Generate the script to include as a blob
@@ -248,8 +217,7 @@ function encryptFile(file, callback) {
reader.onprogress = function (data) {
if (data.lengthComputable) {
var progress = parseInt(((data.loaded / data.total) * 100), 10);
- $('#progress-' + fileID).children('.progress-bar').css('width', (progress / 5) + '%');
- $('#progress-' + fileID).children('.progress-bar').html(progress + '% Loaded');
+ setProgress(fileID, progress, 'progress-bar-success progress-bar-striped active', progress + '%', 'Loading');
}
}
@@ -258,124 +226,117 @@ function encryptFile(file, callback) {
reader.readAsArrayBuffer(blob);
}
-function uploadFile(data, key, iv, filetype, fileExt, fileID, saveKey, serverSideEncrypt)
+function uploadFile(data, key, iv, filetype, fileExt, fileID, encrypt)
{
- $('#key-' + fileID).val(key);
+ // Set variables for tracking
+ var lastTime = (new Date()).getTime();
+ var lastData = 0;
+
var blob = new Blob([data]);
// Now we need to upload the file
var fd = new FormData();
fd.append('fileType', filetype);
fd.append('fileExt', fileExt);
- if (saveKey)
- {
- fd.append('key', key);
- }
fd.append('iv', iv);
fd.append('keySize', keySize);
fd.append('blockSize', blockSize);
fd.append('data', blob);
- fd.append('saveKey', saveKey);
- fd.append('encrypt', serverSideEncrypt);
+ fd.append('encrypt', !encrypt);
fd.append('__RequestVerificationToken', $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val());
var xhr = new XMLHttpRequest();
- xhr.upload.addEventListener("progress", uploadProgress.bind(null, fileID), false);
- xhr.addEventListener("load", uploadComplete.bind(null, fileID, key, saveKey, serverSideEncrypt), false);
+ xhr.upload.addEventListener("progress", uploadProgress.bind(null, fileID, lastTime, lastData), false);
+ xhr.addEventListener("load", uploadComplete.bind(null, fileID, key, encrypt), false);
xhr.addEventListener("error", uploadFailed.bind(null, fileID), false);
xhr.addEventListener("abort", uploadCanceled.bind(null, fileID), false);
xhr.open("POST", uploadFileURL);
xhr.send(fd);
}
-function uploadProgress(fileID, evt) {
+
+
+function uploadProgress(fileID, lastTime, lastData, evt) {
var serverSideEncrypt = $('#serverSideEncrypt').is(':checked');
if (evt.lengthComputable) {
+ var curTime = (new Date()).getTime();
+ var elapsedTime = (curTime - lastTime) / 1000;
+ var speed = ((evt.loaded - lastData) / elapsedTime);
+ lastTime = curTime;
+ lastData = evt.loaded;
var percentComplete = Math.round(evt.loaded * 100 / evt.total);
- if (serverSideEncrypt && percentComplete == 100) {
- $('#progress-' + fileID).children('.progress-bar').css('width', '100%');
- $('#progress-' + fileID).children('.progress-bar').html('Encrypting');
+ if (percentComplete == 100) {
+ setProgress(fileID, 100, 'progress-bar-success progress-bar-striped active', '', 'Processing Upload');
}
else {
- $('#progress-' + fileID).children('.progress-bar').css('width', (percentComplete * (2 / 5)) + 60 + '%');
- $('#progress-' + fileID).children('.progress-bar').html(percentComplete + '% Uploaded');
+ setProgress(fileID, percentComplete, 'progress-bar-success progress-bar-striped active', percentComplete + '%', 'Uploading to Server [' + getReadableBandwidthString(speed) + ']');
}
}
}
-function uploadComplete(fileID, key, saveKey, serverSideEncrypt, evt) {
+function uploadComplete(fileID, key, encrypt, evt) {
obj = JSON.parse(evt.target.responseText);
if (obj.result != null) {
- var name = obj.result.name;
- var fullName = obj.result.url;
- if (obj.result.key != null)
- key = obj.result.key;
- if (!saveKey) {
- fullName = fullName + '#' + key;
+ var itemDiv = $('#upload-panel-' + fileID);
+ if (itemDiv) {
+ var name = obj.result.name;
+ var fullName = obj.result.url;
+ if (encrypt) {
+ fullName = fullName + '#' + key;
+ }
+ var contentType = obj.result.contentType;
+ var contentLength = obj.result.contentLength;
+
+ // Set progress bar
+ setProgress(fileID, 100, 'progress-bar-success', '', 'Complete');
+
+ // Set the panel to success
+ itemDiv.find('.panel').addClass('panel-success');
+
+ // Add the upload details
+ itemDiv.find('#upload-link').attr('href', fullName);
+ itemDiv.find('#upload-link').text(fullName);
+ itemDiv.find('#upload-contentType').html(contentType);
+ itemDiv.find('#upload-contentLength').html(contentLength);
+
+ // Setup the buttons
+ linkUploadDelete(itemDiv.find('#generate-delete-link'), name);
+ linkShortenUrl(itemDiv.find('#shortenUrl'), fileID, fullName);
+
+ // Hide the progress bar
+ itemDiv.find('#upload-progress-panel').hide();
+
+ // Show the details
+ itemDiv.find('#upload-link-panel').show();
}
- $('#progress-' + fileID).children('.progress-bar').css('width', '100%');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-striped');
- $("#progress-" + fileID).children('.progress-bar').removeClass('active');
- $('#progress-' + fileID).children('.progress-bar').html('Complete');
- $('#upload-link-' + fileID).html('' + fullName + '
');
- var keyBtn = ' \
- Save Key On Server \
-
';
- if (saveKey) {
- keyBtn = ' \
- Remove Key From Server \
-
';
- }
- $('#link-footer-' + fileID).html(' \
- \
- ' + keyBtn + ' \
-
\
- Generate Deletion URL \
-
\
-
\
- Shorten Url \
-
\
-
\
- ');
- if (saveKey) {
- linkRemoveKey('#remove-key-link-' + fileID + '', name, key, fileID);
- }
- else {
- linkSaveKey('#save-key-link-' + fileID + '', name, key, fileID);
- }
- linkUploadDelete('#generate-delete-link-' + fileID + '', name);
- linkShortenUrl('#shortenUrl-button-' + fileID + '', fileID, fullName);
}
else
{
- $('#progress-' + fileID).children('.progress-bar').css('width', '100%');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-success');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-striped');
- $("#progress-" + fileID).children('.progress-bar').removeClass('active');
- $("#progress-" + fileID).children('.progress-bar').addClass('progress-bar-danger');
- $('#remove-link-' + fileID).text('Clear Upload');
+ var errorMessage = 'Unable to Upload File';
if (obj.error != null) {
- $('#progress-' + fileID).children('.progress-bar').html(obj.error.message);
- }
- else {
- $('#progress-' + fileID).children('.progress-bar').html('Unable to Upload File');
+ errorMessage = obj.error.message;
}
+ setProgress(fileID, 100, 'progress-bar-danger', '', errorMessage);
}
}
function uploadFailed(fileID, evt) {
- $('#progress-' + fileID).children('.progress-bar').css('width', '100%');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-success');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-striped');
- $("#progress-" + fileID).children('.progress-bar').removeClass('active');
- $("#progress-" + fileID).children('.progress-bar').addClass('progress-bar-danger');
- $('#progress-' + fileID).children('.progress-bar').html('Upload Failed');
+ setProgress(fileID, 100, 'progress-bar-danger', '', 'Upload Failed');
+ $('#upload-panel-' + fileID).find('.panel').addClass('panel-danger');
}
function uploadCanceled(fileID, evt) {
- $('#progress-' + fileID).children('.progress-bar').css('width', '100%');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-success');
- $("#progress-" + fileID).children('.progress-bar').removeClass('progress-bar-striped');
- $("#progress-" + fileID).children('.progress-bar').removeClass('active');
- $("#progress-" + fileID).children('.progress-bar').addClass('progress-bar-warning');
- $('#progress-' + fileID).children('.progress-bar').html('Upload Canceled');
+ setProgress(fileID, 100, 'progress-bar-warning', '', 'Upload Canceled');
+ $('#upload-panel-' + fileID).find('.panel').addClass('panel-warning');
+}
+
+function setProgress(fileID, percentage, classes, barMessage, title) {
+ var progress = $('#upload-panel-' + fileID);
+ if (progress !== null) {
+ progress.find('#progress-bar').css('width', percentage + '%');
+ progress.find('#progress-bar').removeClass();
+ progress.find('#progress-bar').addClass('progress-bar');
+ progress.find('#progress-bar').addClass(classes);
+ progress.find('#progress-bar').html(barMessage);
+ progress.find('#progress-info').html(title);
+ }
}
\ No newline at end of file
diff --git a/Teknik/Areas/Upload/Uploader.cs b/Teknik/Areas/Upload/Uploader.cs
index 58213b6..4ea1e30 100644
--- a/Teknik/Areas/Upload/Uploader.cs
+++ b/Teknik/Areas/Upload/Uploader.cs
@@ -7,6 +7,7 @@ using Teknik.Configuration;
using Teknik.Models;
using Teknik.Utilities;
using System.Text;
+using Org.BouncyCastle.Utilities.Encoders;
namespace Teknik.Areas.Upload
{
@@ -14,24 +15,24 @@ namespace Teknik.Areas.Upload
{
public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt)
{
- return SaveFile(db, config, file, contentType, contentLength, encrypt, string.Empty, null, null, false, 256, 128);
+ return SaveFile(db, config, file, contentType, contentLength, encrypt, string.Empty, null, null, 256, 128);
}
public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt, string defaultExtension)
{
- return SaveFile(db, config, file, contentType, contentLength, encrypt, defaultExtension, null, null, false, 256, 128);
+ return SaveFile(db, config, file, contentType, contentLength, encrypt, defaultExtension, null, null, 256, 128);
}
public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt, string defaultExtension, string iv)
{
- return SaveFile(db, config, file, contentType, contentLength, encrypt, defaultExtension, iv, null, false, 256, 128);
+ return SaveFile(db, config, file, contentType, contentLength, encrypt, defaultExtension, iv, null, 256, 128);
}
- public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt, string defaultExtension, string iv, string key, bool saveKey)
+ public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt, string defaultExtension, string iv, string key)
{
- return SaveFile(db, config, file, contentType, contentLength, encrypt, defaultExtension, iv, key, saveKey, 256, 128);
+ return SaveFile(db, config, file, contentType, contentLength, encrypt, defaultExtension, iv, key, 256, 128);
}
- public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt, string defaultExtension, string iv, string key, bool saveKey, int keySize, int blockSize)
+ public static Models.Upload SaveFile(TeknikEntities db, Config config, System.IO.Stream file, string contentType, int contentLength, bool encrypt, string defaultExtension, string iv, string key, int keySize, int blockSize)
{
if (!Directory.Exists(config.UploadConfig.UploadDirectory))
{
@@ -45,15 +46,9 @@ namespace Teknik.Areas.Upload
// once we have the filename, lets save the file
if (encrypt)
{
- // Generate key and iv if empty
- if (string.IsNullOrEmpty(key))
- {
- key = StringHelper.RandomString(keySize / 8);
- }
- if (string.IsNullOrEmpty(iv))
- {
- iv = StringHelper.RandomString(blockSize / 8);
- }
+ // Generate a key and iv
+ key = StringHelper.RandomString(config.UploadConfig.KeySize / 8);
+ iv = StringHelper.RandomString(config.UploadConfig.BlockSize / 8);
byte[] keyBytes = Encoding.UTF8.GetBytes(key);
byte[] ivBytes = Encoding.UTF8.GetBytes(iv);
@@ -86,7 +81,7 @@ namespace Teknik.Areas.Upload
upload.FileName = fileName;
upload.ContentType = (!string.IsNullOrEmpty(contentType)) ? contentType : "application/octet-stream";
upload.ContentLength = contentLength;
- upload.Key = (saveKey) ? key : null;
+ upload.Key = key;
upload.IV = iv;
upload.KeySize = keySize;
upload.BlockSize = blockSize;
diff --git a/Teknik/Areas/Upload/ViewModels/UploadViewModel.cs b/Teknik/Areas/Upload/ViewModels/UploadViewModel.cs
index ea393f7..701c082 100644
--- a/Teknik/Areas/Upload/ViewModels/UploadViewModel.cs
+++ b/Teknik/Areas/Upload/ViewModels/UploadViewModel.cs
@@ -10,8 +10,6 @@ namespace Teknik.Areas.Upload.ViewModels
{
public string CurrentSub { get; set; }
- public bool SaveKey { get; set; }
-
- public bool ServerSideEncrypt { get; set; }
+ public bool Encrypt { get; set; }
}
}
\ No newline at end of file
diff --git a/Teknik/Areas/Upload/Views/Upload/Index.cshtml b/Teknik/Areas/Upload/Views/Upload/Index.cshtml
index 889fd34..76e26aa 100644
--- a/Teknik/Areas/Upload/Views/Upload/Index.cshtml
+++ b/Teknik/Areas/Upload/Views/Upload/Index.cshtml
@@ -44,19 +44,17 @@
-
+
@@ -65,7 +63,7 @@
Each file is encrypted on upload using an AES-256-CTR cipher.
- To view the file decrypted, you must use the direct Teknik link in a javascript enabled browser or save the key to the server.
+ To view the file decrypted, you must use the direct Teknik link in a javascript enabled browser.
The maximum file size per upload is @StringHelper.GetBytesReadable(Model.Config.UploadConfig.MaxUploadSize)
@@ -76,4 +74,57 @@
-@Scripts.Render("~/bundles/upload")
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+ Url
+
+ Content-Type
+
+ File Size
+
+
+
+
+
+ Shorten
+ Deletion URL
+
+
+
+
+
+
+
+
+
+
+@Scripts.Render("~/bundles/upload")
diff --git a/Teknik/Areas/User/Controllers/UserController.cs b/Teknik/Areas/User/Controllers/UserController.cs
index 4ad583f..ee32c21 100644
--- a/Teknik/Areas/User/Controllers/UserController.cs
+++ b/Teknik/Areas/User/Controllers/UserController.cs
@@ -350,7 +350,7 @@ namespace Teknik.Areas.Users.Controllers
[HttpPost]
[ValidateAntiForgeryToken]
- public ActionResult Edit(string curPass, string newPass, string newPassConfirm, string pgpPublicKey, string recoveryEmail, bool allowTrustedDevices, bool twoFactorEnabled, string website, string quote, string about, string blogTitle, string blogDesc, bool saveKey, bool serverSideEncrypt)
+ public ActionResult Edit(string curPass, string newPass, string newPassConfirm, string pgpPublicKey, string recoveryEmail, bool allowTrustedDevices, bool twoFactorEnabled, string website, string quote, string about, string blogTitle, string blogDesc, bool encrypt)
{
if (ModelState.IsValid)
{
@@ -440,8 +440,7 @@ namespace Teknik.Areas.Users.Controllers
user.BlogSettings.Description = blogDesc;
// Uploads
- user.UploadSettings.SaveKey = saveKey;
- user.UploadSettings.ServerSideEncrypt = serverSideEncrypt;
+ user.UploadSettings.Encrypt = encrypt;
UserHelper.EditAccount(db, Config, user, changePass, newPass);
diff --git a/Teknik/Areas/User/Models/UploadSettings.cs b/Teknik/Areas/User/Models/UploadSettings.cs
index 82b4672..721f230 100644
--- a/Teknik/Areas/User/Models/UploadSettings.cs
+++ b/Teknik/Areas/User/Models/UploadSettings.cs
@@ -21,14 +21,11 @@ namespace Teknik.Areas.Users.Models
public virtual UserSettings UserSettings { get; set; }
- public bool SaveKey { get; set; }
-
- public bool ServerSideEncrypt { get; set; }
+ public bool Encrypt { get; set; }
public UploadSettings()
{
- SaveKey = true;
- ServerSideEncrypt = true;
+ Encrypt = false;
}
}
}
diff --git a/Teknik/Areas/User/Scripts/User.js b/Teknik/Areas/User/Scripts/User.js
index f56bc15..1a6d938 100644
--- a/Teknik/Areas/User/Scripts/User.js
+++ b/Teknik/Areas/User/Scripts/User.js
@@ -1,6 +1,5 @@
$(document).ready(function () {
- $("[name='update_upload_saveKey']").bootstrapSwitch();
- $("[name='update_upload_serverSideEncrypt']").bootstrapSwitch();
+ $("[name='update_upload_encrypt']").bootstrapSwitch();
$("[name='update_security_two_factor']").bootstrapSwitch();
$("[name='update_security_allow_trusted']").bootstrapSwitch();
@@ -208,8 +207,7 @@
about = $("#update_about").val();
blog_title = $("#update_blog_title").val();
blog_desc = $("#update_blog_description").val();
- upload_saveKey = $("#update_upload_saveKey").is(":checked");
- upload_serverSideEncrypt = $("#update_upload_serverSideEncrypt").is(":checked");
+ upload_encrypt = $("#update_upload_encrypt").is(":checked");
$.ajax({
type: "POST",
url: editUserURL,
@@ -226,8 +224,7 @@
about: about,
blogTitle: blog_title,
blogDesc: blog_desc,
- saveKey: upload_saveKey,
- serverSideEncrypt: upload_serverSideEncrypt
+ encrypt: upload_encrypt
}),
success: function (html) {
$.unblockUI();
diff --git a/Teknik/Areas/User/Views/User/Settings.cshtml b/Teknik/Areas/User/Views/User/Settings.cshtml
index 782e50a..c4dc12a 100644
--- a/Teknik/Areas/User/Views/User/Settings.cshtml
+++ b/Teknik/Areas/User/Views/User/Settings.cshtml
@@ -219,16 +219,8 @@
-
diff --git a/Teknik/Scripts/Common.js b/Teknik/Scripts/Common.js
index edc2e7e..1029c90 100644
--- a/Teknik/Scripts/Common.js
+++ b/Teknik/Scripts/Common.js
@@ -195,6 +195,27 @@ AddAntiForgeryToken = function (data) {
return data;
};
+function copyTextToClipboard(text) {
+ var copyFrom = document.createElement("textarea");
+ copyFrom.textContent = text;
+ var body = document.getElementsByTagName('body')[0];
+ body.appendChild(copyFrom);
+ copyFrom.select();
+ document.execCommand('copy');
+ body.removeChild(copyFrom);
+}
+
+function getReadableBandwidthString(bandwidth) {
+
+ var i = -1;
+ var byteUnits = [' Kbps', ' Mbps', ' Gbps', ' Tbps', 'Pbps', 'Ebps', 'Zbps', 'Ybps'];
+ do {
+ bandwidth = bandwidth / 1024;
+ i++;
+ } while (bandwidth > 1024);
+
+ return Math.max(bandwidth, 0.1).toFixed(1) + byteUnits[i];
+}
/***************************** TIMER Page Load *******************************/
var loopTime;
var startTime = new Date();
diff --git a/Teknik/Teknik.csproj b/Teknik/Teknik.csproj
index 486885e..b036da5 100644
--- a/Teknik/Teknik.csproj
+++ b/Teknik/Teknik.csproj
@@ -334,6 +334,7 @@
+
diff --git a/Utilities/Utilities/Crypto.cs b/Utilities/Utilities/Crypto.cs
index 3e84610..d93c2a0 100644
--- a/Utilities/Utilities/Crypto.cs
+++ b/Utilities/Utilities/Crypto.cs
@@ -96,13 +96,23 @@ namespace Teknik.Utilities
public static string Hash(string value)
{
byte[] valueBytes = Encoding.Unicode.GetBytes(value);
- HashAlgorithm hash = new SHA256CryptoServiceProvider();
+ return Hash(valueBytes);
+ }
- byte[] hashBytes = hash.ComputeHash(valueBytes);
+ public static string Hash(byte[] value)
+ {
+ HashAlgorithm hash = new SHA256CryptoServiceProvider();
+ byte[] hashBytes = hash.ComputeHash(value);
return Convert.ToBase64String(hashBytes);
}
+ public static byte[] Hash(Stream value)
+ {
+ HashAlgorithm hash = new SHA256CryptoServiceProvider();
+ return hash.ComputeHash(value);
+ }
+
public static string Hash(string value, string salt1, string salt2)
{
SHA256Managed hash = new SHA256Managed();