Skip to content

Commit

Permalink
Read encryption password from stdin instead of the command line.
Browse files Browse the repository at this point in the history
  • Loading branch information
sreitshamer committed Feb 3, 2017
1 parent 857c185 commit ea68271
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 16 deletions.
73 changes: 61 additions & 12 deletions ArqRestoreCommand.m
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
*/



#include <termios.h>
#import "ArqRestoreCommand.h"
#import "Target.h"
#import "AWSRegion.h"
Expand Down Expand Up @@ -60,6 +60,9 @@
#import "AWSRegion.h"


#define BUFSIZE (65536)


@implementation ArqRestoreCommand
- (NSString *)errorDomain {
return @"ArqRestoreCommandErrorDomain";
Expand Down Expand Up @@ -245,7 +248,7 @@ - (BOOL)listComputers:(NSArray *)args error:(NSError **)error {


- (BOOL)listFolders:(NSArray *)args error:(NSError **)error {
if ([args count] != 5) {
if ([args count] != 4) {
SETNSERROR([self errorDomain], ERROR_USAGE, @"invalid arguments");
return NO;
}
Expand All @@ -256,7 +259,10 @@ - (BOOL)listFolders:(NSArray *)args error:(NSError **)error {
}

NSString *theComputerUUID = [args objectAtIndex:3];
NSString *theEncryptionPassword = [args objectAtIndex:4];
NSString *theEncryptionPassword = [self readEncryptionPassword:error];
if (theEncryptionPassword == nil) {
return NO;
}

BackupSet *backupSet = [self backupSetForTarget:target computerUUID:theComputerUUID error:error];
if (backupSet == nil) {
Expand All @@ -282,7 +288,7 @@ - (BOOL)listFolders:(NSArray *)args error:(NSError **)error {
return YES;
}
- (BOOL)printPlist:(NSArray *)args error:(NSError **)error {
if ([args count] != 6) {
if ([args count] != 5) {
SETNSERROR([self errorDomain], ERROR_USAGE, @"invalid arguments");
return NO;
}
Expand All @@ -293,8 +299,12 @@ - (BOOL)printPlist:(NSArray *)args error:(NSError **)error {
}

NSString *theComputerUUID = [args objectAtIndex:3];
NSString *theEncryptionPassword = [args objectAtIndex:4];
NSString *theBucketUUID = [args objectAtIndex:5];
NSString *theBucketUUID = [args objectAtIndex:4];

NSString *theEncryptionPassword = [self readEncryptionPassword:error];
if (theEncryptionPassword == nil) {
return NO;
}

BackupSet *backupSet = [self backupSetForTarget:target computerUUID:theComputerUUID error:error];
if (backupSet == nil) {
Expand Down Expand Up @@ -330,7 +340,7 @@ - (BOOL)printPlist:(NSArray *)args error:(NSError **)error {
return YES;
}
- (BOOL)listTree:(NSArray *)args error:(NSError **)error {
if ([args count] != 6) {
if ([args count] != 5) {
SETNSERROR([self errorDomain], ERROR_USAGE, @"invalid arguments");
return NO;
}
Expand All @@ -341,8 +351,12 @@ - (BOOL)listTree:(NSArray *)args error:(NSError **)error {
}

NSString *theComputerUUID = [args objectAtIndex:3];
NSString *theEncryptionPassword = [args objectAtIndex:4];
NSString *theBucketUUID = [args objectAtIndex:5];
NSString *theBucketUUID = [args objectAtIndex:4];

NSString *theEncryptionPassword = [self readEncryptionPassword:error];
if (theEncryptionPassword == nil) {
return NO;
}

BackupSet *backupSet = [self backupSetForTarget:target computerUUID:theComputerUUID error:error];
if (backupSet == nil) {
Expand Down Expand Up @@ -414,7 +428,7 @@ - (BOOL)printTree:(Tree *)theTree repo:(Repo *)theRepo relativePath:(NSString *)
}

- (BOOL)restore:(NSArray *)args error:(NSError **)error {
if ([args count] != 6) {
if ([args count] != 5) {
SETNSERROR([self errorDomain], ERROR_USAGE, @"invalid arguments");
return NO;
}
Expand All @@ -425,8 +439,12 @@ - (BOOL)restore:(NSArray *)args error:(NSError **)error {
}

NSString *theComputerUUID = [args objectAtIndex:3];
NSString *theEncryptionPassword = [args objectAtIndex:4];
NSString *theBucketUUID = [args objectAtIndex:5];
NSString *theBucketUUID = [args objectAtIndex:4];

NSString *theEncryptionPassword = [self readEncryptionPassword:error];
if (theEncryptionPassword == nil) {
return NO;
}

BackupSet *backupSet = [self backupSetForTarget:target computerUUID:theComputerUUID error:error];
if (backupSet == nil) {
Expand Down Expand Up @@ -753,4 +771,35 @@ - (BOOL)glacierRestorerDidFail:(NSError *)error {
return NO;
}


#pragma mark internal
- (NSString *)readEncryptionPassword:(NSError **)error {
printf("enter encryption password: ");
fflush(stdout);

struct termios oldTermios;
struct termios newTermios;

if (tcgetattr(STDIN_FILENO, &oldTermios) != 0) {
int errnum = errno;
HSLogError(@"tcgetattr error %d: %s", errnum, strerror(errnum));
SETNSERROR(@"UnixErrorDomain", errnum, @"%s", strerror(errnum));
return nil;
}
newTermios = oldTermios;
newTermios.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newTermios);
size_t bufsize = BUFSIZE;
char *buf = malloc(bufsize);
ssize_t len = getline(&buf, &bufsize, stdin);
free(buf);
tcsetattr(STDIN_FILENO, TCSANOW, &oldTermios);

if (len > 0 && buf[len - 1] == '\n') {
--len;
}
printf("\n");

return [[[NSString alloc] initWithBytes:buf length:len encoding:NSUTF8StringEncoding] autorelease];
}
@end
8 changes: 4 additions & 4 deletions arq_restore.m
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ static void printUsage(const char *exeName) {
fprintf(stderr, "\t%s [-l loglevel] deletetarget <nickname>\n", exeName);
fprintf(stderr, "\n");
fprintf(stderr, "\t%s [-l loglevel] listcomputers <target_nickname>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] listfolders <target_nickname> <computer_uuid> <encryption_password>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] printplist <target_nickname> <computer_uuid> <encryption_password> <folder_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] listtree <target_nickname> <computer_uuid> <encryption_password> <folder_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] restore <target_nickname> <computer_uuid> <encryption_password> <folder_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] listfolders <target_nickname> <computer_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] printplist <target_nickname> <computer_uuid> <folder_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] listtree <target_nickname> <computer_uuid> <folder_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] restore <target_nickname> <computer_uuid> <folder_uuid>\n", exeName);
fprintf(stderr, "\t%s [-l loglevel] clearcache <target_nickname>\n", exeName);
fprintf(stderr, "\n");
fprintf(stderr, "log levels: none, error, warn, info, and debug\n");
Expand Down

0 comments on commit ea68271

Please sign in to comment.