Jump to content

Блокировка рекламы Adblock с помощью Privoxy


Recommended Posts

0. Кому и зачем это нужно.

Обычно на ПК и ноутбуках я пользуюсь плагином uBlock, и в целом меня это устраивало,

Но не устраивало отсутствие такой роскоши на мобильных устройствах, и, менее актуально, на проприетарных (телевизоры, плейстейшены, медиаплееры)

Им избавление от рекламы нужно больше из-за ограниченных ресурсов.

Итак, свершился релиз OPKG в обновлениях. И, как и собирался по подсказке А.Рыжова, прикрутил на кинетик блокировщик.

В результате смешанные чувства.

Плюсы:

- блокировка рекламы на всех устройствах домашней сети, проводных и беспроводных

- единая настройка для всех

- не потребляет ресурсов устройств

Минусы:

- низкое качество блокировки: в файлах для Privoxy оказалась потеряна большая часть того что блокирует uBlock, хотя исходные файлы одни (плохие скрипты с конверторами?)

- невозможность блокировать в HTTPS

- невозможность использования Yandex/Sky DNS (по крайней мере я пока не знаю как)

Первые два недостатка обходятся продолжением использования плагинов к браузерам ;)

Т.е. там где блокировалось хорошо - хуже не будет, а там, где не блокировалось ничего - будет лучше.

1. Установка пакетов

opkg install privoxy iptables
 

2. Настройка правила переадресации при старте роутера

cd /opt/etc/ndm/netfilter.d
echo "#!/bin/sh" > 010-privoxy-route.sh
echo "iptables -t nat -A PREROUTING -m iprange --src-range 192.168.1.2-192.168.1.100 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128" >> 010-privoxy-route.sh
chmod +x 010-privoxy-route.sh
 

3. Настройка блокировщика

Содержание файла /etc/privoxy/config

 

confdir /opt/etc/privoxy

logdir /opt/var/log

logfile privoxy.log

actionsfile match-all.action # Actions that are applied to all sites and maybe overruled later on.

actionsfile default.action # Main actions file

actionsfile user.action

actionsfile advblock.action

filterfile advblock.script.filter

filterfile default.filter

filterfile user.filter

listen-address 0.0.0.0:3128

toggle 1

enable-remote-toggle 0

enable-remote-http-toggle 0

enable-edit-actions 0

enforce-blocks 0

buffer-limit 4096

forwarded-connect-retries 1

accept-intercepted-requests 1

allow-cgi-request-crunching 0

split-large-forms 0

keep-alive-timeout 30

socket-timeout 300

tolerate-pipelining 1

hostname my.keenetic.net

#permit-access 192.168.1.0/24

#debug 1 # show each GET/POST/CONNECT request

#debug 1024 # show each blocked URL

debug 4096 # Startup banner and warnings

debug 8192 # Errors - *we highly recommended enabling this*

4. Поместить в папку /etc/privoxy/ прикрепленные файлы из архива


advblock.action 
advblock.script.filter
user.action
 

ОЧЕНЬ ПРИВЕТСТВУЮТСЯ БОЛЕЕ ДЕЙСТВЕННЫЕ НАСТРОЙКИ!!!

прикрепляйте

Не более огромные файлы, а именно более действенные для рунета. Некоторые потерявшиеся из advblock list при конвертациях я добавил в конец user.action

Гуглится множество таких скриптов и сделанных файлов.

actions.zip

  • Thanks 3
Link to comment
Share on other sites

Минусы:

- низкое качество блокировки: в файлах для Privoxy оказалась потеряна большая часть того что блокирует uBlock, хотя исходные файлы одни (плохие скрипты с конверторами?)

Первые два недостатка обходятся продолжением использования плагинов к браузерам ;)

Так не понятно какой конвертер использовался.

В моей статье был этот, но идею я забросил, потому как за последние годы HTTPS-шифрование и/или gzip-сжатие страниц стали настолько популярными, что свели всю идею на нет.

Link to comment
Share on other sites

Минусы:

- низкое качество блокировки: в файлах для Privoxy оказалась потеряна большая часть того что блокирует uBlock, хотя исходные файлы одни (плохие скрипты с конверторами?)

Первые два недостатка обходятся продолжением использования плагинов к браузерам ;)

Так не понятно какой конвертер использовался.

В моей статье был этот, но идею я забросил, потому как за последние годы HTTPS-шифрование и/или gzip-сжатие страниц стали настолько популярными, что свели всю идею на нет.

тот скрипт что был в статье я попробовал в первую очередь, потерял все основные хосты из advblock.

