void on_entry_config_ipv6_trt_prefix_activate(GtkEditable *unused_editable, gpointer unused_udata) { const gchar *endptr; host_addr_t addr; gchar *text; (void) unused_editable; (void) unused_udata; text = STRTRACK(gtk_editable_get_chars( GTK_EDITABLE(gui_dlg_prefs_lookup("entry_config_ipv6_trt_prefix")), 0, -1)); g_strstrip(text); if ( string_to_host_addr(text, &endptr, &addr) && '\0' == endptr[0] && host_addr_is_ipv6(addr) ) { gnet_prop_set_ip_val(PROP_IPV6_TRT_PREFIX, addr); } else if (0 == strcmp(text, "") || 0 == strcmp(text, "<none>")) { gnet_prop_set_ip_val(PROP_IPV6_TRT_PREFIX, zero_host_addr); } G_FREE_NULL(text); }
/** * Retrieve value associated with an IP address, i.e. that of the range * containing it. * * @param db the IP range database * @param ha the IP address to lookup * * @return The data associated with the IP address or 0 if not found. */ uint16 iprange_get_addr(const struct iprange_db *idb, const host_addr_t ha) { host_addr_t to; if ( host_addr_convert(ha, &to, NET_TYPE_IPV4) || host_addr_tunnel_client(ha, &to) ) { return iprange_get(idb, host_addr_ipv4(to)); } else if (host_addr_is_ipv6(ha)) { return iprange_get6(idb, host_addr_ipv6(&ha)); } return 0; }
/** * @returns true if the address is inside one of the local networks */ gboolean host_is_nearby(const host_addr_t addr) { guint i; if (host_addr_is_ipv4(addr)) { for (i = 0; i < number_local_networks; i++) { guint32 m_mask = local_networks[i].mask; guint32 m_ip = local_networks[i].net; if ((host_addr_ipv4(addr) & m_mask) == (m_ip & m_mask)) return TRUE; } } else if (host_addr_is_ipv6(addr)) { /* XXX: Implement this! */ } return FALSE; }
void on_entry_config_ipv6_trt_prefix_changed(GtkEditable *editable, gpointer unused_udata) { gchar *text = STRTRACK(gtk_editable_get_chars(editable, 0, -1)); const gchar *endptr; host_addr_t addr; gboolean sensitive; (void) unused_udata; g_strstrip(text); sensitive = string_to_host_addr(text, &endptr, &addr) && '\0' == endptr[0] && host_addr_is_ipv6(addr); gtk_widget_set_sensitive( gui_dlg_prefs_lookup("checkbutton_config_ipv6_trt_enable"), sensitive); G_FREE_NULL(text); }
static inline bool host_addr_is_teredo(const host_addr_t ha) { return host_addr_is_ipv6(ha) && 0x20010000UL == peek_be32(&ha.addr.ipv6[0]); }
static inline bool host_addr_is_6to4(const host_addr_t ha) { return host_addr_is_ipv6(ha) && 0x2002 == peek_be16(&ha.addr.ipv6[0]); }
/** * Loads the whitelist into memory. */ static void G_COLD whitelist_retrieve(void) { char line[1024]; FILE *f; filestat_t st; unsigned linenum = 0; file_path_t fp[1]; whitelist_generation++; file_path_set(fp, settings_config_dir(), whitelist_file); f = file_config_open_read_norename("Host Whitelist", fp, N_ITEMS(fp)); if (!f) return; if (fstat(fileno(f), &st)) { g_warning("%s(): fstat() failed: %m", G_STRFUNC); fclose(f); return; } while (fgets(line, sizeof line, f)) { pslist_t *sl_addr, *sl; const char *endptr, *start; host_addr_t addr; uint16 port; uint8 bits; bool item_ok; bool use_tls; char *hname; linenum++; if (!file_line_chomp_tail(line, sizeof line, NULL)) { g_warning("%s(): line %u too long, aborting", G_STRFUNC, linenum); break; } if (file_line_is_skipable(line)) continue; sl_addr = NULL; addr = zero_host_addr; endptr = NULL; hname = NULL; endptr = is_strprefix(line, "tls:"); if (endptr) { use_tls = TRUE; start = endptr; } else { use_tls = FALSE; start = line; } port = 0; if (string_to_host_addr_port(start, &endptr, &addr, &port)) { sl_addr = name_to_host_addr(host_addr_to_string(addr), settings_dns_net()); } else if (string_to_host_or_addr(start, &endptr, &addr)) { uchar c = *endptr; switch (c) { case '\0': case ':': case '/': break; default: if (!is_ascii_space(c)) endptr = NULL; } if (!endptr) { g_warning("%s(): line %d: " "expected a hostname or IP address \"%s\"", G_STRFUNC, linenum, line); continue; } /* Terminate the string for name_to_host_addr() */ hname = h_strndup(start, endptr - start); } else { g_warning("%s(): line %d: expected hostname or IP address \"%s\"", G_STRFUNC, linenum, line); continue; } g_assert(sl_addr != NULL || hname != NULL); g_assert(NULL != endptr); bits = 0; item_ok = TRUE; /* * When an explicit address is given (no hostname) and with no * port, one can suffix the address with bits to indicate a CIDR * range of whitelisted addresses. */ if (0 == port) { /* Ignore trailing items separated by a space */ while ('\0' != *endptr && !is_ascii_space(*endptr)) { uchar c = *endptr++; if (':' == c) { int error; uint32 v; if (0 != port) { g_warning("%s(): line %d: multiple colons after host", G_STRFUNC, linenum); item_ok = FALSE; break; } v = parse_uint32(endptr, &endptr, 10, &error); port = (error || v > 0xffff) ? 0 : v; if (0 == port) { g_warning("%s(): line %d: " "invalid port value after host", G_STRFUNC, linenum); item_ok = FALSE; break; } } else if ('/' == c) { const char *ep; uint32 mask; if (0 != bits) { g_warning("%s(): line %d: " "multiple slashes after host", G_STRFUNC, linenum); item_ok = FALSE; break; } if (string_to_ip_strict(endptr, &mask, &ep)) { if (!host_addr_is_ipv4(addr)) { g_warning("%s(): line %d: " "IPv4 netmask after non-IPv4 address", G_STRFUNC, linenum); item_ok = FALSE; break; } endptr = ep; if (0 == (bits = netmask_to_cidr(mask))) { g_warning("%s(): line %d: " "IPv4 netmask after non-IPv4 address", G_STRFUNC, linenum); item_ok = FALSE; break; } } else { int error; uint32 v; v = parse_uint32(endptr, &endptr, 10, &error); if ( error || 0 == v || (v > 32 && host_addr_is_ipv4(addr)) || (v > 128 && host_addr_is_ipv6(addr)) ) { g_warning("%s(): line %d: " "invalid numeric netmask after host", G_STRFUNC, linenum); item_ok = FALSE; break; } bits = v; } } else { g_warning("%s(): line %d: " "unexpected character after host", G_STRFUNC, linenum); item_ok = FALSE; break; } } } if (item_ok) { struct whitelist *item; if (hname) { item = whitelist_hostname_create(use_tls, hname, port); whitelist_dns_resolve(item, FALSE); } else { PSLIST_FOREACH(sl_addr, sl) { host_addr_t *aptr = sl->data; g_assert(aptr != NULL); item = whitelist_addr_create(use_tls, *aptr, port, bits); whitelist_add(item); } } } else {