A bunch of cross-platform fixes for mpw.c + make config file optional and read master password from input instead.
This commit is contained in:
parent
0d66d4660e
commit
5268039c3d
@ -1,8 +1,28 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Run with -DDEBUG to enable trace-level output.
|
#
|
||||||
|
# TROUBLESHOOTING
|
||||||
|
# - See the 'options' array. Comment/uncomment lines as you see fit.
|
||||||
|
# - If you see 'undefined reference to `clock_gettime'', try ./build -lrt instead.
|
||||||
|
#
|
||||||
|
# BUGS
|
||||||
|
# masterpassword@lyndir.com
|
||||||
|
#
|
||||||
|
# AUTHOR
|
||||||
|
# Maarten Billemont
|
||||||
|
#
|
||||||
cd "${BASH_SOURCE%/*}"
|
cd "${BASH_SOURCE%/*}"
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
|
options=(
|
||||||
|
# optional features.
|
||||||
|
-DDEBUG # Turn on debugging verbosity.
|
||||||
|
#-DEDITLINE -ledit -ltermcap # Use editline for reading the master password.
|
||||||
|
-DREADLINE -lreadline # Use readline for reading the master password.
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
### DEPENDENCIES
|
||||||
|
|
||||||
if ! [[ -e lib/scrypt/scrypt-scryptenc.o ]]; then
|
if ! [[ -e lib/scrypt/scrypt-scryptenc.o ]]; then
|
||||||
# libscrypt not built.
|
# libscrypt not built.
|
||||||
pushd lib/scrypt
|
pushd lib/scrypt
|
||||||
@ -52,23 +72,32 @@ fi
|
|||||||
echo
|
echo
|
||||||
echo "Building mpw..."
|
echo "Building mpw..."
|
||||||
|
|
||||||
# libscrypt built.
|
cc() {
|
||||||
deps=(
|
if hash llvm-gcc; then
|
||||||
|
llvm-gcc -Qunused-arguments "$@"
|
||||||
|
else
|
||||||
|
gcc "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### MPW
|
||||||
|
|
||||||
|
options+=(
|
||||||
# include paths.
|
# include paths.
|
||||||
-I"lib/scrypt/lib" -I"lib/scrypt/libcperciva"
|
-I"lib/scrypt/lib" -I"lib/scrypt/libcperciva"
|
||||||
# library paths.
|
# library paths.
|
||||||
-L"." -L"lib/scrypt"
|
-L"." -L"lib/scrypt"
|
||||||
# link libraries.
|
# link libraries.
|
||||||
-l "scrypt-crypto_aesctr.o"
|
"lib/scrypt/scrypt-crypto_aesctr.o"
|
||||||
-l "scrypt-sha256.o"
|
"lib/scrypt/scrypt-sha256.o"
|
||||||
-l "scrypt-crypto_scrypt-nosse.o"
|
"lib/scrypt/scrypt-crypto_scrypt-nosse.o"
|
||||||
-l "scrypt-memlimit.o"
|
"lib/scrypt/scrypt-memlimit.o"
|
||||||
-l "scrypt-scryptenc_cpuperf.o"
|
"lib/scrypt/scrypt-scryptenc_cpuperf.o"
|
||||||
-l "scrypt-scryptenc.o"
|
"lib/scrypt/scrypt-scryptenc.o"
|
||||||
-l "crypto"
|
-l"crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
# build mpw.
|
cc "${options[@]}" -std=c99 -c types.c -o types.o "$@"
|
||||||
gcc "${deps[@]}" -Qunused-arguments -c types.c -o types.o "$@"
|
cc "${options[@]}" -std=c99 -l"types.o" mpw.c -o mpw "$@"
|
||||||
gcc "${deps[@]}" -Qunused-arguments -l"types.o" mpw.c -o mpw "$@"
|
|
||||||
echo "done! Now run ./install or use ./mpw"
|
echo "done! Now run ./install or use ./mpw"
|
||||||
|
@ -23,6 +23,12 @@
|
|||||||
#include <crypto/crypto_scrypt.h>
|
#include <crypto/crypto_scrypt.h>
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
#if defined(READLINE)
|
||||||
|
#include <readline/readline.h>
|
||||||
|
#elif defined(EDITLINE)
|
||||||
|
#include <histedit.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MP_N 32768
|
#define MP_N 32768
|
||||||
#define MP_r 8
|
#define MP_r 8
|
||||||
#define MP_p 2
|
#define MP_p 2
|
||||||
@ -98,8 +104,7 @@ int main(int argc, char *const argv[]) {
|
|||||||
const char *siteCounterString = getenv( MP_env_sitecounter );
|
const char *siteCounterString = getenv( MP_env_sitecounter );
|
||||||
|
|
||||||
// Read the options.
|
// Read the options.
|
||||||
char opt;
|
for (int opt; (opt = getopt(argc, argv, "u:t:c:v:h")) != -1;)
|
||||||
while ((opt = getopt(argc, argv, "u:t:c:v:h")) != -1)
|
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage();
|
usage();
|
||||||
@ -172,22 +177,35 @@ int main(int argc, char *const argv[]) {
|
|||||||
}
|
}
|
||||||
trc("mpwConfigPath: %s\n", mpwConfigPath);
|
trc("mpwConfigPath: %s\n", mpwConfigPath);
|
||||||
FILE *mpwConfig = fopen(mpwConfigPath, "r");
|
FILE *mpwConfig = fopen(mpwConfigPath, "r");
|
||||||
if (!mpwConfig) {
|
|
||||||
fprintf(stderr, "Couldn't open configuration file: %s: %d\n", mpwConfigPath, errno);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
free(mpwConfigPath);
|
free(mpwConfigPath);
|
||||||
char *line = NULL;
|
if (mpwConfig) {
|
||||||
size_t linecap = 0;
|
char *line = NULL;
|
||||||
ssize_t linelen;
|
size_t linecap = 0;
|
||||||
while ((linelen = getline(&line, &linecap, mpwConfig)) > 0)
|
ssize_t linelen;
|
||||||
if (strcmp(strsep(&line, ":"), userName) == 0) {
|
while ((linelen = getline(&line, &linecap, mpwConfig)) > 0)
|
||||||
masterPassword = strsep(&line, "\n");
|
if (strcmp(strsep(&line, ":"), userName) == 0) {
|
||||||
break;
|
masterPassword = strsep(&line, "\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!masterPassword) {
|
||||||
|
#if defined(READLINE)
|
||||||
|
masterPassword = readline( "Your master password: " );
|
||||||
|
#elif defined(EDITLINE)
|
||||||
|
EditLine *e = el_init("mpw", stdin, stdout, stderr);
|
||||||
|
int count = 0;
|
||||||
|
char *line = el_gets(e, &count);
|
||||||
|
masterPassword = strsep(&line, "\n");
|
||||||
|
el_end(e);
|
||||||
|
|
||||||
|
if (count < 0) {
|
||||||
|
fprintf(stderr, "Could not read master password: %d\n", errno);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (!masterPassword) {
|
#else
|
||||||
fprintf(stderr, "Missing master password for user: %s\n", userName);
|
fprintf(stderr, "Missing master password for user: %s\n", userName);
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
trc("masterPassword: %s\n", masterPassword);
|
trc("masterPassword: %s\n", masterPassword);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user