summaryrefslogtreecommitdiffstats
path: root/src/irc/proxy/proxy.c
blob: d32b6009ad8080bfbd83c521ce8c4b3a491854ea (plain)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 proxy.c : irc proxy

    Copyright (C) 1999-2001 Timo Sirainen

    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 2 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, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/

#include "module.h"
#include <irssi/src/core/signals.h>
#include <irssi/src/core/settings.h>
#include <irssi/src/core/levels.h>

#include <irssi/src/fe-common/core/printtext.h>

/* SYNTAX: IRSSIPROXY STATUS */
static void cmd_irssiproxy_status(const char *data, IRC_SERVER_REC *server)
{
	GSList *tmp;

	if (!settings_get_bool("irssiproxy")) {
		printtext(server, NULL, MSGLEVEL_CLIENTNOTICE,
			  "Proxy is currently disabled");
		return;
	}


	printtext(server, NULL, MSGLEVEL_CLIENTNOTICE,
		  "Proxy: Currently connected clients: %d",
		  g_slist_length(proxy_clients));

	for (tmp = proxy_clients; tmp != NULL; tmp = tmp->next) {
		CLIENT_REC *rec = tmp->data;

		printtext(server, NULL, MSGLEVEL_CLIENTNOTICE,
			  "  %s connect%s to %s (%s)",
			  rec->addr,
			  rec->connected ? "ed" : "ing",
			  rec->listen->port_or_path, rec->listen->ircnet);
	}
}

/* SYNTAX: IRSSIPROXY */
static void cmd_irssiproxy(const char *data, IRC_SERVER_REC *server, void *item)
{
	if (*data == '\0') {
		cmd_irssiproxy_status(data, server);
		return;
	}

	command_runsub("irssiproxy", data, server, item);
}

static void irc_proxy_setup_changed(void)
{
	if (settings_get_bool("irssiproxy")) {
		proxy_listen_init();
	} else {
		proxy_listen_deinit();
	}
}

void irc_proxy_init(void)
{
	settings_add_str("irssiproxy", "irssiproxy_ports", "");
	settings_add_str("irssiproxy", "irssiproxy_password", "");
	settings_add_str("irssiproxy", "irssiproxy_bind", "");
	settings_add_bool("irssiproxy", "irssiproxy", TRUE);

	if (*settings_get_str("irssiproxy_password") == '\0') {
		/* no password - bad idea! */
		signal_emit("gui dialog", 2, "warning",
			    "Warning!! Password not specified, everyone can "
			    "use this proxy! Use /set irssiproxy_password "
			    "<password> to set it");
	}
	if (*settings_get_str("irssiproxy_ports") == '\0') {
		signal_emit("gui dialog", 2, "warning",
			    "No proxy ports specified. Use /SET "
			    "irssiproxy_ports <ircnet>=<port> <ircnet2>=<port2> "
			    "... to set them.");
	}

	command_bind("irssiproxy", NULL, (SIGNAL_FUNC) cmd_irssiproxy);
	command_bind("irssiproxy status", NULL, (SIGNAL_FUNC) cmd_irssiproxy_status);

	signal_add_first("setup changed", (SIGNAL_FUNC) irc_proxy_setup_changed);

	if (settings_get_bool("irssiproxy")) {
		proxy_listen_init();
	}
	settings_check();
        module_register("proxy", "irc");
}

void irc_proxy_deinit(void)
{
	proxy_listen_deinit();
}

void irc_proxy_abicheck(int *version)
{
	*version = IRSSI_ABI_VERSION;
}