tor-commits
Threads by month
- ----- 2025 -----
- 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
April 2015
- 19 participants
- 1110 discussions

[translation/tails-greeter] Update translations for tails-greeter
by translation@torproject.org 09 Apr '15
by translation@torproject.org 09 Apr '15
09 Apr '15
commit d82af67645bc38d33446e0fbb2fbb0d81b0e922f
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 9 19:15:27 2015 +0000
Update translations for tails-greeter
---
ar/ar.po | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index e1189b3..3bc1c99 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -4,6 +4,7 @@
#
# Translators:
# kraim <biskraim(a)gmail.com>, 2013
+# Amr Syria <safianxs(a)bk.ru>, 2015
# Arwa, 2014
# 0xidz <ghoucine(a)gmail.com>, 2014
# guessous.uni <guessousuni(a)gmail.com>, 2014
@@ -16,9 +17,9 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-07-01 22:07+0200\n"
-"PO-Revision-Date: 2014-07-04 14:31+0000\n"
-"Last-Translator: 0xidz <ghoucine(a)gmail.com>\n"
+"POT-Creation-Date: 2014-10-15 16:05+0200\n"
+"PO-Revision-Date: 2015-04-09 19:02+0000\n"
+"Last-Translator: Amr Syria <safianxs(a)bk.ru>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/torproject/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -112,7 +113,7 @@ msgstr "<a href=\"doc/first_steps/startup_options/windows_camouflage.en.html\">
msgid ""
"This option makes Tails look more like Microsoft Windows 8. This may be "
"useful in public places in order to avoid attracting suspicion."
-msgstr "هذه الخصيصة ستجعل تيلز يبدو مثل ويندوز 8. قد يكون هذا مفيدا في الأماكن العامة حتى لا يجلب الشبهات."
+msgstr "هذه الخاصية ستجعل تيلز يبدو مثل ويندوز 8. قد يكون هذا مفيدا في الأماكن العامة حتى لا يثير الشبهات."
#: ../glade/optionswindow.glade.h:13
msgid "Activate Microsoft Windows 8 Camouflage"
1
0

