ソースを参照

add port parsing for sandboxing

shtrophic 1 年間 前
コミット
4c1a2d24d3
4 ファイル変更70 行追加18 行削除
  1. 2 2
      activitypub.c
  2. 15 16
      sandbox.c
  3. 1 0
      snac.h
  4. 52 0
      utils.c

+ 2 - 2
activitypub.c

@@ -2465,9 +2465,9 @@ int process_input_message(snac *snac, const xs_dict *msg, const xs_dict *req)
 
 
 
 
 int send_email(const xs_dict *mailinfo)
 int send_email(const xs_dict *mailinfo)
-/* invoke sendmail with email headers and body in msg */
+/* invoke curl */
 {
 {
-    const xs_dict *smtp_cfg = xs_dict_get(srv_config, "smtp");
+    const xs_dict *smtp_cfg = xs_dict_get(srv_config, "email_notifications");
     const char 
     const char 
         *url  = xs_dict_get(smtp_cfg, "url"),
         *url  = xs_dict_get(smtp_cfg, "url"),
         *user = xs_dict_get(smtp_cfg, "username"),
         *user = xs_dict_get(smtp_cfg, "username"),

+ 15 - 16
sandbox.c

@@ -8,8 +8,6 @@ void sbox_enter(const char *basedir)
 {
 {
     const char *address = xs_dict_get(srv_config, "address");
     const char *address = xs_dict_get(srv_config, "address");
 
 
-    int smail = !xs_is_true(xs_dict_get(srv_config, "disable_email_notifications"));
-
     if (xs_is_true(xs_dict_get(srv_config, "disable_openbsd_security"))) {
     if (xs_is_true(xs_dict_get(srv_config, "disable_openbsd_security"))) {
         srv_log(xs_dup("OpenBSD security disabled by admin"));
         srv_log(xs_dup("OpenBSD security disabled by admin"));
         return;
         return;
@@ -24,9 +22,6 @@ void sbox_enter(const char *basedir)
     unveil("/etc/ssl/cert.pem",    "r");
     unveil("/etc/ssl/cert.pem",    "r");
     unveil("/usr/share/zoneinfo",  "r");
     unveil("/usr/share/zoneinfo",  "r");
 
 
-    if (smail)
-        unveil("/usr/sbin/sendmail",   "x");
-
     if (*address == '/')
     if (*address == '/')
         unveil(address, "rwc");
         unveil(address, "rwc");
 
 
@@ -36,9 +31,6 @@ void sbox_enter(const char *basedir)
 
 
     xs *p = xs_str_new("stdio rpath wpath cpath flock inet proc dns fattr");
     xs *p = xs_str_new("stdio rpath wpath cpath flock inet proc dns fattr");
 
 
-    if (smail)
-        p = xs_str_cat(p, " exec");
-
     if (*address == '/')
     if (*address == '/')
         p = xs_str_cat(p, " unix");
         p = xs_str_cat(p, " unix");
 
 
@@ -55,7 +47,7 @@ void sbox_enter(const char *basedir)
 #include "landloc.h"
 #include "landloc.h"
 
 
 static
 static
-LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail) {
+LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smtp_port) {
 
 
     const unsigned long long
     const unsigned long long
         rd = LANDLOCK_ACCESS_FS_READ_DIR,
         rd = LANDLOCK_ACCESS_FS_READ_DIR,
@@ -94,9 +86,6 @@ LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail)
         LL_PATH(sdir, s);
         LL_PATH(sdir, s);
     }
     }
 
 
-    if (smail && mtime("/usr/sbin/sendmail") > 0)
-        LL_PATH("/usr/sbin/sendmail", x);
-
     if (*address != '/') {
     if (*address != '/') {
         unsigned short listen_port = xs_number_get(xs_dict_get(srv_config, "port"));
         unsigned short listen_port = xs_number_get(xs_dict_get(srv_config, "port"));
         LL_PORT(listen_port, LANDLOCK_ACCESS_NET_BIND_TCP_COMPAT);
         LL_PORT(listen_port, LANDLOCK_ACCESS_NET_BIND_TCP_COMPAT);
@@ -104,24 +93,34 @@ LL_BEGIN(sbox_enter_linux_, const char* basedir, const char *address, int smail)
 
 
     LL_PORT(80,  LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
     LL_PORT(80,  LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
     LL_PORT(443, LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
     LL_PORT(443, LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
+    if (smtp_port > 0)
+        LL_PORT((unsigned short)smtp_port, LANDLOCK_ACCESS_NET_CONNECT_TCP_COMPAT);
 
 
 } LL_END
 } LL_END
 
 
 void sbox_enter(const char *basedir)
 void sbox_enter(const char *basedir)
 {
 {
+    const xs_val *v;
+    const char *errstr;
     const char *address = xs_dict_get(srv_config, "address");
     const char *address = xs_dict_get(srv_config, "address");
-
-    int smail = !xs_is_true(xs_dict_get(srv_config, "disable_email_notifications"));
+    int smtp_port = -1;
 
 
     if (xs_is_true(xs_dict_get(srv_config, "disable_sandbox"))) {
     if (xs_is_true(xs_dict_get(srv_config, "disable_sandbox"))) {
         srv_debug(1, xs_dup("Linux sandbox disabled by admin"));
         srv_debug(1, xs_dup("Linux sandbox disabled by admin"));
         return;
         return;
     }
     }
 
 
-    if (sbox_enter_linux_(basedir, address, smail) == 0)
+    if ((v = xs_dict_get(srv_config, "email_notifications")) && 
+        (v = xs_dict_get(v, "url"))) {
+        smtp_port = parse_port((const char *)v, &errstr);
+        if (errstr)
+            srv_debug(0, xs_fmt("Couldn't determine port from '%s': %s", (const char *)v, errstr));
+    }
+
+    if (sbox_enter_linux_(basedir, address, smtp_port) == 0)
         srv_debug(1, xs_dup("Linux sandbox enabled"));
         srv_debug(1, xs_dup("Linux sandbox enabled"));
     else
     else
-        srv_debug(1, xs_dup("Linux sandbox failed"));
+        srv_debug(0, xs_dup("Linux sandbox failed"));
 }
 }
 
 
 #else /* defined(WITH_LINUX_SANDBOX) */
 #else /* defined(WITH_LINUX_SANDBOX) */

+ 1 - 0
snac.h

@@ -417,6 +417,7 @@ void import_blocked_accounts_csv(snac *user, const char *fn);
 void import_following_accounts_csv(snac *user, const char *fn);
 void import_following_accounts_csv(snac *user, const char *fn);
 void import_list_csv(snac *user, const char *fn);
 void import_list_csv(snac *user, const char *fn);
 void import_csv(snac *user);
 void import_csv(snac *user);
+int parse_port(const char *url, const char **errstr);
 
 
 typedef enum {
 typedef enum {
 #define HTTP_STATUS(code, name, text) HTTP_STATUS_ ## name = code,
 #define HTTP_STATUS(code, name, text) HTTP_STATUS_ ## name = code,

+ 52 - 0
utils.c

@@ -904,3 +904,55 @@ void import_csv(snac *user)
     else
     else
         snac_log(user, xs_fmt("Cannot open file %s", fn));
         snac_log(user, xs_fmt("Cannot open file %s", fn));
 }
 }
+
+static const struct {
+	const char *proto;
+	unsigned short default_port;
+} FALLBACK_PORTS[] = {
+	/* caution: https > http, smpts > smtp */
+	{"https", 443},
+	{"http",  80},
+    {"smtps", 465},
+	{"smtp", 25}
+};
+
+int parse_port(const char *url, const char **errstr)
+{
+	const char *col, *rcol;
+	int tmp, ret = -1;
+
+    if (errstr)
+	    *errstr = NULL;
+
+	if (!(col = strchr(url, ':'))) {
+        if (errstr)
+		    *errstr = "bad url";
+		return -1;
+	}
+	
+	for (size_t i = 0; i < sizeof(FALLBACK_PORTS) / sizeof(*FALLBACK_PORTS); ++i) {
+		if (memcmp(url, FALLBACK_PORTS[i].proto, strlen(FALLBACK_PORTS[i].proto)) == 0) {
+			ret = FALLBACK_PORTS[i].default_port;
+			break;
+		}
+	}
+
+	if (!(rcol = strchr(col + 1, ':')))
+		rcol = col;
+
+	if (rcol) {
+		tmp = atoi(rcol + 1);
+        if (tmp == 0) {
+            if (ret != -1) 
+                return ret;
+            
+            *errstr = strerror(errno);
+            return -1;
+        }
+		
+		return tmp;
+	}
+
+	*errstr = "unknown protocol";
+	return -1;
+}