Потом попробовал ещё какой-то скрипт на перле, результат примерно такой же.

Вчера попробовал вот это: https://projects.zubr.me/wiki/adblock2privoxy

Но он наоборот избыточный! Создаёт по 4 записи на один хост, миллион css, реально я выдержал их распаковку на флешку только до 4% архива.

Но настроил совместно с nginx, оставив только корневые css, БЛОКИРУЕТ ВСЁ, но пользоваться нереально, загрузка проца кинетика 100%, сайты еле открываются.

Тут надо наоборот сокращать объём записей в файлах.

Link to comment
Share on other sites

Могу на Java написать нормальный парсер, скажи только к какому виду нужно привести, а сам файл можно вручную обновлять на роутере раз в месяц, к примеру.

Link to comment
Share on other sites

Могу на Java написать нормальный парсер, скажи только к какому виду нужно привести, а сам файл можно вручную обновлять на роутере раз в месяц, к примеру.

К сожалению, тут нельзя просто взять и "сказать" к какому виду привести)

система не самая простая

Вот мануалы:

https://www.privoxy.org/user-manual/actions-file.html

https://www.privoxy.org/user-manual/filter-file.html

Link to comment
Share on other sites

  • 1 month later...

Сделал все по инструкции - в журнале при перезагрузке роутера:
 

Sep 15 20:13:44 ndm Opkg::Manager: /opt/etc/ndm/netfilter.d/010-privoxy-route.sh: iptables: No chain/target/match by that name.
Sep 15 20:13:44 ndm Opkg::Manager: /opt/etc/ndm/netfilter.d/010-privoxy-route.sh: exit code 1.

Подскажите, в чем может быть дело? В логах privoxy тоже ошибки, жалуется на файл advblock.script.filter. Все файлы из прикрепленного архива.


Omni II, прошивка 2.07, Entware-3x

privoxy.log

Edited by ka1ll
Link to comment
Share on other sites

  • 2 weeks later...
34 минуты назад, 876974 сказал:

Аналогичная проблема, какое подскажете решение?

Даю подсказку, куда попробовать копать:

~ # iptables -nvL | grep PREROUTING
~ # iptables -nvL -t nat| grep PREROUTING
Chain PREROUTING (policy ACCEPT 262K packets, 78M bytes)

По умолчанию используется таблица filter, а там нет цепочки PREROUTING. Эта цепочка есть в таблице nat и ее нужно указать.

  • Thanks 1
Link to comment
Share on other sites

28 минут назад, zyxmon сказал:

По умолчанию используется таблица filter, а там нет цепочки PREROUTING. Эта цепочка есть в таблице nat и ее нужно указать.

iptables -t nat -A PREROUTING -m iprange --src-range 192.168.1.2-192.168.1.100 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

так именно таблица nat и используется по умолчанию, в указании правила, где есть эта цепочка, но выше указанная нами ошибка и приводится в нем. Либо совершена нами какая то ошибка которую может быть мы не доглядели?

Link to comment
Share on other sites

значит у Вас iptables не все параметры поддерживает. это зависит от прошивки. не судьба!

У меня на Extra с 2.08 все пучком

~ # iptables -t nat -A PREROUTING -m iprange --src-range 192.168.1.2-192.168.1.100 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
~ # iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 50 packets, 16985 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 278K   83M _NDM_DNAT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_EZ_BYPASS  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_SD_DNSREDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_SD_WEBREDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_UPNP_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_YD_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 SL_PRIVATE  tcp  --  *      *       0.0.0.0/0            78.47.125.180        tcp dpt:80
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 192.168.1.2-192.168.1.100 tcp dpt:80 redir ports 3128
 

Делал copy-paste Вашей команды )))

Edited by zyxmon
  • Thanks 1
Link to comment
Share on other sites

8 часов назад, zyxmon сказал:

значит у Вас iptables не все параметры поддерживает. это зависит от прошивки. не судьба!

У меня на Extra с 2.08 все пучком


~ # iptables -t nat -A PREROUTING -m iprange --src-range 192.168.1.2-192.168.1.100 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
~ # iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 50 packets, 16985 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 278K   83M _NDM_DNAT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_EZ_BYPASS  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_SD_DNSREDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_SD_WEBREDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_UPNP_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
 278K   83M _NDM_YD_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 SL_PRIVATE  tcp  --  *      *       0.0.0.0/0            78.47.125.180        tcp dpt:80
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 192.168.1.2-192.168.1.100 tcp dpt:80 redir ports 3128
 

