Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ program
.option('-v, --verbose', 'enable verbosity')
.option('-t, --trace', 'enable stacktrace')
.option('-p, --tmp <directory>', 'change temporary directory')
.option('-H, --hide', 'enable filenames encryption. A metadata file will be created in the same directory. Do not loose the metadata file if you want to be able to restore the names. The decription of names is automatic')
.description('encrypt a file or all files in a directory')
.action(encrypt);

Expand Down
28 changes: 23 additions & 5 deletions src/UserInterface.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,19 @@ function showHeader() {
});
}

async function askHideNames() {
showHeader();
return inquirer.prompt({
name: 'hide',
type: 'list',
message: 'Do you also want to encrypt your files name?',
choices: ['Yes', 'No'],
default: 'Yes'
}).then((input) => {
return input.hide;
})
}

async function askMode() {
showHeader();
return inquirer.prompt({
Expand All @@ -42,7 +55,7 @@ async function askOptions() {
name: 'options',
type: 'checkbox',
message: 'Choose options you want to enable:',
choices: ['verbose', 'trace'],
choices: ['verbose', 'trace errors'],
}).then((input) => {
return input.options;
})
Expand All @@ -62,18 +75,23 @@ async function askFile() {
}

async function showUI() {
const options = { parent: { verbose: false, trace: false, tmp: false } };
const options = {verbose: false, trace: false, tmp: false, hide: true };
const mode = await askMode();
const enabledOptions = await askOptions();
options.parent.verbose = enabledOptions.includes('verbose');
options.parent.trace = enabledOptions.includes('trace');
options.verbose = enabledOptions.includes('verbose');
options.trace = enabledOptions.includes('trace errors');
const file = await askFile();
showHeader();

if (mode === MODE_DECRYPT) {
showHeader();
await decrypt(file, options)
}
else {
const hide = await askHideNames();
if(hide === 'No'){
options.hide=false;
}
showHeader()
await encrypt(file, options)
}
}
Expand Down
116 changes: 72 additions & 44 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const Spinner = require('./Spinner');
const os = require('os');
const path = require('path');
const mkdirp = require('mkdirp');
const fs = require('fs');

function clearline() {
process.stdout.write('\u001b[1G\u001b[2K');
Expand Down Expand Up @@ -51,10 +52,13 @@ function display_verbose(message, filename, trace = false, error = "") {
stream.write('\r\n');
}

async function encrypt(file, { verbose, trace, tmp }) {
async function encrypt(file, {verbose, trace, tmp, hide}) {

try {
const key = await ask_password(true);

let added = 0;
let current = 0;
let done = 0;
let failed = 0;

Expand Down Expand Up @@ -83,6 +87,7 @@ async function encrypt(file, { verbose, trace, tmp }) {
const encryption = warshield.encryptRecursive(file, key, tmp);

encryption.on('crawl-found', filename => {
added++;
if (verbose) {
display_verbose("Added file", filename);
} else {
Expand All @@ -108,43 +113,57 @@ async function encrypt(file, { verbose, trace, tmp }) {

encryption.on('done', filename => {
done++;

current++;
if (verbose) {
display_verbose("\x1b[32mDone encrypting", filename);
display_verbose(`\x1b[32mDone encrypting [${current}/${added}]`, filename);
} else {
spinner.query = `Encrypting files... ${filename}`;
let percent = parseInt((current/added)*100)
spinner.query = `Encrypting files ${percent}% : ${filename}`;
}
});

encryption.on('failed', (filename, err) => {
failed++;

current++;
if (verbose) {
display_verbose("\x1b[31mFailed encrypting", filename, trace, err);
display_verbose(`\x1b[31mFailed encrypting [${current}/${added}]`, filename, trace, err);
} else {
spinner.query = `Encrypting files... ${filename}`;
let percent = parseInt((current/added)*100)
spinner.query = `Encrypting files ${percent}% : ${filename}`;
}
});

encryption.on('end', () => {
const diff = process.hrtime(start);

if (spinner) {
spinner.stop();
}
function finish(){
const diff = process.hrtime(start);
if (spinner) {
spinner.stop();
}

if (verbose) {
process.stdout.write('\r\n');
} else {
clearline();
if (verbose) {
process.stdout.write('\r\n');
} else {
clearline();
}

console.log(`Finished encrypting files!`);
console.log(`Elapsed time: ${((diff[0] * 1e9 + diff[1]) / 1e9).toFixed(2)}s!`);
console.log(`Total encrypted files: ${done}`);
console.log(`Failed: ${failed} (read-only or access denied files)`);

process.exit();
}

console.log(`Finished encrypting files!`);
console.log(`Elapsed time: ${((diff[0] * 1e9 + diff[1]) / 1e9).toFixed(2)}s!`);
console.log(`Total encrypted files: ${done}`);
console.log(`Failed: ${failed} (read-only or access denied files)`);
if(hide){
var metadata=warshield.encryptNames(file)
warshield.encryptFile(metadata, key, tmp).then(()=>{
finish()
});
}else{
finish();
}

process.exit();
});
} catch (e) {
console.error(e.message);
Expand All @@ -158,6 +177,8 @@ async function decrypt(file, { verbose, trace, tmp }) {

let done = 0;
let failed = 0;
let added = 0;
let current = 0;

if (!verbose) {
var spinner = new Spinner("Starting decryption...");
Expand All @@ -179,14 +200,15 @@ async function decrypt(file, { verbose, trace, tmp }) {
process.stdout.write(' Done!\n');
process.stdout.write('Starting decrypting files...\n');
}

const start = process.hrtime();

const decryption = warshield.decryptRecursive(file, key, tmp);
const newfile = await warshield.decryptNames(file, key, tmp);
const decryption = warshield.decryptRecursive(newfile, key, tmp);

decryption.on('crawl-found', filename => {
added++;
if (verbose) {
display_verbose("Failed adding", filename);
display_verbose("Added file", filename);
} else {
spinner.query = `Crawling files... ${filename}`;
}
Expand All @@ -210,43 +232,49 @@ async function decrypt(file, { verbose, trace, tmp }) {

decryption.on('done', filename => {
done++;

current++;
if (verbose) {
display_verbose("\x1b[32mDone decrypting", filename);
display_verbose(`\x1b[32mDone decrypting [${current}/${added}]`, filename);
} else {
spinner.query = `Decrypting files... ${filename}`;
let percent = parseInt((current/added)*100)
spinner.query = `Decrypting files ${percent}% : ${filename}`;
}
});

decryption.on('failed', (filename, err) => {
failed++;

current++;
if (verbose) {
display_verbose("\x1b[31mFailed decrypting", filename, trace, err);
display_verbose(`\x1b[32mFailed decrypting [${current}/${added}]`, filename, trace, err);
} else {
spinner.query = `Decrypting files... ${filename}`;
let percent = parseInt((current/added)*100)
spinner.query = `Decrypting files ${percent}% : ${filename}`;
}
});

decryption.on('end', () => {
const diff = process.hrtime(start);
function finish(){
const diff = process.hrtime(start);

if (spinner) {
spinner.stop();
}
if (spinner) {
spinner.stop();
}

if (verbose) {
process.stdout.write('\r\n');
} else {
clearline();
}
if (verbose) {
process.stdout.write('\r\n');
} else {
clearline();
}

console.log(`Finished decrypting files!`);
console.log(`Elapsed time: ${((diff[0] * 1e9 + diff[1]) / 1e9).toFixed(2)}s!`);
console.log(`Total decrypted files: ${done}`);
console.log(`Failed: ${failed} (read-only, access denied or non-encrypted files)`);
console.log(`Finished decrypting files!`);
console.log(`Elapsed time: ${((diff[0] * 1e9 + diff[1]) / 1e9).toFixed(2)}s!`);
console.log(`Total decrypted files: ${done}`);
console.log(`Failed: ${failed} (read-only, access denied or non-encrypted files)`);

process.exit();
process.exit();
}

finish();
});
} catch (e) {
console.error(e.message);
Expand Down
Loading