Pull to refresh

Свободная литература или сказ про дружбу CoolReader c Tor

Reading time5 min
Views71K
Картинка для привлечения внимания

Живет у меня в доме соседка: очень хорошая женщина, пенсионерка, ветеран труда, бывший медицинский работник, отработавший всю жизнь медсестрой в больнице. В настоящее время на пенсии. Я ей помогаю, чем могу, но сказ не про соседку, а про то, что подарила ей дирекция больницы, где она раньше работала планшет. Все бы ничего в этом планшете (WIFI есть, 3G нету, диагональ экрана 7 дюймов, на алиэкспрессе такие по 45 долларов с доставкой), но вот что делать с этим планшетом, естественно, не объяснили. И пришлось мне отвечать на вопрос, что делаю со своим планшетом я, а я на планшете книжки читаю, в основном Ясинского и Эльтерруса.

Естественно я подключил планшет к своему ноутбуку и перекинул апкашку CoolReader, а также свою библиотеку. К сожалению, через два дня выяснилось, что литературные пристрастия у нас разные и мои книжки соседке неинтересны. Пришлось поделиться паролем от своего вайфая и настроить opds «Флибусты», так как что такое Интернет соседка знала весьма приблизительно и ни компьютера, ни интернет-соединения у нее нет и никогда не было.

После выходных меня огорошили тем фактом, что нужные книжки с Флибусты не скачиваются. Сказать, что я был в недоумении — ничего не сказать — вся интересующая меня литература всегда была в свободном доступе, но соседка хотела Дарью Донцову и «50 оттенков серого» и, к моему удивлению, они действительно не скачивались.

Погуглив по сети, я выяснил, что в сети TOR добрые люди сделали зеркало Флибусты, с которого все прекрасно скачивается, однако все попытки объяснить CoolReader, что нужно заходить по .onion адресу, наткнулись на его стойкое нежелание коннектиться по .onion адресам в принципе. Что, в принципе, логично. Попытка объяснить принципы современного копирайта и покупки книг на «Литресе» была мною благополучно провалена: карточки, как и компьютера, у соседки нет, а противостоять наивному «а за что платить-то, если книжки у меня так и не будет?» и «где магазин, в который можно прийти и получить книжку на планшет?» оказалось выше моих скромных сил, поэтому пришлось решать эту проблему методами техническими, ибо не умею я людям говорить «нет», особенно тем, кто нуждается в помощи и защите.

К счастью, у меня уже был VRS (virtual root server), на котором крутился мой маленький проект по управлением Ubuntu и Apache.

Шаг 1. Устанавливаем на Ubuntu tor
apt-get install tor

Настройки «по-умолчанию» меня вполне устроили.

Шаг 2. Пишем скрипт для апача, назвав его, например: /home/user/flibusta/nph-flibusta.pl. Префикс nph- в имени файла очень важен, ибо влияет на то, как скрипт будет обрабатываться апачем.

#!/usr/bin/perl
use warnings;
use HTTP::Proxy;
use LWP::UserAgent;
use LWP::Protocol::socks;
use URI::Escape;
use CGI qw(:standard -nph);

my $q = new CGI;
my $ua = LWP::UserAgent->new(max_redirect => 0, agent => $q->user_agent(),);
$ua->timeout(60);
$ua->proxy([qw/ http https /] => 'socks://127.0.0.1:9050'); # Tor proxy

my $refer = $q->referer();
$refer = "" unless defined($refer);
$refer =~ s/proxy\.flibusta\.net/flibustahezeous3.onion/g; 

#handle extra parameters
my $ep ="";
foreach my $par ($q->param) {$ep .= $par.'='.uri_escape($q->param($par)).'&' unless ($par eq 'url');}
chop $ep;
$ep = '?'.$ep if ($ep ne '');

my $rsp = $ua->get('http://flibustahezeous3.onion'.$q->param('url').$ep, 'Referer'=>$refer, 'Accept'=>$q->http('Accept'), 
          'Accept-Language'=>$q->http('Accept-Language'),
          'Accept-Encoding'=>'identity',
          'Cookie'=>$q->http('Cookie') );
          
my $fstr = $rsp->as_string;

$fstr =~ s/flibustahezeous3\.onion/proxy.flibusta.net/g;