Делал copy-paste Вашей команды )))

Стоит прошивка 2.08 на Giga 2

Link to comment
Share on other sites

9 часов назад, zyxmon сказал:

У меня на Extra с 2.08 все пучком...

а, что по этому поводу пресса пишет выдают `cat /proc/net/ip_tables_matches` и `cat /proc/net/ip_tables_targets` ? а то оно, вроде как, есть, но не совсем (((

~ # cat /proc/net/ip_tables_matches | grep ^ip
iprange

 полный выхлоп вывод:

Скрытый текст

~ # cat /proc/net/ip_tables_matches
connbytes
addrtype
comment
helper
physdev
owner
statistic
connmark
pkttype
quota
u32
time
state
mac
limit
conntrack
conntrack
conntrack
mark
set
set
iprange
addrtype
recent
ecn
socket
socket
esp
ah
ttl
hashlimit
tos
dscp
length
policy
icmp
tcpmss
multiport
udplite
udp
tcp
~ # 
~ # cat /proc/net/ip_tables_targets
CLASSIFY
CONNMARK
MARK
SET
SET
SET
TPROXY
TPROXY
ULOG
REDIRECT
ECN
ROUTE
TOS
DSCP
TEE
REJECT
NETMAP
MASQUERADE
DNAT
SNAT
ERROR
TCPMSS
TTL
~ # 

 

 

Link to comment
Share on other sites

4 часа назад, TheBB сказал:

а, что по этому поводу пресса пишет выдают `cat /proc/net/ip_tables_matches` и `cat /proc/net/ip_tables_targets` ? а то оно, вроде как, есть, но не совсем (((

Скрытый текст

~ # cat /proc/net/ip_tables_matches
connbytes
addrtype
comment
helper
physdev
owner
statistic
connmark
pkttype
quota
u32
time
state
mac
limit
conntrack
conntrack
conntrack
mark
set
set
iprange
addrtype
recent
ecn
socket
socket
esp
ah
ttl
hashlimit
tos
dscp
length
policy
icmp
tcpmss
multiport
udplite
udp
tcp
~ # cat /proc/net/ip_tables_targets
CLASSIFY
CONNMARK
MARK
SET
SET
SET
TPROXY
TPROXY
ULOG
REDIRECT
ECN
ROUTE
TOS
DSCP
TEE
REJECT
NETMAP
MASQUERADE
DNAT
SNAT
ERROR
TCPMSS
TTL

 

Вот выхлоп

Link to comment
Share on other sites

странно, вчера отсылало "курить" --help, сегодня принимает (устройства DSL 2.05/GigaII 2.08 не обновлялись/ не перезагружались)

Link to comment
Share on other sites

вчера раки были по 5 рублей, ну-у о-очень большие. а сегодня - по 3, но ма-аленькие , ну никак. можно было б списать на ошибку при вводе, но команда, из истории, та же. видать - глюк )))

~ # iptables -t nat -A PREROUTING -m iprange --src-range 192.168.1.2-192.168.1.100 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
~ # 
~ # iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 5 packets, 300 bytes)
 pkts bytes target     prot opt in     out     source               destination         
26405 2094K _NDM_DNAT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
20810 1750K _NDM_UPNP_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
20810 1750K _NDM_YD_REDIRECT  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 REDIRECT   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 192.168.1.2-192.168.1.100 tcp dpt:80 redir ports 3128

screen-004.png

Link to comment
Share on other sites

  • 2 weeks later...

На основе этого решения -> https://sites.google.com/site/rpfteam/conf 

Переделал все конфиги. Perl скрипт - работает и обновляет adblock.action. В логи ошибок теперь не сыпет ....

Для счастья :

opkg install perl-dev wget ca-certificates 

для privoxy-bl-upd.pl дать права 711 + сделав

opkg install cron 

 и переписать privoxy-bl-upd.pl в /opt/etc/cron.daily/ (или по желанию ....) можно автоматизировать обновление adblock.action по расписанию :) 

/opt/etc/init.d/S10cron start

 

p.s. Если есть желание совместить privoxy + AdBlock + Tor ... то в таком случае

opkg install tor

редактируем  /opt/etc/tor/torrc

SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections.

SOCKSPort your.keenetic.ip:9100 # Bind to this address:port too.

RunAsDaemon 1

DataDirectory /opt/var/lib/tor

 

#User tor

/opt/etc/init.d/S35tor start

в выложенных мной конфигах в /opt/etc/privoxy/config в самом конце добавть

forward-socks5 / localhost:9050 .

# forward-socks4 / localhost:9050 .

# forward-socks4a / localhost:9050 .

В данном случае на все сайты вы будуте попадать через TOR

Есть возможность задать свой список сайтов на которые Вы будуте попадать через TOR , а на все остальные - "как обычно" ,..... "засвечивая" свой IP .... в таком случае надо вернуть в /opt/etc/privoxy/config 

# forward-socks5 / localhost:9050 .

# forward-socks4 / localhost:9050 .

# forward-socks4a / localhost:9050 .

И внимательно изучить в конце два файлика из прилагаемых мной конфигов, а именно 

user.action и user.filter , там, кроме "заторивания" доступа к определенным сайтам реализована возможность "подсовывания" фейкового инфо по Вашему браузеру ....  Если надо "срочно" зайти через TOR на сайт не указанный в списке то достаточно добавить в конце запрос ./?=tor или ./&=tor

Например: сравните http://iplogger.ru и http://iplogger.ru./?=tor

Доступ к *.onion - настроен "автоматом" только через TOR

Если Вы все сделали правильно и "стартанули" privoxy и выставили параметр permit-access  в config, то Вам станет доступна web-страница его управления - http://config.privoxy.org .... где перейдя по View & change the current configuration можно настроить под себя :) ....

В зависимости от "производительности" Вашего роутера можно поразвлекаться выставив в /opt/etc/privoxy/match-all.action [Edit] предпочитаемую "глубину" анализа web-страниц (cautious, medium, advanced )

Если в скрипт хотите добавить нужные Вам фильтры, то берем тут -> https://filterlists.com

p.s. Для применения любых изменений конфигов перегружать роутер не нужно. Достаточно вызвать web-страницу управления privoxy http://config.privoxy.org/show-status

p.s.s. К сожалению ко всем прелестям и удобству есть и недостатки. Privoxy "работает" только с HTTP .... HTTPS не поддерживается :(ОДНАКО! Если появится на нашу "игрушку" pyOpenSSL (mips), ибо это едиственный модуль для python (pip install pyOpenSSL) , которого мне не хватило чтобы прикрутить фильтрацию HTTPS ..... взяв за основу вот это -> https://sourceforge.net/p/ijbswa/support-requests/1667/

 

privoxy_conf_v.2.tar.gz

Edited by Dorik1972
Обновил update script до v2.0
  • Thanks 8
Link to comment
Share on other sites

  • 1 month later...
В 15.09.2016 в 20:18, ka1ll сказал:

Сделал все по инструкции - в журнале при перезагрузке роутера:
 

Sep 15 20:13:44 ndm Opkg::Manager: /opt/etc/ndm/netfilter.d/010-privoxy-route.sh: iptables: No chain/target/match by that name.
Sep 15 20:13:44 ndm Opkg::Manager: /opt/etc/ndm/netfilter.d/010-privoxy-route.sh: exit code 1.

Подскажите, в чем может быть дело? В логах privoxy тоже ошибки, жалуется на файл advblock.script.filter. Все файлы из прикрепленного архива.


Omni II, прошивка 2.07, Entware-3x

privoxy.log

Все решилось установкой IPv6 и ядерных модулей netfilter в компонентах.

Link to comment
Share on other sites

  • 2 weeks later...
51 минуту назад, rotor сказал:

Добрый час. Возможна реализация подобного с помощью AdNauseam https://github.com/dhowe/AdNauseam ?

Судя по описанию, это очередная надстройка над браузером и никаким образом к роутеру его не привязать, может и ошибаюсь.

Но вот если найдется умный человек и запилит прозрачный mitmproxy, от этого будет толк, он должен уметь и https обрабатывать, только бы ресурсов роутера хватило.

Link to comment
Share on other sites

Зачем сочинять велосипед ? Я писал ранее что https можно "фильтровать" и для запуска не хватило ровно одного модуля для python. Как это работает и пример установки под MAcOS здесь -> https://www.prxbx.com/forums/showthread.php?tid=2224 , но аналогично настраивается и на keenetic-"игрушке"    

Link to comment
Share on other sites

В 30.11.2016 в 23:00, Dorik1972 сказал:

... ОДНАКО! Если появится на нашу "игрушку" pyOpenSSL (mips)...

python-pyopenssl_16.1.0-1_mipsel-3x.ipk - не оно?

Link to comment
Share on other sites

В 03.02.2017 в 12:47, Dorik1972 сказал:

На выходных "поиграюсь" :) О результатах отпишусь ... 

Хотелось бы результат видеть в виде готового решения. !;) 

Link to comment
Share on other sites

1 минуту назад, vlad сказал:

Хотелось бы результат видеть в виде готового решения. !;) 

 как только починят iptables в крайней версии 2.09 чтобы можно было "играться" 

  • Thanks 1
