libsodium: Needed for Dnscrypto-proxy Release 1.3.0
[tomato.git] / release / src / router / rc / telssh.c
blob398c15464eff881ce5a467119db8dfd9312f6073
1 /*
3 Tomato Firmware
4 Copyright (C) 2006-2009 Jonathan Zarate
6 */
8 #include "rc.h"
11 void create_passwd(void)
13 char s[512];
14 char *p;
15 char salt[32];
16 FILE *f;
17 mode_t m;
18 #ifdef TCONFIG_SAMBASRV //!!TB
19 char *smbd_user;
20 #endif
22 strcpy(salt, "$1$");
23 f_read("/dev/urandom", s, 6);
24 base64_encode(s, salt + 3, 6);
25 salt[3 + 8] = 0;
26 p = salt;
27 while (*p) {
28 if (*p == '+') *p = '.';
29 ++p;
31 if (((p = nvram_get("http_passwd")) == NULL) || (*p == 0)) p = "admin";
33 #ifdef TCONFIG_SAMBASRV //!!TB
34 if (((smbd_user = nvram_get("smbd_user")) == NULL) || (*smbd_user == 0) || !strcmp(smbd_user, "root"))
35 smbd_user = "nas";
36 #endif
38 m = umask(0777);
39 if ((f = fopen("/etc/shadow", "w")) != NULL) {
40 p = crypt(p, salt);
41 fprintf(f, "root:%s:0:0:99999:7:0:0:\n"
42 "nobody:*:0:0:99999:7:0:0:\n", p);
43 #if TOMATO_SL
44 // todo zzz
45 fprintf(f, "admin:*:0:0:99999:7:0:0:\n");
46 #endif
47 #ifdef TCONFIG_SAMBASRV //!!TB
48 fprintf(f, "%s:*:0:0:99999:7:0:0:\n", smbd_user);
49 #endif
51 fappend(f, "/etc/shadow.custom");
52 fclose(f);
54 umask(m);
55 chmod("/etc/shadow", 0600);
57 #ifdef TCONFIG_SAMBASRV //!!TB
58 sprintf(s,
59 "root:x:0:0:root:/root:/bin/sh\n"
60 "%s:x:100:100:nas:/dev/null:/dev/null\n"
61 "nobody:x:65534:65534:nobody:/dev/null:/dev/null\n",
62 smbd_user);
63 f_write_string("/etc/passwd", s, 0, 0644);
64 #else //!!TB
65 f_write_string("/etc/passwd",
66 "root:x:0:0:root:/root:/bin/sh\n"
67 #if TOMATO_SL
68 // todo zzz
69 "admin:x:100:100:nas:/dev/null:/dev/null\n"
70 #endif
71 "nobody:x:65534:65534:nobody:/dev/null:/dev/null\n",
72 0, 0644);
73 #endif //!!TB
74 fappend_file("/etc/passwd", "/etc/passwd.custom");
76 f_write_string("/etc/gshadow",
77 "root:*:0:\n"
78 //#if TOMATO_SL
79 #ifdef TCONFIG_SAMBASRV //!!TB
80 "nas:*:100:\n"
81 #endif
82 "nobody:*:65534:\n",
83 0, 0600);
84 fappend_file("/etc/gshadow", "/etc/gshadow.custom");
86 f_write_string("/etc/group",
87 "root:x:0:\n"
88 //#if TOMATO_SL
89 #ifdef TCONFIG_SAMBASRV //!!TB
90 "nas:x:100:\n"
91 #endif
92 "nobody:x:65534:\n",
93 0, 0644);
94 fappend_file("/etc/group", "/etc/group.custom");
97 static inline int check_host_key(const char *ktype, const char *nvname, const char *hkfn)
99 unlink(hkfn);
101 if (!nvram_get_file(nvname, hkfn, 2048)) {
102 eval("dropbearkey", "-t", (char *)ktype, "-f", (char *)hkfn);
103 if (nvram_set_file(nvname, hkfn, 2048)) {
104 return 1;
108 return 0;
111 void start_sshd(void)
113 int dirty = 0;
115 mkdir("/etc/dropbear", 0700);
116 mkdir("/root/.ssh", 0700);
118 f_write_string("/root/.ssh/authorized_keys", nvram_safe_get("sshd_authkeys"), 0, 0700);
120 dirty |= check_host_key("rsa", "sshd_hostkey", "/etc/dropbear/dropbear_rsa_host_key");
121 dirty |= check_host_key("dss", "sshd_dsskey", "/etc/dropbear/dropbear_dss_host_key");
122 if (dirty)
123 nvram_commit_x();
126 xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s");
129 char *argv[11];
130 int argc;
131 char *p;
133 argv[0] = "dropbear";
134 argv[1] = "-p";
135 argv[2] = nvram_safe_get("sshd_port");
136 argc = 3;
138 if (nvram_get_int("sshd_remote") && nvram_invmatch("sshd_rport", nvram_safe_get("sshd_port"))) {
139 argv[argc++] = "-p";
140 argv[argc++] = nvram_safe_get("sshd_rport");
143 if (!nvram_get_int("sshd_pass")) argv[argc++] = "-s";
145 if (nvram_get_int("sshd_forwarding")) argv[argc++] = "-a";
147 if (((p = nvram_get("sshd_rwb")) != NULL) && (*p)) {
148 argv[argc++] = "-W";
149 argv[argc++] = p;
152 argv[argc] = NULL;
153 _eval(argv, NULL, 0, NULL);
156 void stop_sshd(void)
158 killall("dropbear", SIGTERM);
161 void start_telnetd(void)
163 xstart("telnetd", "-p", nvram_safe_get("telnetd_port"));
166 void stop_telnetd(void)
168 killall("telnetd", SIGTERM);