[translation/liveusb-creator_completed] Update translations for liveusb-creator_completed
by translation@torproject.org 09 Apr '15
by translation@torproject.org 09 Apr '15
09 Apr '15
commit 47317504178b279cf5fc0b27f9c479f7d6d6355e
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 9 19:15:21 2015 +0000
Update translations for liveusb-creator_completed
---
ar/ar.po | 123 +++++++++++++++++++++++++++++++-------------------------------
1 file changed, 62 insertions(+), 61 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index a8d6d3b..4a6bbf9 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -5,6 +5,7 @@
# Translators:
# kraim <biskraim(a)gmail.com>, 2013
# Abdullah Al Hatim <abo0ody2689(a)gmail.com>, 2012
+# Amr Syria <safianxs(a)bk.ru>, 2015
# طاهر <charaf.le.prince(a)gmail.com>, 2014
# Fadi Mansour <fadi.redeemer.mansour(a)gmail.com>, 2012
# 0xidz <ghoucine(a)gmail.com>, 2014
@@ -17,9 +18,9 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-02-23 13:07+0100\n"
-"PO-Revision-Date: 2015-03-23 22:50+0000\n"
-"Last-Translator: stayanonymous\n"
+"POT-Creation-Date: 2015-03-30 14:40+0200\n"
+"PO-Revision-Date: 2015-04-09 19:12+0000\n"
+"Last-Translator: Amr Syria <safianxs(a)bk.ru>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/torproject/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -47,10 +48,10 @@ msgstr "%(size)s %(label)s"
msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
-#: ../liveusb/creator.py:1063
+#: ../liveusb/creator.py:1072
#, python-format
msgid "%s already bootable"
-msgstr "%s اصلاً جاهز للأقلاع"
+msgstr "%s جاهز للأقلاع "
#: ../liveusb/launcher_ui.py:156
msgid ""
@@ -104,16 +105,16 @@ msgid ""
"persist after a reboot."
msgstr "إذا خصصت مساحة إضافية في قرص الـUSB لتصبح مساحة دائمة، سوف تستطيع أن تخزن البيانات و القيام بتعديلات دائمة علي نظام التشغيل الحي. من دون المساحة الإضافية الدائمة لن تستطيع حفظ البياناتت و ستفقدها إذا تم إعادة تشغيل النظام."
-#: ../liveusb/creator.py:1162 ../liveusb/creator.py:1425
+#: ../liveusb/creator.py:1171 ../liveusb/creator.py:1434
#, python-format
msgid "Calculating the SHA1 of %s"
msgstr "يتم حساب SHA1 الخاص بـ %s"
-#: ../liveusb/creator.py:1373
+#: ../liveusb/creator.py:1382
msgid "Cannot find"
msgstr "لا يمكن العثور"
-#: ../liveusb/creator.py:556
+#: ../liveusb/creator.py:558
#, python-format
msgid "Cannot find device %s"
msgstr "لا يمكن العثور على الجهاز %s"
@@ -132,7 +133,7 @@ msgid ""
"Upgrade"
msgstr "استنسخ\nو\nحدث"
-#: ../liveusb/creator.py:408
+#: ../liveusb/creator.py:410
#, python-format
msgid "Creating %sMB persistent overlay"
msgstr "يتم إنشاء مكان تخزين دائم بحجم %s ميجابايت"
@@ -160,16 +161,16 @@ msgstr "التحميل فشل: "
msgid "Downloading %s..."
msgstr "جاري التحميل %s..."
-#: ../liveusb/creator.py:1158
+#: ../liveusb/creator.py:1167
msgid "Drive is a loopback, skipping MBR reset"
msgstr "نوع القرص loopback ، سيتم تجاوز إعادة ضبط سجل الإقلاع الرئيسي"
-#: ../liveusb/creator.py:827
+#: ../liveusb/creator.py:836
#, python-format
msgid "Entering unmount_device for '%(device)s'"
msgstr "يتم الدخول على unmount_device للجهاز '%(device)s'"
-#: ../liveusb/creator.py:1238
+#: ../liveusb/creator.py:1247
msgid "Error probing device"
msgstr "خطأ بفحص الجهاز"
@@ -179,26 +180,26 @@ msgid ""
"continue."
msgstr "خطأ: لا يمكن ضبط العنوان أو الحصول على رقم الـUUID لجهازك. ﻻ يمكن المتابعة."
-#: ../liveusb/creator.py:384
+#: ../liveusb/creator.py:386
msgid ""
"Error: The SHA1 of your Live CD is invalid. You can run this program with "
"the --noverify argument to bypass this verification check."
msgstr "خطأ: إن الـSHA1 للقرص الحي غير صحيح. تستطيع تشغيل هذا البرنامج باستخدام المعطى --noverify لتجاوز الفحص."
-#: ../liveusb/creator.py:147
+#: ../liveusb/creator.py:148
msgid "Extracting live image to the target device..."
msgstr "جاري فك ضغط ملف الأيزو بداخل الجهاز المختار..."
-#: ../liveusb/creator.py:1106
+#: ../liveusb/creator.py:1115
#, python-format
msgid "Formatting %(device)s as FAT32"
msgstr "يتم إعادة تشكيل جهاز %(device)s كنظام FAT32"
-#: ../liveusb/creator.py:142
+#: ../liveusb/creator.py:143
msgid "ISO MD5 checksum passed"
msgstr "نجح التحقق من الـMD5 لملف الأيزو"
-#: ../liveusb/creator.py:140
+#: ../liveusb/creator.py:141
msgid "ISO MD5 checksum verification failed"
msgstr "التحقق من الـMD5 لملف الأيزو فشل"
@@ -225,7 +226,7 @@ msgstr "تم التثبيت! (%s)"
msgid "Installation was completed. Press OK to close this program."
msgstr "تم التثبيت. اضغط \"موافق\" لإغلاق هذا البرنامج."
-#: ../liveusb/creator.py:963 ../liveusb/creator.py:1279
+#: ../liveusb/creator.py:972 ../liveusb/creator.py:1288
msgid "Installing bootloader..."
msgstr "تنصيب نظام الاقلاع ..."
@@ -233,18 +234,18 @@ msgstr "تنصيب نظام الاقلاع ..."
msgid "LiveUSB creation failed!"
msgstr "فشل إنشاء قرص USB حي!"
-#: ../liveusb/creator.py:1374
+#: ../liveusb/creator.py:1383
msgid ""
"Make sure to extract the entire liveusb-creator zip file before running this"
" program."
msgstr "تأكد من فك ضغط ملف \"liveusb-creator\" قبل العمل بالبرنامج."
-#: ../liveusb/creator.py:1250
+#: ../liveusb/creator.py:1259
msgid ""
"Make sure your USB key is plugged in and formatted with the FAT filesystem"
msgstr "تأكد أن قرص الـ USB متصل بالجهاز وتم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/creator.py:849
+#: ../liveusb/creator.py:858
#, python-format
msgid "Mount %s exists after unmounting"
msgstr "تركيب %s موجود بعد إزالة الجهاز"
@@ -254,11 +255,11 @@ msgstr "تركيب %s موجود بعد إزالة الجهاز"
msgid "No free space on device %(device)s"
msgstr "لا توجد مساحة فارغة على الجهاز %(device)s"
-#: ../liveusb/creator.py:816
+#: ../liveusb/creator.py:825
msgid "No mount points found"
msgstr "لا توجد نقاط تركيب"
-#: ../liveusb/creator.py:401
+#: ../liveusb/creator.py:403
#, python-format
msgid ""
"Not enough free space on device.\n"
@@ -273,7 +274,7 @@ msgstr "صيغة هذا القسم هي FAT16؛ سيتم تحديد المساح
msgid "Partition is FAT32; Restricting overlay size to 4G"
msgstr "صيغة تقسيمة التخزين هي FAT32، و هذا سيحد حجم الملفات إلى ٤ جيجابايت."
-#: ../liveusb/creator.py:228 ../liveusb/creator.py:856
+#: ../liveusb/creator.py:229 ../liveusb/creator.py:865
#, python-format
msgid "Partitioning device %(device)s"
msgstr "تقسيم الجهاز %(device)s"
@@ -298,16 +299,16 @@ msgstr "تحديث النشرات..."
msgid "Releases updated!"
msgstr "تم تحديث النشرات!"
-#: ../liveusb/creator.py:970 ../liveusb/creator.py:1297
+#: ../liveusb/creator.py:979 ../liveusb/creator.py:1306
#, python-format
msgid "Removing %(file)s"
msgstr "إزالة ملفات %(file)s"
-#: ../liveusb/creator.py:483
+#: ../liveusb/creator.py:485
msgid "Removing existing Live OS"
msgstr "يتم حاليا إزالة نظام التشغيل الحي الموجود أصلاً"
-#: ../liveusb/creator.py:1152
+#: ../liveusb/creator.py:1161
#, python-format
msgid "Resetting Master Boot Record of %s"
msgstr "إعادة ضبط سجل الإقلاع الرئيسي الخاص بـ %s"
@@ -316,23 +317,23 @@ msgstr "إعادة ضبط سجل الإقلاع الرئيسي الخاص بـ %
msgid "Select Live ISO"
msgstr "حدد ملف أيزو حي"
-#: ../liveusb/creator.py:184
+#: ../liveusb/creator.py:185
msgid "Setting up OLPC boot file..."
msgstr "تجهيز ملف الإقلاع \"OLPC\"..."
-#: ../liveusb/creator.py:730
+#: ../liveusb/creator.py:739
#, python-format
msgid ""
"Some partitions of the target device %(device)s are mounted. They will be "
"unmounted before starting the installation process."
msgstr "بعض اقسام الجهاز المختار %(device)s مركبة. سيتم فكهم قبل بدء عملية التثبيت."
-#: ../liveusb/creator.py:133
+#: ../liveusb/creator.py:134
msgid ""
"Source type does not support verification of ISO MD5 checksum, skipping"
msgstr "نوع المصدر لا يدعم التحقق من الـMD5 لملف الأيزو، سيتم التجاوز"
-#: ../liveusb/creator.py:1186
+#: ../liveusb/creator.py:1195
msgid "Synchronizing data on disk..."
msgstr "مزامنة البيانات الموجودة على القرص ..."
@@ -346,7 +347,7 @@ msgid ""
"another file."
msgstr "الملف المختار غير قابل للقراءة. الرجاء تغيير صلاحياته أو اختيار ملف آخر."
-#: ../liveusb/creator.py:345
+#: ../liveusb/creator.py:347
#, python-format
msgid ""
"There was a problem executing the following command: `%(command)s`.\n"
@@ -384,7 +385,7 @@ msgstr "هذا هو شريط التقدم و سوف يشير إلي مدي تق
msgid "This is the status console, where all messages get written to."
msgstr "هذه هي لوحة مراقبة الحالة و هنا يتم طباعة كل الرسائل."
-#: ../liveusb/creator.py:925
+#: ../liveusb/creator.py:934
msgid "Trying to continue anyway."
msgstr "على أية حال سوف أحاول المتابعة."
@@ -392,17 +393,17 @@ msgstr "على أية حال سوف أحاول المتابعة."
msgid "USB drive found"
msgstr "تم العثور على محرك أقراص USB"
-#: ../liveusb/creator.py:958
+#: ../liveusb/creator.py:967
#, python-format
msgid "Unable to change volume label: %(message)s"
msgstr "غير قادر على تغيير عنوان القرص: %(message)s"
-#: ../liveusb/creator.py:492 ../liveusb/creator.py:503
+#: ../liveusb/creator.py:494 ../liveusb/creator.py:505
#, python-format
msgid "Unable to chmod %(file)s: %(message)s"
msgstr "غير قادر علي تغيير صلاحيات %(file)s: %(message)s"
-#: ../liveusb/creator.py:469
+#: ../liveusb/creator.py:471
#, python-format
msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
msgstr "غير قادر علي نسخ %(infile)s لـ %(outfile)s: %(message)s"
@@ -411,15 +412,15 @@ msgstr "غير قادر علي نسخ %(infile)s لـ %(outfile)s: %(message)s"
msgid "Unable to find any USB drive"
msgstr "لم يتم العثور على أي قرص USB."
-#: ../liveusb/creator.py:1240
+#: ../liveusb/creator.py:1249
msgid "Unable to find any supported device"
msgstr "غير قادر على العثور على أي جهاز مدعوم"
-#: ../liveusb/creator.py:1083
+#: ../liveusb/creator.py:1092
msgid "Unable to find partition"
msgstr "غير قادر على ايجاد تقسيمة القرص"
-#: ../liveusb/creator.py:1320
+#: ../liveusb/creator.py:1329
msgid ""
"Unable to get Win32_LogicalDisk; win32com query did not return any results"
msgstr "غير قادر علي الحصول علي Win32_LogicalDisk; win32com الطلب لم ينتج عنه أي نتائج"
@@ -428,22 +429,22 @@ msgstr "غير قادر علي الحصول علي Win32_LogicalDisk; win32com
msgid "Unable to mount device"
msgstr "لا يمكن تركيب الجهاز"
-#: ../liveusb/creator.py:804
+#: ../liveusb/creator.py:813
#, python-format
msgid "Unable to mount device: %(message)s"
msgstr "غير قادر على تركيب جهاز: %(message)s"
-#: ../liveusb/creator.py:508
+#: ../liveusb/creator.py:510
#, python-format
msgid "Unable to remove directory from previous LiveOS: %(message)s"
msgstr "غير قادر علي إزالة مجلد من نظام التشغيل الحي السابق: %(message)s"
-#: ../liveusb/creator.py:496
+#: ../liveusb/creator.py:498
#, python-format
msgid "Unable to remove file from previous LiveOS: %(message)s"
msgstr "غير قادر علي إزالة ملف من نظام التشغيل الحي السابق: %(message)s"
-#: ../liveusb/creator.py:1155
+#: ../liveusb/creator.py:1164
msgid ""
"Unable to reset MBR. You may not have the `syslinux` package installed."
msgstr "غير قادر على إعادة ضبط سجل الإقلاع الرئيسي. قد تكون حزمة `syslinux` غير مثبتة."
@@ -454,21 +455,21 @@ msgid ""
"ISO to the root of your drive (ie: C:\\)"
msgstr "لا يمكن استخدام الملف المُحدد. قد يحالفك حظ أكثر إن نقلت ملف الأيزو إلى المجلد الرئيسي لقرصك (C:\\ على سبيل المثال)"
-#: ../liveusb/creator.py:711
+#: ../liveusb/creator.py:720
#, python-format
msgid "Unable to write on %(device)s, skipping."
msgstr "غير قادر على الكتابة على الجهاز %(device)s، سيتم التجاوز."
-#: ../liveusb/creator.py:390
+#: ../liveusb/creator.py:392
msgid "Unknown ISO, skipping checksum verification"
msgstr "ملف أيزو غير معروف، سيتم تجاوز الفحص."
-#: ../liveusb/creator.py:800
+#: ../liveusb/creator.py:809
#, python-format
msgid "Unknown dbus exception while trying to mount device: %(message)s"
msgstr "خطأ غير معروف ببرنامج dbus عند محاولة تركيب جهاز: %(message)s"
-#: ../liveusb/creator.py:779 ../liveusb/creator.py:937
+#: ../liveusb/creator.py:788 ../liveusb/creator.py:946
msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr "نظام ملفات غير معرف. قد يحتاج جهازك إلى إعادة تشكيل."
@@ -477,41 +478,41 @@ msgstr "نظام ملفات غير معرف. قد يحتاج جهازك إلى
msgid "Unknown release: %s"
msgstr "إصدار غير معروف: %s"
-#: ../liveusb/creator.py:841
+#: ../liveusb/creator.py:850
#, python-format
msgid "Unmounting '%(udi)s' on '%(device)s'"
msgstr "إزالة تثبيت '%(udi)s' على '%(device)s'"
-#: ../liveusb/creator.py:837
+#: ../liveusb/creator.py:846
#, python-format
msgid "Unmounting mounted filesystems on '%(device)s'"
msgstr "إزالة تثبيت نظام الملفات من '%(device)s'"
-#: ../liveusb/creator.py:922
+#: ../liveusb/creator.py:931
#, python-format
msgid "Unsupported device '%(device)s', please report a bug."
msgstr "هذا الجهاز غير مدعوم '%(device)s', الرجاء الابلاغ عن العطل."
-#: ../liveusb/creator.py:784 ../liveusb/creator.py:940
+#: ../liveusb/creator.py:793 ../liveusb/creator.py:949
#, python-format
msgid "Unsupported filesystem: %s"
msgstr "نظام ملفات غير مدعوم: %s"
-#: ../liveusb/creator.py:782
+#: ../liveusb/creator.py:791
#, python-format
msgid ""
"Unsupported filesystem: %s\n"
"In case you are trying to upgrade a manually installed Tails system (that is, if it was installed without this installer), this option is not supported: you need to install it anew to start with, e.g. by choosing the \"Clone & Install\" action instead."
msgstr "نظام ملفات غير مدعوم: %s\nفي حالة محاولتك تنصيب تحديث لنظام تيلز (و هو لم يتم تثبيتة من قبل هذا المثبت), هذا الخيار غير مدعوم: يجب عليك أن تثبت البرنامج من جديد و يرجح أستخدام امر \"أستنساخ و تثبيت\""
-#: ../liveusb/creator.py:1253
+#: ../liveusb/creator.py:1262
#, python-format
msgid ""
"Unsupported filesystem: %s\n"
"Please backup and format your USB key with the FAT filesystem."
msgstr "نظام ملفات غير مدعوم: %s\nالرجاء نسخ قرص USB نسخة احتياطية ثم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/creator.py:882
+#: ../liveusb/creator.py:891
#, python-format
msgid "Updating properties of system partition %(system_partition)s"
msgstr "جاري تحديث خصائص تجزئة القرص الخاصة بالنظام %(system_partition)s"
@@ -524,19 +525,19 @@ msgstr "التحديث من ملف أيزو"
msgid "Use existing Live system ISO"
msgstr "أستخدام نظام تشغيل حي بصيغة أيزو"
-#: ../liveusb/creator.py:135
+#: ../liveusb/creator.py:136
msgid "Verifying ISO MD5 checksum"
msgstr "يتم التحقق من الـMD5 لملف الأيزو"
-#: ../liveusb/creator.py:364
+#: ../liveusb/creator.py:366
msgid "Verifying SHA1 checksum of LiveCD image..."
msgstr "التحقق من الـSHA1 لملف القرص الحي..."
-#: ../liveusb/creator.py:368
+#: ../liveusb/creator.py:370
msgid "Verifying SHA256 checksum of LiveCD image..."
msgstr "التحقق من الـSHA256 لملف القرص الحي..."
-#: ../liveusb/creator.py:934 ../liveusb/creator.py:1246
+#: ../liveusb/creator.py:943 ../liveusb/creator.py:1255
msgid "Verifying filesystem..."
msgstr "جاري التحقق من نظام الملفات"
@@ -552,7 +553,7 @@ msgid ""
"check the \"Run this program as an administrator\" box."
msgstr "تنبيه: يجب تنفيذ هذه الأداة بصلاحيات مدير النظام. لعمل هذا، انقر باليمين على الأيقونة وافتح الخصائص. في صفحة \"Compatibility/التوافقية\"، فعل الخيار \"Run this program as an administrator/قم بتشغيل هذا التطبيق كمدير\"."
-#: ../liveusb/creator.py:154
+#: ../liveusb/creator.py:155
#, python-format
msgid "Wrote to device at %(speed)d MB/sec"
msgstr "تمت الكتابة علي الجهاز بسرعة %(speed)d ميغابايت بالثانية"
@@ -572,7 +573,7 @@ msgid ""
"unchanged. Continue?"
msgstr "ستقوم بتحديث تايلز على %(parent_size)s %(vendor)s %(model)s جهاز (%(device)s). كل البيانات المحفوظة ستتم كما هي. هل تريد الاستمرار؟"
-#: ../liveusb/creator.py:618
+#: ../liveusb/creator.py:620
msgid ""
"You are using an old version of syslinux-extlinux that does not support the "
"ext4 filesystem"
@@ -582,7 +583,7 @@ msgstr "أنت تستخدم نسخة قديمة من syslinux-extlinux، وهي
msgid "You can try again to resume your download"
msgstr "تستطيع المحاولة مرة أخرى لاستئناف التحميل"
-#: ../liveusb/creator.py:94
+#: ../liveusb/creator.py:95
msgid "You must run this application as root"
msgstr "من الضروري ان يعمل هذا التطبيق بصلاحيات حساب رووت"
1
0