Link to comment
Share on other sites

Результат пока никак :(

pip3 install pyOpenSSL
Collecting pyOpenSSL
  Using cached pyOpenSSL-16.2.0-py2.py3-none-any.whl
Collecting cryptography>=1.3.4 (from pyOpenSSL)
  Using cached cryptography-1.7.2.tar.gz
Collecting six>=1.5.2 (from pyOpenSSL)
  Using cached six-1.10.0-py2.py3-none-any.whl
Collecting idna>=2.0 (from cryptography>=1.3.4->pyOpenSSL)
  Using cached idna-2.2-py2.py3-none-any.whl
Collecting pyasn1>=0.1.8 (from cryptography>=1.3.4->pyOpenSSL)
  Using cached pyasn1-0.2.2-py2.py3-none-any.whl
Requirement already satisfied: setuptools>=11.3 in /opt/lib/python3.5/site-packages (from cryptography>=1.3.4->pyOpenSSL)
Collecting cffi>=1.4.1 (from cryptography>=1.3.4->pyOpenSSL)
  Using cached cffi-1.9.1.tar.gz
    Complete output from command python setup.py egg_info:
    
        No working compiler found, or bogus compiler options
        passed to the compiler from Python's distutils module.
        See the error messages above.
        (If they are about -mno-fused-madd and you are on OS/X 10.8,
        see http://stackoverflow.com/questions/22313407/ .)
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /opt/tmp/pip-build-h71ncde1/cffi/

На "Большом Брате" - пошло и работает .....  

Link to comment
Share on other sites

19 минут назад, Dorik1972 сказал:

Результат пока никак :(


pip3 install pyOpenSSL
Collecting pyOpenSSL
  Using cached pyOpenSSL-16.2.0-py2.py3-none-any.whl
Collecting cryptography>=1.3.4 (from pyOpenSSL)
  Using cached cryptography-1.7.2.tar.gz
Collecting six>=1.5.2 (from pyOpenSSL)
  Using cached six-1.10.0-py2.py3-none-any.whl
Collecting idna>=2.0 (from cryptography>=1.3.4->pyOpenSSL)
  Using cached idna-2.2-py2.py3-none-any.whl
Collecting pyasn1>=0.1.8 (from cryptography>=1.3.4->pyOpenSSL)
  Using cached pyasn1-0.2.2-py2.py3-none-any.whl
Requirement already satisfied: setuptools>=11.3 in /opt/lib/python3.5/site-packages (from cryptography>=1.3.4->pyOpenSSL)
Collecting cffi>=1.4.1 (from cryptography>=1.3.4->pyOpenSSL)
  Using cached cffi-1.9.1.tar.gz
    Complete output from command python setup.py egg_info:
    
        No working compiler found, or bogus compiler options
        passed to the compiler from Python's distutils module.
        See the error messages above.
        (If they are about -mno-fused-madd and you are on OS/X 10.8,
        see http://stackoverflow.com/questions/22313407/ .)
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /opt/tmp/pip-build-h71ncde1/cffi/

На "Большом Брате" - пошло и работает .....  

Печально. 

Link to comment
Share on other sites

В 01.02.2017 в 23:24, TheBB сказал:

python-pyopenssl_16.1.0-1_mipsel-3x.ipk - не оно?

Рано печалиться ))) Попробую "перебрать" исходники прокси для запуска из-под Python 2.7 используя вышеприведенную подсказку ..... вопрос "свободного" времени  

 

 

 

  • Thanks 3
Link to comment
Share on other sites

22 минуты назад, Dorik1972 сказал:

Рано печалиться ))) Попробую "перебрать" исходники прокси для запуска из-под Python 2.7 используя вышеприведенную подсказку ..... вопрос "свободного" времени  

 

 

 

Устанавливал entware-3x ради блокировки рекламы..ну и OpenVPN иногда использую. 

Link to comment
Share on other sites

  • 6 months later...
В 09.02.2017 в 13:57, Dorik1972 сказал:

Рано печалиться ))) Попробую "перебрать" исходники прокси для запуска из-под Python 2.7 используя вышеприведенную подсказку ..... вопрос "свободного" времени  

:? Возможно оно появилось, просто мы не знаем этого? Поделитесь решением, пожалуйста.

Edited by rotor
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...