diff options
author | Wilmer van der Gaast <wilmer@gaast.net> | 2017-04-05 23:38:08 +0100 |
---|---|---|
committer | Wilmer van der Gaast <github@wilmer.gaast.net> | 2017-04-06 21:25:08 +0100 |
commit | b0979452e9d42896b8f6fdc0da76dc0c79651b62 (patch) | |
tree | d424f5fa18e7b3aee6f90058fc27b9f9ec0b9f94 | |
parent | 0156c4220b58515294d7689ea69da8c215a33bdb (diff) |
Move canohost functions (diff licence) to separate file.
-rw-r--r-- | debian/copyright | 4 | ||||
-rw-r--r-- | irc.c | 1 | ||||
-rw-r--r-- | irc_commands.c | 1 | ||||
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/canohost.c | 140 | ||||
-rw-r--r-- | lib/canohost.h | 43 | ||||
-rw-r--r-- | lib/misc.c | 103 | ||||
-rw-r--r-- | lib/misc.h | 3 |
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: @@ -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); @@ -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); @@ -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); |