[translation/liveusb-creator] Update translations for liveusb-creator
by translation@torproject.org 09 Apr '15
by translation@torproject.org 09 Apr '15
09 Apr '15
commit 6291fdf42a91c6c41ca85ba1dce24abd7fa472b1
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 9 19:15:17 2015 +0000
Update translations for liveusb-creator
---
ar/ar.po | 123 +++++++++++++++++++++++++++++++-------------------------------
1 file changed, 62 insertions(+), 61 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index a8d6d3b..4a6bbf9 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -5,6 +5,7 @@
# Translators:
# kraim <biskraim(a)gmail.com>, 2013
# Abdullah Al Hatim <abo0ody2689(a)gmail.com>, 2012
+# Amr Syria <safianxs(a)bk.ru>, 2015
# طاهر <charaf.le.prince(a)gmail.com>, 2014
# Fadi Mansour <fadi.redeemer.mansour(a)gmail.com>, 2012
# 0xidz <ghoucine(a)gmail.com>, 2014
@@ -17,9 +18,9 @@ msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-02-23 13:07+0100\n"
-"PO-Revision-Date: 2015-03-23 22:50+0000\n"
-"Last-Translator: stayanonymous\n"
+"POT-Creation-Date: 2015-03-30 14:40+0200\n"
+"PO-Revision-Date: 2015-04-09 19:12+0000\n"
+"Last-Translator: Amr Syria <safianxs(a)bk.ru>\n"
"Language-Team: Arabic (http://www.transifex.com/projects/p/torproject/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -47,10 +48,10 @@ msgstr "%(size)s %(label)s"
msgid "%(vendor)s %(model)s (%(details)s) - %(device)s"
msgstr "%(vendor)s %(model)s (%(details)s) - %(device)s"
-#: ../liveusb/creator.py:1063
+#: ../liveusb/creator.py:1072
#, python-format
msgid "%s already bootable"
-msgstr "%s اصلاً جاهز للأقلاع"
+msgstr "%s جاهز للأقلاع "
#: ../liveusb/launcher_ui.py:156
msgid ""
@@ -104,16 +105,16 @@ msgid ""
"persist after a reboot."
msgstr "إذا خصصت مساحة إضافية في قرص الـUSB لتصبح مساحة دائمة، سوف تستطيع أن تخزن البيانات و القيام بتعديلات دائمة علي نظام التشغيل الحي. من دون المساحة الإضافية الدائمة لن تستطيع حفظ البياناتت و ستفقدها إذا تم إعادة تشغيل النظام."
-#: ../liveusb/creator.py:1162 ../liveusb/creator.py:1425
+#: ../liveusb/creator.py:1171 ../liveusb/creator.py:1434
#, python-format
msgid "Calculating the SHA1 of %s"
msgstr "يتم حساب SHA1 الخاص بـ %s"
-#: ../liveusb/creator.py:1373
+#: ../liveusb/creator.py:1382
msgid "Cannot find"
msgstr "لا يمكن العثور"
-#: ../liveusb/creator.py:556
+#: ../liveusb/creator.py:558
#, python-format
msgid "Cannot find device %s"
msgstr "لا يمكن العثور على الجهاز %s"
@@ -132,7 +133,7 @@ msgid ""
"Upgrade"
msgstr "استنسخ\nو\nحدث"
-#: ../liveusb/creator.py:408
+#: ../liveusb/creator.py:410
#, python-format
msgid "Creating %sMB persistent overlay"
msgstr "يتم إنشاء مكان تخزين دائم بحجم %s ميجابايت"
@@ -160,16 +161,16 @@ msgstr "التحميل فشل: "
msgid "Downloading %s..."
msgstr "جاري التحميل %s..."
-#: ../liveusb/creator.py:1158
+#: ../liveusb/creator.py:1167
msgid "Drive is a loopback, skipping MBR reset"
msgstr "نوع القرص loopback ، سيتم تجاوز إعادة ضبط سجل الإقلاع الرئيسي"
-#: ../liveusb/creator.py:827
+#: ../liveusb/creator.py:836
#, python-format
msgid "Entering unmount_device for '%(device)s'"
msgstr "يتم الدخول على unmount_device للجهاز '%(device)s'"
-#: ../liveusb/creator.py:1238
+#: ../liveusb/creator.py:1247
msgid "Error probing device"
msgstr "خطأ بفحص الجهاز"
@@ -179,26 +180,26 @@ msgid ""
"continue."
msgstr "خطأ: لا يمكن ضبط العنوان أو الحصول على رقم الـUUID لجهازك. ﻻ يمكن المتابعة."
-#: ../liveusb/creator.py:384
+#: ../liveusb/creator.py:386
msgid ""
"Error: The SHA1 of your Live CD is invalid. You can run this program with "
"the --noverify argument to bypass this verification check."
msgstr "خطأ: إن الـSHA1 للقرص الحي غير صحيح. تستطيع تشغيل هذا البرنامج باستخدام المعطى --noverify لتجاوز الفحص."
-#: ../liveusb/creator.py:147
+#: ../liveusb/creator.py:148
msgid "Extracting live image to the target device..."
msgstr "جاري فك ضغط ملف الأيزو بداخل الجهاز المختار..."
-#: ../liveusb/creator.py:1106
+#: ../liveusb/creator.py:1115
#, python-format
msgid "Formatting %(device)s as FAT32"
msgstr "يتم إعادة تشكيل جهاز %(device)s كنظام FAT32"
-#: ../liveusb/creator.py:142
+#: ../liveusb/creator.py:143
msgid "ISO MD5 checksum passed"
msgstr "نجح التحقق من الـMD5 لملف الأيزو"
-#: ../liveusb/creator.py:140
+#: ../liveusb/creator.py:141
msgid "ISO MD5 checksum verification failed"
msgstr "التحقق من الـMD5 لملف الأيزو فشل"
@@ -225,7 +226,7 @@ msgstr "تم التثبيت! (%s)"
msgid "Installation was completed. Press OK to close this program."
msgstr "تم التثبيت. اضغط \"موافق\" لإغلاق هذا البرنامج."
-#: ../liveusb/creator.py:963 ../liveusb/creator.py:1279
+#: ../liveusb/creator.py:972 ../liveusb/creator.py:1288
msgid "Installing bootloader..."
msgstr "تنصيب نظام الاقلاع ..."
@@ -233,18 +234,18 @@ msgstr "تنصيب نظام الاقلاع ..."
msgid "LiveUSB creation failed!"
msgstr "فشل إنشاء قرص USB حي!"
-#: ../liveusb/creator.py:1374
+#: ../liveusb/creator.py:1383
msgid ""
"Make sure to extract the entire liveusb-creator zip file before running this"
" program."
msgstr "تأكد من فك ضغط ملف \"liveusb-creator\" قبل العمل بالبرنامج."
-#: ../liveusb/creator.py:1250
+#: ../liveusb/creator.py:1259
msgid ""
"Make sure your USB key is plugged in and formatted with the FAT filesystem"
msgstr "تأكد أن قرص الـ USB متصل بالجهاز وتم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/creator.py:849
+#: ../liveusb/creator.py:858
#, python-format
msgid "Mount %s exists after unmounting"
msgstr "تركيب %s موجود بعد إزالة الجهاز"
@@ -254,11 +255,11 @@ msgstr "تركيب %s موجود بعد إزالة الجهاز"
msgid "No free space on device %(device)s"
msgstr "لا توجد مساحة فارغة على الجهاز %(device)s"
-#: ../liveusb/creator.py:816
+#: ../liveusb/creator.py:825
msgid "No mount points found"
msgstr "لا توجد نقاط تركيب"
-#: ../liveusb/creator.py:401
+#: ../liveusb/creator.py:403
#, python-format
msgid ""
"Not enough free space on device.\n"
@@ -273,7 +274,7 @@ msgstr "صيغة هذا القسم هي FAT16؛ سيتم تحديد المساح
msgid "Partition is FAT32; Restricting overlay size to 4G"
msgstr "صيغة تقسيمة التخزين هي FAT32، و هذا سيحد حجم الملفات إلى ٤ جيجابايت."
-#: ../liveusb/creator.py:228 ../liveusb/creator.py:856
+#: ../liveusb/creator.py:229 ../liveusb/creator.py:865
#, python-format
msgid "Partitioning device %(device)s"
msgstr "تقسيم الجهاز %(device)s"
@@ -298,16 +299,16 @@ msgstr "تحديث النشرات..."
msgid "Releases updated!"
msgstr "تم تحديث النشرات!"
-#: ../liveusb/creator.py:970 ../liveusb/creator.py:1297
+#: ../liveusb/creator.py:979 ../liveusb/creator.py:1306
#, python-format
msgid "Removing %(file)s"
msgstr "إزالة ملفات %(file)s"
-#: ../liveusb/creator.py:483
+#: ../liveusb/creator.py:485
msgid "Removing existing Live OS"
msgstr "يتم حاليا إزالة نظام التشغيل الحي الموجود أصلاً"
-#: ../liveusb/creator.py:1152
+#: ../liveusb/creator.py:1161
#, python-format
msgid "Resetting Master Boot Record of %s"
msgstr "إعادة ضبط سجل الإقلاع الرئيسي الخاص بـ %s"
@@ -316,23 +317,23 @@ msgstr "إعادة ضبط سجل الإقلاع الرئيسي الخاص بـ %
msgid "Select Live ISO"
msgstr "حدد ملف أيزو حي"
-#: ../liveusb/creator.py:184
+#: ../liveusb/creator.py:185
msgid "Setting up OLPC boot file..."
msgstr "تجهيز ملف الإقلاع \"OLPC\"..."
-#: ../liveusb/creator.py:730
+#: ../liveusb/creator.py:739
#, python-format
msgid ""
"Some partitions of the target device %(device)s are mounted. They will be "
"unmounted before starting the installation process."
msgstr "بعض اقسام الجهاز المختار %(device)s مركبة. سيتم فكهم قبل بدء عملية التثبيت."
-#: ../liveusb/creator.py:133
+#: ../liveusb/creator.py:134
msgid ""
"Source type does not support verification of ISO MD5 checksum, skipping"
msgstr "نوع المصدر لا يدعم التحقق من الـMD5 لملف الأيزو، سيتم التجاوز"
-#: ../liveusb/creator.py:1186
+#: ../liveusb/creator.py:1195
msgid "Synchronizing data on disk..."
msgstr "مزامنة البيانات الموجودة على القرص ..."
@@ -346,7 +347,7 @@ msgid ""
"another file."
msgstr "الملف المختار غير قابل للقراءة. الرجاء تغيير صلاحياته أو اختيار ملف آخر."
-#: ../liveusb/creator.py:345
+#: ../liveusb/creator.py:347
#, python-format
msgid ""
"There was a problem executing the following command: `%(command)s`.\n"
@@ -384,7 +385,7 @@ msgstr "هذا هو شريط التقدم و سوف يشير إلي مدي تق
msgid "This is the status console, where all messages get written to."
msgstr "هذه هي لوحة مراقبة الحالة و هنا يتم طباعة كل الرسائل."
-#: ../liveusb/creator.py:925
+#: ../liveusb/creator.py:934
msgid "Trying to continue anyway."
msgstr "على أية حال سوف أحاول المتابعة."
@@ -392,17 +393,17 @@ msgstr "على أية حال سوف أحاول المتابعة."
msgid "USB drive found"
msgstr "تم العثور على محرك أقراص USB"
-#: ../liveusb/creator.py:958
+#: ../liveusb/creator.py:967
#, python-format
msgid "Unable to change volume label: %(message)s"
msgstr "غير قادر على تغيير عنوان القرص: %(message)s"
-#: ../liveusb/creator.py:492 ../liveusb/creator.py:503
+#: ../liveusb/creator.py:494 ../liveusb/creator.py:505
#, python-format
msgid "Unable to chmod %(file)s: %(message)s"
msgstr "غير قادر علي تغيير صلاحيات %(file)s: %(message)s"
-#: ../liveusb/creator.py:469
+#: ../liveusb/creator.py:471
#, python-format
msgid "Unable to copy %(infile)s to %(outfile)s: %(message)s"
msgstr "غير قادر علي نسخ %(infile)s لـ %(outfile)s: %(message)s"
@@ -411,15 +412,15 @@ msgstr "غير قادر علي نسخ %(infile)s لـ %(outfile)s: %(message)s"
msgid "Unable to find any USB drive"
msgstr "لم يتم العثور على أي قرص USB."
-#: ../liveusb/creator.py:1240
+#: ../liveusb/creator.py:1249
msgid "Unable to find any supported device"
msgstr "غير قادر على العثور على أي جهاز مدعوم"
-#: ../liveusb/creator.py:1083
+#: ../liveusb/creator.py:1092
msgid "Unable to find partition"
msgstr "غير قادر على ايجاد تقسيمة القرص"
-#: ../liveusb/creator.py:1320
+#: ../liveusb/creator.py:1329
msgid ""
"Unable to get Win32_LogicalDisk; win32com query did not return any results"
msgstr "غير قادر علي الحصول علي Win32_LogicalDisk; win32com الطلب لم ينتج عنه أي نتائج"
@@ -428,22 +429,22 @@ msgstr "غير قادر علي الحصول علي Win32_LogicalDisk; win32com
msgid "Unable to mount device"
msgstr "لا يمكن تركيب الجهاز"
-#: ../liveusb/creator.py:804
+#: ../liveusb/creator.py:813
#, python-format
msgid "Unable to mount device: %(message)s"
msgstr "غير قادر على تركيب جهاز: %(message)s"
-#: ../liveusb/creator.py:508
+#: ../liveusb/creator.py:510
#, python-format
msgid "Unable to remove directory from previous LiveOS: %(message)s"
msgstr "غير قادر علي إزالة مجلد من نظام التشغيل الحي السابق: %(message)s"
-#: ../liveusb/creator.py:496
+#: ../liveusb/creator.py:498
#, python-format
msgid "Unable to remove file from previous LiveOS: %(message)s"
msgstr "غير قادر علي إزالة ملف من نظام التشغيل الحي السابق: %(message)s"
-#: ../liveusb/creator.py:1155
+#: ../liveusb/creator.py:1164
msgid ""
"Unable to reset MBR. You may not have the `syslinux` package installed."
msgstr "غير قادر على إعادة ضبط سجل الإقلاع الرئيسي. قد تكون حزمة `syslinux` غير مثبتة."
@@ -454,21 +455,21 @@ msgid ""
"ISO to the root of your drive (ie: C:\\)"
msgstr "لا يمكن استخدام الملف المُحدد. قد يحالفك حظ أكثر إن نقلت ملف الأيزو إلى المجلد الرئيسي لقرصك (C:\\ على سبيل المثال)"
-#: ../liveusb/creator.py:711
+#: ../liveusb/creator.py:720
#, python-format
msgid "Unable to write on %(device)s, skipping."
msgstr "غير قادر على الكتابة على الجهاز %(device)s، سيتم التجاوز."
-#: ../liveusb/creator.py:390
+#: ../liveusb/creator.py:392
msgid "Unknown ISO, skipping checksum verification"
msgstr "ملف أيزو غير معروف، سيتم تجاوز الفحص."
-#: ../liveusb/creator.py:800
+#: ../liveusb/creator.py:809
#, python-format
msgid "Unknown dbus exception while trying to mount device: %(message)s"
msgstr "خطأ غير معروف ببرنامج dbus عند محاولة تركيب جهاز: %(message)s"
-#: ../liveusb/creator.py:779 ../liveusb/creator.py:937
+#: ../liveusb/creator.py:788 ../liveusb/creator.py:946
msgid "Unknown filesystem. Your device may need to be reformatted."
msgstr "نظام ملفات غير معرف. قد يحتاج جهازك إلى إعادة تشكيل."
@@ -477,41 +478,41 @@ msgstr "نظام ملفات غير معرف. قد يحتاج جهازك إلى
msgid "Unknown release: %s"
msgstr "إصدار غير معروف: %s"
-#: ../liveusb/creator.py:841
+#: ../liveusb/creator.py:850
#, python-format
msgid "Unmounting '%(udi)s' on '%(device)s'"
msgstr "إزالة تثبيت '%(udi)s' على '%(device)s'"
-#: ../liveusb/creator.py:837
+#: ../liveusb/creator.py:846
#, python-format
msgid "Unmounting mounted filesystems on '%(device)s'"
msgstr "إزالة تثبيت نظام الملفات من '%(device)s'"
-#: ../liveusb/creator.py:922
+#: ../liveusb/creator.py:931
#, python-format
msgid "Unsupported device '%(device)s', please report a bug."
msgstr "هذا الجهاز غير مدعوم '%(device)s', الرجاء الابلاغ عن العطل."
-#: ../liveusb/creator.py:784 ../liveusb/creator.py:940
+#: ../liveusb/creator.py:793 ../liveusb/creator.py:949
#, python-format
msgid "Unsupported filesystem: %s"
msgstr "نظام ملفات غير مدعوم: %s"
-#: ../liveusb/creator.py:782
+#: ../liveusb/creator.py:791
#, python-format
msgid ""
"Unsupported filesystem: %s\n"
"In case you are trying to upgrade a manually installed Tails system (that is, if it was installed without this installer), this option is not supported: you need to install it anew to start with, e.g. by choosing the \"Clone & Install\" action instead."
msgstr "نظام ملفات غير مدعوم: %s\nفي حالة محاولتك تنصيب تحديث لنظام تيلز (و هو لم يتم تثبيتة من قبل هذا المثبت), هذا الخيار غير مدعوم: يجب عليك أن تثبت البرنامج من جديد و يرجح أستخدام امر \"أستنساخ و تثبيت\""
-#: ../liveusb/creator.py:1253
+#: ../liveusb/creator.py:1262
#, python-format
msgid ""
"Unsupported filesystem: %s\n"
"Please backup and format your USB key with the FAT filesystem."
msgstr "نظام ملفات غير مدعوم: %s\nالرجاء نسخ قرص USB نسخة احتياطية ثم تشكيلة بنظام الملفات FAT"
-#: ../liveusb/creator.py:882
+#: ../liveusb/creator.py:891
#, python-format
msgid "Updating properties of system partition %(system_partition)s"
msgstr "جاري تحديث خصائص تجزئة القرص الخاصة بالنظام %(system_partition)s"
@@ -524,19 +525,19 @@ msgstr "التحديث من ملف أيزو"
msgid "Use existing Live system ISO"
msgstr "أستخدام نظام تشغيل حي بصيغة أيزو"
-#: ../liveusb/creator.py:135
+#: ../liveusb/creator.py:136
msgid "Verifying ISO MD5 checksum"
msgstr "يتم التحقق من الـMD5 لملف الأيزو"
-#: ../liveusb/creator.py:364
+#: ../liveusb/creator.py:366
msgid "Verifying SHA1 checksum of LiveCD image..."
msgstr "التحقق من الـSHA1 لملف القرص الحي..."
-#: ../liveusb/creator.py:368
+#: ../liveusb/creator.py:370
msgid "Verifying SHA256 checksum of LiveCD image..."
msgstr "التحقق من الـSHA256 لملف القرص الحي..."
-#: ../liveusb/creator.py:934 ../liveusb/creator.py:1246
+#: ../liveusb/creator.py:943 ../liveusb/creator.py:1255
msgid "Verifying filesystem..."
msgstr "جاري التحقق من نظام الملفات"
@@ -552,7 +553,7 @@ msgid ""
"check the \"Run this program as an administrator\" box."
msgstr "تنبيه: يجب تنفيذ هذه الأداة بصلاحيات مدير النظام. لعمل هذا، انقر باليمين على الأيقونة وافتح الخصائص. في صفحة \"Compatibility/التوافقية\"، فعل الخيار \"Run this program as an administrator/قم بتشغيل هذا التطبيق كمدير\"."
-#: ../liveusb/creator.py:154
+#: ../liveusb/creator.py:155
#, python-format
msgid "Wrote to device at %(speed)d MB/sec"
msgstr "تمت الكتابة علي الجهاز بسرعة %(speed)d ميغابايت بالثانية"
@@ -572,7 +573,7 @@ msgid ""
"unchanged. Continue?"
msgstr "ستقوم بتحديث تايلز على %(parent_size)s %(vendor)s %(model)s جهاز (%(device)s). كل البيانات المحفوظة ستتم كما هي. هل تريد الاستمرار؟"
-#: ../liveusb/creator.py:618
+#: ../liveusb/creator.py:620
msgid ""
"You are using an old version of syslinux-extlinux that does not support the "
"ext4 filesystem"
@@ -582,7 +583,7 @@ msgstr "أنت تستخدم نسخة قديمة من syslinux-extlinux، وهي
msgid "You can try again to resume your download"
msgstr "تستطيع المحاولة مرة أخرى لاستئناف التحميل"
-#: ../liveusb/creator.py:94
+#: ../liveusb/creator.py:95
msgid "You must run this application as root"
msgstr "من الضروري ان يعمل هذا التطبيق بصلاحيات حساب رووت"
1
0
commit 282e03e60ef58339b09ed2282deb1a67c48b4678
Author: Roger Dingledine <arma(a)torproject.org>
Date: Thu Apr 9 13:43:49 2015 -0400
c261c7ec left a vidalia paragraph in
---
getinvolved/en/volunteer.wml | 7 -------
1 file changed, 7 deletions(-)
diff --git a/getinvolved/en/volunteer.wml b/getinvolved/en/volunteer.wml
index ddc9203..36a6218 100644
--- a/getinvolved/en/volunteer.wml
+++ b/getinvolved/en/volunteer.wml
@@ -434,13 +434,6 @@ meetings around the world.</li>
more secure.
</p>
- <p>
- The most commonly used user interface for Tor. Matt Edman started the
- project in 2006 and brought it to its current stable state. Development
- slowed for several years, though Tomás Touceda has since taken the
- lead with pushing the project forward.
- </p>
-
<a id="project-arm"></a>
<h3><a href="https://www.atagar.com/arm/">Arm</a> (<a
href="https://gitweb.torproject.org/arm.git">code</a>, <a
1
0

09 Apr '15
commit 9974654c0888694ca187209da782ffc83f479c49
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Thu Apr 9 01:28:38 2015 -0400
fix for setting root and transproxy preferences
---
res/values/strings.xml | 2 +-
res/xml/preferences.xml | 4 ++++
.../android/settings/SettingsPreferences.java | 24 +++++---------------
3 files changed, 11 insertions(+), 19 deletions(-)
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ede9174..0318cac 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -107,7 +107,7 @@
<string name="wizard_permissions_title">Permissions</string>
<string name="wizard_permissions_root_msg1">You can optionally grant Orbot \'Superuser\' access to enable advanced features, such as Transparent Proxying.</string>
<string name="wizard_permissions_root_msg2">If you do not want to do this, please make sure to use apps made to work with Orbot</string>
- <string name="wizard_permissions_no_root_msg">Your device does not appear to be rooted or provide \'Superuser\' access.\n\nIn order to you to benefit from Tor, you will need to use apps built to work with Orbot, or that support HTTP or SOCKS proxy settings.\n\n</string>
+ <string name="wizard_permissions_no_root_msg">Your device does not appear to be rooted or provide root or \'Superuser\' access.\n\nPlease try the \'Apps\' mode on the main screen instead.</string>
<!--TipsAndTricks screen-->
<string name="wizard_tips_title">Orbot-Enabled Apps</string>
<string name="wizard_tips_gibberbot">ChatSecure: Secure chat app with Off-the-Record Encryption</string>
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index eabc9b3..d5a8a75 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -47,6 +47,7 @@ android:defaultValue="false"
android:key="pref_transparent"
android:title="@string/pref_trans_proxy_title"
android:summary="@string/pref_trans_proxy_summary"
+android:dependency="has_root"
android:enabled="true"/>
<CheckBoxPreference
@@ -54,6 +55,7 @@ android:defaultValue="false"
android:key="pref_transparent_all"
android:summary="@string/pref_transparent_all_summary"
android:enabled="true"
+android:dependency="has_root"
android:title="@string/pref_transparent_all_title"/>
<Preference
@@ -61,6 +63,7 @@ android:defaultValue=""
android:key="pref_transparent_app_list"
android:title="@string/pref_select_apps"
android:summary="@string/pref_select_apps_summary"
+android:dependency="has_root"
android:enabled="true"/>
<CheckBoxPreference
@@ -68,6 +71,7 @@ android:defaultValue="false"
android:key="pref_transparent_tethering"
android:summary="@string/pref_transparent_tethering_summary"
android:enabled="true"
+android:dependency="has_root"
android:title="@string/pref_transparent_tethering_title"/>
diff --git a/src/org/torproject/android/settings/SettingsPreferences.java b/src/org/torproject/android/settings/SettingsPreferences.java
index 0e7f837..147f84d 100644
--- a/src/org/torproject/android/settings/SettingsPreferences.java
+++ b/src/org/torproject/android/settings/SettingsPreferences.java
@@ -64,19 +64,18 @@ public class SettingsPreferences
private void init ()
{
- int REQUEST_ROOT_IDX = 1;
int SET_LOCALE_IDX = 3;
int GENERAL_GROUP_IDX = 0;
- prefRequestRoot = ((CheckBoxPreference)((PreferenceCategory)getPreferenceScreen().getPreference(GENERAL_GROUP_IDX)).getPreference(REQUEST_ROOT_IDX));
+ prefRequestRoot = ((CheckBoxPreference)((PreferenceCategory)getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(0));
prefRequestRoot.setOnPreferenceClickListener(this);
prefLocale = (((PreferenceCategory)getPreferenceScreen().getPreference(GENERAL_GROUP_IDX)).getPreference(SET_LOCALE_IDX));
prefLocale.setOnPreferenceClickListener(this);
- prefCBTransProxy = ((CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(0));
- prefcBTransProxyAll = (CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(1);
+ prefCBTransProxy = ((CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(1));
+ prefcBTransProxyAll = (CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(2);
prefTransProxyFlush = (Preference)((PreferenceCategory)this.getPreferenceScreen().getPreference(DEBUG_GROUP_IDX)).getPreference(8);
prefTransProxyFlush.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@@ -94,24 +93,15 @@ public class SettingsPreferences
});
- prefTransProxyApps = ((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(2);
+ prefTransProxyApps = ((PreferenceCategory)this.getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX)).getPreference(3);
prefCBTransProxy.setOnPreferenceClickListener(this);
prefcBTransProxyAll.setOnPreferenceClickListener(this);
prefTransProxyApps.setOnPreferenceClickListener(this);
- if (!hasRoot)
- {
- getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX).setEnabled(false);
- }
- else
- {
-
- prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked());
- prefTransProxyApps.setEnabled(prefCBTransProxy.isChecked() && (!prefcBTransProxyAll.isChecked()));
-
- }
+ prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked());
+ prefTransProxyApps.setEnabled(prefCBTransProxy.isChecked() && (!prefcBTransProxyAll.isChecked()));
prefHiddenServices = ((CheckBoxPreference)((PreferenceCategory)this.getPreferenceScreen().getPreference(HIDDEN_SERVICE_PREF_IDX)).getPreference(0));
@@ -154,12 +144,10 @@ public class SettingsPreferences
if (preference == prefRequestRoot)
{
-
if (prefRequestRoot.isChecked())
{
boolean canRoot = RootCommands.rootAccessGiven();
- getPreferenceScreen().getPreference(TRANSPROXY_GROUP_IDX).setEnabled(canRoot);
prefRequestRoot.setChecked(canRoot);
if (!canRoot)
1
0

[orbot/master] Improved handling of VPN and Tun2Socks on Network Switch
by n8fr8@torproject.org 09 Apr '15
by n8fr8@torproject.org 09 Apr '15
09 Apr '15
commit 690a8c3b69b1c34af876b20702b6af59083897a5
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Thu Apr 9 08:52:59 2015 -0400
Improved handling of VPN and Tun2Socks on Network Switch
---
src/org/torproject/android/OrbotMainActivity.java | 34 ++--
.../torproject/android/service/OnBootReceiver.java | 3 +-
src/org/torproject/android/service/TorService.java | 68 ++++---
.../torproject/android/vpn/OrbotVpnService.java | 214 +++++++++++---------
4 files changed, 182 insertions(+), 137 deletions(-)
diff --git a/src/org/torproject/android/OrbotMainActivity.java b/src/org/torproject/android/OrbotMainActivity.java
index 26abd58..0900178 100644
--- a/src/org/torproject/android/OrbotMainActivity.java
+++ b/src/org/torproject/android/OrbotMainActivity.java
@@ -272,7 +272,6 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
}
-
});
mBtnBridges = (ToggleButton)findViewById(R.id.btnBridges);
@@ -674,8 +673,8 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
- doLayout();
- updateStatus("");
+ // doLayout();
+ //updateStatus("");
}
@@ -822,7 +821,10 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
else if (request == REQUEST_VPN && response == RESULT_OK)
{
startService(TorServiceConstants.CMD_VPN);
- restartTor ();
+
+ // if (torStatus == TorServiceConstants.STATUS_ON)
+ // restartTor ();
+
}
IntentResult scanResult = IntentIntegrator.parseActivityResult(request, response, data);
@@ -1092,14 +1094,16 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
else
{
startService(TorServiceConstants.CMD_VPN);
- restartTor ();
+ // if (torStatus == TorServiceConstants.STATUS_ON)
+ // restartTor ();
+
}
}
public void stopVpnService ()
{
startService(TorServiceConstants.CMD_VPN_CLEAR);
- restartTor ();
+ // restartTor ();
}
private boolean flushTransProxy ()
@@ -1200,12 +1204,8 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
if (lblStatus != null && torServiceMsg != null)
if (torServiceMsg.indexOf('%')!=-1)
lblStatus.setText(torServiceMsg);
-
- /**
- if (torServiceMsg != null && torServiceMsg.length() > 0)
- {
- mTxtOrbotLog.append(torServiceMsg + '\n');
- }**/
+ else
+ lblStatus.setText("");
boolean showFirstTime = mPrefs.getBoolean("connect_first_time",true);
@@ -1242,10 +1242,7 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
if (torServiceMsg.indexOf('%')!=-1)
lblStatus.setText(torServiceMsg);
- if (torServiceMsg != null && torServiceMsg.length() > 0)
- {
- mTxtOrbotLog.append(torServiceMsg + '\n');
- }
+
}
else if (torStatus == TorServiceConstants.STATUS_OFF)
@@ -1258,6 +1255,11 @@ public class OrbotMainActivity extends Activity implements OrbotConstants, OnLon
mItemOnOff.setTitle(R.string.menu_start);
}
+
+ if (torServiceMsg != null && torServiceMsg.length() > 0)
+ {
+ mTxtOrbotLog.append(torServiceMsg + '\n');
+ }
}
diff --git a/src/org/torproject/android/service/OnBootReceiver.java b/src/org/torproject/android/service/OnBootReceiver.java
index 9ed66ae..f87d2bb 100644
--- a/src/org/torproject/android/service/OnBootReceiver.java
+++ b/src/org/torproject/android/service/OnBootReceiver.java
@@ -35,7 +35,8 @@ public class OnBootReceiver extends BroadcastReceiver {
public void startVpnService (Context context)
{
Intent intent = VpnService.prepare(context);
- // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
if (intent != null) {
context.startActivity(intent);
}
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index b0419a4..bb2a31d 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -357,7 +357,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
new Thread (new TorStarter(intent)).start();
- return START_REDELIVER_INTENT;
+ return Service.START_STICKY;
}
@@ -1201,9 +1201,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
try
{
int newSocksPort = Integer.parseInt(socksPortPref);
- ServerSocket ss = new ServerSocket(newSocksPort);
- ss.close();
-
+
ArrayList<String> socksLines = new ArrayList<String>();
socksLines.add("SOCKSPort " + mPortSOCKS);
socksLines.add("SOCKSPort " + socksPortPref);
@@ -1224,10 +1222,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
try
{
- int newPort = Integer.parseInt(transPort);
- ServerSocket ss = new ServerSocket(newPort);
- ss.close();
-
ArrayList<String> confLines = new ArrayList<String>();
confLines.add("TransPort " + transPort);
@@ -1247,10 +1241,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
try
{
- int newPort = Integer.parseInt(dnsPort);
- ServerSocket ss = new ServerSocket(newPort);
- ss.close();
-
ArrayList<String> confLines = new ArrayList<String>();
confLines.add("DNSPort " + dnsPort);
@@ -1480,10 +1470,21 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
debug ("refreshing VPN Proxy");
- Intent intent = new Intent(TorService.this, OrbotVpnService.class);
- intent.setAction("refresh");
- startService(intent);
-
+ try
+ {
+ // conn.setConf("DisableNetwork", "1");
+
+ Intent intent = new Intent(TorService.this, OrbotVpnService.class);
+ intent.setAction("refresh");
+ startService(intent);
+
+ // conn.setConf("DisableNetwork", "0");
+ }
+ catch (Exception ioe)
+ {
+ Log.e(TAG,"error restarting network",ioe);
+ }
+
}
@@ -1733,9 +1734,20 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
{
try {
- Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8118));
+ URLConnection conn = null;
+
+ Proxy proxy = null;
+
+ if (mUseVPN)
+ {
+ proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8118));
+ conn = new URL(ONIONOO_BASE_URL + mNode.id).openConnection(proxy);
+ }
+ else
+ {
+ conn = new URL(ONIONOO_BASE_URL + mNode.id).openConnection();
+ }
- URLConnection conn = new URL(ONIONOO_BASE_URL + mNode.id).openConnection(proxy);
conn.setRequestProperty("Connection","Close");
conn.setConnectTimeout(60000);
conn.setReadTimeout(60000);
@@ -2079,6 +2091,9 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
@Override
public void onReceive(Context context, Intent intent) {
+ if (mCurrentStatus != STATUS_ON)
+ return;
+
SharedPreferences prefs = TorServiceUtils.getSharedPrefs(getApplicationContext());
boolean doNetworKSleep = prefs.getBoolean(OrbotConstants.PREF_DISABLE_NETWORK, true);
@@ -2091,6 +2106,11 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
boolean isChanged = false;
+ if (netInfo!=null)
+ newNetType = netInfo.getType();
+
+ isChanged = ((mNetworkType != newNetType)&&(mConnectivity != newConnectivityState));
+
if(netInfo != null && netInfo.isConnected()) {
// WE ARE CONNECTED: DO SOMETHING
newConnectivityState = true;
@@ -2100,11 +2120,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
newConnectivityState = false;
}
- if (netInfo!=null)
- newNetType = netInfo.getType();
-
- isChanged = ((mNetworkType != newNetType)||(mConnectivity != newConnectivityState));
-
mNetworkType = newNetType;
mConnectivity = newConnectivityState;
@@ -2143,15 +2158,12 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
shell.close();
}
-
- if (mUseVPN) //we need to turn on VPN here so the proxy is running
+ else if (mUseVPN) //we need to turn on VPN here so the proxy is running
refreshVpnProxy();
}
}
- saveConfiguration();
-
} catch (Exception e) {
logException ("error updating state after network restart",e);
}
@@ -2465,7 +2477,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (mUseVPN)
{
- updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
+ // updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
}
updateConfiguration("DisableNetwork","0", false);
diff --git a/src/org/torproject/android/vpn/OrbotVpnService.java b/src/org/torproject/android/vpn/OrbotVpnService.java
index ee9acc2..cf3a9d1 100644
--- a/src/org/torproject/android/vpn/OrbotVpnService.java
+++ b/src/org/torproject/android/vpn/OrbotVpnService.java
@@ -16,6 +16,7 @@
package org.torproject.android.vpn;
+import java.io.IOException;
import java.net.InetAddress;
import java.util.Locale;
@@ -53,7 +54,6 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
private int mSocksProxyPort = -1;
private ProxyServer mSocksProxyServer;
- private Thread mThreadProxy;
private final static int VPN_MTU = 1500;
@@ -61,82 +61,91 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
private boolean isRestart = false;
+
+
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- String action = intent.getAction();
-
- if (action.equals("start"))
+ if (intent != null)
{
- Log.d(TAG,"starting OrbotVPNService service!");
-
- mSocksProxyPort = intent.getIntExtra("proxyPort", 0);
+ String action = intent.getAction();
- // The handler is only used to show messages.
- if (mHandler == null) {
- mHandler = new Handler(this);
- }
-
- // Stop the previous session by interrupting the thread.
- if (mThreadVPN == null || (!mThreadVPN.isAlive()))
- {
-
- if (!isLollipop)
- startSocksBypass();
-
- setupTun2Socks();
- }
- }
- else if (action.equals("stop"))
- {
- Log.d(TAG,"stop OrbotVPNService service!");
-
- stopVPN();
- if (mHandler != null)
- mHandler.postDelayed(new Runnable () { public void run () { stopSelf(); }}, 1000);
- }
- else if (action.equals("refresh"))
- {
- Log.d(TAG,"refresh OrbotVPNService service!");
-
- // if (!isLollipop)
- // startSocksBypass();
-
- setupTun2Socks();
+ if (action.equals("start"))
+ {
+
+ // Stop the previous session by interrupting the thread.
+ if (mThreadVPN == null || (!mThreadVPN.isAlive()))
+ {
+ Log.d(TAG,"starting OrbotVPNService service!");
+
+ mSocksProxyPort = intent.getIntExtra("proxyPort", 0);
+
+ // The handler is only used to show messages.
+ if (mHandler == null) {
+ mHandler = new Handler(this);
+ }
+
+ if (!isLollipop)
+ startSocksBypass();
+
+ setupTun2Socks();
+ }
+ }
+ else if (action.equals("stop"))
+ {
+ Log.d(TAG,"stop OrbotVPNService service!");
+
+ stopVPN();
+ if (mHandler != null)
+ mHandler.postDelayed(new Runnable () { public void run () { stopSelf(); }}, 1000);
+ }
+ else if (action.equals("refresh"))
+ {
+ Log.d(TAG,"refresh OrbotVPNService service!");
+
+ //if (!isLollipop)
+ ///startSocksBypass();
+
+ if (!isRestart)
+ setupTun2Socks();
+ }
}
- return START_NOT_STICKY;
+ return START_STICKY;
}
- private void startSocksBypass(){
- mThreadProxy = new Thread ()
- {
- public void run ()
- {
-
- try {
-
- if (mSocksProxyServer != null)
- {
- stopSocksBypass ();
- }
-
- mSocksProxyServer = new ProxyServer(new ServerAuthenticatorNone(null, null));
- ProxyServer.setVpnService(OrbotVpnService.this);
- mSocksProxyServer.start(mSocksProxyPort, 5, InetAddress.getLocalHost());
- } catch (Exception e) {
- Log.d(TAG,"proxy server error: " + e.getLocalizedMessage(),e);
- }
- }
- };
-
- mThreadProxy.start();
-
+ private void startSocksBypass()
+ {
+
+ new Thread ()
+ {
+
+ public void run ()
+ {
+ if (mSocksProxyServer != null)
+ {
+ stopSocksBypass ();
+ }
+
+ try
+ {
+ mSocksProxyServer = new ProxyServer(new ServerAuthenticatorNone(null, null));
+ ProxyServer.setVpnService(OrbotVpnService.this);
+ mSocksProxyServer.start(mSocksProxyPort, 5, InetAddress.getLocalHost());
+
+ }
+ catch (Exception e)
+ {
+ Log.e(TAG,"error getting host",e);
+ }
+ }
+ }.start();
+
}
- private void stopSocksBypass ()
+ private synchronized void stopSocksBypass ()
{
if (mSocksProxyServer != null){
@@ -148,6 +157,23 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
}
@Override
+ public void onCreate() {
+ super.onCreate();
+
+ System.loadLibrary("tun2socks");
+
+
+ // Set the locale to English (or probably any other language that^M
+ // uses Hindu-Arabic (aka Latin) numerals).^M
+ // We have found that VpnService.Builder does something locale-dependent^M
+ // internally that causes errors when the locale uses its own numerals^M
+ // (i.e., Farsi and Arabic).^M
+ Locale.setDefault(new Locale("en"));
+
+ }
+
+
+ @Override
public void onDestroy() {
stopVPN();
}
@@ -188,8 +214,14 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
}
- private void setupTun2Socks() {
-
+ private synchronized void setupTun2Socks() {
+
+ if (mInterface != null) //stop tun2socks now to give it time to clean up
+ {
+ isRestart = true;
+ Tun2Socks.Stop();
+ }
+
mThreadVPN = new Thread ()
{
@@ -198,21 +230,18 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
try
{
- // Set the locale to English (or probably any other language that^M
- // uses Hindu-Arabic (aka Latin) numerals).^M
- // We have found that VpnService.Builder does something locale-dependent^M
- // internally that causes errors when the locale uses its own numerals^M
- // (i.e., Farsi and Arabic).^M
- Locale.setDefault(new Locale("en"));
-
- String localhost = "127.0.0.1";//InetAddress.getLocalHost().getHostAddress();
-
- String vpnName = "OrbotVPN";
- String virtualGateway = "10.0.0.1";
- String virtualIP = "10.0.0.2";
- String virtualNetMask = "255.255.255.0";
- String localSocks = localhost + ':' + TorServiceConstants.PORT_SOCKS_DEFAULT;
- String localDNS = "10.0.0.1" + ':' + TorServiceConstants.TOR_DNS_PORT_DEFAULT;
+ if (isRestart)
+ {
+ Log.d(TAG,"is a restart... let's wait for a few seconds");
+ Thread.sleep(3000);
+ }
+
+ final String vpnName = "OrbotVPN";
+ final String virtualGateway = "10.0.0.1";
+ final String virtualIP = "10.0.0.2";
+ final String virtualNetMask = "255.255.255.0";
+ final String localSocks = "127.0.0.1:" + TorServiceConstants.PORT_SOCKS_DEFAULT;
+ final String localDNS = "127.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT;
Builder builder = new Builder();
@@ -225,27 +254,28 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
{
doLollipopAppRouting(builder);
}
-
- if (mInterface != null)
- {
- Log.d(TAG,"Stopping existing VPN interface");
- isRestart = true;
- mInterface.close();
- mInterface = null;
- Tun2Socks.Stop();
- }
-
// Create a new interface using the builder and save the parameters.
ParcelFileDescriptor newInterface = builder.setSession(mSessionName)
.setConfigureIntent(mConfigureIntent)
.establish();
-
+
+ if (mInterface != null)
+ {
+ Log.d(TAG,"Stopping existing VPN interface");
+ mInterface.close();
+ mInterface = null;
+ }
mInterface = newInterface;
+ Thread.sleep(4000);
+
Tun2Socks.Start(mInterface, VPN_MTU, virtualIP, virtualNetMask, localSocks , localDNS , true);
+
+ isRestart = false;
+
}
catch (Exception e)
{
1
0

[orbot/master] switch back to DNS on 10.0.0.1, update after VPN refresh
by n8fr8@torproject.org 09 Apr '15
by n8fr8@torproject.org 09 Apr '15
09 Apr '15
commit 7d8eea24b18d6f1560bddf25d11ab228dedea408
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Thu Apr 9 09:10:14 2015 -0400
switch back to DNS on 10.0.0.1, update after VPN refresh
---
src/org/torproject/android/service/TorService.java | 8 +++++++-
src/org/torproject/android/vpn/OrbotVpnService.java | 2 +-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index bb2a31d..fb1ac63 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -1477,6 +1477,12 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
Intent intent = new Intent(TorService.this, OrbotVpnService.class);
intent.setAction("refresh");
startService(intent);
+
+ updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
+ updateConfiguration("DisableNetwork","0", false);
+
+ saveConfiguration();
+
// conn.setConf("DisableNetwork", "0");
}
@@ -2477,7 +2483,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (mUseVPN)
{
- // updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
+ updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
}
updateConfiguration("DisableNetwork","0", false);
diff --git a/src/org/torproject/android/vpn/OrbotVpnService.java b/src/org/torproject/android/vpn/OrbotVpnService.java
index cf3a9d1..bc06f43 100644
--- a/src/org/torproject/android/vpn/OrbotVpnService.java
+++ b/src/org/torproject/android/vpn/OrbotVpnService.java
@@ -241,7 +241,7 @@ public class OrbotVpnService extends VpnService implements Handler.Callback {
final String virtualIP = "10.0.0.2";
final String virtualNetMask = "255.255.255.0";
final String localSocks = "127.0.0.1:" + TorServiceConstants.PORT_SOCKS_DEFAULT;
- final String localDNS = "127.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT;
+ final String localDNS = "10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT;
Builder builder = new Builder();
1
0

09 Apr '15
commit c39cdcba6040fc578fc9eb7f566bd7a542aaf6ec
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Thu Apr 9 09:14:12 2015 -0400
improve root access check for transproxy
---
.../android/settings/SettingsPreferences.java | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/org/torproject/android/settings/SettingsPreferences.java b/src/org/torproject/android/settings/SettingsPreferences.java
index 147f84d..339514a 100644
--- a/src/org/torproject/android/settings/SettingsPreferences.java
+++ b/src/org/torproject/android/settings/SettingsPreferences.java
@@ -6,6 +6,7 @@ package org.torproject.android.settings;
import java.util.Locale;
import org.sufficientlysecure.rootcommands.RootCommands;
+import org.sufficientlysecure.rootcommands.Shell;
import org.torproject.android.R;
import org.torproject.android.service.TorServiceUtils;
@@ -146,13 +147,24 @@ public class SettingsPreferences
{
if (prefRequestRoot.isChecked())
{
+
boolean canRoot = RootCommands.rootAccessGiven();
-
prefRequestRoot.setChecked(canRoot);
if (!canRoot)
{
- Toast.makeText(this, R.string.wizard_permissions_no_root_msg, Toast.LENGTH_LONG).show();
+ try
+ {
+ Shell shell = Shell.startRootShell();
+ shell.close();
+
+ prefRequestRoot.setChecked(true);
+
+ }
+ catch (Exception e)
+ {
+ Toast.makeText(this, R.string.wizard_permissions_no_root_msg, Toast.LENGTH_LONG).show();
+ }
}
}
}
1
0

[orbot/master] Fixes for bridge setup, and root/shell interaction
by n8fr8@torproject.org 09 Apr '15
by n8fr8@torproject.org 09 Apr '15
09 Apr '15
commit d6c51bcc3c769103a1ad11a10bed8fb48c787091
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Thu Apr 9 13:04:28 2015 -0400
Fixes for bridge setup, and root/shell interaction
- If you paste bridge addresses from Gmail, you get some strange
characters that were causing problems. This looks for that, and
other formatting related gotchas.
- This also moves all configuratino to the torrc.custom file
instead of using the control port. These changes require you to
restart anyhow, and using the torrc.custom is more reliable as it
affects the tor process on launch, and not post control port interaction.
---
res/xml/preferences.xml | 1 +
.../android/service/TorResourceInstaller.java | 40 ++++-
src/org/torproject/android/service/TorService.java | 185 ++++++++++----------
.../android/service/TorServiceConstants.java | 2 +-
.../torproject/android/service/TorTransProxy.java | 5 +-
5 files changed, 127 insertions(+), 106 deletions(-)
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index d5a8a75..3778dd6 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -112,6 +112,7 @@ android:title="@string/bridges"
android:summary="@string/ip_address_and_port_of_bridges"
android:dialogTitle="@string/enter_bridge_addresses"
android:defaultValue="@string/default_bridges"
+android:inputType="textMultiLine|textNoSuggestions"
/>
</PreferenceCategory>
diff --git a/src/org/torproject/android/service/TorResourceInstaller.java b/src/org/torproject/android/service/TorResourceInstaller.java
index a56c618..139da02 100644
--- a/src/org/torproject/android/service/TorResourceInstaller.java
+++ b/src/org/torproject/android/service/TorResourceInstaller.java
@@ -8,9 +8,12 @@ import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
import java.io.StringBufferInputStream;
import java.util.ArrayList;
import java.util.concurrent.TimeoutException;
@@ -19,8 +22,8 @@ import java.util.zip.ZipInputStream;
import org.sufficientlysecure.rootcommands.Shell;
import org.sufficientlysecure.rootcommands.command.SimpleCommand;
-import org.torproject.android.R;
import org.torproject.android.OrbotConstants;
+import org.torproject.android.R;
import android.content.Context;
import android.util.Log;
@@ -116,10 +119,28 @@ public class TorResourceInstaller implements TorServiceConstants {
public boolean updateTorConfigCustom (File fileTorRcCustom, String extraLines) throws IOException, FileNotFoundException, TimeoutException
{
-
-
- StringBufferInputStream sbis = new StringBufferInputStream(extraLines + '\n');
- streamToFile(sbis,fileTorRcCustom,false,false);
+ if (fileTorRcCustom.exists())
+ {
+ fileTorRcCustom.delete();
+ Log.d("torResources","deleeting existing torrc.custom");
+ }
+ else
+ fileTorRcCustom.createNewFile();
+
+ FileOutputStream fos = new FileOutputStream(fileTorRcCustom, false);
+ PrintStream ps = new PrintStream(fos);
+ ps.print(extraLines);
+ ps.close();
+
+ /*
+ FileWriter fw = new FileWriter( fileTorRcCustom, false );
+ PrintWriter bw = new PrintWriter( fw );
+ bw.write(extraLines);
+ bw.close();
+ */
+
+// StringBufferInputStream sbis = new StringBufferInputStream(extraLines + '\n');
+ // streamToFile(sbis,fileTorRcCustom,false,false);
return true;
}
@@ -239,11 +260,14 @@ public class TorResourceInstaller implements TorServiceConstants {
}
//copy the file from inputstream to File output - alternative impl
- public static void copyFile (InputStream is, File outputFile)
+ public static boolean copyFile (InputStream is, File outputFile)
{
try {
- outputFile.createNewFile();
+ if (outputFile.exists())
+ outputFile.delete();
+
+ boolean newFile = outputFile.createNewFile();
DataOutputStream out = new DataOutputStream(new FileOutputStream(outputFile));
DataInputStream in = new DataInputStream(is);
@@ -262,10 +286,12 @@ public class TorResourceInstaller implements TorServiceConstants {
in.close();
// chmod?
+ return newFile;
} catch (IOException ex) {
Log.e(OrbotConstants.TAG, "error copying binary", ex);
+ return false;
}
}
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index fb1ac63..3e7edc6 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -23,10 +23,10 @@ import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Proxy;
-import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
+import java.text.Normalizer;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -49,9 +49,9 @@ import org.json.JSONArray;
import org.json.JSONObject;
import org.sufficientlysecure.rootcommands.Shell;
import org.sufficientlysecure.rootcommands.command.SimpleCommand;
+import org.torproject.android.OrbotConstants;
import org.torproject.android.OrbotMainActivity;
import org.torproject.android.R;
-import org.torproject.android.OrbotConstants;
import org.torproject.android.settings.AppManager;
import org.torproject.android.settings.TorifiedApp;
import org.torproject.android.vpn.OrbotVpnService;
@@ -448,7 +448,11 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
sendCallbackStatus(mCurrentStatus);
if (mHasRoot && mEnableTransparentProxy)
- disableTransparentProxy(Shell.startRootShell());
+ {
+ Shell shellRoot = Shell.startRootShell();
+ disableTransparentProxy(shellRoot);
+ shellRoot.close();
+ }
clearNotifications();
@@ -723,12 +727,13 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
extraLines.append("AutomapHostsOnResolve 1").append('\n');
extraLines.append("DisableNetwork 0").append('\n');
+
+ //.extraLines.append("CircuitStreamTimeout 60").append('\n');
+ processSettingsImpl(extraLines);
- extraLines.append("CircuitStreamTimeout 60").append('\n');
-
-
- extraLines.append(prefs.getString("pref_custom_torrc", ""));
+ String torrcCustom = new String(prefs.getString("pref_custom_torrc", "").getBytes("US-ASCII"));
+ extraLines.append(torrcCustom).append('\n');
logNotice("updating torrc custom configuration...");
@@ -928,7 +933,9 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
{
showToolbarNotification(getString(R.string.transproxy_enabled_for_tethering_), TRANSPROXY_NOTIFY_ID, R.drawable.ic_stat_tor);
- mTransProxy.enableTetheringRules(this, Shell.startRootShell());
+ Shell shellRoot = Shell.startRootShell();
+ mTransProxy.enableTetheringRules(this, shellRoot);
+ shellRoot.close();
}
else
@@ -1025,9 +1032,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
logNotice("Tor started; process id=" + mLastProcessId);
- processSettingsImpl();
-
-
+
}
return true;
@@ -1847,16 +1852,6 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
e.printStackTrace();
}
- Thread thread = new Thread(){
- public void run (){
- try {
- processSettingsImpl();
- } catch (Exception e) {
- logException ("error applying mPrefs",e);
- }
- }
- };
- thread.start();
}
public String getInfo (String key) {
@@ -2181,7 +2176,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
};
- private boolean processSettingsImpl () throws Exception
+ private boolean processSettingsImpl (StringBuffer extraLines) throws IOException
{
logNotice(getString(R.string.updating_settings_in_tor_service));
@@ -2212,7 +2207,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if (!useBridges)
{
- updateConfiguration("UseBridges", "0", false);
+ extraLines.append("UseBridges 0").append('\n');
if (mUseVPN) //set the proxy here if we aren't using a bridge
{
@@ -2220,7 +2215,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
{
String proxyType = "socks5";
String proxyHost = "127.0.0.1";
- updateConfiguration(proxyType + "Proxy", proxyHost + ':' + mVpnProxyPort, false);
+ extraLines.append(proxyType + "Proxy" + ' ' + proxyHost + ':' + mVpnProxyPort).append('\n');
};
}
@@ -2236,21 +2231,21 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
if ((proxyHost != null && proxyHost.length()>0) && (proxyPort != null && proxyPort.length() > 0))
{
- updateConfiguration(proxyType + "Proxy", proxyHost + ':' + proxyPort, false);
+ extraLines.append(proxyType + "Proxy" + ' ' + proxyHost + ':' + proxyPort).append('\n');
if (proxyUser != null && proxyPass != null)
{
if (proxyType.equalsIgnoreCase("socks5"))
{
- updateConfiguration("Socks5ProxyUsername", proxyUser, false);
- updateConfiguration("Socks5ProxyPassword", proxyPass, false);
+ extraLines.append("Socks5ProxyUsername" + ' ' + proxyUser).append('\n');
+ extraLines.append("Socks5ProxyPassword" + ' ' + proxyPass).append('\n');
}
else
- updateConfiguration(proxyType + "ProxyAuthenticator", proxyUser + ':' + proxyPort, false);
+ extraLines.append(proxyType + "ProxyAuthenticator" + ' ' + proxyUser + ':' + proxyPort).append('\n');
}
else if (proxyPass != null)
- updateConfiguration(proxyType + "ProxyAuthenticator", proxyUser + ':' + proxyPort, false);
+ extraLines.append(proxyType + "ProxyAuthenticator" + ' ' + proxyUser + ':' + proxyPort).append('\n');
@@ -2261,47 +2256,52 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
else
{
- debug ("Using bridges");
- String bridgeCfgKey = "Bridge";
- updateConfiguration("UseBridges", "1", false);
+ extraLines.append("UseBridges 1").append('\n');
- String bridgeList = prefs.getString(OrbotConstants.PREF_BRIDGES_LIST,null);
+ String bridgeList = new String(prefs.getString(OrbotConstants.PREF_BRIDGES_LIST,"").getBytes("ISO-8859-1"));
if (bridgeList != null && bridgeList.length() > 1) //longer then 1 = some real values here
{
- String bridgeDelim = "\n";
- if (bridgeList.indexOf(",") != -1)
+ //check if any PT bridges are needed
+ boolean obfsBridges = bridgeList.contains("obfs3")||bridgeList.contains("obfs4")||bridgeList.contains("scramblesuit");
+
+ if (obfsBridges)
{
- bridgeDelim = ",";
+ extraLines.append("ClientTransportPlugin obfs3 exec " + fileObfsclient.getCanonicalPath()).append('\n');
+ extraLines.append("ClientTransportPlugin obfs4 exec " + fileObfsclient.getCanonicalPath()).append('\n');
+ extraLines.append("ClientTransportPlugin scramblesuit exec " + fileObfsclient.getCanonicalPath()).append('\n');
}
-
- StringTokenizer st = new StringTokenizer(bridgeList,bridgeDelim);
- while (st.hasMoreTokens())
+
+ String[] bridgeListLines = bridgeList.split("\\r?\\n");
+
+ for (String bridgeConfigLine : bridgeListLines)
{
- String bridgeConfigLine = st.nextToken().trim();
-
if (bridgeConfigLine != null && bridgeConfigLine.length() > 0)
{
- debug("Adding bridge: " + bridgeConfigLine);
- updateConfiguration(bridgeCfgKey, bridgeConfigLine, false);
+ extraLines.append("Bridge ");
+
+ bridgeConfigLine = bridgeConfigLine.replace('�', ' ');
+
+ StringTokenizer st = new StringTokenizer (bridgeConfigLine," ");
+ while (st.hasMoreTokens())
+ extraLines.append(st.nextToken()).append(' ');
+
+ extraLines.append("\n");
+
}
}
+
+ /**
+ extraLines.append("Bridge obfs3 192.36.31.74:35870 FEB63CA5EBD805C42DC0E5FBDDE82F3B1CDD80B4\n");
+ extraLines.append("Bridge obfs3 131.72.136.85:52447 1AC601EA50397948DD5FB5B453922EB8A69A5EF6\n");
+ extraLines.append("Bridge obfs3 192.36.31.76:33439 54C59DF0FCEE2D08F789CA04E5B57519071C232B\n");
+ */
+
+ // extraLines.append("Bridge obfs4 54.66.226.196:18965 95151988DC29FCCB4F610A1C700A1DDF7D5FFBD4 cert=3wYo19iAMNbfO7snEeqVBmsIat+RMmMDV5BV4jDvXuz9BaACXt7XffC8Dz8J1MUvLKHKaQ iat-mode=0\n");
- //check if any PT bridges are needed
- boolean obfsBridges = bridgeList.contains("obfs2")||bridgeList.contains("obfs3")||bridgeList.contains("scramblesuit");
-
- if (obfsBridges)
- {
- // String bridgeConfig = "obfs3,scramblesuit,obfs4 exec " + fileObfsclient.getCanonicalPath();
- String bridgeConfig = "obfs3,obfs4 exec " + fileObfsclient.getCanonicalPath();
-
- debug ("Using OBFUSCATED bridges: " + bridgeConfig);
-
- updateConfiguration("ClientTransportPlugin",bridgeConfig, false);
- }
}
else
{
@@ -2310,9 +2310,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
debug ("Using meek bridges");
String bridgeConfig = "meek exec " + fileMeekclient.getCanonicalPath();
- updateConfiguration("ClientTransportPlugin",bridgeConfig, false);
+ extraLines.append("ClientTransportPlugin" + ' ' + bridgeConfig).append('\n');
-
String[] meekBridge =
{
"meek 0.0.2.0:1 url=https://meek-reflect.appspot.com/ front=www.google.com",
@@ -2337,14 +2336,10 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
}
- updateConfiguration(bridgeCfgKey, meekBridge[meekIdx], false);
+ extraLines.append("Bridge " + meekBridge[meekIdx]).append('\n');
}
-
-
-// updateConfiguration("UpdateBridgesFromAuthority", "0", false);
-
-
+
}
if (entranceNodes.length() > 0 || exitNodes.length() > 0 || excludeNodes.length() > 0)
@@ -2362,8 +2357,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
- updateConfiguration("GeoIPFile", fileGeoIP.getCanonicalPath(), false);
- updateConfiguration("GeoIPv6File", fileGeoIP6.getCanonicalPath(), false);
+ extraLines.append("GeoIPFile" + ' ' + fileGeoIP.getCanonicalPath()).append('\n');
+ extraLines.append("GeoIPv6File" + ' ' + fileGeoIP6.getCanonicalPath()).append('\n');
}
catch (Exception e)
@@ -2374,12 +2369,16 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
}
- updateConfiguration("EntryNodes", entranceNodes, false);
- updateConfiguration("ExitNodes", exitNodes, false);
- updateConfiguration("ExcludeNodes", excludeNodes, false);
- updateConfiguration("StrictNodes", enableStrictNodes ? "1" : "0", false);
+ if (entranceNodes != null && entranceNodes.length() > 0)
+ extraLines.append("EntryNodes" + ' ' + entranceNodes).append('\n');
+
+ if (exitNodes != null && exitNodes.length() > 0)
+ extraLines.append("ExitNodes" + ' ' + exitNodes).append('\n');
+ if (excludeNodes != null && excludeNodes.length() > 0)
+ extraLines.append("ExcludeNodes" + ' ' + excludeNodes).append('\n');
+ extraLines.append("StrictNodes" + ' ' + (enableStrictNodes ? "1" : "0")).append('\n');
try
{
@@ -2388,13 +2387,10 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
String ReachableAddressesPorts =
prefs.getString(OrbotConstants.PREF_REACHABLE_ADDRESSES_PORTS, "*:80,*:443");
- updateConfiguration("ReachableAddresses", ReachableAddressesPorts, false);
+ extraLines.append("ReachableAddresses" + ' ' + ReachableAddressesPorts).append('\n');
}
- else
- {
- updateConfiguration("ReachableAddresses", "", false);
- }
+
}
catch (Exception e)
{
@@ -2412,18 +2408,12 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
String dnsFile = writeDNSFile ();
- updateConfiguration("ServerDNSResolvConfFile", dnsFile, false);
- updateConfiguration("ORPort", ORPort + "", false);
- updateConfiguration("Nickname", nickname, false);
- updateConfiguration("ExitPolicy", "reject *:*", false);
+ extraLines.append("ServerDNSResolvConfFile" + ' ' + dnsFile).append('\n');
+ extraLines.append("ORPort" + ' ' + ORPort).append('\n');
+ extraLines.append("Nickname" + ' ' + nickname).append('\n');
+ extraLines.append("ExitPolicy" + ' ' + "reject *:*").append('\n');
}
- else
- {
- updateConfiguration("ORPort", "", false);
- updateConfiguration("Nickname", "", false);
- updateConfiguration("ExitPolicy", "", false);
- }
}
catch (Exception e)
{
@@ -2462,8 +2452,8 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
debug("Adding hidden service on port: " + hsPortConfig);
- updateConfiguration("HiddenServiceDir",hsDirPath, false);
- updateConfiguration("HiddenServicePort",hsPortConfig, false);
+ extraLines.append("HiddenServiceDir" + ' ' + hsDirPath).append('\n');
+ extraLines.append("HiddenServicePort" + ' ' + hsPortConfig).append('\n');
} catch (NumberFormatException e) {
@@ -2475,24 +2465,27 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
}
- else
- {
- updateConfiguration("HiddenServiceDir","", false);
-
- }
+
if (mUseVPN)
{
- updateConfiguration("DNSListenAddress","10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT,false);
+ extraLines.append("DNSListenAddress" + ' ' + "10.0.0.1:" + TorServiceConstants.TOR_DNS_PORT_DEFAULT).append('\n');
}
-
- updateConfiguration("DisableNetwork","0", false);
-
- saveConfiguration();
return true;
}
+ public static String flattenToAscii(String string) {
+ char[] out = new char[string.length()];
+ string = Normalizer.normalize(string, Normalizer.Form.NFD);
+ int j = 0;
+ for (int i = 0, n = string.length(); i < n; ++i) {
+ char c = string.charAt(i);
+ if (c <= '\u007F') out[j++] = c;
+ }
+ return new String(out);
+ }
+
/*
private void enableSocks (String socks, boolean safeSocks) throws RemoteException
{
diff --git a/src/org/torproject/android/service/TorServiceConstants.java b/src/org/torproject/android/service/TorServiceConstants.java
index 8808976..55ff6c3 100644
--- a/src/org/torproject/android/service/TorServiceConstants.java
+++ b/src/org/torproject/android/service/TorServiceConstants.java
@@ -86,7 +86,7 @@ public interface TorServiceConstants {
public static final String CMD_UPDATE = "update";
- public static final String BINARY_TOR_VERSION = "0.2.6-RC6-PT-UPDATE-2";
+ public static final String BINARY_TOR_VERSION = "0.2.6.7";
public static final String PREF_BINARY_TOR_VERSION_INSTALLED = "BINARY_TOR_VERSION_INSTALLED";
//obfsproxy
diff --git a/src/org/torproject/android/service/TorTransProxy.java b/src/org/torproject/android/service/TorTransProxy.java
index 4c32bb5..89663fb 100644
--- a/src/org/torproject/android/service/TorTransProxy.java
+++ b/src/org/torproject/android/service/TorTransProxy.java
@@ -490,8 +490,7 @@ public class TorTransProxy implements TorServiceConstants {
}
-
-
+
return lastExit;
}
@@ -598,6 +597,8 @@ public class TorTransProxy implements TorServiceConstants {
dropAllIPv6Traffic(context,-1,false, shell);
+ shell.close();
+
return exit;
}
1
0
commit 1feda73e3f6f9bc404937a4e6b18d4c582a7f8ad
Author: Nathan Freitas <nathan(a)freitas.net>
Date: Thu Apr 9 13:16:14 2015 -0400
update changelog
---
CHANGELOG | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/CHANGELOG b/CHANGELOG
index eec1e76..66fb9f3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,13 @@
NOTE: Specific #s below correspond to Trac tickets logged and maintained at https://trac.torproject.org/projects/tor/
+/** 15.0.0 RC 2 / 9-Apr-2015 / 60f19ca **/
+d6c51bc Fixes for bridge setup, and root/shell interaction
+- If you paste bridge addresses from Gmail, you get some strange characters
+c39cdcb improve root access check for transproxy
+7d8eea2 switch back to DNS on 10.0.0.1, update after VPN refresh
+690a8c3 Improved handling of VPN and Tun2Socks on Network Switch
+9974654 fix for setting root and transproxy preferences
+
/** 15.0.0 RC 1 / 8-Apr-2015 / 280f69dfa10c38d880e98e71954526c68f1b3df5 **/
776b7af use loopback address
e6fe252 auto-restart Tor when config changes
1
0