annotate src/plugins/plugin_misc_ip.py @ 1596:b7ee113183fc

jp: better profile commands: - new "profile/default" command - info doesn't show password anymore by default, need to be explicitly requested - info and modify don't need to connect anymore - modify can now set default profile. As use_profile is set, at least a profile session need to be started when it would not be mandatory technicaly (if just setting the profile as default is needed). But this option should not be used often, and it's not a big side effect, so I don't feel the need to create a new dedicated command, or to do complicated checks to avoid the session start.
author Goffi <goffi@goffi.org>
date Sat, 14 Nov 2015 19:18:10 +0100
parents d5f59ba166fe
children a9e86f660653
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/python
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for IP address discovery
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Jérôme Poisson (goffi@goffi.org)
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from sat.core.i18n import _, D_
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from sat.core.constants import Const as C
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from sat.core.log import getLogger
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 log = getLogger(__name__)
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from sat.tools import xml_tools
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
25 from twisted.web import client as webclient
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
26 from twisted.internet import defer
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
27 from twisted.internet import reactor
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
28 from twisted.internet import protocol
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
29 from twisted.internet import endpoints
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
30 from twisted.internet import error as internet_error
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
31 from zope.interface import implements
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
32 from wokkel import disco, iwokkel
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
33 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 import urlparse
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
35 try:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
36 import netifaces
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
37 except ImportError:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
38 log.warning(u"netifaces is not available, it help discovering IPs, you can install it on https://pypi.python.org/pypi/netifaces")
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
39 netifaces = None
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
40
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
41
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 PLUGIN_INFO = {
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 "name": "IP discovery",
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 "import_name": "IP",
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 "type": C.PLUG_TYPE_MISC,
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
46 "protocols": ["XEP-0279"],
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
47 "recommendations": ["NAT-PORT"],
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 "main": "IPPlugin",
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
49 "handler": "yes",
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 "description": _("""This plugin help to discover our external IP address.""")
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 }
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
52
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 GET_IP_PAGE = "http://www.goffi.org/sat_tools/get_ip.php" # This page must only return external IP of the requester
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 GET_IP_LABEL = D_(u"Allow external get IP")
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 GET_IP_CATEGORY = "General"
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 GET_IP_NAME = "allow_get_ip"
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 GET_IP_CONFIRM_TITLE = D_(u"Confirm external site request")
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 GET_IP_CONFIRM = D_(u"""To facilitate data transfer, we need to contact a website.
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 A request will be done on {page}
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 That means that administrators of {domain} can know that you use "{app_name}" and your IP Address.
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
61
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 IP address is an identifier to locate you on Internet (similar to a phone number).
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
63
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 Do you agree to do this request ?
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 """).format(
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 page = GET_IP_PAGE,
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 domain = urlparse.urlparse(GET_IP_PAGE).netloc,
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 app_name = C.APP_NAME)
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
69 NS_IP_CHECK = "urn:xmpp:sic:1"
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
70
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 PARAMS = """
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 <params>
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 <general>
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 <category name="{category}">
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 <param name="{name}" label="{label}" type="bool" />
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 </category>
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 </general>
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 </params>
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 """.format(category=GET_IP_CATEGORY, name=GET_IP_NAME, label=GET_IP_LABEL)
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
80
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
81
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 class IPPlugin(object):
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
83 # TODO: refresh IP if a new connection is detected
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
84 # TODO: manage IPv6 when implemented in SàT
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
85
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 def __init__(self, host):
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 log.info(_("plugin IP discovery initialization"))
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 self.host = host
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 host.memory.updateParams(PARAMS)
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
90
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
91 # NAT-Port
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
92 try:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
93 self._nat = host.plugins['NAT-PORT']
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
94 except KeyError:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
95 log.debug(u"NAT port plugin not available")
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
96 self._nat = None
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
97
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
98 # XXX: cache is kept until SàT is restarted
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
99 # if IP may have changed, use self.refreshIP
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
100 self._external_ip_cache = None
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
101 self._local_ip_cache = None
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
102
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
103 def getHandler(self, profile):
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
104 return IPPlugin_handler()
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
105
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
106 def refreshIP(self):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
107 # FIXME: use a trigger instead ?
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
108 self._external_ip_cache = None
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
109 self._local_ip_cache = None
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
110
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
111 def _externalAllowed(self, profile):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
112 """Return value of parameter with autorisation of user to do external requests
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
113
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
114 if parameter is not set, a dialog is shown to use to get its confirmation, and parameted is set according to answer
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
115 @param profile: %(doc_profile)s
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
116 @return (defer.Deferred[bool]): True if external request is autorised
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
117 """
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
118 allow_get_ip = self.host.memory.params.getParamA(GET_IP_NAME, GET_IP_CATEGORY, use_default=False)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
119
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
120 if allow_get_ip is None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
121 # we don't have autorisation from user yet to use get_ip, we ask him
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
122 def setParam(allowed):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
123 # FIXME: we need to use boolConst as setParam only manage str/unicode
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
124 # need to be fixed when params will be refactored
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
125 self.host.memory.setParam(GET_IP_NAME, C.boolConst(allowed), GET_IP_CATEGORY)
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
126 return allowed
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
127 d = xml_tools.deferConfirm(self.host, _(GET_IP_CONFIRM), _(GET_IP_CONFIRM_TITLE), profile=profile)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
128 d.addCallback(setParam)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
129 return d
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
130
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
131 return defer.succeed(allow_get_ip)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
132
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
133 def _filterAddresse(self, ip_addr):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
134 """Filter acceptable addresses
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
135
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
136 For now, just remove IPv4 local addresses
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
137 @param ip_addr(str): IP addresse
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
138 @return (bool): True if addresse is acceptable
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
139 """
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
140 return not ip_addr.startswith('127.')
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
141
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
142 def _insertFirst(self, addresses, ip_addr):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
143 """Insert ip_addr as first item in addresses
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
144
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
145 @param ip_addr(str): IP addresse
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
146 @param addresses(list): list of IP addresses
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
147 """
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
148 if ip_addr in addresses:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
149 if addresses[0] != ip_addr:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
150 addresses.remove(ip_addr)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
151 addresses.insert(0, ip_addr)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
152 else:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
153 addresses.insert(0, ip_addr)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
154
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
155 def _getIPFromExternal(self, ext_url):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
156 """Get local IP by doing a connection on an external url
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
157
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
158 @param ext_utl(str): url to connect to
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
159 @return (D(str)): return local IP
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
160 """
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
161 url = urlparse.urlparse(ext_url)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
162 port = url.port
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
163 if port is None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
164 if url.scheme=='http':
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
165 port = 80
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
166 elif url.scheme=='https':
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
167 port = 443
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
168 else:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
169 log.error(u"Unknown url scheme: {}".format(url.scheme))
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
170 defer.returnValue(None)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
171 if url.hostname is None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
172 log.error(u"Can't find url hostname for {}".format(GET_IP_PAGE))
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
173
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
174 point = endpoints.TCP4ClientEndpoint(reactor, url.hostname, port)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
175 def gotConnection(p):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
176 local_ip = p.transport.getHost().host
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
177 p.transport.loseConnection()
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
178 return local_ip
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
179
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
180 d = endpoints.connectProtocol(point, protocol.Protocol())
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
181 d.addCallback(gotConnection)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
182 return d
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
183
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
184 @defer.inlineCallbacks
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
185 def getLocalIPs(self, profile):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
186 """Try do discover local area network IPs
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
187
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
188 @param profile): %(doc_profile)s
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
189 @return (deferred): list of lan IP addresses
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
190 if there are several addresses, the one used with the server is put first
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
191 if no address is found, localhost IP will be in the list
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
192 """
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
193 # TODO: manage permission requesting (e.g. for UMTS link)
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
194 if self._local_ip_cache is not None:
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
195 defer.returnValue(self._local_ip_cache)
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 client = self.host.getClient(profile)
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
197 addresses = []
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
198 localhost = ['127.0.0.1']
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
199
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
200 # we first try our luck with netifaces
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
201 if netifaces is not None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
202 addresses = []
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
203 for interface in netifaces.interfaces():
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
204 if_addresses = netifaces.ifaddresses(interface)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
205 try:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
206 inet_list = if_addresses[netifaces.AF_INET]
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
207 except KeyError:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
208 continue
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
209 for data in inet_list:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
210 addresse = data['addr']
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
211 if self._filterAddresse(addresse):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
212 addresses.append(addresse)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
213
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
214 # then we use our connection to server
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
215 ip = client.xmlstream.transport.getHost().host
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
216 if self._filterAddresse(ip):
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
217 self._insertFirst(addresses, ip)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
218 defer.returnValue(addresses)
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
219
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
220 # if server is local, we try with NAT-Port
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
221 if self._nat is not None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
222 nat_ip = yield self._nat.getIP(local=True)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
223 if nat_ip is not None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
224 self._insertFirst(addresses, nat_ip)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
225 defer.returnValue(addresses)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
226
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
227 if addresses:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
228 defer.returnValue(addresses)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
229
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
230 # still not luck, we need to contact external website
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
231 allow_get_ip = yield self._externalAllowed(profile)
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
232
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
233 if not allow_get_ip:
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
234 defer.returnValue(addresses or localhost)
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
235
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
236 try:
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
237 ip_tuple = yield self._getIPFromExternal(GET_IP_PAGE)
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
238 except (internet_error.DNSLookupError, internet_error.TimeoutError):
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
239 log.warning(u"Can't access Domain Name System")
1576
d5f59ba166fe plugins IP: getLocalIPs now return localhost IP instead of an empty list if no non-localhost ip can be found
Goffi <goffi@goffi.org>
parents: 1566
diff changeset
240 defer.returnValue(addresses or localhost)
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
241 self._insertFirst(addresses, ip_tuple.local)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
242 defer.returnValue(addresses)
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
243
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
244 @defer.inlineCallbacks
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
245 def getExternalIP(self, profile):
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 """Try to discover external IP
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
247
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 @param profile: %(doc_profile)s
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 @return (deferred): external IP address or None if it can't be discovered
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 """
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
251 if self._external_ip_cache is not None:
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
252 defer.returnValue(self._external_ip_cache)
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
253
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
254 # we first try with XEP-0279
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
255 if self.host.hasFeature(NS_IP_CHECK, profile=profile):
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
256 log.debug(u"Server IP Check available, we use it to retrieve our IP")
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
257 client = self.host.getClient(profile)
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
258 iq_elt = client.IQ("get")
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
259 iq_elt.addElement((NS_IP_CHECK, 'address'))
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
260 result_elt = yield iq_elt.send()
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
261 try:
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
262 address_elt = result_elt.elements(NS_IP_CHECK, 'address').next()
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
263 ip_elt = address_elt.elements(NS_IP_CHECK,'ip').next()
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
264 except StopIteration:
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
265 log.warning(u"Server returned invalid result on XEP-0279 request, we ignore it")
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
266 else:
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
267 # FIXME: server IP may not be the same as external IP (server can be on local machine or network)
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
268 # IP should be checked to see if we have a local one, and rejected in this case
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
269 external_ip = str(ip_elt)
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
270 log.debug(u"External IP found: {}".format(external_ip))
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
271 self._external_ip_cache = external_ip
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
272 defer.returnValue(self._external_ip_cache)
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
273
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
274 # then with NAT-Port
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
275 if self._nat is not None:
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
276 nat_ip = yield self._nat.getIP()
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
277 if nat_ip is not None:
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
278 self._external_ip_cache = nat_ip
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
279 defer.returnValue(nat_ip)
1534
a5e0393a06cd plugin ip, params: plugin IP discovery, first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
280
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
281 # and finally by requesting external website
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
282 allow_get_ip = yield self._externalAllowed(profile)
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
283 try:
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
284 ip = (yield webclient.getPage(GET_IP_PAGE)) if allow_get_ip else None
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
285 except (internet_error.DNSLookupError, internet_error.TimeoutError):
1555
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
286 log.warning(u"Can't access Domain Name System")
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
287 ip = None
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
288 else:
eb8aae35085b plugin ip: local ip cache + DNS error detection
Goffi <goffi@goffi.org>
parents: 1537
diff changeset
289 self._external_ip_cache = ip
1537
6fa9e8c02c34 plugin IP discovery: better IP discovering:
Goffi <goffi@goffi.org>
parents: 1534
diff changeset
290 defer.returnValue(ip)
1566
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
291
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
292
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
293 class IPPlugin_handler(XMPPHandler):
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
294 implements(iwokkel.IDisco)
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
295
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
296 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
297 return [disco.DiscoFeature(NS_IP_CHECK)]
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
298
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
299 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
ec3848916ee8 plugin ip: implemented XEP-0279 for external ip retrieval + fixed bad exception handling
Goffi <goffi@goffi.org>
parents: 1555
diff changeset
300 return []