/* ** Prompt the user for a password. Store the result in the pPassphrase ** blob. ** ** Behavior is controlled by the verify parameter: ** ** 0 Just ask once. ** ** 1 If the first answer is a non-empty string, ask for ** verification. Repeat if the two strings do not match. ** ** 2 Ask twice, repeat if the strings do not match. */ void prompt_for_password( const char *zPrompt, Blob *pPassphrase, int verify ){ Blob secondTry; blob_zero(pPassphrase); blob_zero(&secondTry); while(1){ prompt_for_passphrase(zPrompt, pPassphrase); if( verify==0 ) break; if( verify==1 && blob_size(pPassphrase)==0 ) break; prompt_for_passphrase("Again: ", &secondTry); if( blob_compare(pPassphrase, &secondTry) ){ printf("Passphrases do not match. Try again...\n"); }else{ break; } } blob_reset(&secondTry); }
int main(int argc, char **argv){ int rc; int i, j; int seeFlag = 0; char *zArchive = 0; char *zMountPoint = 0; char *azNewArg[5]; for(i=1; i<argc; i++){ if( argv[i][0]=='-' ){ for(j=1; argv[i][j]; j++){ switch( argv[i][j] ){ case 'e': seeFlag++; break; case '-': break; default: showHelp(argv[0]); } } }else if( zArchive==0 ){ zArchive = argv[i]; }else if( zMountPoint==0 ){ zMountPoint = argv[i]; }else{ showHelp(argv[0]); } } if( zMountPoint==0 ) showHelp(argv[0]); rc = sqlite3_open(zArchive, &g.db); if( rc!=SQLITE_OK ){ fprintf(stderr, "Cannot open sqlar file [%s]\n", argv[1]); exit(1); } if( seeFlag ){ char zPassPhrase[MX_PASSPHRASE+1]; #ifndef SQLITE_HAS_CODEC printf("WARNING: The passphrase is a no-op because this build of\n" "sqlar is compiled without encryption capabilities.\n"); #endif memset(zPassPhrase, 0, sizeof(zPassPhrase)); prompt_for_passphrase("passphrase: ", seeFlag>1, zPassPhrase); #ifdef SQLITE_HAS_CODEC sqlite3_key_v2(g.db, "main", zPassPhrase, -1); #endif } rc = sqlite3_exec(g.db, "SELECT 1 FROM sqlar LIMIT 1", 0, 0, 0); if( rc!=SQLITE_OK ){ fprintf(stderr, "File [%s] is not an SQLite archive\n", argv[1]); exit(1); } g.uid = getuid(); g.gid = getgid(); azNewArg[0] = argv[0]; azNewArg[1] = "-f"; azNewArg[2] = "-s"; azNewArg[3] = zMountPoint; azNewArg[4] = 0; rc = fuse_main(4, azNewArg, &sqlarfs_methods, NULL); sqlite3_finalize(g.pStat); sqlite3_finalize(g.pFList); sqlite3_finalize(g.pExists); sqlite3_finalize(g.pRead); sqlite3_free(g.zCacheName); sqlite3_free(g.zCacheData); sqlite3_close(g.db); return rc; }