This repository has been archived by the owner on Dec 14, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
/
ssh.c
101 lines (75 loc) · 1.87 KB
/
ssh.c
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
96
97
98
99
100
101
/*
Tomato Firmware
Copyright (C) 2006-2009 Jonathan Zarate
*/
#include "rc.h"
#include <shared.h>
static inline int check_host_key(const char *ktype, const char *nvname, const char *hkfn)
{
unlink(hkfn);
if (!nvram_get_file(nvname, hkfn, 2048)) {
eval("dropbearkey", "-t", (char *)ktype, "-f", (char *)hkfn);
if (nvram_set_file(nvname, hkfn, 2048)) {
return 1;
}
}
return 0;
}
char *get_parsed_key(const char *name, char *buf)
{
char *value;
int len, i;
value = nvram_safe_get(name);
len = strlen(value);
if (len > 3500) len = 3500;
for (i=0; (i < len); i++) {
if (value[i] == '>')
buf[i] = '\n';
else
buf[i] = value[i];
}
buf[i] = '\0';
return buf;
}
void start_sshd(void)
{
int dirty = 0;
char buf[3500];
if (!nvram_match("sshd_enable", "1"))
return;
mkdir("/etc/dropbear", 0700);
mkdir("/root/.ssh", 0700);
f_write_string("/root/.ssh/authorized_keys", get_parsed_key("sshd_authkeys", buf), 0, 0700);
dirty |= check_host_key("rsa", "sshd_hostkey", "/etc/dropbear/dropbear_rsa_host_key");
dirty |= check_host_key("dss", "sshd_dsskey", "/etc/dropbear/dropbear_dss_host_key");
dirty |= check_host_key("ecdsa", "sshd_ecdsakey", "/etc/dropbear/dropbear_ecdsa_host_key");
if (dirty)
nvram_commit_x();
/*
xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s");
*/
char *argv[9];
int argc;
char *p;
argv[0] = "dropbear";
argv[1] = "-p";
argv[2] = nvram_safe_get("sshd_port");
argc = 3;
if (!nvram_get_int("sshd_pass")) argv[argc++] = "-s";
if (nvram_get_int("sshd_forwarding")) {
argv[argc++] = "-a";
} else {
argv[argc++] = "-j";
argv[argc++] = "-k";
}
if (((p = nvram_get("sshd_rwb")) != NULL) && (*p)) {
argv[argc++] = "-W";
argv[argc++] = p;
}
argv[argc] = NULL;
_eval(argv, NULL, 0, NULL);
}
void stop_sshd(void)
{
killall("dropbear", SIGTERM);
}