aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2017-04-05 23:38:08 +0100
committerWilmer van der Gaast <github@wilmer.gaast.net>2017-04-06 21:25:08 +0100
commitb0979452e9d42896b8f6fdc0da76dc0c79651b62 (patch)
treed424f5fa18e7b3aee6f90058fc27b9f9ec0b9f94
parent0156c4220b58515294d7689ea69da8c215a33bdb (diff)
Move canohost functions (diff licence) to separate file.
-rw-r--r--debian/copyright4
-rw-r--r--irc.c1
-rw-r--r--irc_commands.c1
-rw-r--r--lib/Makefile2
-rw-r--r--lib/canohost.c140
-rw-r--r--lib/canohost.h43
-rw-r--r--lib/misc.c103
-rw-r--r--lib/misc.h3
8 files changed, 189 insertions, 108 deletions
diff --git a/debian/copyright b/debian/copyright
index f1c7f7f4..09f27568 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -16,8 +16,8 @@ Bits of third party code, also (L)GPLed:
Other license (but GPL-compatible):
* lib/json.[ch] is from <https://github.com/udp/json-parser> and licensed
under the modified BSD license.
-* reverse_lookup() from lib/misc.c is from OpenSSH and licenced under
- the BSD-3-clause licence.
+* lib/canohost.[ch] is from OpenSSH and licenced under the BSD-3-clause
+ licence.
BitlBee License:
diff --git a/irc.c b/irc.c
index 655aa967..0010b3e2 100644
--- a/irc.c
+++ b/irc.c
@@ -24,6 +24,7 @@
*/
#include "bitlbee.h"
+#include "canohost.h"
#include "ipc.h"
#include "dcc.h"
#include "lib/ssl_client.h"
diff --git a/irc_commands.c b/irc_commands.c
index 4a8bae4d..19855075 100644
--- a/irc_commands.c
+++ b/irc_commands.c
@@ -25,6 +25,7 @@
#define BITLBEE_CORE
#include "bitlbee.h"
+#include "canohost.h"
#include "help.h"
#include "ipc.h"
#include "base64.h"
diff --git a/lib/Makefile b/lib/Makefile
index 40c03215..05aaca7f 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -12,7 +12,7 @@ _SRCDIR_ := $(_SRCDIR_)lib/
endif
# [SH] Program variables
-objects = arc.o base64.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o json.o json_util.o md5.o misc.o oauth.o oauth2.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o ns_parse.o
+objects = arc.o base64.o canohost.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o json.o json_util.o md5.o misc.o oauth.o oauth2.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o ns_parse.o
LFLAGS += -r
diff --git a/lib/canohost.c b/lib/canohost.c
new file mode 100644
index 00000000..61d695b9
--- /dev/null
+++ b/lib/canohost.c
@@ -0,0 +1,140 @@
+ /********************************************************************\
+ * BitlBee -- An IRC to other IM-networks gateway *
+ * *
+ * Copyright 2002-2017 Wilmer van der Gaast and others *
+ \********************************************************************/
+
+/*
+ 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 with
+ the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
+ if not, write to the Free Software Foundation, Inc., 51 Franklin St.,
+ Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+/* These two functions, with some modifications, taken from OpenSSH:
+ *
+ * $OpenBSD: canohost.c,v 1.73 2016/03/07 19:02:43 djm Exp
+ *
+ * Author: Tatu Ylonen <ylo@cs.hut.fi>
+ * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+ * All rights reserved
+ * Functions for returning the canonical host name of the remote site.
+ *
+ * As far as I am concerned, the code I have written for this software
+ * can be used freely for any purpose. Any derived versions of this
+ * software must be clearly marked as such, and if the derived work is
+ * incompatible with the protocol description in the RFC file, it must be
+ * called by a name other than "ssh" or "Secure Shell".
+ */
+
+#include "canohost.h"
+
+char *reverse_lookup(const struct sockaddr *from_, const socklen_t fromlen_)
+{
+ struct sockaddr_storage from;
+ socklen_t fromlen;
+ struct addrinfo hints, *ai, *aitop;
+ char name[NI_MAXHOST], ntop2[NI_MAXHOST];
+ char ntop[INET6_ADDRSTRLEN];
+
+ fromlen = sizeof(from);
+ memset(&from, 0, sizeof(from));
+ memcpy(&from, from_, fromlen_);
+ ipv64_normalise_mapped(&from, &fromlen);
+ if (from.ss_family == AF_INET6) {
+ fromlen = sizeof(struct sockaddr_in6);
+ }
+
+ if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop),
+ NULL, 0, NI_NUMERICHOST) != 0) {
+ return NULL;
+ }
+
+ /* Map the IP address to a host name. */
+ if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
+ NULL, 0, NI_NAMEREQD) != 0) {
+ /* Host name not found. Use ip address. */
+ return g_strdup(ntop);
+ }
+
+ /*
+ * if reverse lookup result looks like a numeric hostname,
+ * someone is trying to trick us by PTR record like following:
+ * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
+ */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_DGRAM; /*dummy*/
+ hints.ai_flags = AI_NUMERICHOST;
+ if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
+ freeaddrinfo(ai);
+ return g_strdup(ntop);
+ }
+
+ /* Names are stored in lowercase. */
+ char *tolower = g_utf8_strdown(name, -1);
+ g_snprintf(name, sizeof(name), "%s", tolower);
+ g_free(tolower);
+
+ /*
+ * Map it back to an IP address and check that the given
+ * address actually is an address of this host. This is
+ * necessary because anyone with access to a name server can
+ * define arbitrary names for an IP address. Mapping from
+ * name to IP address can be trusted better (but can still be
+ * fooled if the intruder has access to the name server of
+ * the domain).
+ */
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_family = from.ss_family;
+ hints.ai_socktype = SOCK_STREAM;
+ if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
+ return g_strdup(ntop);
+ }
+ /* Look for the address from the list of addresses. */
+ for (ai = aitop; ai; ai = ai->ai_next) {
+ if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
+ sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
+ (strcmp(ntop, ntop2) == 0))
+ break;
+ }
+ freeaddrinfo(aitop);
+ /* If we reached the end of the list, the address was not there. */
+ if (ai == NULL) {
+ /* Address not found for the host name. */
+ return g_strdup(ntop);
+ }
+ return g_strdup(name);
+}
+
+void
+ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
+{
+ struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)addr;
+ struct sockaddr_in *a4 = (struct sockaddr_in *)addr;
+ struct in_addr inaddr;
+ u_int16_t port;
+
+ if (addr->ss_family != AF_INET6 ||
+ !IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr))
+ return;
+
+ memcpy(&inaddr, ((char *)&a6->sin6_addr) + 12, sizeof(inaddr));
+ port = a6->sin6_port;
+
+ memset(a4, 0, sizeof(*a4));
+
+ a4->sin_family = AF_INET;
+ *len = sizeof(*a4);
+ memcpy(&a4->sin_addr, &inaddr, sizeof(inaddr));
+ a4->sin_port = port;
+}
diff --git a/lib/canohost.h b/lib/canohost.h
new file mode 100644
index 00000000..25fa30f2
--- /dev/null
+++ b/lib/canohost.h
@@ -0,0 +1,43 @@
+ /********************************************************************\
+ * BitlBee -- An IRC to other IM-networks gateway *
+ * *
+ * Copyright 2002-2017 Wilmer van der Gaast and others *
+ \********************************************************************/
+
+/*
+ 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 with
+ the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
+ if not, write to the Free Software Foundation, Inc., 51 Franklin St.,
+ Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+/* These two functions, with some modifications, taken from OpenSSH:
+ *
+ * $OpenBSD: canohost.c,v 1.73 2016/03/07 19:02:43 djm Exp
+ *
+ * Author: Tatu Ylonen <ylo@cs.hut.fi>
+ * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+ * All rights reserved
+ * Functions for returning the canonical host name of the remote site.
+ *
+ * As far as I am concerned, the code I have written for this software
+ * can be used freely for any purpose. Any derived versions of this
+ * software must be clearly marked as such, and if the derived work is
+ * incompatible with the protocol description in the RFC file, it must be
+ * called by a name other than "ssh" or "Secure Shell".
+ */
+
+#include <bitlbee.h>
+
+G_MODULE_EXPORT char *reverse_lookup(const struct sockaddr *from_, const socklen_t fromlen_);
+G_MODULE_EXPORT void ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len);
diff --git a/lib/misc.c b/lib/misc.c
index 21f3ad2e..2723be1e 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -1,4 +1,4 @@
-/********************************************************************\
+ /********************************************************************\
* BitlBee -- An IRC to other IM-networks gateway *
* *
* Copyright 2002-2012 Wilmer van der Gaast and others *
@@ -503,107 +503,6 @@ void srv_free(struct ns_srv_reply **srv)
g_free(srv);
}
-/* From OpenSSH 7.4p1 canohost.c" */
-char *reverse_lookup(const struct sockaddr *from_, const socklen_t fromlen_)
-{
- struct sockaddr_storage from;
- socklen_t fromlen;
- struct addrinfo hints, *ai, *aitop;
- char name[NI_MAXHOST], ntop2[NI_MAXHOST];
- char ntop[INET6_ADDRSTRLEN];
-
- fromlen = sizeof(from);
- memset(&from, 0, sizeof(from));
- memcpy(&from, from_, fromlen_);
- ipv64_normalise_mapped(&from, &fromlen);
- if (from.ss_family == AF_INET6) {
- fromlen = sizeof(struct sockaddr_in6);
- }
-
- if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop),
- NULL, 0, NI_NUMERICHOST) != 0) {
- return NULL;
- }
-
- /* Map the IP address to a host name. */
- if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
- NULL, 0, NI_NAMEREQD) != 0) {
- /* Host name not found. Use ip address. */
- return g_strdup(ntop);
- }
-
- /*
- * if reverse lookup result looks like a numeric hostname,
- * someone is trying to trick us by PTR record like following:
- * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
- */
- memset(&hints, 0, sizeof(hints));
- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
- hints.ai_flags = AI_NUMERICHOST;
- if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
- freeaddrinfo(ai);
- return g_strdup(ntop);
- }
-
- /* Names are stored in lowercase. */
- char *tolower = g_utf8_strdown(name, -1);
- g_snprintf(name, sizeof(name), "%s", tolower);
- g_free(tolower);
-
- /*
- * Map it back to an IP address and check that the given
- * address actually is an address of this host. This is
- * necessary because anyone with access to a name server can
- * define arbitrary names for an IP address. Mapping from
- * name to IP address can be trusted better (but can still be
- * fooled if the intruder has access to the name server of
- * the domain).
- */
- memset(&hints, 0, sizeof(hints));
- hints.ai_family = from.ss_family;
- hints.ai_socktype = SOCK_STREAM;
- if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
- return g_strdup(ntop);
- }
- /* Look for the address from the list of addresses. */
- for (ai = aitop; ai; ai = ai->ai_next) {
- if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
- sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
- (strcmp(ntop, ntop2) == 0))
- break;
- }
- freeaddrinfo(aitop);
- /* If we reached the end of the list, the address was not there. */
- if (ai == NULL) {
- /* Address not found for the host name. */
- return g_strdup(ntop);
- }
- return g_strdup(name);
-}
-
-void
-ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
-{
- struct sockaddr_in6 *a6 = (struct sockaddr_in6 *)addr;
- struct sockaddr_in *a4 = (struct sockaddr_in *)addr;
- struct in_addr inaddr;
- u_int16_t port;
-
- if (addr->ss_family != AF_INET6 ||
- !IN6_IS_ADDR_V4MAPPED(&a6->sin6_addr))
- return;
-
- memcpy(&inaddr, ((char *)&a6->sin6_addr) + 12, sizeof(inaddr));
- port = a6->sin6_port;
-
- memset(a4, 0, sizeof(*a4));
-
- a4->sin_family = AF_INET;
- *len = sizeof(*a4);
- memcpy(&a4->sin_addr, &inaddr, sizeof(inaddr));
- a4->sin_port = port;
-}
-
char *word_wrap(const char *msg, int line_len)
{
GString *ret = g_string_sized_new(strlen(msg) + 16);
diff --git a/lib/misc.h b/lib/misc.h
index ece4bbff..68ed21ce 100644
--- a/lib/misc.h
+++ b/lib/misc.h
@@ -140,9 +140,6 @@ G_MODULE_EXPORT int bool2int(char *value);
G_MODULE_EXPORT struct ns_srv_reply **srv_lookup(char *service, char *protocol, char *domain);
G_MODULE_EXPORT void srv_free(struct ns_srv_reply **srv);
-G_MODULE_EXPORT char *reverse_lookup(const struct sockaddr *from_, const socklen_t fromlen_);
-G_MODULE_EXPORT void ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len);
-
G_MODULE_EXPORT char *word_wrap(const char *msg, int line_len);
G_MODULE_EXPORT gboolean ssl_sockerr_again(void *ssl);
G_MODULE_EXPORT int md5_verify_password(char *password, char *hash);