summary refs log tree commit diff
path: root/cert.c
blob: 23c9ce8c877d3ba5afc7d980379dced83ef44a47 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* Copyright (C) 2020  C. McEnroe <june@causal.agency>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 *
 * Additional permission under GNU GPL version 3 section 7:
 *
 * If you modify this Program, or any covered work, by linking or
 * combining it with OpenSSL (or a modified version of that library),
 * containing parts covered by the terms of the OpenSSL License and the
 * original SSLeay license, the licensors of this Program grant you
 * additional permission to convey the resulting work. Corresponding
 * Source for a non-source form of such a combination shall include the
 * source code for the parts of OpenSSL used as well as that of the
 * covered work.
 */

#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>

#include "bounce.h"

// This basically exists to work around certbot's symlinks from "live" into
// "archive" under capsicum.

int certOpen(struct Cert *cert, const char *path) {
	char buf[PATH_MAX];
	snprintf(buf, sizeof(buf), "%s", path);

	char *base = strrchr(buf, '/');
	if (base) {
		*base = '\0';
		snprintf(cert->name, sizeof(cert->name), "%s", &base[1]);
		cert->parent = open(buf, O_DIRECTORY);
	} else {
		snprintf(cert->name, sizeof(cert->name), "%s", path);
		cert->parent = open(".", O_DIRECTORY);
	}
	if (cert->parent < 0) return -1;

	cert->target = cert->parent;
	ssize_t len = readlinkat(cert->parent, cert->name, buf, sizeof(buf) - 1);
	if (len < 0 && errno == EINVAL) return 0;
	if (len < 0) return -1;
	buf[len] = '\0';

	base = strrchr(buf, '/');
	if (base) {
		*base = '\0';
		cert->target = openat(cert->parent, buf, O_DIRECTORY);
		if (cert->target < 0) return -1;
	}
	return 0;
}

FILE *certFile(const struct Cert *cert) {
	const char *name = cert->name;

	char buf[PATH_MAX];
	ssize_t len = readlinkat(cert->parent, cert->name, buf, sizeof(buf) - 1);
	if (len < 0) {
		if (errno != EINVAL) return NULL;
	} else {
		// XXX: Assume only the target base name has changed.
		buf[len] = '\0';
		name = strrchr(buf, '/');
		if (name) {
			name = &name[1];
		} else {
			name = buf;
		}
	}

	int fd = openat(cert->target, name, O_RDONLY);
	if (fd < 0) return NULL;

	return fdopen(fd, "r");
}
fabb01a22261fbf&follow=1'>Document channel keys in join optionJune McEnroe 2021-06-18Use | to separate flags from config optionsJune McEnroe This lets mandoc generate tags for the option names as well, so you can ":t away" in less(1), for example, and anchor links in HTML output. The added No's prevent the equals signs from being part of the anchor links. 2021-06-18Stop referring to server-time as IRCv3.2June McEnroe IRCv3 has moved away from grouping specs together into versions like this. SASL is still referred to as IRCv3.2 because there are two different versions of that spec. 2021-06-17Add mailing list archive to READMEJune McEnroe 2021-06-10Stop accumulating ISUPPORT tokens once MOTD startsJune McEnroe This avoids duplicating tokens when a client sends VERSION and the server responds with its 005s again. 2021-06-09Use seprintf for snip, removing strlcpynJune McEnroe 2021-06-09Use seprintf for reserializeJune McEnroe 2021-06-09Use seprintf for capListJune McEnroe 2021-06-09Add seprintfJune McEnroe Based on seprint(2) from Plan 9. I'm not sure if my return value exactly matches Plan 9's in the case of truncation. seprint(2) is described only as returning a pointer to the terminating '\0', but if it does so even in the case of truncation, it is awkward for the caller to detect. This implementation returns end in the truncation case, so that (ptr == end) indicates truncation. 2021-05-27Add pounce-notify to README 2.4June McEnroe 2021-05-27Fix ENVIRONMENT formatting in pounce-notify(1)June McEnroe 2021-05-27Add note about Libera.Chat SASL-only rangesJune McEnroe 2021-05-25Add QUIRKS fileJune McEnroe 2021-05-19Replace freenode with tilde.chatJune McEnroe 2021-05-04notify: Reword pounce-notify manualJune McEnroe 2021-05-02Clean up Makefiles, configure scriptsJune McEnroe Default MANDIR to ${PREFIX}/man since it turns out man-db includes /usr/local/man by default. Add support for BINDIR. Separate libs out into LDADD variables. 2021-04-30palaver: Exit on getopt failureJune McEnroe Oops. 2021-04-30notify: Implement pounce-notifyJune McEnroe