mirror of
https://codeberg.org/scip/pcp.git
synced 2025-12-17 03:50:57 +01:00
added extpass option
This commit is contained in:
21
src/pcp.c
21
src/pcp.c
@@ -66,6 +66,7 @@ int main (int argc, char **argv) {
|
||||
char *xpassfile = NULL;
|
||||
char *extra = NULL;
|
||||
plist_t *recipient = NULL;
|
||||
char *askpass = NULL;
|
||||
FILE *in;
|
||||
|
||||
errno = 0;
|
||||
@@ -93,6 +94,7 @@ int main (int argc, char **argv) {
|
||||
{ "text", required_argument, NULL, 't' },
|
||||
{ "xpass", required_argument, NULL, 'x' },
|
||||
{ "password-file", required_argument, NULL, 'X' },
|
||||
{ "extpass", required_argument, NULL, LONG_EXTPASS },
|
||||
{ "recipient", required_argument, NULL, 'r' },
|
||||
|
||||
/* key management */
|
||||
@@ -271,6 +273,10 @@ int main (int argc, char **argv) {
|
||||
if(strncmp(xpass, "n/a", 3) == 0)
|
||||
xpass[0] = '\0';
|
||||
break;
|
||||
case LONG_EXTPASS:
|
||||
askpass = malloc(strlen(optarg)+1);
|
||||
strncpy(askpass, optarg, strlen(optarg)+1);
|
||||
break;
|
||||
case 'r':
|
||||
p_add(&recipient, optarg);
|
||||
userec = 1;
|
||||
@@ -415,12 +421,18 @@ int main (int argc, char **argv) {
|
||||
}
|
||||
|
||||
if(xpassfile != NULL) {
|
||||
pcp_readpass(&xpass, "passphrase", NULL, 0, xpassfile);
|
||||
if(pcp_readpass(ptx, &xpass, "passphrase", NULL, 0, xpassfile) != 0)
|
||||
goto perr1;
|
||||
if(xpassfile[0] != '-')
|
||||
xpf = 0;
|
||||
free(xpassfile);
|
||||
}
|
||||
|
||||
if(askpass != NULL) {
|
||||
if(pcp_readpass_fromprog(ptx, &xpass, askpass) != 0)
|
||||
goto perr1;
|
||||
}
|
||||
|
||||
/* check if there's some enviroment we could use */
|
||||
if(usevault == 1) {
|
||||
char *_vaultfile = getenv("PCP_VAULT");
|
||||
@@ -631,7 +643,8 @@ int main (int argc, char **argv) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
perr1:
|
||||
fatals_ifany(ptx);
|
||||
int e = ptx->pcp_exit;
|
||||
ptx_clean(ptx);
|
||||
@@ -646,6 +659,10 @@ int main (int argc, char **argv) {
|
||||
free(sigfile);
|
||||
if(xpass != NULL)
|
||||
sfree(xpass);
|
||||
if(askpass != NULL)
|
||||
free(askpass);
|
||||
if(xpassfile != NULL)
|
||||
free(xpassfile);
|
||||
if(recipient != NULL)
|
||||
p_clean(recipient);
|
||||
if(id != NULL)
|
||||
|
||||
@@ -85,6 +85,8 @@
|
||||
#define PCP_HELP_INTRO "This is Pretty Curved Privacy. Licensed under the GPLv3. This is\n" \
|
||||
"BETA software. Use with care. NOT intended for production use.\n"
|
||||
|
||||
#define LONG_EXTPASS 515
|
||||
|
||||
/* some globals */
|
||||
vault_t *vault;
|
||||
PCPCTX *ptx;
|
||||
|
||||
156
src/readpass.c
156
src/readpass.c
@@ -1,156 +0,0 @@
|
||||
/*-
|
||||
* Copyright 2009 Colin Percival
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
|
||||
#include "readpass.h"
|
||||
|
||||
/**
|
||||
* tarsnap_getpass(passwd, prompt, confirmprompt, devtty)
|
||||
* If ${devtty} is non-zero, read a password from /dev/tty if possible; if
|
||||
* not, read from stdin. If reading from a tty (either /dev/tty or stdin),
|
||||
* disable echo and prompt the user by printing ${prompt} to stderr. If
|
||||
* ${confirmprompt} is non-NULL, read a second password (prompting if a
|
||||
* terminal is being used) and repeat until the user enters the same password
|
||||
* twice. Return the password as a malloced NUL-terminated string via
|
||||
* ${passwd}. The obscure name is to avoid namespace collisions due to the
|
||||
* getpass / readpass / readpassphrase / etc. functions in various libraries.
|
||||
*/
|
||||
int
|
||||
pcp_readpass(char ** passwd, const char * prompt,
|
||||
const char * confirmprompt, int devtty, char *readfromfile)
|
||||
{
|
||||
FILE * readfrom;
|
||||
char passbuf[MAXPASSLEN];
|
||||
char confpassbuf[MAXPASSLEN];
|
||||
struct termios term, term_old;
|
||||
int usingtty;
|
||||
|
||||
/*
|
||||
* If devtty != 0, try to open /dev/tty; if that fails, or if devtty
|
||||
* is zero, we'll read the password from stdin instead.
|
||||
*
|
||||
* Added by tlinden: however, if readfromfile is defined, we'll
|
||||
* read the password from there, but if it is '-' we'll use stdin
|
||||
* as well.
|
||||
*/
|
||||
if ((devtty == 0) || ((readfrom = fopen("/dev/tty", "r")) == NULL)) {
|
||||
if(readfromfile != NULL) {
|
||||
if(readfromfile[0] == '-') {
|
||||
readfrom = stdin;
|
||||
}
|
||||
else {
|
||||
if((readfrom = fopen(readfromfile, "r")) == NULL) {
|
||||
fatal(ptx, "Could not open password file '%s'\n", readfromfile);
|
||||
goto err1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
readfrom = stdin;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we're reading from a terminal, try to disable echo. */
|
||||
if ((usingtty = isatty(fileno(readfrom))) != 0) {
|
||||
if (tcgetattr(fileno(readfrom), &term_old)) {
|
||||
fatal(ptx, "Cannot read terminal settings\n");
|
||||
goto err1;
|
||||
}
|
||||
memcpy(&term, &term_old, sizeof(struct termios));
|
||||
term.c_lflag = (term.c_lflag & ~ECHO) | ECHONL;
|
||||
if (tcsetattr(fileno(readfrom), TCSANOW, &term)) {
|
||||
fatal(ptx, "Cannot set terminal settings\n");
|
||||
goto err1;
|
||||
}
|
||||
}
|
||||
|
||||
retry:
|
||||
/* If we have a terminal, prompt the user to enter the password. */
|
||||
if (usingtty)
|
||||
fprintf(stderr, "%s: ", prompt);
|
||||
|
||||
/* Read the password. */
|
||||
if (fgets(passbuf, MAXPASSLEN, readfrom) == NULL) {
|
||||
fatal(ptx, "Cannot read password\n");
|
||||
goto err2;
|
||||
}
|
||||
|
||||
/* Confirm the password if necessary. */
|
||||
if (confirmprompt != NULL) {
|
||||
if (usingtty)
|
||||
fprintf(stderr, "%s: ", confirmprompt);
|
||||
if (fgets(confpassbuf, MAXPASSLEN, readfrom) == NULL) {
|
||||
fatal(ptx, "Cannot read password\n");
|
||||
goto err2;
|
||||
}
|
||||
if (strcmp(passbuf, confpassbuf)) {
|
||||
fprintf(stderr,
|
||||
"Passwords mismatch, please try again\n");
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Terminate the string at the first "\r" or "\n" (if any). */
|
||||
passbuf[strcspn(passbuf, "\r\n")] = '\0';
|
||||
|
||||
/* If we changed terminal settings, reset them. */
|
||||
if (usingtty)
|
||||
tcsetattr(fileno(readfrom), TCSANOW, &term_old);
|
||||
|
||||
/* Close /dev/tty if we opened it.
|
||||
if readfromfile is defined and set to -, disable stdin */
|
||||
if (readfrom != stdin) {
|
||||
fclose(readfrom);
|
||||
}
|
||||
else {
|
||||
if(readfromfile != NULL)
|
||||
stdin = NULL;
|
||||
}
|
||||
|
||||
/* Copy the password out. */
|
||||
char *p = smalloc(strlen(passbuf) + 1);
|
||||
memcpy(p, passbuf, strlen(passbuf) + 1 );
|
||||
*passwd = p;
|
||||
|
||||
/* Zero any stored passwords. */
|
||||
memset(passbuf, 0, MAXPASSLEN);
|
||||
memset(confpassbuf, 0, MAXPASSLEN);
|
||||
|
||||
/* Success! */
|
||||
return (0);
|
||||
|
||||
err2:
|
||||
/* Reset terminal settings if necessary. */
|
||||
if (usingtty)
|
||||
tcsetattr(fileno(readfrom), TCSAFLUSH, &term_old);
|
||||
err1:
|
||||
/* Close /dev/tty if we opened it. */
|
||||
if (readfrom != stdin)
|
||||
fclose(readfrom);
|
||||
|
||||
/* Failure! */
|
||||
return (-1);
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
/*-
|
||||
* Copyright 2009 Colin Percival
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This file was originally written by Colin Percival as part of the Tarsnap
|
||||
* online backup system.
|
||||
*/
|
||||
#ifndef _READPASS_H_
|
||||
#define _READPASS_H_
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "context.h"
|
||||
#include "pcp.h"
|
||||
|
||||
#define MAXPASSLEN 2048
|
||||
|
||||
/**
|
||||
* tarsnap_getpass(passwd, prompt, confirmprompt, devtty)
|
||||
* If ${devtty} is non-zero, read a password from /dev/tty if possible; if
|
||||
* not, read from stdin. If reading from a tty (either /dev/tty or stdin),
|
||||
* disable echo and prompt the user by printing ${prompt} to stderr. If
|
||||
* ${confirmprompt} is non-NULL, read a second password (prompting if a
|
||||
* terminal is being used) and repeat until the user enters the same password
|
||||
* twice. Return the password as a malloced NUL-terminated string via
|
||||
* ${passwd}. The obscure name is to avoid namespace collisions due to the
|
||||
* getpass / readpass / readpassphrase / etc. functions in various libraries.
|
||||
*/
|
||||
int pcp_readpass(char **, const char *, const char *, int, char *);
|
||||
|
||||
#endif /* !_READPASS_H_ */
|
||||
@@ -19,6 +19,7 @@
|
||||
"-x --xpass <passwd> Provide password. INSECURE! Use for testing\n" \
|
||||
" or debugging only!\n" \
|
||||
"-X --password-file <file> Read passphrase from <file>.\n" \
|
||||
" --extpass <program> Use external program for password prompt.\n" \
|
||||
"-i --keyid <id> Specify a key id for various operations.\n" \
|
||||
"-r --recipient <string> Specify a recpipient, multiple allowed.\n" \
|
||||
"-t --text Print textual representation of ojects.\n" \
|
||||
|
||||
@@ -17,6 +17,7 @@ General Options:
|
||||
-x --xpass <passwd> Provide password. INSECURE! Use for testing
|
||||
or debugging only!
|
||||
-X --password-file <file> Read passphrase from <file>.
|
||||
--extpass <program> Use external program for password prompt.
|
||||
-i --keyid <id> Specify a key id for various operations.
|
||||
-r --recipient <string> Specify a recpipient, multiple allowed.
|
||||
-t --text Print textual representation of ojects.
|
||||
|
||||
Reference in New Issue
Block a user