#define templates
my $nbl = <<DATA1;
 <link href="/b/BOOOOOOOK/fb2" rel="http://opds-spec.org/acquisition/open-access" type="application/fb2+zip" />
 <link href="/b/BOOOOOOOK/html" rel="http://opds-spec.org/acquisition/open-access" type="application/html+zip" />
 <link href="/b/BOOOOOOOK/txt" rel="http://opds-spec.org/acquisition/open-access" type="application/txt+zip" />
 <link href="/b/BOOOOOOOK/rtf" rel="http://opds-spec.org/acquisition/open-access" type="application/rtf+zip" />
 <link href="/b/BOOOOOOOK/epub" rel="http://opds-spec.org/acquisition/open-access" type="application/epub+zip" />
 <link href="/b/BOOOOOOOK/mobi" rel="http://opds-spec.org/acquisition/open-access" type="application/x-mobipocket-ebook" />
DATA1
my $olb = quotemeta <<DATA2;
 <link href="/b/BOOOOOOOK/download" rel="http://opds-spec.org/acquisition/disabled" type="disabled/fb2+zip" />
DATA2
#get all book IDs
my @IDs = $fstr =~ /\/b\/(\d+)\/download/g;
foreach my $id (@IDs)
{
  # prepare search and replace strings
  my $ao = $olb;
  $ao =~ s/BOOOOOOOK/$id/g;
  my $an= $nbl;
  $an =~ s/BOOOOOOOK/$id/g;
   # do replace to fix format for cool reader
  $fstr =~ s/$ao/$an/g;
}

print $fstr;


Что делает скрипт: получает параметр скрипт $url, переделывает имя хоста на торовское, отправляет запрос через TOR и подправляет пришедший ответ в ту форму, в какой его хочет видеть CoolReader.

Шаг 3. Настраиваем апач.
Создаем файл /etc/apache2/sites-available/proxy.flibusta.net с примерно таким содержимым:

<VirtualHost *:80>
  ServerAdmin webmaster@flibusta.net
  ServerName proxy.flibusta.net

  DirectoryIndex /home/user/flibusta/nph-flibusta.pl
  DocumentRoot /home/user/flibusta/
  <Directory /home/user/flibusta/ >
    AllowOverride None
    Options -Indexes +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
  </Directory>
   RewriteEngine On
   RewriteCond %{HTTP_HOST} =proxy.flibusta.net
   RewriteRule ^(.*)$ /nph-flibusta.pl?url=$1 [H=cgi-script,QSA,L]
   LogLevel warn
   CustomLog /var/log/apache2/access.log combined
 </VirtualHost>


И даем команду:

a2ensite proxy.flibusta.net

Перезапуская попутно апач:

service apache2 restart

Что тут происходит: все запросы к сайту proxy.flibusta.net отправляются на наш магический скрипт.

Шаг 4. Исправляем конфигурацию DNS на роутере.
У меня роутер ASUS RT-N66U, поэтому для того, чтобы была возможность провести необходимую модификацию, была проставлена прошивка MerlinWRT, использующая DNSmasq, c сайта разработчика. Включен раздел JFFS и в файл /jffs/configs/dnsmasq.conf.add была внесена строка:

address=/proxy.flibusta.net/99.99.99.99

Где 99.99.99.99 — IP-адрес моей VRSки (специально изменен во избежание хабраэфффекта) с учетом того факта, что адрес у меня динамический и никакой фильтрации IP-адресов на сервере при обращении к скрипту у меня нет. Очевидно, что для другой модели роутера шаг 4 будет иным, но аналогичным.

Шаг последний. Добавляем адрес proxy.flibusta.net/opds в список электронных библиотек в программе CoolReader. Тут ничего пояснять, думаю, не надо. Просто используем соответствующее меню в интрефейсе CoolReader~а.

Надеюсь, мой опыт пригодится другим людям и поможет сделать не только мою соседку счастливей, но и кого-либо еще в этом мире. Отдельное спасибо человеку, который сделал возможность скачивания книг через сеть Тor и автору программы CoolReader, которой пользуются «и пионеры и пенсионеры».

PS: Через две недели я узнал, что «Донцова отличный писатель, а „50 оттенков серого“ чернуха, которую не стоит читать таким воспитанным и вежливым молодым людям как я.», а также мне почти насильно впихнули шоколадный батончик Аленка вместе с просьбой удалить из меню CoolReader~а Litres, который почему-то «постоянно просит регистрации». Очевидно, что данный метод можно использовать и для организации доступа любого другого программного обеспечения к .onion и .i2p сайтам.
Tags:
Hubs:
+63
Comments91

Articles

Change theme settings