commit 3ca49d4a2c6701075452c39c3af0f0284839552e
Author: Debian Live user <amnesia(a)localhost.localdomain>
Date: Sat Oct 25 10:21:35 2014 +0000
Check for ability to capture, not a specific uid
---
ooni/geoip.py | 6 ++++--
ooni/nettest.py | 7 ++++---
ooni/oonicli.py | 9 +++++----
ooni/tests/test_oonicli.py | 9 ++++-----
4 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/ooni/geoip.py b/ooni/geoip.py
index 86383d0..9cb5da3 100644
--- a/ooni/geoip.py
+++ b/ooni/geoip.py
@@ -9,7 +9,7 @@ client._HTTP11ClientFactory.noisy = False
from twisted.internet import reactor, defer
-from ooni.utils import log, checkForRoot
+from ooni.utils import log
from ooni import errors
try:
@@ -243,7 +243,9 @@ class ProbeIP(object):
"""
Perform a UDP traceroute to determine the probes IP address.
"""
- checkForRoot()
+ from ooni.utils.txscapy import hasRawSocketPermission
+ if not hasRawSocketPermission():
+ raise errors.InsufficientPrivileges
raise NotImplemented
def askTor(self):
diff --git a/ooni/nettest.py b/ooni/nettest.py
index 1a780fd..12fb2fb 100644
--- a/ooni/nettest.py
+++ b/ooni/nettest.py
@@ -10,7 +10,8 @@ from twisted.python import usage, reflect
from ooni import otime
from ooni.tasks import Measurement
-from ooni.utils import log, checkForRoot, sanitize_options
+from ooni.utils import log, sanitize_options
+from ooni.utils.txscapy import hasRawSocketPermission
from ooni.settings import config
from ooni import errors as e
@@ -339,8 +340,8 @@ class NetTestLoader(object):
klass.localOptions = options
test_instance = klass()
- if test_instance.requiresRoot:
- checkForRoot()
+ if test_instance.requiresRoot and not hasRawSocketPermission():
+ raise errors.InsufficientPrivileges
if test_instance.requiresTor:
self.requiresTor = True
test_instance.requirements()
diff --git a/ooni/oonicli.py b/ooni/oonicli.py
index 6505584..8997fca 100644
--- a/ooni/oonicli.py
+++ b/ooni/oonicli.py
@@ -13,7 +13,8 @@ from ooni.director import Director
from ooni.deck import Deck, nettest_to_path
from ooni.nettest import NetTestLoader
-from ooni.utils import log, checkForRoot
+from ooni.utils import log
+from ooni.utils.txscapy import hasRawSocketPermission
class Options(usage.Options):
@@ -125,11 +126,11 @@ def runWithDirector(logging=True, start_tor=True, check_incoherences=True):
log.start(global_options['logfile'])
if config.privacy.includepcap:
- try:
- checkForRoot()
+ if hasRawSocketPermission():
+ from ooni.utils.txscapy import hasRawSocketPermission
from ooni.utils.txscapy import ScapyFactory
config.scapyFactory = ScapyFactory(config.advanced.interface)
- except errors.InsufficientPrivileges:
+ else:
log.err("Insufficient Privileges to capture packets."
" See ooniprobe.conf privacy.includepcap")
sys.exit(2)
diff --git a/ooni/tests/test_oonicli.py b/ooni/tests/test_oonicli.py
index 3d5fdeb..89c4234 100644
--- a/ooni/tests/test_oonicli.py
+++ b/ooni/tests/test_oonicli.py
@@ -8,8 +8,8 @@ from ooni.tests import is_internet_connected
from ooni.tests.bases import ConfigTestCase
from ooni.settings import config
from ooni.oonicli import runWithDirector
-from ooni.utils import checkForRoot
from ooni.errors import InsufficientPrivileges
+from ooni.utils.txscapy import hasRawSocketPermission
def verify_header(header):
@@ -63,10 +63,9 @@ class TestRunDirector(ConfigTestCase):
super(TestRunDirector, self).setUp()
if not is_internet_connected():
self.skipTest("You must be connected to the internet to run this test")
- try:
- checkForRoot()
- except InsufficientPrivileges:
- self.skipTest("You must be root to run this test")
+ elif not hasRawSocketPermission():
+ self.skipTest("You must run this test as root or have the capabilities "
+ "cap_net_admin,cap_net_raw+eip")
config.tor.socks_port = 9050
config.tor.control_port = None
self.filenames = ['example-input.txt']