tor-commits
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
November 2012
- 18 participants
- 1509 discussions
commit 19d533e4d1a473365d9794834cf4dea0a5a931a1
Author: Arturo Filastò <art(a)fuffa.org>
Date: Wed Nov 28 14:52:31 2012 +0100
Improve oonib
* More robust error handling
* Add docstrings on not implemented collector parts
* Refactor ooni reporting system
---
ooni/__init__.py | 6 +-
oonib/__init__.py | 2 +
oonib/report/__init__.py | 8 ++
oonib/report/api.py | 156 ++++------------------------------------
oonib/report/file_collector.py | 145 +++++++++++++++++++++++++++++++++++++
5 files changed, 172 insertions(+), 145 deletions(-)
diff --git a/ooni/__init__.py b/ooni/__init__.py
index bf98e16..36afc9a 100644
--- a/ooni/__init__.py
+++ b/ooni/__init__.py
@@ -11,9 +11,9 @@ from . import runner
from . import templates
from . import utils
+__author__ = "Arturo Filastò"
+__version__ = "0.0.7.1-alpha"
+
__all__ = ['config', 'inputunit', 'kit',
'lib', 'nettest', 'oonicli', 'reporter',
'runner', 'templates', 'utils']
-
-__author__ = "Arturo Filastò"
-__version__ = "0.0.7.1-alpha"
diff --git a/oonib/__init__.py b/oonib/__init__.py
index 1a853dd..ab7419c 100644
--- a/oonib/__init__.py
+++ b/oonib/__init__.py
@@ -14,6 +14,8 @@ from storm.uri import URI
from storm.twisted.transact import Transactor
from storm.databases.sqlite import SQLite
+__version__ = '0.0.1'
+
from oonib import config
database = SQLite(URI(config.main.database_uri))
diff --git a/oonib/report/__init__.py b/oonib/report/__init__.py
index e69de29..96667b4 100644
--- a/oonib/report/__init__.py
+++ b/oonib/report/__init__.py
@@ -0,0 +1,8 @@
+def generateReportID():
+ return otime.timestamp() + '_' + randomStr(20)
+
+class MissingField(Exception):
+ pass
+
+class InvalidRequestField(Exception):
+ pass
diff --git a/oonib/report/api.py b/oonib/report/api.py
index 5668857..9c42a54 100644
--- a/oonib/report/api.py
+++ b/oonib/report/api.py
@@ -1,7 +1,7 @@
"""
-/report/do
+/new
-/report/pcap
+/pcap
This is the async pcap reporting system. It requires the client to have created a report already, but can work independently from test progress.
@@ -18,47 +18,9 @@ from cyclone import web
from ooni.utils import randomStr, otime
from oonib import models, config
-
-backend_version = '0.0.1'
-
-def generateReportID():
- return otime.timestamp() + '_' + randomStr(20)
-
-class MissingField(Exception):
- pass
-
-class InvalidRequestField(Exception):
- pass
-
-def parseNewReportRequest(request):
- """
- Here we parse a new report request.
- """
- version_string = re.compile("[0-9A-Za-z_\-\.]+$")
- name = re.compile("[a-zA-Z0-9_\- ]+$")
- expected_request = {'software_name': name,
- 'software_version': version_string,
- 'test_name': name,
- 'test_version': version_string,
- 'progress': re.compile("[0-9]+$")
- }
- parsed_request = json.loads(request)
- for k, regexp in expected_request.items():
- try:
- value_to_check = parsed_request[k]
- except KeyError:
- raise MissingField(k)
- print "Matching %s with %s | %s" % (regexp, value_to_check, k)
- if re.match(regexp, str(value_to_check)):
- continue
- else:
- raise InvalidRequestField(k)
- return parsed_request
+from oonib.report import file_collector
def parseUpdateReportRequest(request):
- # XXX this and the function above can probably be refactored into something
- # more compact. There is quite a bit of code duplication going on here.
-
#db_report_id_regexp = re.compile("[a-zA-Z0-9]+$")
# this is the regexp for the reports that include the timestamp
@@ -80,92 +42,6 @@ def parseUpdateReportRequest(request):
return parsed_request
-class NewReportHandlerFile(web.RequestHandler):
- """
- Responsible for creating and updating reports by writing to flat file.
- """
- def post(self):
- """
- Creates a new report with the input
-
- * Request
-
- {'software_name': 'XXX',
- 'software_version': 'XXX',
- 'test_name': 'XXX',
- 'test_version': 'XXX',
- 'progress': 'XXX',
- 'content': 'XXX'
- }
-
- Optional:
- 'test_helper': 'XXX'
- 'client_ip': 'XXX'
-
- * Response
-
- {'backend_version': 'XXX', 'report_id': 'XXX'}
-
- """
- # XXX here we should validate and sanitize the request
- try:
- report_data = parseNewReportRequest(self.request.body)
- except InvalidRequestField, e:
- raise web.HTTPError(400, "Invalid Request Field %s" % e)
- except MissingField, e:
- raise web.HTTPError(400, "Missing Request Field %s" % e)
-
- print "Parsed this data %s" % report_data
- software_name = report_data['software_name']
- software_version = report_data['software_version']
- test_name = report_data['test_name']
- test_version = report_data['test_version']
- content = report_data['content']
-
- report_id = generateReportID()
-
- #report_filename = '_'.join((report_id,
- # report_data['software_name'],
- # report_data['software_version'],
- # report_data['test_name'],
- # report_data['test_version']))
-
- # The report filename contains the timestamp of the report plus a
- # random nonce
- report_filename = os.path.join(config.main.report_dir, report_id)
- report_filename += '.yamloo'
-
- response = {'backend_version': backend_version,
- 'report_id': report_id
- }
-
- fp = open(report_filename, 'w+')
- fp.write(report_data['content'])
- fp.close()
- self.write(response)
-
- def put(self):
- """
- Update an already existing report.
-
- {'report_id': 'XXX',
- 'content': 'XXX'
- }
- """
- parsed_request = parseUpdateReportRequest(self.request.body)
- report_id = parsed_request['report_id']
- print "Got this request %s" % parsed_request
-
- report_filename = os.path.join(config.main.report_dir, report_id)
- report_filename += '.yamloo'
- try:
- with open(report_filename, 'a+') as f:
- # XXX this could be quite big. We should probably use the
- # twisted.internet.fdesc module
- print parsed_request['content']
- f.write(parsed_request['content'])
- except IOError as e:
- web.HTTPError(404, "Report not found")
class NewReportHandlerDB(web.RequestHandler):
"""
@@ -177,7 +53,8 @@ class NewReportHandlerDB(web.RequestHandler):
@defer.inlineCallbacks
def post(self):
"""
- Creates a new report with the input
+ Creates a new report with the input to the database.
+ XXX this is not yet implemented.
* Request
@@ -193,23 +70,23 @@ class NewReportHandlerDB(web.RequestHandler):
'test_helper': 'XXX'
'client_ip': 'XXX'
- * Response
+ * Response
{'backend_version': 'XXX', 'report_id': 'XXX'}
"""
- parsed_request = json.loads(self.request.body)
- # XXX here we should validate and sanitize the request
- report_data = parsed_request
+ report_data = json.loads(self.request.body)
new_report = models.Report()
- print "Got %s as request" % parsed_request
+ log.debug("Got this request %s" % report_data)
result = yield new_report.new(report_data)
self.write(result)
self.finish()
def put(self):
"""
- Update an already existing report.
+ Update an already existing report with the database.
+
+ XXX this is not yet implemented.
{'report_id': 'XXX',
'content': 'XXX'
@@ -217,15 +94,10 @@ class NewReportHandlerDB(web.RequestHandler):
"""
pass
-class PCAPReportHandler(web.RequestHandler):
- def get(self):
- pass
-
- def post(self):
- pass
-reportingBackendAPI = [(r"/report/new", NewReportHandlerFile),
- (r"/report/pcap", PCAPReportHandler)
+reportingBackendAPI = [
+ (r"/report", file_collector.NewReportHandlerFile),
+ (r"/pcap", file_collector.PCAPReportHandler)
]
reportingBackend = web.Application(reportingBackendAPI, debug=True)
diff --git a/oonib/report/file_collector.py b/oonib/report/file_collector.py
new file mode 100644
index 0000000..9896784
--- /dev/null
+++ b/oonib/report/file_collector.py
@@ -0,0 +1,145 @@
+import random
+import string
+import json
+import re
+import os
+
+from oonib.report import generateReportID
+from oonib.report import MissingField, InvalidRequestField
+
+from cyclone import web
+
+def parseNewReportRequest(request):
+ """
+ Here we parse a new report request.
+ """
+ version_string = re.compile("[0-9A-Za-z_\-\.]+$")
+ name = re.compile("[a-zA-Z0-9_\- ]+$")
+
+ expected_request = {'software_name': name,
+ 'software_version': version_string,
+ 'test_name': name,
+ 'test_version': version_string
+ }
+
+ parsed_request = json.loads(request)
+ for k, regexp in expected_request.items():
+ try:
+ value_to_check = parsed_request[k]
+ except KeyError:
+ raise MissingField(k)
+ print "Matching %s with %s | %s" % (regexp, value_to_check, k)
+ if re.match(regexp, str(value_to_check)):
+ continue
+ else:
+ raise InvalidRequestField(k)
+ return parsed_request
+
+class NewReportHandlerFile(web.RequestHandler):
+ """
+ Responsible for creating and updating reports by writing to flat file.
+ """
+ def post(self):
+ """
+ Creates a new report with the input
+
+ * Request
+
+ {'software_name': 'XXX',
+ 'software_version': 'XXX',
+ 'test_name': 'XXX',
+ 'test_version': 'XXX',
+ 'progress': 'XXX',
+ 'content': 'XXX'
+ }
+
+ Optional:
+ 'test_helper': 'XXX'
+ 'client_ip': 'XXX'
+
+ (not implemented, nor in client, nor in backend)
+ The idea behind these two fields is that it would be interesting to
+ also collect how the request was observed from the collectors point
+ of view.
+
+ We use as a unique key the client_ip address and a time window. We
+ then need to tell the test_helper that is selected the client_ip
+ address and tell it to expect a connection from a probe in that time
+ window.
+
+ Once the test_helper sees a connection from that client_ip it will
+ store for the testing session the data that it receives.
+ When the probe completes the report (or the time window is over) the
+ final report will include also the data collected from the
+ collectors view point.
+
+ * Response
+
+ {'backend_version': 'XXX', 'report_id': 'XXX'}
+
+ """
+ # XXX here we should validate and sanitize the request
+ try:
+ report_data = parseNewReportRequest(self.request.body)
+ except InvalidRequestField, e:
+ raise web.HTTPError(400, "Invalid Request Field %s" % e)
+ except MissingField, e:
+ raise web.HTTPError(400, "Missing Request Field %s" % e)
+
+ print "Parsed this data %s" % report_data
+ software_name = report_data['software_name']
+ software_version = report_data['software_version']
+ test_name = report_data['test_name']
+ test_version = report_data['test_version']
+ content = report_data['content']
+
+ report_id = generateReportID()
+
+ #report_filename = '_'.join((report_id,
+ # report_data['software_name'],
+ # report_data['software_version'],
+ # report_data['test_name'],
+ # report_data['test_version']))
+
+ # The report filename contains the timestamp of the report plus a
+ # random nonce
+ report_filename = os.path.join(config.main.report_dir, report_id)
+ report_filename += '.yamloo'
+
+ response = {'backend_version': backend_version,
+ 'report_id': report_id
+ }
+
+ fp = open(report_filename, 'w+')
+ fp.write(report_data['content'])
+ fp.close()
+ self.write(response)
+
+ def put(self):
+ """
+ Update an already existing report.
+
+ {'report_id': 'XXX',
+ 'content': 'XXX'
+ }
+ """
+ parsed_request = parseUpdateReportRequest(self.request.body)
+ report_id = parsed_request['report_id']
+ print "Got this request %s" % parsed_request
+
+ report_filename = os.path.join(config.main.report_dir, report_id)
+ report_filename += '.yamloo'
+ try:
+ with open(report_filename, 'a+') as f:
+ # XXX-Twisted change this to use t.i.a.fdesc and perhaps make a
+ # nice little object for it.
+ f.write(parsed_request['content'])
+ except IOError as e:
+ web.HTTPError(404, "Report not found")
+
+class PCAPReportHandler(web.RequestHandler):
+ def get(self):
+ pass
+
+ def post(self):
+ pass
1
0
commit 2ce89fc1331b6eec44599639a79f7a34e5c7a6e6
Author: Arturo Filastò <art(a)fuffa.org>
Date: Tue Nov 27 16:55:45 2012 +0100
Always write report to file
* Do not write to backend reporter if report creation fails
* More robust error handling
* Improve debug log output
---
ooni/__init__.py | 1 +
ooni/config.py | 8 ++---
ooni/reporter.py | 53 +++++++++++++++++++++-----------------
ooni/runner.py | 73 +++++++++++++++++++++++++++++++++++------------------
4 files changed, 81 insertions(+), 54 deletions(-)
diff --git a/ooni/__init__.py b/ooni/__init__.py
index 2763b16..bf98e16 100644
--- a/ooni/__init__.py
+++ b/ooni/__init__.py
@@ -1,4 +1,5 @@
# -*- encoding: utf-8 -*-
+
from . import config
from . import inputunit
from . import kit
diff --git a/ooni/config.py b/ooni/config.py
index 1c40b32..bc255be 100644
--- a/ooni/config.py
+++ b/ooni/config.py
@@ -96,11 +96,9 @@ def generateReportFilenames():
raise TestFilenameNotSet
test_name = '.'.join(test_filename.split(".")[:-1])
- base_filename = "%s_%s_"+otime.timestamp()+".%s"
- reports.yamloo = base_filename % (test_name, "report", "yamloo")
- print "Setting yamloo to %s" % reports.yamloo
- reports.pcap = base_filename % (test_name, "packets", "pcap")
- print "Setting pcap to %s" % reports.pcap
+ frm_str = "report_%s_"+otime.timestamp()+".%s"
+ reports.yamloo = frm_str % (test_name, "yamloo")
+ reports.pcap = frm_str % (test_name, "pcap")
if not basic:
# Here we make sure that we instance the config file attributes only once
diff --git a/ooni/reporter.py b/ooni/reporter.py
index 8e4eede..abbd9c9 100644
--- a/ooni/reporter.py
+++ b/ooni/reporter.py
@@ -7,6 +7,7 @@
# :authors: Arturo Filastò, Isis Lovecruft
# :license: see included LICENSE file
+import traceback
import itertools
import logging
import sys
@@ -14,7 +15,6 @@ import os
import time
import yaml
import json
-import traceback
from yaml.representer import *
from yaml.emitter import *
@@ -115,7 +115,6 @@ def getTestDetails(options):
from ooni import __version__ as software_version
client_geodata = {}
-
if config.privacy.includeip or \
config.privacy.includeasn or \
config.privacy.includecountry or \
@@ -224,7 +223,6 @@ class YAMLReporter(OReporter):
self._write('---\n')
self._write(safe_dump(entry))
self._write('...\n')
- return
@defer.inlineCallbacks
def createReport(self, options):
@@ -242,18 +240,22 @@ class YAMLReporter(OReporter):
self._stream.close()
-class OONIBReportUpdateFailed(Exception):
+class OONIBReportError(Exception):
+ pass
+
+class OONIBReportUpdateError(OONIBReportError):
pass
-class OONIBReportCreationFailed(Exception):
+class OONIBReportCreationError(OONIBReportError):
pass
-class OONIBTestDetailsLookupFailed(Exception):
+class OONIBTestDetailsLookupError(OONIBReportError):
pass
class OONIBReporter(OReporter):
def __init__(self, cmd_line_options):
self.backend_url = cmd_line_options['collector']
+ self.report_id = None
from ooni.utils.txagentwithsocks import Agent
from twisted.internet import reactor
@@ -287,15 +289,10 @@ class OONIBReporter(OReporter):
response = yield self.agent.request("PUT", url,
bodyProducer=bodyProducer)
except:
- # XXX we must trap this in the runner and make sure to report the data later.
+ # XXX we must trap this in the runner and make sure to report the
+ # data later.
log.err("Error in writing report entry")
- raise OONIBReportUpdateFailed
-
- #parsed_response = json.loads(backend_response)
- #self.report_id = parsed_response['report_id']
- #self.backend_version = parsed_response['backend_version']
- #log.debug("Created report with id %s" % parsed_response['report_id'])
-
+ raise OONIBReportUpdateError
@defer.inlineCallbacks
def createReport(self, options):
@@ -305,39 +302,47 @@ class OONIBReporter(OReporter):
test_name = options['name']
test_version = options['version']
- log.debug("Creating report with OONIB Reporter")
url = self.backend_url + '/report/new'
- software_version = '0.0.1'
- test_details = yield getTestDetails(options)
+ try:
+ test_details = yield getTestDetails(options)
+ except Exception, e:
+ log.exception(e)
+
test_details['options'] = self.cmd_line_options
+ log.debug("Obtained test_details: %s" % test_details)
+
content = '---\n'
content += safe_dump(test_details)
content += '...\n'
- request = {'software_name': 'ooniprobe',
- 'software_version': software_version,
+ request = {'software_name': test_details['software_name'],
+ 'software_version': test_details['software_version'],
'test_name': test_name,
'test_version': test_version,
- 'progress': 0,
'content': content
}
- log.debug("Creating report via url %s" % url)
+
+ log.msg("Reporting %s" % url)
request_json = json.dumps(request)
log.debug("Sending %s" % request_json)
bodyProducer = StringProducer(json.dumps(request))
+ log.msg("Creating report with OONIB Reporter. Please be patient.")
+ log.msg("This may take up to 1-2 minutes...")
+
try:
response = yield self.agent.request("POST", url,
bodyProducer=bodyProducer)
except ConnectionRefusedError:
log.err("Connection to reporting backend failed (ConnectionRefusedError)")
- raise OONIBReportCreationFailed
+ raise OONIBReportCreationError
+
except Exception, e:
log.exception(e)
- raise OONIBReportCreationFailed
+ raise OONIBReportCreationError
# This is a little trix to allow us to unspool the response. We create
# a deferred and call yield on it.
@@ -350,7 +355,7 @@ class OONIBReporter(OReporter):
parsed_response = json.loads(backend_response)
except Exception, e:
log.exception(e)
- raise OONIBReportCreationFailed
+ raise OONIBReportCreationError
self.report_id = parsed_response['report_id']
self.backend_version = parsed_response['backend_version']
diff --git a/ooni/runner.py b/ooni/runner.py
index 97d4d7e..5fa80ae 100644
--- a/ooni/runner.py
+++ b/ooni/runner.py
@@ -26,8 +26,7 @@ from txtorcon import TorState, launch_tor
from ooni import config
-from ooni.reporter import OONIBReporter, YAMLReporter
-from ooni.reporter import OONIBReportCreationFailed
+from ooni.reporter import OONIBReporter, YAMLReporter, OONIBReportError
from ooni.inputunit import InputUnitFactory
from ooni.nettest import NetTestCase, NoPostProcessor
@@ -154,25 +153,45 @@ def loadTestsAndOptions(classes, cmd_line_options):
return test_cases, options
-def runTestCasesWithInput(test_cases, test_input, oreporter):
+def runTestCasesWithInput(test_cases, test_input, yaml_reporter,
+ oonib_reporter=None):
"""
Runs in parallel all the test methods that are inside of the specified test case.
Reporting happens every time a Test Method has concluded running.
Once all the test methods have been called we check to see if the
postProcessing class method returns something. If it does return something
we will write this as another entry inside of the report called post_processing.
+
+ Args:
+
+ test_cases (list): A list of tuples containing the test_class (a
+ class) and the test_method (a string)
+
+ test_input (instance): Any instance that will be passed as input to
+ the test.
+
+ yaml_reporter: An instance of :class:ooni.reporter.YAMLReporter
+
+ oonib_reporter: An instance of :class:ooni.reporter.OONIBReporter. If
+ this is set to none then we will only report to the YAML reporter.
+
"""
# This is used to store a copy of all the test reports
tests_report = {}
def test_done(result, test_instance, test_name):
- log.debug("runTestWithInput: concluded %s" % test_name)
+ log.msg("Successfully finished running %s" % test_name)
+ log.debug("Deferred callback result: %s" % result)
tests_report[test_name] = dict(test_instance.report)
- return oreporter.testDone(test_instance, test_name)
+ if not oonib_reporter:
+ return yaml_reporter.testDone(test_instance, test_name)
+ d1 = oonib_reporter.testDone(test_instance, test_name)
+ d2 = yaml_reporter.testDone(test_instance, test_name)
+ return defer.DeferredList([d1, d2])
def test_error(failure, test_instance, test_name):
- log.err("run Test Cases With Input problem")
+ log.err("Error in running %s" % test_name)
log.exception(failure)
return
@@ -184,7 +203,11 @@ def runTestCasesWithInput(test_cases, test_input, oreporter):
post = getattr(test_instance, 'postProcessor')
try:
post_processing = post(tests_report)
- return oreporter.testDone(test_instance, 'summary')
+ if not oonib_reporter:
+ return yaml_reporter.testDone(test_instance, 'summary')
+ d1 = oonib_reporter.testDone(test_instance, 'summary')
+ d2 = yaml_reporter.testDone(test_instance, 'summary')
+ return defer.DeferredList([d1, d2])
except NoPostProcessor:
log.debug("No post processor configured")
return
@@ -195,12 +218,11 @@ def runTestCasesWithInput(test_cases, test_input, oreporter):
test_class = test_case[0]
test_method = test_case[1]
- log.msg("Running %s with %s" % (test_method, test_input))
+ log.msg("Running %s with %s..." % (test_method, test_input))
test_instance = test_class()
test_instance.input = test_input
test_instance.report = {}
- log.msg("Processing %s" % test_instance.name)
# use this to keep track of the test runtime
test_instance._start_time = time.time()
# call setups on the test
@@ -351,7 +373,7 @@ def updateProgressMeters(test_filename, input_unit_factory,
config.state[test_filename].per_item_average = 2.0
input_unit_idx = float(config.stateDict[test_filename])
- input_unit_items = float(len(input_unit_factory) + 1)
+ input_unit_items = float(len(input_unit_factory))
test_case_number = float(test_case_number)
total_iterations = input_unit_items * test_case_number
current_iteration = input_unit_idx * test_case_number
@@ -382,23 +404,23 @@ def runTestCases(test_cases, options, cmd_line_options):
test_inputs = options['inputs']
+ oonib_reporter = OONIBReporter(cmd_line_options)
+ yaml_reporter = YAMLReporter(cmd_line_options)
+
if cmd_line_options['collector']:
log.msg("Using remote collector, please be patient while we create the report.")
- oreporter = OONIBReporter(cmd_line_options)
- else:
- log.msg("Reporting to file %s" % config.reports.yamloo)
- oreporter = YAMLReporter(cmd_line_options)
+ try:
+ yield oonib_reporter.createReport(options)
+ except OONIBReportError:
+ log.err("Error in creating new report")
+ log.msg("We will only create reports to a file")
+ oonib_reporter = None
- try:
- input_unit_factory = InputUnitFactory(test_inputs)
- except Exception, e:
- log.exception(e)
+ yield yaml_reporter.createReport(options)
+ log.msg("Reporting to file %s" % config.reports.yamloo)
try:
- yield oreporter.createReport(options)
- except OONIBReportCreationFailed:
- log.err("Error in creating new report")
- raise
+ input_unit_factory = InputUnitFactory(test_inputs)
except Exception, e:
log.exception(e)
@@ -425,7 +447,8 @@ def runTestCases(test_cases, options, cmd_line_options):
log.debug("Running %s with input unit %s" % (test_filename, input_unit))
yield runTestCasesWithInputUnit(test_cases, input_unit,
- oreporter)
+ yaml_reporter, oonib_reporter)
+
yield increaseInputUnitIdx(test_filename)
updateProgressMeters(test_filename, input_unit_factory, len(test_cases))
@@ -518,8 +541,8 @@ def loadTest(cmd_line_options):
config.generateReportFilenames()
if cmd_line_options['reportfile']:
- config.reports.yamloo = cmd_line_options['reportfile']
- config.reports.pcap = config.reports.yamloo+".pcap"
+ config.reports.yamloo = cmd_line_options['reportfile']+'.yamloo'
+ config.reports.pcap = config.reports.yamloo+'.pcap'
if os.path.exists(config.reports.pcap):
print "Report PCAP already exists with filename %s" % config.reports.pcap
1
0
[translation/tails-persistence-setup_completed] Update translations for tails-persistence-setup_completed
by translation@torproject.org 28 Nov '12
by translation@torproject.org 28 Nov '12
28 Nov '12
commit 485357b0229b749a2617237e22c16dc714a3655a
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Nov 28 09:16:27 2012 +0000
Update translations for tails-persistence-setup_completed
---
templates/tails-persistence-setup.pot | 26 +++++++++++++++++---------
1 files changed, 17 insertions(+), 9 deletions(-)
diff --git a/templates/tails-persistence-setup.pot b/templates/tails-persistence-setup.pot
index 3b23c9e..40dac83 100644
--- a/templates/tails-persistence-setup.pot
+++ b/templates/tails-persistence-setup.pot
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-03 17:39+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: runasand <runa.sandvik(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -74,26 +74,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configuration of network devices and connections"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr "Browser bookmarks"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr "Bookmarks saved in Iceweasel browser"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT Packages"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Packages downloaded by APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT Lists"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Lists downloaded by APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dotfiles"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Symlink into $HOME every file or directory found in the `dotfiles' directory"
@@ -192,8 +200,8 @@ msgstr "Choose a passphrase to protect the persistent volume"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "A %s persistent volume will be created on the <b>%s %s</b> device. Data on this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr "A %s persistent volume will be created on the <b>%s %s</b> device. Data on this volume will be stored in an encrypted form protected by a passphrase."
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
1
0
[translation/tails-persistence-setup] Update translations for tails-persistence-setup
by translation@torproject.org 28 Nov '12
by translation@torproject.org 28 Nov '12
28 Nov '12
commit 532d1daceafbaf6102edd4b5305813880dd2ab94
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Nov 28 09:16:23 2012 +0000
Update translations for tails-persistence-setup
---
bg/bg.po | 26 +++++++++++++++++---------
de/de.po | 24 ++++++++++++++++--------
el/el.po | 24 ++++++++++++++++--------
es/es.po | 26 +++++++++++++++++---------
eu/eu.po | 24 ++++++++++++++++--------
fr/fr.po | 26 +++++++++++++++++---------
hu/hu.po | 24 ++++++++++++++++--------
it/it.po | 26 +++++++++++++++++---------
nl/nl.po | 26 +++++++++++++++++---------
pt_BR/pt_BR.po | 26 +++++++++++++++++---------
ru/ru.po | 24 ++++++++++++++++--------
templates/tails-persistence-setup.pot | 26 +++++++++++++++++---------
zh_CN/zh_CN.po | 26 +++++++++++++++++---------
13 files changed, 216 insertions(+), 112 deletions(-)
diff --git a/bg/bg.po b/bg/bg.po
index 388ce28..172e064 100644
--- a/bg/bg.po
+++ b/bg/bg.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-29 19:33+0100\n"
-"PO-Revision-Date: 2012-11-22 17:02+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: kirilvel <kirilvelinov(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr "Конфигуриране на мрежови устройства и връзки"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT Пакети"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Пакети свален от APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT списъци"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Списъци свалени с APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dotfiles"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Символична връзка в $ HOME всеки файл или директория в директория \"dotfiles\""
@@ -193,8 +201,8 @@ msgstr "Изберете парола за защита на устойчиво
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "Устойчивото пространство %s ще бъде създаден на на <b>%s %s</b> устройство. Данните за това устройство ще се съхраняват в криптиран вид, защитени с парола."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/de/de.po b/de/de.po
index 7662856..2168637 100644
--- a/de/de.po
+++ b/de/de.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-06 14:23+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: Cooligan <ppt23(a)lkj.hopto.org>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
-msgid "APT Packages"
+msgid "Browser bookmarks"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
-msgid "Packages downloaded by APT"
+msgid "Bookmarks saved in Iceweasel browser"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
-msgid "APT Lists"
+msgid "APT Packages"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
-msgid "Lists downloaded by APT"
+msgid "Packages downloaded by APT"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
-msgid "Dotfiles"
+msgid "APT Lists"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+msgid "Lists downloaded by APT"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
+msgid "Dotfiles"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr ""
@@ -193,7 +201,7 @@ msgstr ""
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
diff --git a/el/el.po b/el/el.po
index 45545dc..0efdff9 100644
--- a/el/el.po
+++ b/el/el.po
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-29 19:33+0100\n"
-"PO-Revision-Date: 2012-11-15 19:05+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: Alex <hestia(a)riseup.net>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -78,26 +78,34 @@ msgid "Configuration of network devices and connections"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "Πακέτα APT "
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Πακέτα κατεβασμένα από το APT "
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "Λίστες APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Λίστες κατεβασμένες από το APT "
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr ""
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr ""
@@ -196,7 +204,7 @@ msgstr ""
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
diff --git a/es/es.po b/es/es.po
index 00804bc..58ce389 100644
--- a/es/es.po
+++ b/es/es.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-29 19:33+0100\n"
-"PO-Revision-Date: 2012-11-01 19:42+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: strel <strelnic(a)gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/projects/p/torproject/language/es/)\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configuración de dispositivos de red y conexiones"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "Paquetes APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Paquetes descargados por APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "Listas APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Listas descargadas por APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dotfiles (archivos de configuraciones .archivo)"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Crear enlaces simbólicos (symlinks) en $HOME para todos los archivos o carpetas que se encuentren en la carpeta `dotfiles'"
@@ -193,8 +201,8 @@ msgstr "Elija una frase clave para proteger el volumen persistente"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "Un volumen persistente %s será creado sobre el dispositivo <b>%s %s</b>. Los datos en este volumen serán guardados de forma cifrada, protegidos por una frase clave."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/eu/eu.po b/eu/eu.po
index 16a744b..01dc7f2 100644
--- a/eu/eu.po
+++ b/eu/eu.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-29 19:33+0100\n"
-"PO-Revision-Date: 2012-11-23 18:19+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: totorika93 <totorika93(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -76,26 +76,34 @@ msgid "Configuration of network devices and connections"
msgstr "Sare gailu eta konexioen konfigurazioa"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT paketeak"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "APT bidez deskargatutako paketeak"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT zerrendak"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "APT bidez deskargatutako zerrendak"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dot fitxategiak"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr ""
@@ -194,7 +202,7 @@ msgstr "Aukeratu euskarri iraunkorra babesteko pasahitz bat"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
diff --git a/fr/fr.po b/fr/fr.po
index b0d58d7..85ce85f 100644
--- a/fr/fr.po
+++ b/fr/fr.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-19 22:29+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: palsecam <paul(a)dabuttonfactory.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -76,26 +76,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configuration de cartes réseaux et connexions"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "Paquets APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Paquets téléchargés par APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "Listes d'APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Listes de paquets téléchargées par APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dotfiles"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Créer un lien symbolique, dans $HOME, vers chaque fichier se trouvant dans le dossier `dotfiles'"
@@ -194,8 +202,8 @@ msgstr "Choississez une phrase de passe pour protéger le volume persistant"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "Un volume persistant %s sera créé sur le périphérique <b>%s %s</b>. Les données stockées sur ce périphérique seront chiffrées, et protégées par une phrase de passe."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/hu/hu.po b/hu/hu.po
index 0c5e076..7ed026f 100644
--- a/hu/hu.po
+++ b/hu/hu.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-12 16:31+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: vargaviktor <viktor.varga(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT csomagok"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "APT által letöltött csomagok"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT listák"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "APT által letöltött listák"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dot-fájlok"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr ""
@@ -193,7 +201,7 @@ msgstr ""
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
diff --git a/it/it.po b/it/it.po
index b356578..1c2a037 100644
--- a/it/it.po
+++ b/it/it.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-10 07:27+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: jan <jan.reister(a)unimi.it>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/torproject/language/it/)\n"
"MIME-Version: 1.0\n"
@@ -76,26 +76,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configurazione dei dispositivi e delle connessioni di rete"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "Pacchetti APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Pacchetti scaricati da APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "Liste APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Liste scaricate da APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dotfiles"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Crea un symlink in $HOME per ogni file o cartella dentro la cartella `dotfiles'"
@@ -194,8 +202,8 @@ msgstr "Scegli una frase segret per proteggere il volume persistente"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "Un volume persistente %s sarà creato sul dispositivo <b>%s %s</b>. I dati saranno salvati in formato criptato protetti da una frase segreta."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/nl/nl.po b/nl/nl.po
index a15b5ca..50390f0 100644
--- a/nl/nl.po
+++ b/nl/nl.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-10 15:38+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: Richard E. van der Luit <nippur(a)fedoraproject.org>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configuratie van netwerkapparaten en connecties"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT-pakketten"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Pakketten door APT gedownload"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT-lijsten"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Lijsten gedownload door APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Puntbestanden"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Symlink naar $HOME elk bestand of map dat gevonden is in de `puntbestanden'-map"
@@ -193,8 +201,8 @@ msgstr "Kies een wachtzin om het persistente volume te beschermen"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "Een %s persistent volume zal worden aangemaakt op apparaat <b>%s %s</b>. Data op dit apparaat zal versleuteld worden opgeslagen en worden beschermd met een wachtzin."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/pt_BR/pt_BR.po b/pt_BR/pt_BR.po
index d51b244..483ebb1 100644
--- a/pt_BR/pt_BR.po
+++ b/pt_BR/pt_BR.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-15 05:53+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: NICEcookie <rafaelmartinsrm(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configuração de dispositivos de rede e conexões"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "Pacotes APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Pacotes baixados pelo APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "Listas APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Listas baixadas pelo APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Arquivos de configuração (dotfiles)"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Criar um link em $HOME para todos os arquivos ou diretórios encontrados no diretório `dotfiles`"
@@ -193,8 +201,8 @@ msgstr "Escolha uma senha para proteger o volume persistente"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "Um volume persistente %s vai ser criado no dispositivo <b>%s %s</b>. Dados neste dispositivo serão armazenados de forma criptografada protegidos por uma senha."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/ru/ru.po b/ru/ru.po
index 23e6bda..c9176a9 100644
--- a/ru/ru.po
+++ b/ru/ru.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-29 19:33+0100\n"
-"PO-Revision-Date: 2012-11-06 07:11+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: Den Arefyev <>\n"
"Language-Team: Russian (http://www.transifex.com/projects/p/torproject/language/ru/)\n"
"MIME-Version: 1.0\n"
@@ -75,26 +75,34 @@ msgid "Configuration of network devices and connections"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
-msgid "APT Packages"
+msgid "Browser bookmarks"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
-msgid "Packages downloaded by APT"
+msgid "Bookmarks saved in Iceweasel browser"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
-msgid "APT Lists"
+msgid "APT Packages"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
-msgid "Lists downloaded by APT"
+msgid "Packages downloaded by APT"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
-msgid "Dotfiles"
+msgid "APT Lists"
msgstr ""
#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+msgid "Lists downloaded by APT"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
+msgid "Dotfiles"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr ""
@@ -193,7 +201,7 @@ msgstr ""
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
diff --git a/templates/tails-persistence-setup.pot b/templates/tails-persistence-setup.pot
index 3b23c9e..40dac83 100644
--- a/templates/tails-persistence-setup.pot
+++ b/templates/tails-persistence-setup.pot
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-03 16:16+0200\n"
-"PO-Revision-Date: 2012-10-03 17:39+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: runasand <runa.sandvik(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -74,26 +74,34 @@ msgid "Configuration of network devices and connections"
msgstr "Configuration of network devices and connections"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr "Browser bookmarks"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr "Bookmarks saved in Iceweasel browser"
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT Packages"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "Packages downloaded by APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT Lists"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "Lists downloaded by APT"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr "Dotfiles"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "Symlink into $HOME every file or directory found in the `dotfiles' directory"
@@ -192,8 +200,8 @@ msgstr "Choose a passphrase to protect the persistent volume"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "A %s persistent volume will be created on the <b>%s %s</b> device. Data on this device will be stored in an encrypted form protected by a passphrase."
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr "A %s persistent volume will be created on the <b>%s %s</b> device. Data on this volume will be stored in an encrypted form protected by a passphrase."
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
diff --git a/zh_CN/zh_CN.po b/zh_CN/zh_CN.po
index f792314..18cd0e1 100644
--- a/zh_CN/zh_CN.po
+++ b/zh_CN/zh_CN.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
-"POT-Creation-Date: 2012-10-29 19:33+0100\n"
-"PO-Revision-Date: 2012-11-14 04:30+0000\n"
+"POT-Creation-Date: 2012-11-27 21:00+0100\n"
+"PO-Revision-Date: 2012-11-28 09:09+0000\n"
"Last-Translator: xtoaster <zhazhenzhong(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
@@ -74,26 +74,34 @@ msgid "Configuration of network devices and connections"
msgstr "配置网络设备和连接"
#: ../lib/Tails/Persistence/Configuration/Presets.pm:118
+msgid "Browser bookmarks"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+msgid "Bookmarks saved in Iceweasel browser"
+msgstr ""
+
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
msgid "APT Packages"
msgstr "APT 软件包"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:120
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
msgid "Packages downloaded by APT"
msgstr "APT 下载的软件包"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:128
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
msgid "APT Lists"
msgstr "APT 列表"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:130
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
msgid "Lists downloaded by APT"
msgstr "APT 下载的软件包列表"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:138
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:148
msgid "Dotfiles"
msgstr ".用户配置文件"
-#: ../lib/Tails/Persistence/Configuration/Presets.pm:140
+#: ../lib/Tails/Persistence/Configuration/Presets.pm:150
msgid ""
"Symlink into $HOME every file or directory found in the `dotfiles' directory"
msgstr "连入 $HOME 的符号链接,'.'开头目录中的所有文件和文件夹"
@@ -192,8 +200,8 @@ msgstr "输入一个密码来保护您的持久卷"
#, perl-format
msgid ""
"A %s persistent volume will be created on the <b>%s %s</b> device. Data on "
-"this device will be stored in an encrypted form protected by a passphrase."
-msgstr "系统将创建一个 %s 的持久卷保存于 <b>%s %s</b> 设备上。此卷中的数据将加密存储与此设备上并受密码保护。"
+"this volume will be stored in an encrypted form protected by a passphrase."
+msgstr ""
#: ../lib/Tails/Persistence/Step/Bootstrap.pm:66
msgid "Create"
1
0
[tor/master] Add a torrc option to specify the bind address of managed proxies.
by nickm@torproject.org 28 Nov '12
by nickm@torproject.org 28 Nov '12
28 Nov '12
commit f88c3038697b00f50b2da12f46fc76ee0e20d646
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Tue Oct 30 04:17:13 2012 +0200
Add a torrc option to specify the bind address of managed proxies.
---
changes/bug7013 | 4 ++
doc/tor.1.txt | 5 +++
src/or/config.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++
src/or/config.h | 2 +
src/or/or.h | 3 ++
src/or/statefile.c | 11 +++++-
6 files changed, 125 insertions(+), 1 deletions(-)
diff --git a/changes/bug7013 b/changes/bug7013
new file mode 100644
index 0000000..ba78520
--- /dev/null
+++ b/changes/bug7013
@@ -0,0 +1,4 @@
+ o Minor features:
+ - Add a new torrc option 'ServerTransportListenAddr' which allows
+ users to select the address where their pluggable transports
+ will listen for connections.
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
index 8245ff4..9eb3745 100644
--- a/doc/tor.1.txt
+++ b/doc/tor.1.txt
@@ -181,6 +181,11 @@ GENERAL OPTIONS
using __options__ as its command-line options, and expects to receive
proxied client traffic from it.
+**ServerTransportListenAddr** __transport__ __IP__:__PORT__::
+ When this option is set, Tor will suggest __IP__:__PORT__ as the
+ listening address of any pluggable transport proxy that tries to
+ launch __transport__.
+
**ConnLimit** __NUM__::
The minimum number of file descriptors that must be available to the Tor
process before it will start. Tor will ask the OS for as many file
diff --git a/src/or/config.c b/src/or/config.c
index 6eace9f..822bc62 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -273,6 +273,7 @@ static config_var_t option_vars_[] = {
V(HTTPSProxy, STRING, NULL),
V(HTTPSProxyAuthenticator, STRING, NULL),
VAR("ServerTransportPlugin", LINELIST, ServerTransportPlugin, NULL),
+ V(ServerTransportListenAddr, LINELIST, NULL),
V(Socks4Proxy, STRING, NULL),
V(Socks5Proxy, STRING, NULL),
V(Socks5ProxyUsername, STRING, NULL),
@@ -462,6 +463,9 @@ static int parse_bridge_line(const char *line, int validate_only);
static int parse_client_transport_line(const char *line, int validate_only);
static int parse_server_transport_line(const char *line, int validate_only);
+static char *get_bindaddr_from_transport_listen_line(const char *line,
+ const char *transport);
+
static int parse_dir_server_line(const char *line,
dirinfo_type_t required_type,
int validate_only);
@@ -2879,6 +2883,22 @@ options_validate(or_options_t *old_options, or_options_t *options,
escaped(options->ServerTransportPlugin->value));
}
+ for (cl = options->ServerTransportListenAddr; cl; cl = cl->next) {
+ /** If get_bindaddr_from_transport_listen_line() fails with
+ 'transport' being NULL, it means that something went wrong
+ while parsing the ServerTransportListenAddr line. */
+ char *bindaddr = get_bindaddr_from_transport_listen_line(cl->value, NULL);
+ if (!bindaddr)
+ REJECT("ServerTransportListenAddr did not parse. See logs for details.");
+ tor_free(bindaddr);
+ }
+
+ if (options->ServerTransportListenAddr && !options->ServerTransportPlugin) {
+ log_notice(LD_GENERAL, "You need at least a single managed-proxy to "
+ "specify a transport listen address. The "
+ "ServerTransportListenAddr line will be ignored.");
+ }
+
if (options->ConstrainedSockets) {
/* If the user wants to constrain socket buffer use, make sure the desired
* limit is between MIN|MAX_TCPSOCK_BUFFER in k increments. */
@@ -4117,6 +4137,87 @@ parse_client_transport_line(const char *line, int validate_only)
return r;
}
+/** Given a ServerTransportListenAddr <b>line</b>, return its
+ * <address:port> string. Return NULL if the line was not
+ * well-formed.
+ *
+ * If <b>transport</b> is set, return NULL if the line is not
+ * referring to <b>transport</b>.
+ *
+ * The returned string is allocated on the heap and it's the
+ * responsibility of the caller to free it. */
+static char *
+get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
+{
+ smartlist_t *items = NULL;
+ const char *parsed_transport = NULL;
+ char *addrport = NULL;
+ char *addr = NULL;
+ uint16_t port = 0;
+
+ items = smartlist_new();
+ smartlist_split_string(items, line, NULL,
+ SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
+
+ if (smartlist_len(items) < 2) {
+ log_warn(LD_CONFIG,"Too few arguments on ServerTransportListenAddr line.");
+ goto err;
+ }
+
+ parsed_transport = smartlist_get(items, 0);
+ addrport = tor_strdup(smartlist_get(items, 1));
+
+ /* If 'transport' is given, check if it matches the one on the line */
+ if (transport && strcmp(transport, parsed_transport))
+ goto err;
+
+ /* Validate addrport */
+ if (tor_addr_port_split(LOG_WARN, addrport, &addr, &port)<0) {
+ log_warn(LD_CONFIG, "Error parsing ServerTransportListenAddr "
+ "address '%s'", addrport);
+ goto err;
+ }
+
+ if (!port) {
+ log_warn(LD_CONFIG,
+ "ServerTransportListenAddr address '%s' has no port.", addrport);
+ goto err;
+ }
+
+ goto done;
+
+ err:
+ tor_free(addrport);
+ addrport = NULL;
+
+ done:
+ SMARTLIST_FOREACH(items, char*, s, tor_free(s));
+ smartlist_free(items);
+ tor_free(addr);
+
+ return addrport;
+}
+
+/** Given the name of a pluggable transport in <b>transport</b>, check
+ * the configuration file to see if the user has explicitly asked for
+ * it to listen on a specific port. Return a <address:port> string if
+ * so, otherwise NULL. */
+char *
+get_transport_bindaddr_from_config(const char *transport)
+{
+ config_line_t *cl;
+ const or_options_t *options = get_options();
+
+ for (cl = options->ServerTransportListenAddr; cl; cl = cl->next) {
+ char *bindaddr =
+ get_bindaddr_from_transport_listen_line(cl->value, transport);
+ if (bindaddr)
+ return bindaddr;
+ }
+
+ return NULL;
+}
+
/** Read the contents of a ServerTransportPlugin line from
* <b>line</b>. Return 0 if the line is well-formed, and -1 if it
* isn't.
diff --git a/src/or/config.h b/src/or/config.h
index f3b28ad..336685d 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -82,6 +82,8 @@ const char *tor_get_digests(void);
uint32_t get_effective_bwrate(const or_options_t *options);
uint32_t get_effective_bwburst(const or_options_t *options);
+char *get_transport_bindaddr_from_config(const char *transport);
+
#ifdef CONFIG_PRIVATE
/* Used only by config.c and test.c */
or_options_t *options_new(void);
diff --git a/src/or/or.h b/src/or/or.h
index b59c079..82e847a 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3218,6 +3218,9 @@ typedef struct {
config_line_t *ServerTransportPlugin; /**< List of client
transport plugins. */
+ /** List of TCP/IP addresses that transports should listen at. */
+ config_line_t *ServerTransportListenAddr;
+
int BridgeRelay; /**< Boolean: are we acting as a bridge relay? We make
* this explicit so we can change how we behave in the
* future. */
diff --git a/src/or/statefile.c b/src/or/statefile.c
index beb9cf8..704c4e5 100644
--- a/src/or/statefile.c
+++ b/src/or/statefile.c
@@ -517,8 +517,17 @@ get_stored_bindaddr_for_server_transport(const char *transport)
{
char *default_addrport = NULL;
const char *stored_bindaddr = NULL;
+ config_line_t *line = NULL;
+
+ {
+ /* See if the user explicitly asked for a specific listening
+ address for this transport. */
+ char *conf_bindaddr = get_transport_bindaddr_from_config(transport);
+ if (conf_bindaddr)
+ return conf_bindaddr;
+ }
- config_line_t *line = get_transport_in_state_by_name(transport);
+ line = get_transport_in_state_by_name(transport);
if (!line) /* Found no references in state for this transport. */
goto no_bindaddr_found;
1
0
[tor/master] Introduce tor_addr_port_parse() and use it to parse ServerTransportListenAddr.
by nickm@torproject.org 28 Nov '12
by nickm@torproject.org 28 Nov '12
28 Nov '12
commit 6f21d2e49657ada264cace9da7cf6945b4fc073d
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Wed Nov 28 00:24:58 2012 +0200
Introduce tor_addr_port_parse() and use it to parse ServerTransportListenAddr.
---
src/common/address.c | 41 +++++++++++++++++++++++++++++++++++++-
src/common/address.h | 3 ++
src/or/config.c | 11 +--------
src/test/test_addr.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 98 insertions(+), 10 deletions(-)
diff --git a/src/common/address.c b/src/common/address.c
index a714ead..fff3206 100644
--- a/src/common/address.c
+++ b/src/common/address.c
@@ -1393,7 +1393,46 @@ is_internal_IP(uint32_t ip, int for_listening)
return tor_addr_is_internal(&myaddr, for_listening);
}
-/** Given an address of the form "host:port", try to divide it into its host
+/** Given an address of the form "ip:port", try to divide it into its
+ * ip and port portions, setting *<b>address_out</b> to a newly
+ * allocated string holding the address portion and *<b>port_out</b>
+ * to the port.
+ *
+ * Don't do DNS lookups and don't allow domain names in the <ip> field.
+ * Don't accept <b>addrport</b> of the form "<ip>" or "<ip>:0".
+ *
+ * Return 0 on success, -1 on failure. */
+int
+tor_addr_port_parse(int severity, const char *addrport,
+ tor_addr_t *address_out, uint16_t *port_out)
+{
+ int retval = -1;
+ int r;
+ char *addr_tmp = NULL;
+
+ tor_assert(addrport);
+ tor_assert(address_out);
+ tor_assert(port_out);
+
+ r = tor_addr_port_split(severity, addrport, &addr_tmp, port_out);
+ if (r < 0)
+ goto done;
+
+ if (!*port_out)
+ goto done;
+
+ /* make sure that address_out is an IP address */
+ if (tor_addr_parse(address_out, addr_tmp) < 0)
+ goto done;
+
+ retval = 0;
+
+ done:
+ tor_free(addr_tmp);
+ return retval;
+}
+
+/** Given an address of the form "host[:port]", try to divide it into its host
* ane port portions, setting *<b>address_out</b> to a newly allocated string
* holding the address portion and *<b>port_out</b> to the port (or 0 if no
* port is given). Return 0 on success, -1 on failure. */
diff --git a/src/common/address.h b/src/common/address.h
index 067b7a0..61c6eb8 100644
--- a/src/common/address.h
+++ b/src/common/address.h
@@ -206,6 +206,9 @@ int tor_addr_is_loopback(const tor_addr_t *addr);
int tor_addr_port_split(int severity, const char *addrport,
char **address_out, uint16_t *port_out);
+int tor_addr_port_parse(int severity, const char *addrport,
+ tor_addr_t *address_out, uint16_t *port_out);
+
int tor_addr_hostname_is_local(const char *name);
/* IPv4 helpers */
diff --git a/src/or/config.c b/src/or/config.c
index 822bc62..48e33b9 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -4152,7 +4152,7 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
smartlist_t *items = NULL;
const char *parsed_transport = NULL;
char *addrport = NULL;
- char *addr = NULL;
+ tor_addr_t addr;
uint16_t port = 0;
items = smartlist_new();
@@ -4172,18 +4172,12 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
goto err;
/* Validate addrport */
- if (tor_addr_port_split(LOG_WARN, addrport, &addr, &port)<0) {
+ if (tor_addr_port_parse(LOG_WARN, addrport, &addr, &port)<0) {
log_warn(LD_CONFIG, "Error parsing ServerTransportListenAddr "
"address '%s'", addrport);
goto err;
}
- if (!port) {
- log_warn(LD_CONFIG,
- "ServerTransportListenAddr address '%s' has no port.", addrport);
- goto err;
- }
-
goto done;
err:
@@ -4193,7 +4187,6 @@ get_bindaddr_from_transport_listen_line(const char *line,const char *transport)
done:
SMARTLIST_FOREACH(items, char*, s, tor_free(s));
smartlist_free(items);
- tor_free(addr);
return addrport;
}
diff --git a/src/test/test_addr.c b/src/test/test_addr.c
index 0dcc017..065ca58 100644
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@ -623,12 +623,65 @@ test_addr_ip6_helpers(void)
;
}
+/** Test tor_addr_port_parse(). */
+static void
+test_addr_parse(void)
+{
+ int r;
+ tor_addr_t addr;
+ char buf[TOR_ADDR_BUF_LEN];
+ uint16_t port = 0;
+
+ /* Correct call. */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2.1:1234",
+ &addr, &port);
+ test_assert(r == 0);
+ tor_addr_to_str(buf, &addr, sizeof(buf), 0);
+ test_streq(buf, "192.0.2.1");
+ test_eq(port, 1234);
+
+ /* Domain name. */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "torproject.org:1234",
+ &addr, &port);
+ test_assert(r == -1);
+
+ /* Only IP. */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2.2",
+ &addr, &port);
+ test_assert(r == -1);
+
+ /* Bad port. */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2.2:66666",
+ &addr, &port);
+ test_assert(r == -1);
+
+ /* Only domain name */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "torproject.org",
+ &addr, &port);
+ test_assert(r == -1);
+
+ /* Bad IP address */
+ r= tor_addr_port_parse(LOG_DEBUG,
+ "192.0.2:1234",
+ &addr, &port);
+ test_assert(r == -1);
+
+ done:
+ ;
+}
+
#define ADDR_LEGACY(name) \
{ #name, legacy_test_helper, 0, &legacy_setup, test_addr_ ## name }
struct testcase_t addr_tests[] = {
ADDR_LEGACY(basic),
ADDR_LEGACY(ip6_helpers),
+ ADDR_LEGACY(parse),
END_OF_TESTCASES
};
1
0
commit 190c1d4981e5751aabd3d894095851c830f1d570
Merge: 267c0e5 6f21d2e
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue Nov 27 22:18:16 2012 -0500
Merge branch 'bug7013_take2_squashed'
changes/bug7013 | 4 ++
doc/tor.1.txt | 5 +++
src/common/address.c | 41 +++++++++++++++++++++-
src/common/address.h | 3 ++
src/or/config.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/or/config.h | 2 +
src/or/or.h | 3 ++
src/or/statefile.c | 11 +++++-
src/test/test_addr.c | 53 ++++++++++++++++++++++++++++
9 files changed, 214 insertions(+), 2 deletions(-)
diff --cc src/or/config.c
index 206ccc8,48e33b9..75f6193
--- a/src/or/config.c
+++ b/src/or/config.c
@@@ -276,8 -272,8 +276,9 @@@ static config_var_t option_vars_[] =
V(HTTPProxyAuthenticator, STRING, NULL),
V(HTTPSProxy, STRING, NULL),
V(HTTPSProxyAuthenticator, STRING, NULL),
+ V(IPv6Exit, BOOL, "0"),
VAR("ServerTransportPlugin", LINELIST, ServerTransportPlugin, NULL),
+ V(ServerTransportListenAddr, LINELIST, NULL),
V(Socks4Proxy, STRING, NULL),
V(Socks5Proxy, STRING, NULL),
V(Socks5ProxyUsername, STRING, NULL),
1
0
[torspec/master] Add proposal 217: Tor Extended ORPort Authentication
by nickm@torproject.org 28 Nov '12
by nickm@torproject.org 28 Nov '12
28 Nov '12
commit 1d6ada880b389cb61a52ab120cb5a55a71292b6d
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue Nov 27 19:59:34 2012 -0500
Add proposal 217: Tor Extended ORPort Authentication
---
proposals/000-index.txt | 2 +
proposals/217-ext-orport-auth.txt | 177 +++++++++++++++++++++++++++++++++++++
2 files changed, 179 insertions(+), 0 deletions(-)
diff --git a/proposals/000-index.txt b/proposals/000-index.txt
index 72bec71..5865e78 100644
--- a/proposals/000-index.txt
+++ b/proposals/000-index.txt
@@ -137,6 +137,7 @@ Proposals by number:
214 Allow 4-byte circuit IDs in a new link protocol [OPEN]
215 Let the minimum consensus method change with time [OPEN]
216 Improved circuit-creation key exchange [OPEN]
+217 Tor Extended ORPort Authentication [OPEN]
Proposals by status:
@@ -189,6 +190,7 @@ Proposals by status:
214 Allow 4-byte circuit IDs in a new link protocol
215 Let the minimum consensus method change with time
216 Improved circuit-creation key exchange
+ 217 Tor Extended ORPort Authentication [for 0.2.5.x]
ACCEPTED:
140 Provide diffs between consensuses
147 Eliminate the need for v2 directories in generating v3 directories [for 0.2.4.x]
diff --git a/proposals/217-ext-orport-auth.txt b/proposals/217-ext-orport-auth.txt
new file mode 100644
index 0000000..1206234
--- /dev/null
+++ b/proposals/217-ext-orport-auth.txt
@@ -0,0 +1,177 @@
+Filename: 217-ext-orport-auth.txt
+Title: Tor Extended ORPort Authentication
+Author: George Kadianakis
+Created: 28-11-2012
+Status: Open
+Target: 0.2.5.x
+
+1. Overview
+
+ This proposal defines a scheme for Tor components to authenticate to
+ each other using a shared-secret.
+
+2. Motivation
+
+ Proposal 196 introduced new ways for pluggable transport proxies to
+ communicate with Tor. The communication happens using TCP in the same
+ fashion that controllers speak to the ControlPort.
+
+ To defend against cross-protocol attacks [0] on the transport ports,
+ we need to define an authentication scheme that will restrict passage
+ to unknown clients.
+
+ Tor's ControlPort uses an authentication scheme called safe-cookie
+ authentication [1]. Unfortunately, the design of the safe-cookie
+ authentication was influenced by the protocol structure of the
+ ControlPort and the need for backwards compatibility of the
+ cookie-file and can't be easily reused in other use cases.
+
+3. Goals
+
+ The general goal of Extended ORPort authentication is to authenticate
+ the client based on a shared-secret that only authorized clients
+ should know.
+
+ Furthermore, its implementation should be flexible and easy to reuse,
+ so that it can be used as the authentication mechanism in front of
+ future Tor helper ports (for example, in proposal 199).
+
+ Finally, the protocol is able to support multiple authentication
+ schemes and each of them has different goals.
+
+4. Protocol Specification
+
+4.1. Initial handshake
+
+ When a client connects to the Extended ORPort, the server sends:
+
+ AuthTypes [variable]
+ EndAuthTypes [1 octet]
+
+ Where,
+
+ + AuthTypes are the authentication schemes that the server supports
+ for this session. They are multiple concatenated 1-octet values that
+ take values from 1 to 255.
+ + EndAuthTypes is the special value 0.
+
+ The client reads the list of supported authentication schemes and
+ replies with the one he prefers to use:
+
+ AuthType [1 octet]
+
+ Where,
+
+ + AuthType is the authentication scheme that the client wants to use
+ for this session. A valid authentication type takes values from 1 to
+ 255. A value of 0 means that the client did not like the
+ authentication types offered by the server.
+
+ If the client sent an AuthType of value 0, or an AuthType that the
+ server does not support, the server MUST close the connection.
+
+4.2. Authentication types
+
+4.2.1 SAFE_COOKIE handshake
+
+ Authentication type 1 is called SAFE_COOKIE.
+
+4.2.1.1. Motivation and goals
+
+ The SAFE_COOKIE scheme is pretty-much identical to the authentication
+ scheme that was introduced for the ControlPort in proposal 193.
+
+ An additional goal of the SAFE_COOKIE authentication scheme (apart
+ from the goals of section 2), is that it should not leak the contents
+ of the cookie-file to untrusted parties.
+
+ Specifically, the SAFE_COOKIE protocol will never leak the actual
+ contents of the file. Instead, it uses a challenge-response protocol
+ (similar to the HTTP digest authentication of RFC2617) to ensure that
+ both parties know the cookie without leaking it.
+
+4.2.1.2. Cookie-file format
+
+ The format of the cookie-file is:
+
+ StaticHeader [32 octets]
+ Cookie [32 octets]
+
+ Where,
+ + StaticHeader is the following string:
+ "! Extended ORPort Auth Cookie !\x0a"
+ + Cookie is the shared-secret. During the SAFE_COOKIE protocol, the
+ cookie is called CookieString.
+
+ Extended ORPort clients MUST make sure that the StaticHeader is
+ present in the cookie file, before proceeding with the
+ authentication protocol.
+
+ Details on how Tor locates the cookie file can be found in section 5
+ of proposal 196. Details on how transport proxies locate the cookie
+ file can be found in pt-spec.txt.
+
+4.2.1.3. Protocol specification
+
+ A client that performs the SAFE_COOKIE handshake begins by sending:
+
+ ClientNonce [32 octets]
+
+ Where,
+ + ClientNonce is 32 octets of random data.
+
+ Then, the server replies with:
+
+ ServerHash [32 octets]
+ ServerNonce [32 octets]
+
+ Where,
+ + ServerHash is computed as:
+ HMAC-SHA256(CookieString,
+ "ExtORPort authentication server-to-client hash" | ClientNonce | ServerNonce)
+ + ServerNonce is 32 random octets.
+
+ Upon receiving that data, the client computers ServerHash herself and
+ validates it against the ServerHash provided by the server.
+
+ If the server-provided ServerHash is invalid, the client MUST
+ terminate the connection.
+
+ Otherwise the client replies with:
+
+ ClientHash [32 octets]
+
+ Where,
+ + ClientHash is computed as:
+ HMAC-SHA256(CookieString,
+ "ExtORPort authentication client-to-server hash" | ClientNonce | ServerNonce)
+
+ Upon receiving that data, the server computers ClientHash herself and
+ validates it against the ClientHash provided by the client.
+
+ Finally, the server replies with:
+
+ Status [1 octet]
+
+ Where,
+ + Status is 1 if the authentication was successfull. If the
+ authentication failed, Status is 0.
+
+4.3. Post-authentication
+
+ After completing the Extended ORPort authentication successfully, the
+ two parties should proceed with the Extended ORPort protocol on the
+ same TCP connection.
+
+5. Acknowledgments
+
+ Thanks to Robert Ransom for helping with the proposal and designing
+ the original safe-cookie authentication scheme. Thanks to Nick
+ Mathewson for advices and reviews of the proposal.
+
+[0]:
+http://archives.seul.org/or/announce/Sep-2007/msg00000.html
+
+[1]:
+https://gitweb.torproject.org/torspec.git/blob/79f488c32c43562522e5592f2c19952dc7681a65:/control-spec.txt#l1069
+
1
0
[translation/torbirdy_completed] Update translations for torbirdy_completed
by translation@torproject.org 28 Nov '12
by translation@torproject.org 28 Nov '12
28 Nov '12
commit 6668ca98d7aa80e02d3ccd71345dab2ebde9e7ad
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Nov 28 00:47:01 2012 +0000
Update translations for torbirdy_completed
---
es/torbirdy.dtd | 2 ++
es/torbirdy.properties | 2 ++
2 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/es/torbirdy.dtd b/es/torbirdy.dtd
index b84849a..b174e71 100644
--- a/es/torbirdy.dtd
+++ b/es/torbirdy.dtd
@@ -33,6 +33,8 @@
<!ENTITY torbirdy.prefs.imap.key "i">
<!ENTITY torbirdy.prefs.startup_folder.label "Seleccionar al iniciar el último directorio de correo utilizado [por defecto: deshabilitado, se seleccionará Carpetas locales]">
<!ENTITY torbirdy.prefs.startup_folder.key "l">
+<!ENTITY torbirdy.prefs.timezone.label "No establecer la zona horaria de Thunderbird a UTC [por defecto: establecer a UTC]">
+<!ENTITY torbirdy.prefs.timezone.key "z">
<!ENTITY torbirdy.prefs.enigmail_throwkeyid.label "Deshabilitar GPG '--throw-keyids' [por defecto: habilitado]">
<!ENTITY torbirdy.prefs.enigmail_throwkeyid.key "g">
<!ENTITY torbirdy.prefs.account_specific "Configuración específica de la cuenta">
diff --git a/es/torbirdy.properties b/es/torbirdy.properties
index 568015c..e4b3ff5 100644
--- a/es/torbirdy.properties
+++ b/es/torbirdy.properties
@@ -11,3 +11,5 @@ torbirdy.email.prompt=TorBirdy ha deshabilitado el asistente de auto-configuraci
torbirdy.email.advanced=Por favor, ten en cuenta que recomendamos NO cambiar la configuración avanzada de TorBirdy.⏎ ⏎ Debes continuar sólo si estás seguro/a de lo que estás haciendo.
torbirdy.email.advanced.nextwarning=Mostrar una advertencia la próxima vez
torbirdy.email.advanced.title=Configuración avanzada de TorBirdy
+
+torbirdy.restart=Para que la preferencia de zona horaria cause efecto, cierre Thunderbird e inícielo de nuevo.
1
0
28 Nov '12
commit 58dd8692527f7dea44dc4393afc7a00647a803af
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Nov 28 00:46:55 2012 +0000
Update translations for torbirdy
---
es/torbirdy.dtd | 4 ++--
es/torbirdy.properties | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/es/torbirdy.dtd b/es/torbirdy.dtd
index 7f872e7..b174e71 100644
--- a/es/torbirdy.dtd
+++ b/es/torbirdy.dtd
@@ -33,8 +33,8 @@
<!ENTITY torbirdy.prefs.imap.key "i">
<!ENTITY torbirdy.prefs.startup_folder.label "Seleccionar al iniciar el último directorio de correo utilizado [por defecto: deshabilitado, se seleccionará Carpetas locales]">
<!ENTITY torbirdy.prefs.startup_folder.key "l">
-<!ENTITY torbirdy.prefs.timezone.label "">
-<!ENTITY torbirdy.prefs.timezone.key "">
+<!ENTITY torbirdy.prefs.timezone.label "No establecer la zona horaria de Thunderbird a UTC [por defecto: establecer a UTC]">
+<!ENTITY torbirdy.prefs.timezone.key "z">
<!ENTITY torbirdy.prefs.enigmail_throwkeyid.label "Deshabilitar GPG '--throw-keyids' [por defecto: habilitado]">
<!ENTITY torbirdy.prefs.enigmail_throwkeyid.key "g">
<!ENTITY torbirdy.prefs.account_specific "Configuración específica de la cuenta">
diff --git a/es/torbirdy.properties b/es/torbirdy.properties
index 28619e1..e4b3ff5 100644
--- a/es/torbirdy.properties
+++ b/es/torbirdy.properties
@@ -12,4 +12,4 @@ torbirdy.email.advanced=Por favor, ten en cuenta que recomendamos NO cambiar la
torbirdy.email.advanced.nextwarning=Mostrar una advertencia la próxima vez
torbirdy.email.advanced.title=Configuración avanzada de TorBirdy
-# torbirdy.restart=For the time zone preference to take effect, please close Thunderbird and start it again.
+torbirdy.restart=Para que la preferencia de zona horaria cause efecto, cierre Thunderbird e inícielo de nuevo.
1
0