start adding ssh support
This commit is contained in:
parent
aa0e0221b6
commit
9125a69aa0
6
bbs.h
6
bbs.h
@ -90,6 +90,12 @@ struct bbs_config {
|
|||||||
char *echomail_sem;
|
char *echomail_sem;
|
||||||
char *netmail_sem;
|
char *netmail_sem;
|
||||||
char *default_tagline;
|
char *default_tagline;
|
||||||
|
int telnet_port;
|
||||||
|
|
||||||
|
int ssh_server;
|
||||||
|
int ssh_port;
|
||||||
|
char *ssh_dsa_key;
|
||||||
|
char *ssh_rsa_key;
|
||||||
|
|
||||||
char *irc_server;
|
char *irc_server;
|
||||||
int irc_port;
|
int irc_port;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
[main]
|
[main]
|
||||||
|
Telnet Port = 2023
|
||||||
BBS Name = Magicka BBS
|
BBS Name = Magicka BBS
|
||||||
Sysop Name = sysop
|
Sysop Name = sysop
|
||||||
nodes = 4
|
nodes = 4
|
||||||
@ -11,6 +12,10 @@ External Editor cmd = /home/andrew/MagickaBBS/doors/oedit.sh
|
|||||||
External Editor stdio = false
|
External Editor stdio = false
|
||||||
Automessage Write Level = 10
|
Automessage Write Level = 10
|
||||||
Fork = false
|
Fork = false
|
||||||
|
Enable SSH = false
|
||||||
|
SSH Port = 2024
|
||||||
|
SSH DSA Key = /home/andrew/MagickaBBS/keys/ssh_host_dsa_key
|
||||||
|
SSH RSA Key = /home/andrew/MagickaBBS/keys/ssh_rsa_key
|
||||||
|
|
||||||
[paths]
|
[paths]
|
||||||
PID File = /home/andrew/MagickaBBS/magicka.pid
|
PID File = /home/andrew/MagickaBBS/magicka.pid
|
||||||
|
165
main.c
165
main.c
@ -10,12 +10,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
#include <libssh/libssh.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "bbs.h"
|
#include "bbs.h"
|
||||||
#include "inih/ini.h"
|
#include "inih/ini.h"
|
||||||
|
|
||||||
extern struct bbs_config conf;
|
extern struct bbs_config conf;
|
||||||
|
extern struct user_record *gUser;
|
||||||
void sigterm_handler(int s)
|
void sigterm_handler(int s)
|
||||||
{
|
{
|
||||||
remove(conf.pid_file);
|
remove(conf.pid_file);
|
||||||
@ -228,6 +229,20 @@ static int handler(void* user, const char* section, const char* name,
|
|||||||
if (strcasecmp(section, "main") == 0) {
|
if (strcasecmp(section, "main") == 0) {
|
||||||
if (strcasecmp(name, "bbs name") == 0) {
|
if (strcasecmp(name, "bbs name") == 0) {
|
||||||
conf->bbs_name = strdup(value);
|
conf->bbs_name = strdup(value);
|
||||||
|
} else if (strcasecmp(name, "telnet port") == 0) {
|
||||||
|
conf->telnet_port = atoi(value);
|
||||||
|
} else if (strcasecmp(name, "enable ssh") == 0) {
|
||||||
|
if (strcasecmp(value, "true") == 0) {
|
||||||
|
conf->ssh_server = 1;
|
||||||
|
} else {
|
||||||
|
conf->ssh_server = 0;
|
||||||
|
}
|
||||||
|
} else if (strcasecmp(name, "ssh port") == 0) {
|
||||||
|
conf->ssh_port = atoi(value);
|
||||||
|
} else if (strcasecmp(name, "ssh dsa key") == 0) {
|
||||||
|
conf->ssh_dsa_key = strdup(value);
|
||||||
|
} else if (strcasecmp(name, "ssh rsa key") == 0) {
|
||||||
|
conf->ssh_rsa_key = strdup(value);
|
||||||
} else if (strcasecmp(name, "sysop name") == 0) {
|
} else if (strcasecmp(name, "sysop name") == 0) {
|
||||||
conf->sysop_name = strdup(value);
|
conf->sysop_name = strdup(value);
|
||||||
} else if (strcasecmp(name, "nodes") == 0) {
|
} else if (strcasecmp(name, "nodes") == 0) {
|
||||||
@ -318,6 +333,143 @@ static int handler(void* user, const char* section, const char* name,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ssh_authenticate(ssh_session p_ssh_session) {
|
||||||
|
ssh_message message;
|
||||||
|
char *username;
|
||||||
|
char *password;
|
||||||
|
|
||||||
|
do {
|
||||||
|
msg = ssh_message_get(p_ssh_session);
|
||||||
|
switch(ssh_message_type(message)) {
|
||||||
|
case SSH_REQUEST_AUTH:
|
||||||
|
switch(ssh_message_subtype(message)) {
|
||||||
|
case SSH_AUTH_METHOD_PASSWORD:
|
||||||
|
username = ssh_message_auth_user(message);
|
||||||
|
password = ssh_message_auth_password(message);
|
||||||
|
|
||||||
|
if (strcasecmp(username, "new") == 0 && strcasecmp(password, "new") == 0) {
|
||||||
|
ssh_message_free(message);
|
||||||
|
gUser = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
gUser = check_user_pass(username, password);
|
||||||
|
if (gUser != NULL) {
|
||||||
|
ssh_message_free(message);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_INTERACTIVE);
|
||||||
|
ssh_message_reply_default(message);
|
||||||
|
break;
|
||||||
|
case SSH_AUTH_METHOD_NONE:
|
||||||
|
default:
|
||||||
|
ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_INTERACTIVE);
|
||||||
|
ssh_message_reply_default(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_INTERACTIVE);
|
||||||
|
ssh_message_reply_default(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ssh_message_free(message);
|
||||||
|
} while(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serverssh(int port) {
|
||||||
|
ssh_session p_ssh_session;
|
||||||
|
ssh_bind p_ssh_bind;
|
||||||
|
int err;
|
||||||
|
int pid;
|
||||||
|
ssh_channel chan = 0;
|
||||||
|
err = ssh_init();
|
||||||
|
if (err == -1) {
|
||||||
|
fprintf(stderr, "Error starting SSH server.\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
p_ssh_session = ssh_new();
|
||||||
|
if (p_ssh_session == NULL) {
|
||||||
|
fprintf(stderr, "Error starting SSH server.\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
p_ssh_bind = ssh_bind_new();
|
||||||
|
if (p_ssh_bind == NULL) {
|
||||||
|
fprintf(stderr, "Error starting SSH server.\n");
|
||||||
|
exit(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
ssh_bind_options_set(pSshBind, SSH_BIND_OPTIONS_BINDPORT, &port);
|
||||||
|
ssh_bind_options_set(pSshBind, SSH_BIND_OPTIONS_DSAKEY, conf.ssh_dsa_key);
|
||||||
|
ssh_bind_options_set(pSshBind, SSH_BIND_OPTIONS_RSAKEY, conf.ssh_rsa_key);
|
||||||
|
|
||||||
|
ssh_bind_listen(p_ssh_bind);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
if (ssh_bind_accept(p_ssh_bind, p_ssh_session) == SSH_OK) {
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
if (ssh_handle_key_exchange(p_ssh_session)) {
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
if (ssh_authenticate(p_ssh_session) == 1) {
|
||||||
|
do {
|
||||||
|
message = ssh_message_get(p_ssh_session);
|
||||||
|
if (message) {
|
||||||
|
if (ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN && ssh_message_subtype(message) == SSH_CHANNEL_SESSION) {
|
||||||
|
chan = ssh_message_channel_request_open_reply_accept(message);
|
||||||
|
ssh_message_free(message);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
ssh_message_reply_default(message);
|
||||||
|
ssh_message_free(message);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while(!chan);
|
||||||
|
if (!chan) {
|
||||||
|
ssh_finalize();
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
message = ssh_message_get(p_ssh_session);
|
||||||
|
if (message) {
|
||||||
|
if (ssh_message_type(message) == SSH_REQUEST_CHANNEL) {
|
||||||
|
if (ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL) {
|
||||||
|
shell = 1;
|
||||||
|
ssh_channel_request_reply_success(message);
|
||||||
|
ssh_message_free(message);
|
||||||
|
break;
|
||||||
|
} else if (ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_PTY) {
|
||||||
|
ssh_channel_request_reply_success(message);
|
||||||
|
ssh_message_free(message);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (!shell);
|
||||||
|
|
||||||
|
if (!shell) {
|
||||||
|
ssh_finalize();
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
} else if (pid > 0) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void server(int port) {
|
void server(int port) {
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
struct sigaction st;
|
struct sigaction st;
|
||||||
@ -397,8 +549,8 @@ int main(int argc, char **argv) {
|
|||||||
FILE *fptr;
|
FILE *fptr;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
|
||||||
if (argc < 3) {
|
if (argc < 2) {
|
||||||
fprintf(stderr, "Usage ./magicka config/bbs.ini port\n");
|
fprintf(stderr, "Usage ./magicka config/bbs.ini\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,6 +566,7 @@ int main(int argc, char **argv) {
|
|||||||
conf.automsgwritelvl = 10;
|
conf.automsgwritelvl = 10;
|
||||||
conf.echomail_sem = NULL;
|
conf.echomail_sem = NULL;
|
||||||
conf.netmail_sem = NULL;
|
conf.netmail_sem = NULL;
|
||||||
|
conf.telnet_port = 0;
|
||||||
|
|
||||||
// Load BBS data
|
// Load BBS data
|
||||||
if (ini_parse(argv[1], handler, &conf) <0) {
|
if (ini_parse(argv[1], handler, &conf) <0) {
|
||||||
@ -440,8 +593,6 @@ int main(int argc, char **argv) {
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
port = atoi(argv[2]);
|
|
||||||
|
|
||||||
if (conf.fork) {
|
if (conf.fork) {
|
||||||
if (stat(conf.pid_file, &s) == 0) {
|
if (stat(conf.pid_file, &s) == 0) {
|
||||||
fprintf(stderr, "Magicka already running or stale pid file at: %s\n", conf.pid_file);
|
fprintf(stderr, "Magicka already running or stale pid file at: %s\n", conf.pid_file);
|
||||||
@ -463,9 +614,9 @@ int main(int argc, char **argv) {
|
|||||||
fclose(fptr);
|
fclose(fptr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
server(port);
|
server(conf.port);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
server(port);
|
server(conf.port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user