Florian Obser([email protected]) on 2019.06.07 19:52:21 +0200:
>
>
> Remove A and D flag, they are superfluous.
> One could always use them on the command line and acme-client would do
> the right thing.
>
> IIRC this is a leftover from when we moved to the config file and we
> never mopped this up.
>
> It's kinda getting in the way and kinda an itch I have to scratch.
>
> OK?
yes, ok
>
> diff --git acctproc.c acctproc.c
> index 23d3a026c04..de32d968dcd 100644
> --- acctproc.c
> +++ acctproc.c
> @@ -311,13 +311,13 @@ out:
> }
>
> int
> -acctproc(int netsock, const char *acctkey, int newacct)
> +acctproc(int netsock, const char *acctkey)
> {
> FILE *f = NULL;
> EVP_PKEY *pkey = NULL;
> long lval;
> enum acctop op;
> - int rc = 0, cc;
> + int rc = 0, cc, newacct = 0;
> mode_t prev;
>
> /*
> @@ -327,7 +327,10 @@ acctproc(int netsock, const char *acctkey, int newacct)
> */
>
> prev = umask((S_IWUSR | S_IXUSR) | S_IRWXG | S_IRWXO);
> - f = fopen(acctkey, newacct ? "wx" : "r");
> + if ((f = fopen(acctkey, "r")) == NULL && errno == ENOENT) {
> + f = fopen(acctkey, "wx");
> + newacct = 1;
> + }
> umask(prev);
>
> if (f == NULL) {
> diff --git acme-client.1 acme-client.1
> index fd4cde3133e..ba8c16bc60a 100644
> --- acme-client.1
> +++ acme-client.1
> @@ -22,7 +22,7 @@
> .Nd ACME client
> .Sh SYNOPSIS
> .Nm acme-client
> -.Op Fl ADFnrv
> +.Op Fl Fnrv
> .Op Fl f Ar configfile
> .Ar domain
> .Sh DESCRIPTION
> @@ -40,16 +40,6 @@ The certificates are typically used to provide HTTPS for
> web servers,
> but can be used in any situation where domain name validation is required
> (such as mail servers).
> .Pp
> -Before a certificate can be requested, an account key needs to be
> -created using the
> -.Fl A
> -argument.
> -The first time a certificate is requested, a domain key needs to be created
> with
> -.Fl D .
> -So a typical invocation the first time it's run would be:
> -.Pp
> -.Dl # acme-client -ADv example.com
> -.Pp
> If the certificate already exists and is less than 30 days from expiry,
> .Nm
> attempts to renew the certificate.
> @@ -76,10 +66,6 @@ location "/.well-known/acme-challenge/*" {
> .Pp
> The options are as follows:
> .Bl -tag -width Ds
> -.It Fl A
> -Create a new RSA account key if one does not already exist.
> -.It Fl D
> -Create a new RSA domain key if one does not already exist.
> .It Fl F
> Force certificate renewal, even if it's too soon.
> .It Fl f Ar configfile
> @@ -127,7 +113,7 @@ and
> .Pa httpd.conf
> and run:
> .Pp
> -.Dl # acme-client -ADv example.com && rcctl reload httpd
> +.Dl # acme-client -v example.com && rcctl reload httpd
> .Pp
> A
> .Xr cron 8
> diff --git extern.h extern.h
> index c7a11195530..a61f55e897a 100644
> --- extern.h
> +++ extern.h
> @@ -199,7 +199,7 @@ __BEGIN_DECLS
> * Start with our components.
> * These are all isolated and talk to each other using sockets.
> */
> -int acctproc(int, const char *, int);
> +int acctproc(int, const char *);
> int certproc(int, int);
> int chngproc(int, const char *);
> int dnsproc(int);
> @@ -207,8 +207,7 @@ int revokeproc(int, const char *, const
> char *,
> int, int, const char *const *, size_t);
> int fileproc(int, const char *, const char *, const char *,
> const char *);
> -int keyproc(int, const char *,
> - const char **, size_t, int);
> +int keyproc(int, const char *, const char **, size_t);
> int netproc(int, int, int, int, int, int, int,
> struct authority_c *, const char *const *,
> size_t);
> diff --git keyproc.c keyproc.c
> index 1d18bdeb408..3e7075434da 100644
> --- keyproc.c
> +++ keyproc.c
> @@ -75,7 +75,7 @@ add_ext(STACK_OF(X509_EXTENSION) *sk, int nid, const char
> *value)
> */
> int
> keyproc(int netsock, const char *keyfile,
> - const char **alts, size_t altsz, int newkey)
> + const char **alts, size_t altsz)
> {
> char *der64 = NULL, *der = NULL, *dercp;
> char *sans = NULL, *san = NULL;
> @@ -85,7 +85,7 @@ keyproc(int netsock, const char *keyfile,
> EVP_PKEY *pkey = NULL;
> X509_REQ *x = NULL;
> X509_NAME *name = NULL;
> - int len, rc = 0, cc, nid;
> + int len, rc = 0, cc, nid, newkey = 0;
> mode_t prev;
> STACK_OF(X509_EXTENSION) *exts = NULL;
>
> @@ -96,7 +96,10 @@ keyproc(int netsock, const char *keyfile,
> */
>
> prev = umask((S_IWUSR | S_IXUSR) | S_IRWXG | S_IRWXO);
> - f = fopen(keyfile, newkey ? "wx" : "r");
> + if ((f = fopen(keyfile, "r")) == NULL && errno == ENOENT) {
> + f = fopen(keyfile, "wx");
> + newkey = 1;
> + }
> umask(prev);
>
> if (f == NULL) {
> diff --git main.c main.c
> index 9c301f586e5..bf9d51c182e 100644
> --- main.c
> +++ main.c
> @@ -57,14 +57,8 @@ main(int argc, char *argv[])
> struct domain_c *domain = NULL;
> struct altname_c *ac;
>
> - while ((c = getopt(argc, argv, "ADFnrvf:")) != -1)
> + while ((c = getopt(argc, argv, "Fnrvf:")) != -1)
> switch (c) {
> - case 'A':
> - popts |= ACME_OPT_NEWACCT;
> - break;
> - case 'D':
> - popts |= ACME_OPT_NEWDKEY;
> - break;
> case 'F':
> force = 1;
> break;
> @@ -173,28 +167,11 @@ main(int argc, char *argv[])
> ne++;
> }
>
> - if (!(popts & ACME_OPT_NEWDKEY) && access(domain->key, R_OK) == -1) {
> - warnx("%s: domain key file must exist", domain->key);
> - ne++;
> - } else if ((popts & ACME_OPT_NEWDKEY) && access(domain->key, R_OK)
> - != -1) {
> - dodbg("%s: domain key exists (not creating)", domain->key);
> - popts &= ~ACME_OPT_NEWDKEY;
> - }
> -
> if (access(chngdir, R_OK) == -1) {
> warnx("%s: challenge directory must exist", chngdir);
> ne++;
> }
>
> - if (!(popts & ACME_OPT_NEWACCT) && access(acctkey, R_OK) == -1) {
> - warnx("%s: account key file must exist", acctkey);
> - ne++;
> - } else if ((popts & ACME_OPT_NEWACCT) && access(acctkey, R_OK) != -1) {
> - dodbg("%s: account key exists (not creating)", acctkey);
> - popts &= ~ACME_OPT_NEWACCT;
> - }
> -
> if (ne > 0)
> return EXIT_FAILURE;
>
> @@ -276,7 +253,7 @@ main(int argc, char *argv[])
> close(file_fds[0]);
> close(file_fds[1]);
> c = keyproc(key_fds[0], domain->key,
> - (const char **)alts, altsz, (popts & ACME_OPT_NEWDKEY));
> + (const char **)alts, altsz);
> exit(c ? EXIT_SUCCESS : EXIT_FAILURE);
> }
>
> @@ -295,7 +272,7 @@ main(int argc, char *argv[])
> close(chng_fds[0]);
> close(file_fds[0]);
> close(file_fds[1]);
> - c = acctproc(acct_fds[0], acctkey, (popts & ACME_OPT_NEWACCT));
> + c = acctproc(acct_fds[0], acctkey);
> exit(c ? EXIT_SUCCESS : EXIT_FAILURE);
> }
>
> @@ -408,6 +385,6 @@ main(int argc, char *argv[])
> return rc != COMP__MAX ? EXIT_FAILURE : (c == 2 ? EXIT_SUCCESS : 2);
> usage:
> fprintf(stderr,
> - "usage: acme-client [-ADFnrv] [-f configfile] domain\n");
> + "usage: acme-client [-Fnrv] [-f configfile] domain\n");
> return EXIT_FAILURE;
> }
> diff --git parse.h parse.h
> index e371f191910..d1c1fee2515 100644
> --- parse.h
> +++ parse.h
> @@ -58,9 +58,7 @@ struct keyfile {
> };
>
> #define ACME_OPT_VERBOSE 0x00000001
> -#define ACME_OPT_NEWACCT 0x00000002
> -#define ACME_OPT_NEWDKEY 0x00000004
> -#define ACME_OPT_CHECK 0x00000008
> +#define ACME_OPT_CHECK 0x00000004
>
> struct acme_conf {
> int opts;
> diff --git parse.y parse.y
> index 220269ed279..e3c375c15b0 100644
> --- parse.y
> +++ parse.y
> @@ -29,6 +29,7 @@
> #include <sys/stat.h>
> #include <ctype.h>
> #include <err.h>
> +#include <errno.h>
> #include <limits.h>
> #include <stdarg.h>
> #include <stdio.h>
> @@ -69,7 +70,7 @@ struct domain_c *conf_new_domain(struct
> acme_conf *, char *);
> struct keyfile *conf_new_keyfile(struct acme_conf *, char *);
> void clear_config(struct acme_conf *);
> void print_config(struct acme_conf *);
> -int conf_check_file(char *, int);
> +int conf_check_file(char *);
>
> TAILQ_HEAD(symhead, sym) symhead = TAILQ_HEAD_INITIALIZER(symhead);
> struct sym {
> @@ -270,8 +271,7 @@ domainoptsl : ALTERNATIVE NAMES '{' altname_l '}'
> }
> if ((s = strdup($3)) == NULL)
> err(EXIT_FAILURE, "strdup");
> - if (!conf_check_file(s,
> - (conf->opts & ACME_OPT_NEWDKEY))) {
> + if (!conf_check_file(s)) {
> free(s);
> YYERROR;
> }
> @@ -1046,7 +1046,7 @@ domain_valid(const char *cp)
> }
>
> int
> -conf_check_file(char *s, int dontstat)
> +conf_check_file(char *s)
> {
> struct stat st;
>
> @@ -1054,14 +1054,14 @@ conf_check_file(char *s, int dontstat)
> warnx("%s: not an absolute path", s);
> return 0;
> }
> - if (dontstat)
> - return 1;
> if (stat(s, &st)) {
> + if (errno == ENOENT)
> + return 1;
> warn("cannot stat %s", s);
> return 0;
> }
> - if (st.st_mode & (S_IRWXG | S_IRWXO)) {
> - warnx("%s: group read/writable or world read/writable", s);
> + if (st.st_mode & S_IRWXO) {
> + warnx("%s: world read/writable", s);
> return 0;
> }
> return 1;
>
>
> --
> I'm not entirely sure you are real.
>