ok!

Florian Obser([email protected]) on 2020.09.14 17:15:37 +0200:
> 
> This fell through the cracks back in April.
> 
> We need to be able to provide contact information to use the
> buypass.com acme api.
> 
> OK?
> 
> diff --git etc/examples/acme-client.conf etc/examples/acme-client.conf
> index 32ecd8e8655..40d231725ac 100644
> --- etc/examples/acme-client.conf
> +++ etc/examples/acme-client.conf
> @@ -11,6 +11,18 @@ authority letsencrypt-staging {
>       account key "/etc/acme/letsencrypt-staging-privkey.pem"
>  }
>  
> +authority buypass {
> +    api url "https://api.buypass.com/acme/directory";
> +    account key "/etc/acme/buypass-privkey.pem"
> +    contact "mailto:[email protected]";
> +}
> +
> +authority buypass-test {
> +    api url "https://api.test4.buypass.no/acme/directory";
> +    account key "/etc/acme/buypass-test-privkey.pem"
> +    contact "mailto:[email protected]";
> +}
> +
>  domain example.com {
>       alternative names { secure.example.com }
>       domain key "/etc/ssl/private/example.com.key"
> diff --git usr.sbin/acme-client/acme-client.conf.5 
> usr.sbin/acme-client/acme-client.conf.5
> index 08a47a76ab7..41994d13676 100644
> --- usr.sbin/acme-client/acme-client.conf.5
> +++ usr.sbin/acme-client/acme-client.conf.5
> @@ -98,6 +98,11 @@ It defaults to
>  Specify the
>  .Ar url
>  under which the ACME API is reachable.
> +.It Ic contact Ar contact
> +Optional
> +.Ar contact
> +URLs that the authority can use to contact the client for issues related to
> +this account.
>  .El
>  .Sh DOMAINS
>  The certificates to be obtained through ACME.
> diff --git usr.sbin/acme-client/extern.h usr.sbin/acme-client/extern.h
> index 364425b0500..ee341e0950f 100644
> --- usr.sbin/acme-client/extern.h
> +++ usr.sbin/acme-client/extern.h
> @@ -263,7 +263,7 @@ char              *json_getstr(struct jsmnn *, const char 
> *);
>  
>  char         *json_fmt_newcert(const char *);
>  char         *json_fmt_chkacc(void);
> -char         *json_fmt_newacc(void);
> +char         *json_fmt_newacc(const char *);
>  char         *json_fmt_neworder(const char *const *, size_t);
>  char         *json_fmt_protected_rsa(const char *,
>                       const char *, const char *, const char *);
> diff --git usr.sbin/acme-client/json.c usr.sbin/acme-client/json.c
> index a6762eeb258..9201f8d2fc3 100644
> --- usr.sbin/acme-client/json.c
> +++ usr.sbin/acme-client/json.c
> @@ -618,14 +618,24 @@ json_fmt_chkacc(void)
>   * Format the "newAccount" resource request.
>   */
>  char *
> -json_fmt_newacc(void)
> +json_fmt_newacc(const char *contact)
>  {
>       int      c;
> -     char    *p;
> +     char    *p, *cnt = NULL;
> +
> +     if (contact != NULL) {
> +             c = asprintf(&cnt, "\"contact\": [ \"%s\" ], ", contact);
> +             if (c == -1) {
> +                     warn("asprintf");
> +                     return NULL;
> +             }
> +     }
>  
>       c = asprintf(&p, "{"
> +         "%s"
>           "\"termsOfServiceAgreed\": true"
> -         "}");
> +         "}", cnt == NULL ? "" : cnt);
> +     free(cnt);
>       if (c == -1) {
>               warn("asprintf");
>               p = NULL;
> diff --git usr.sbin/acme-client/netproc.c usr.sbin/acme-client/netproc.c
> index 05e36897c38..4490450003e 100644
> --- usr.sbin/acme-client/netproc.c
> +++ usr.sbin/acme-client/netproc.c
> @@ -369,14 +369,14 @@ sreq(struct conn *c, const char *addr, int kid, const 
> char *req, char **loc)
>   * Returns non-zero on success.
>   */
>  static int
> -donewacc(struct conn *c, const struct capaths *p)
> +donewacc(struct conn *c, const struct capaths *p, const char *contact)
>  {
>       struct jsmnn    *j = NULL;
>       int              rc = 0;
>       char            *req, *detail, *error = NULL;
>       long             lc;
>  
> -     if ((req = json_fmt_newacc()) == NULL)
> +     if ((req = json_fmt_newacc(contact)) == NULL)
>               warnx("json_fmt_newacc");
>       else if ((lc = sreq(c, p->newaccount, 0, req, &c->kid)) < 0)
>               warnx("%s: bad comm", p->newaccount);
> @@ -410,7 +410,7 @@ donewacc(struct conn *c, const struct capaths *p)
>   * Returns non-zero on success.
>   */
>  static int
> -dochkacc(struct conn *c, const struct capaths *p)
> +dochkacc(struct conn *c, const struct capaths *p, const char *contact)
>  {
>       int              rc = 0;
>       char            *req;
> @@ -425,7 +425,7 @@ dochkacc(struct conn *c, const struct capaths *p)
>       else if (c->buf.buf == NULL || c->buf.sz == 0)
>               warnx("%s: empty response", p->newaccount);
>       else if (lc == 400)
> -             rc = donewacc(c, p);
> +             rc = donewacc(c, p, contact);
>       else
>               rc = 1;
>  
> @@ -755,7 +755,7 @@ netproc(int kfd, int afd, int Cfd, int cfd, int dfd, int 
> rfd,
>       c.newnonce = paths.newnonce;
>  
>       /* Check if our account already exists or create it. */
> -     if (!dochkacc(&c, &paths))
> +     if (!dochkacc(&c, &paths, authority->contact))
>               goto out;
>  
>       /*
> diff --git usr.sbin/acme-client/parse.h usr.sbin/acme-client/parse.h
> index 9de5a490f69..c928a9de7da 100644
> --- usr.sbin/acme-client/parse.h
> +++ usr.sbin/acme-client/parse.h
> @@ -38,6 +38,7 @@ struct authority_c {
>       char                            *api;
>       char                            *account;
>       enum keytype                     keytype;
> +     char                            *contact;
>  };
>  
>  struct domain_c {
> diff --git usr.sbin/acme-client/parse.y usr.sbin/acme-client/parse.y
> index 120f253a63f..c39b922f764 100644
> --- usr.sbin/acme-client/parse.y
> +++ usr.sbin/acme-client/parse.y
> @@ -100,7 +100,7 @@ typedef struct {
>  
>  %}
>  
> -%token       AUTHORITY URL API ACCOUNT
> +%token       AUTHORITY URL API ACCOUNT CONTACT
>  %token       DOMAIN ALTERNATIVE NAME NAMES CERT FULL CHAIN KEY SIGN WITH 
> CHALLENGEDIR
>  %token       YES NO
>  %token       INCLUDE
> @@ -230,6 +230,16 @@ authorityoptsl   : API URL STRING {
>                       auth->account = s;
>                       auth->keytype = $4;
>               }
> +             | CONTACT STRING {
> +                     char *s;
> +                     if (auth->contact != NULL) {
> +                             yyerror("duplicate contact");
> +                             YYERROR;
> +                     }
> +                     if ((s = strdup($2)) == NULL)
> +                             err(EXIT_FAILURE, "strdup");
> +                     auth->contact = s;
> +             }
>               ;
>  
>  domain               : DOMAIN STRING {
> @@ -452,6 +462,7 @@ lookup(char *s)
>               {"certificate",         CERT},
>               {"chain",               CHAIN},
>               {"challengedir",        CHALLENGEDIR},
> +             {"contact",             CONTACT},
>               {"domain",              DOMAIN},
>               {"ecdsa",               ECDSA},
>               {"full",                FULL},
> 
> 
> -- 
> I'm not entirely sure you are real.
> 

Reply via email to