├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug-report.md
│ └── feature_request.md
└── workflows
│ └── tests.yml
├── .gitignore
├── .gitlab-ci.yml
├── .travis.yml
├── CHANGELOG.md
├── COPYING
├── Dockerfile
├── Dockerfile.arm64v8
├── LICENSE
├── README-ru.md
├── README-zh-cn.md
├── README.md
├── Vagrantfile
├── plugins
├── AnnounceBitTorrent
│ ├── AnnounceBitTorrentPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── AnnounceLocal
│ ├── AnnounceLocalPlugin.py
│ ├── BroadcastServer.py
│ ├── Test
│ │ ├── TestAnnounce.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── __init__.py
│ └── plugin_info.json
├── AnnounceShare
│ ├── AnnounceSharePlugin.py
│ ├── Test
│ │ ├── TestAnnounceShare.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── __init__.py
│ └── plugin_info.json
├── AnnounceZero
│ ├── AnnounceZeroPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── Benchmark
│ ├── BenchmarkDb.py
│ ├── BenchmarkPack.py
│ ├── BenchmarkPlugin.py
│ ├── __init__.py
│ ├── media
│ │ └── benchmark.html
│ └── plugin_info.json
├── Bigfile
│ ├── BigfilePiecefield.py
│ ├── BigfilePlugin.py
│ ├── Test
│ │ ├── TestBigfile.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ └── __init__.py
├── Chart
│ ├── ChartCollector.py
│ ├── ChartDb.py
│ ├── ChartPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── ContentFilter
│ ├── ContentFilterPlugin.py
│ ├── ContentFilterStorage.py
│ ├── Test
│ │ ├── TestContentFilter.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── __init__.py
│ ├── languages
│ │ ├── hu.json
│ │ ├── it.json
│ │ ├── jp.json
│ │ ├── pt-br.json
│ │ ├── zh-tw.json
│ │ └── zh.json
│ ├── media
│ │ ├── blocklisted.html
│ │ └── js
│ │ │ └── ZeroFrame.js
│ └── plugin_info.json
├── Cors
│ ├── CorsPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── CryptMessage
│ ├── CryptMessage.py
│ ├── CryptMessagePlugin.py
│ ├── Test
│ │ ├── TestCrypt.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── __init__.py
│ └── plugin_info.json
├── FilePack
│ ├── FilePackPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── MergerSite
│ ├── MergerSitePlugin.py
│ ├── __init__.py
│ └── languages
│ │ ├── es.json
│ │ ├── fr.json
│ │ ├── hu.json
│ │ ├── it.json
│ │ ├── jp.json
│ │ ├── pt-br.json
│ │ ├── tr.json
│ │ ├── zh-tw.json
│ │ └── zh.json
├── Newsfeed
│ ├── NewsfeedPlugin.py
│ └── __init__.py
├── OptionalManager
│ ├── ContentDbPlugin.py
│ ├── OptionalManagerPlugin.py
│ ├── Test
│ │ ├── TestOptionalManager.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── UiWebsocketPlugin.py
│ ├── __init__.py
│ └── languages
│ │ ├── es.json
│ │ ├── fr.json
│ │ ├── hu.json
│ │ ├── jp.json
│ │ ├── pt-br.json
│ │ ├── zh-tw.json
│ │ └── zh.json
├── PeerDb
│ ├── PeerDbPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── Sidebar
│ ├── ConsolePlugin.py
│ ├── SidebarPlugin.py
│ ├── ZipStream.py
│ ├── __init__.py
│ ├── languages
│ │ ├── da.json
│ │ ├── de.json
│ │ ├── es.json
│ │ ├── fr.json
│ │ ├── hu.json
│ │ ├── it.json
│ │ ├── jp.json
│ │ ├── pl.json
│ │ ├── pt-br.json
│ │ ├── ru.json
│ │ ├── tr.json
│ │ ├── zh-tw.json
│ │ └── zh.json
│ ├── media
│ │ ├── Class.coffee
│ │ ├── Console.coffee
│ │ ├── Console.css
│ │ ├── Menu.coffee
│ │ ├── Menu.css
│ │ ├── Prototypes.coffee
│ │ ├── RateLimit.coffee
│ │ ├── Scrollable.js
│ │ ├── Scrollbable.css
│ │ ├── Sidebar.coffee
│ │ ├── Sidebar.css
│ │ ├── all.css
│ │ ├── all.js
│ │ └── morphdom.js
│ ├── media_globe
│ │ ├── Detector.js
│ │ ├── Tween.js
│ │ ├── all.js
│ │ ├── globe.js
│ │ ├── three.min.js
│ │ └── world.jpg
│ └── plugin_info.json
├── Stats
│ ├── StatsPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── TranslateSite
│ ├── TranslateSitePlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── Trayicon
│ ├── TrayiconPlugin.py
│ ├── __init__.py
│ ├── languages
│ │ ├── es.json
│ │ ├── fr.json
│ │ ├── hu.json
│ │ ├── it.json
│ │ ├── jp.json
│ │ ├── pl.json
│ │ ├── pt-br.json
│ │ ├── tr.json
│ │ ├── zh-tw.json
│ │ └── zh.json
│ ├── lib
│ │ ├── __init__.py
│ │ ├── notificationicon.py
│ │ └── winfolders.py
│ ├── plugin_info.json
│ └── trayicon.ico
├── UiConfig
│ ├── UiConfigPlugin.py
│ ├── __init__.py
│ ├── languages
│ │ ├── hu.json
│ │ ├── jp.json
│ │ ├── pl.json
│ │ ├── pt-br.json
│ │ └── zh.json
│ ├── media
│ │ ├── config.html
│ │ ├── css
│ │ │ ├── Config.css
│ │ │ ├── all.css
│ │ │ ├── button.css
│ │ │ └── fonts.css
│ │ ├── img
│ │ │ └── loading.gif
│ │ └── js
│ │ │ ├── ConfigStorage.coffee
│ │ │ ├── ConfigView.coffee
│ │ │ ├── UiConfig.coffee
│ │ │ ├── all.js
│ │ │ ├── lib
│ │ │ ├── Class.coffee
│ │ │ ├── Promise.coffee
│ │ │ ├── Prototypes.coffee
│ │ │ └── maquette.js
│ │ │ └── utils
│ │ │ ├── Animation.coffee
│ │ │ ├── Dollar.coffee
│ │ │ └── ZeroFrame.coffee
│ └── plugin_info.json
├── UiFileManager
│ ├── UiFileManagerPlugin.py
│ ├── __init__.py
│ ├── languages
│ │ ├── hu.json
│ │ └── jp.json
│ └── media
│ │ ├── codemirror
│ │ ├── LICENSE
│ │ ├── all.css
│ │ ├── all.js
│ │ ├── base
│ │ │ ├── codemirror.css
│ │ │ └── codemirror.js
│ │ ├── extension
│ │ │ ├── dialog
│ │ │ │ ├── dialog.css
│ │ │ │ └── dialog.js
│ │ │ ├── edit
│ │ │ │ ├── closebrackets.js
│ │ │ │ ├── closetag.js
│ │ │ │ ├── continuelist.js
│ │ │ │ ├── matchbrackets.js
│ │ │ │ ├── matchtags.js
│ │ │ │ └── trailingspace.js
│ │ │ ├── fold
│ │ │ │ ├── brace-fold.js
│ │ │ │ ├── comment-fold.js
│ │ │ │ ├── foldcode.js
│ │ │ │ ├── foldgutter.css
│ │ │ │ ├── foldgutter.js
│ │ │ │ ├── indent-fold.js
│ │ │ │ ├── markdown-fold.js
│ │ │ │ └── xml-fold.js
│ │ │ ├── hint
│ │ │ │ ├── anyword-hint.js
│ │ │ │ ├── html-hint.js
│ │ │ │ ├── show-hint.css
│ │ │ │ ├── show-hint.js
│ │ │ │ ├── sql-hint.js
│ │ │ │ └── xml-hint.js
│ │ │ ├── lint
│ │ │ │ ├── json-lint.js
│ │ │ │ ├── jsonlint.js
│ │ │ │ ├── lint.css
│ │ │ │ └── lint.js
│ │ │ ├── mdn-like-custom.css
│ │ │ ├── scroll
│ │ │ │ ├── annotatescrollbar.js
│ │ │ │ ├── scrollpastend.js
│ │ │ │ ├── simplescrollbars.css
│ │ │ │ └── simplescrollbars.js
│ │ │ ├── search
│ │ │ │ ├── jump-to-line.js
│ │ │ │ ├── match-highlighter.js
│ │ │ │ ├── matchesonscrollbar.css
│ │ │ │ ├── matchesonscrollbar.js
│ │ │ │ ├── search.js
│ │ │ │ └── searchcursor.js
│ │ │ ├── selection
│ │ │ │ ├── active-line.js
│ │ │ │ ├── mark-selection.js
│ │ │ │ └── selection-pointer.js
│ │ │ ├── simple.js
│ │ │ └── sublime.js
│ │ └── mode
│ │ │ ├── coffeescript.js
│ │ │ ├── css.js
│ │ │ ├── go.js
│ │ │ ├── htmlembedded.js
│ │ │ ├── htmlmixed.js
│ │ │ ├── javascript.js
│ │ │ ├── markdown.js
│ │ │ ├── python.js
│ │ │ ├── rust.js
│ │ │ └── xml.js
│ │ ├── css
│ │ ├── Menu.css
│ │ ├── Selectbar.css
│ │ ├── UiFileManager.css
│ │ └── all.css
│ │ ├── img
│ │ └── loading.gif
│ │ ├── js
│ │ ├── Config.coffee
│ │ ├── FileEditor.coffee
│ │ ├── FileItemList.coffee
│ │ ├── FileList.coffee
│ │ ├── UiFileManager.coffee
│ │ ├── all.js
│ │ └── lib
│ │ │ ├── Animation.coffee
│ │ │ ├── Class.coffee
│ │ │ ├── Dollar.coffee
│ │ │ ├── ItemList.coffee
│ │ │ ├── Menu.coffee
│ │ │ ├── Promise.coffee
│ │ │ ├── Prototypes.coffee
│ │ │ ├── RateLimitCb.coffee
│ │ │ ├── Text.coffee
│ │ │ ├── Time.coffee
│ │ │ ├── ZeroFrame.coffee
│ │ │ └── maquette.js
│ │ └── list.html
├── UiPluginManager
│ ├── UiPluginManagerPlugin.py
│ ├── __init__.py
│ └── media
│ │ ├── css
│ │ ├── PluginManager.css
│ │ ├── all.css
│ │ ├── button.css
│ │ └── fonts.css
│ │ ├── img
│ │ └── loading.gif
│ │ ├── js
│ │ ├── PluginList.coffee
│ │ ├── UiPluginManager.coffee
│ │ ├── all.js
│ │ ├── lib
│ │ │ ├── Class.coffee
│ │ │ ├── Promise.coffee
│ │ │ ├── Prototypes.coffee
│ │ │ └── maquette.js
│ │ └── utils
│ │ │ ├── Animation.coffee
│ │ │ ├── Dollar.coffee
│ │ │ └── ZeroFrame.coffee
│ │ └── plugin_manager.html
├── Zeroname
│ ├── README.md
│ ├── SiteManagerPlugin.py
│ ├── __init__.py
│ └── updater
│ │ └── zeroname_updater.py
├── __init__.py
├── disabled-Bootstrapper
│ ├── BootstrapperDb.py
│ ├── BootstrapperPlugin.py
│ ├── Test
│ │ ├── TestBootstrapper.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── __init__.py
│ └── plugin_info.json
├── disabled-Dnschain
│ ├── SiteManagerPlugin.py
│ ├── UiRequestPlugin.py
│ └── __init__.py
├── disabled-DonationMessage
│ ├── DonationMessagePlugin.py
│ └── __init__.py
├── disabled-Multiuser
│ ├── MultiuserPlugin.py
│ ├── Test
│ │ ├── TestMultiuser.py
│ │ ├── conftest.py
│ │ └── pytest.ini
│ ├── UserPlugin.py
│ ├── __init__.py
│ └── plugin_info.json
├── disabled-StemPort
│ ├── StemPortPlugin.py
│ └── __init__.py
├── disabled-UiPassword
│ ├── UiPasswordPlugin.py
│ ├── __init__.py
│ ├── login.html
│ └── plugin_info.json
└── disabled-ZeronameLocal
│ ├── SiteManagerPlugin.py
│ ├── UiRequestPlugin.py
│ └── __init__.py
├── requirements.txt
├── src
├── Config.py
├── Connection
│ ├── Connection.py
│ ├── ConnectionServer.py
│ └── __init__.py
├── Content
│ ├── ContentDb.py
│ ├── ContentDbDict.py
│ ├── ContentManager.py
│ └── __init__.py
├── Crypt
│ ├── Crypt.py
│ ├── CryptBitcoin.py
│ ├── CryptConnection.py
│ ├── CryptHash.py
│ ├── CryptRsa.py
│ └── __init__.py
├── Db
│ ├── Db.py
│ ├── DbCursor.py
│ ├── DbQuery.py
│ └── __init__.py
├── Debug
│ ├── Debug.py
│ ├── DebugHook.py
│ ├── DebugLock.py
│ ├── DebugMedia.py
│ ├── DebugReloader.py
│ └── __init__.py
├── File
│ ├── FileRequest.py
│ ├── FileServer.py
│ └── __init__.py
├── Peer
│ ├── Peer.py
│ ├── PeerHashfield.py
│ ├── PeerPortchecker.py
│ └── __init__.py
├── Plugin
│ ├── PluginManager.py
│ └── __init__.py
├── Site
│ ├── Site.py
│ ├── SiteAnnouncer.py
│ ├── SiteManager.py
│ ├── SiteStorage.py
│ └── __init__.py
├── Test
│ ├── BenchmarkSsl.py
│ ├── Spy.py
│ ├── TestCached.py
│ ├── TestConfig.py
│ ├── TestConnectionServer.py
│ ├── TestContent.py
│ ├── TestContentUser.py
│ ├── TestCryptBitcoin.py
│ ├── TestCryptConnection.py
│ ├── TestCryptHash.py
│ ├── TestDb.py
│ ├── TestDbQuery.py
│ ├── TestDebug.py
│ ├── TestDiff.py
│ ├── TestEvent.py
│ ├── TestFileRequest.py
│ ├── TestFlag.py
│ ├── TestHelper.py
│ ├── TestMsgpack.py
│ ├── TestNoparallel.py
│ ├── TestPeer.py
│ ├── TestRateLimit.py
│ ├── TestSafeRe.py
│ ├── TestSite.py
│ ├── TestSiteDownload.py
│ ├── TestSiteStorage.py
│ ├── TestThreadPool.py
│ ├── TestTor.py
│ ├── TestTranslate.py
│ ├── TestUiWebsocket.py
│ ├── TestUpnpPunch.py
│ ├── TestUser.py
│ ├── TestWeb.py
│ ├── TestWorkerTaskManager.py
│ ├── __init__.py
│ ├── conftest.py
│ ├── coverage.ini
│ ├── pytest.ini
│ └── testdata
│ │ └── 1TeSTvb4w2PWE81S2rEELgmX2GCCExQGT-original
│ │ ├── content.json
│ │ ├── css
│ │ └── all.css
│ │ ├── data-default
│ │ ├── data.json
│ │ └── users
│ │ │ └── content-default.json
│ │ ├── data
│ │ ├── data.json
│ │ ├── img
│ │ │ ├── autoupdate.png
│ │ │ ├── direct_domains.png
│ │ │ ├── domain.png
│ │ │ ├── memory.png
│ │ │ ├── multiuser.png
│ │ │ ├── progressbar.png
│ │ │ ├── slides.png
│ │ │ ├── slots_memory.png
│ │ │ ├── trayicon.png
│ │ │ ├── zeroblog-comments.png
│ │ │ ├── zeroid.png
│ │ │ ├── zeroname.png
│ │ │ ├── zerotalk-mark.png
│ │ │ ├── zerotalk-upvote.png
│ │ │ └── zerotalk.png
│ │ ├── optional.txt
│ │ ├── test_include
│ │ │ ├── content.json
│ │ │ └── data.json
│ │ └── users
│ │ │ ├── 1C5sgvWaSgfaTpV5kjBCnCiKtENNMYo69q
│ │ │ ├── content.json
│ │ │ └── data.json
│ │ │ ├── 1CjfbrbwtP8Y2QjPy12vpTATkUT7oSiPQ9
│ │ │ ├── content.json
│ │ │ ├── data.json
│ │ │ └── peanut-butter-jelly-time.gif
│ │ │ ├── 1J6UrZMkarjVg5ax9W4qThir3BFUikbW6C
│ │ │ ├── content.json
│ │ │ └── data.json
│ │ │ └── content.json
│ │ ├── dbschema.json
│ │ ├── img
│ │ └── loading.gif
│ │ ├── index.html
│ │ └── js
│ │ └── all.js
├── Tor
│ ├── TorManager.py
│ └── __init__.py
├── Translate
│ ├── Translate.py
│ ├── __init__.py
│ └── languages
│ │ ├── da.json
│ │ ├── de.json
│ │ ├── es.json
│ │ ├── fa.json
│ │ ├── fr.json
│ │ ├── hu.json
│ │ ├── it.json
│ │ ├── jp.json
│ │ ├── nl.json
│ │ ├── pl.json
│ │ ├── pt-br.json
│ │ ├── ru.json
│ │ ├── sk.json
│ │ ├── sl.json
│ │ ├── tr.json
│ │ ├── zh-tw.json
│ │ └── zh.json
├── Ui
│ ├── UiRequest.py
│ ├── UiServer.py
│ ├── UiWebsocket.py
│ ├── __init__.py
│ ├── media
│ │ ├── Fixbutton.coffee
│ │ ├── Infopanel.coffee
│ │ ├── Loading.coffee
│ │ ├── Notifications.coffee
│ │ ├── Wrapper.coffee
│ │ ├── Wrapper.css
│ │ ├── WrapperZeroFrame.coffee
│ │ ├── ZeroSiteTheme.coffee
│ │ ├── all.css
│ │ ├── all.js
│ │ ├── img
│ │ │ ├── apple-touch-icon.png
│ │ │ ├── favicon.ico
│ │ │ ├── favicon.psd
│ │ │ ├── loading-circle.gif
│ │ │ ├── loading.gif
│ │ │ ├── logo-white.svg
│ │ │ ├── logo.png
│ │ │ ├── logo.psd
│ │ │ └── logo.svg
│ │ └── lib
│ │ │ ├── 00-jquery.min.js
│ │ │ ├── RateLimit.coffee
│ │ │ ├── Translate.coffee
│ │ │ ├── ZeroWebsocket.coffee
│ │ │ ├── jquery.cssanim.js
│ │ │ ├── jquery.csslater.coffee
│ │ │ └── jquery.easing.js
│ └── template
│ │ ├── site_add.html
│ │ └── wrapper.html
├── User
│ ├── User.py
│ ├── UserManager.py
│ └── __init__.py
├── Worker
│ ├── Worker.py
│ ├── WorkerManager.py
│ ├── WorkerTaskManager.py
│ └── __init__.py
├── __init__.py
├── lib
│ ├── __init__.py
│ ├── bencode_open
│ │ ├── LICENSE
│ │ └── __init__.py
│ ├── cssvendor
│ │ ├── __init__.py
│ │ └── cssvendor.py
│ ├── gevent_ws
│ │ └── __init__.py
│ ├── libsecp256k1message
│ │ ├── __init__.py
│ │ └── libsecp256k1message.py
│ ├── openssl
│ │ └── openssl.cnf
│ ├── pyaes
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── aes.py
│ │ ├── blockfeeder.py
│ │ └── util.py
│ ├── sslcrypto
│ │ ├── LICENSE
│ │ ├── __init__.py
│ │ ├── _aes.py
│ │ ├── _ecc.py
│ │ ├── _ripemd.py
│ │ ├── fallback
│ │ │ ├── __init__.py
│ │ │ ├── _jacobian.py
│ │ │ ├── _util.py
│ │ │ ├── aes.py
│ │ │ ├── ecc.py
│ │ │ └── rsa.py
│ │ └── openssl
│ │ │ ├── __init__.py
│ │ │ ├── aes.py
│ │ │ ├── discovery.py
│ │ │ ├── ecc.py
│ │ │ ├── library.py
│ │ │ └── rsa.py
│ └── subtl
│ │ ├── LICENCE
│ │ ├── README.md
│ │ ├── __init__.py
│ │ └── subtl.py
├── main.py
└── util
│ ├── Cached.py
│ ├── Diff.py
│ ├── Electrum.py
│ ├── Event.py
│ ├── Flag.py
│ ├── GreenletManager.py
│ ├── Msgpack.py
│ ├── Noparallel.py
│ ├── OpensslFindPatch.py
│ ├── Platform.py
│ ├── Pooled.py
│ ├── QueryJson.py
│ ├── RateLimit.py
│ ├── SafeRe.py
│ ├── SocksProxy.py
│ ├── ThreadPool.py
│ ├── UpnpPunch.py
│ ├── __init__.py
│ └── helper.py
├── start.py
├── tools
└── coffee
│ ├── README.md
│ ├── coffee-script.js
│ ├── coffee.cmd
│ └── coffee.wsf
├── update.py
└── zeronet.py
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | custom: https://zeronet.io/docs/help_zeronet/donate/
2 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug-report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve ZeroNet
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | ### Step 1: Please describe your environment
11 |
12 | * ZeroNet version: _____
13 | * Operating system: _____
14 | * Web browser: _____
15 | * Tor status: not available/always/disabled
16 | * Opened port: yes/no
17 | * Special configuration: ____
18 |
19 | ### Step 2: Describe the problem:
20 |
21 | #### Steps to reproduce:
22 |
23 | 1. _____
24 | 2. _____
25 | 3. _____
26 |
27 | #### Observed Results:
28 |
29 | * What happened? This could be a screenshot, a description, log output (you can send log/debug.log file to hello@zeronet.io if necessary), etc.
30 |
31 | #### Expected Results:
32 |
33 | * What did you expect to happen?
34 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for ZeroNet
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 |
5 | # Log files
6 | **/*.log
7 |
8 | # Hidden files
9 | .*
10 | !/.github
11 | !/.gitignore
12 | !/.travis.yml
13 | !/.gitlab-ci.yml
14 |
15 | # Temporary files
16 | *.bak
17 |
18 | # Data dir
19 | data/*
20 | *.db
21 |
22 | # Virtualenv
23 | env/*
24 |
25 | # Tor data
26 | tools/tor/data
27 |
28 | # PhantomJS, downloaded manually for unit tests
29 | tools/phantomjs
30 |
31 | # ZeroNet config file
32 | zeronet.conf
33 |
34 | # ZeroNet log files
35 | log/*
36 |
--------------------------------------------------------------------------------
/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | stages:
2 | - test
3 |
4 | .test_template: &test_template
5 | stage: test
6 | before_script:
7 | - pip install --upgrade pip wheel
8 | # Selenium and requests can't be installed without a requests hint on Python 3.4
9 | - pip install --upgrade requests>=2.22.0
10 | - pip install --upgrade codecov coveralls flake8 mock pytest==4.6.3 pytest-cov selenium
11 | - pip install --upgrade -r requirements.txt
12 | script:
13 | - pip list
14 | - openssl version -a
15 | - python -m pytest -x plugins/CryptMessage/Test --color=yes
16 | - python -m pytest -x plugins/Bigfile/Test --color=yes
17 | - python -m pytest -x plugins/AnnounceLocal/Test --color=yes
18 | - python -m pytest -x plugins/OptionalManager/Test --color=yes
19 | - python -m pytest src/Test --cov=src --cov-config src/Test/coverage.ini --color=yes
20 | - mv plugins/disabled-Multiuser plugins/Multiuser
21 | - python -m pytest -x plugins/Multiuser/Test --color=yes
22 | - mv plugins/disabled-Bootstrapper plugins/Bootstrapper
23 | - python -m pytest -x plugins/Bootstrapper/Test --color=yes
24 | - flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics --exclude=src/lib/pyaes/
25 |
26 | test:py3.4:
27 | image: python:3.4.3
28 | <<: *test_template
29 |
30 | test:py3.5:
31 | image: python:3.5.7
32 | <<: *test_template
33 |
34 | test:py3.6:
35 | image: python:3.6.9
36 | <<: *test_template
37 |
38 | test:py3.7-openssl1.1.0:
39 | image: python:3.7.0b5
40 | <<: *test_template
41 |
42 | test:py3.7-openssl1.1.1:
43 | image: python:3.7.4
44 | <<: *test_template
45 |
46 | test:py3.8:
47 | image: python:3.8.0b3
48 | <<: *test_template
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: python
2 | python:
3 | - 3.4
4 | - 3.5
5 | - 3.6
6 | - 3.7
7 | - 3.8
8 | services:
9 | - docker
10 | cache: pip
11 | before_install:
12 | - pip install --upgrade pip wheel
13 | - pip install --upgrade codecov coveralls flake8 mock pytest==4.6.3 pytest-cov selenium
14 | # - docker build -t zeronet .
15 | # - docker run -d -v $PWD:/root/data -p 15441:15441 -p 127.0.0.1:43110:43110 zeronet
16 | install:
17 | - pip install --upgrade -r requirements.txt
18 | - pip list
19 | before_script:
20 | - openssl version -a
21 | # Add an IPv6 config - see the corresponding Travis issue
22 | # https://github.com/travis-ci/travis-ci/issues/8361
23 | - if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
24 | sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6';
25 | fi
26 | script:
27 | - catchsegv python -m pytest src/Test --cov=src --cov-config src/Test/coverage.ini
28 | - export ZERONET_LOG_DIR="log/CryptMessage"; catchsegv python -m pytest -x plugins/CryptMessage/Test
29 | - export ZERONET_LOG_DIR="log/Bigfile"; catchsegv python -m pytest -x plugins/Bigfile/Test
30 | - export ZERONET_LOG_DIR="log/AnnounceLocal"; catchsegv python -m pytest -x plugins/AnnounceLocal/Test
31 | - export ZERONET_LOG_DIR="log/OptionalManager"; catchsegv python -m pytest -x plugins/OptionalManager/Test
32 | - export ZERONET_LOG_DIR="log/Multiuser"; mv plugins/disabled-Multiuser plugins/Multiuser && catchsegv python -m pytest -x plugins/Multiuser/Test
33 | - export ZERONET_LOG_DIR="log/Bootstrapper"; mv plugins/disabled-Bootstrapper plugins/Bootstrapper && catchsegv python -m pytest -x plugins/Bootstrapper/Test
34 | - find src -name "*.json" | xargs -n 1 python3 -c "import json, sys; print(sys.argv[1], end=' '); json.load(open(sys.argv[1])); print('[OK]')"
35 | - find plugins -name "*.json" | xargs -n 1 python3 -c "import json, sys; print(sys.argv[1], end=' '); json.load(open(sys.argv[1])); print('[OK]')"
36 | - flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics --exclude=src/lib/pyaes/
37 | after_failure:
38 | - zip -r log.zip log/
39 | - curl --upload-file ./log.zip https://transfer.sh/log.zip
40 | after_success:
41 | - codecov
42 | - coveralls --rcfile=src/Test/coverage.ini
43 | notifications:
44 | email:
45 | recipients:
46 | hello@zeronet.io
47 | on_success: change
48 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM alpine:3.11
2 |
3 | #Base settings
4 | ENV HOME /root
5 |
6 | COPY requirements.txt /root/requirements.txt
7 |
8 | #Install ZeroNet
9 | RUN apk --update --no-cache --no-progress add python3 python3-dev gcc libffi-dev musl-dev make tor openssl \
10 | && pip3 install -r /root/requirements.txt \
11 | && apk del python3-dev gcc libffi-dev musl-dev make \
12 | && echo "ControlPort 9051" >> /etc/tor/torrc \
13 | && echo "CookieAuthentication 1" >> /etc/tor/torrc
14 |
15 | RUN python3 -V \
16 | && python3 -m pip list \
17 | && tor --version \
18 | && openssl version
19 |
20 | #Add Zeronet source
21 | COPY . /root
22 | VOLUME /root/data
23 |
24 | #Control if Tor proxy is started
25 | ENV ENABLE_TOR false
26 |
27 | WORKDIR /root
28 |
29 | #Set upstart command
30 | CMD (! ${ENABLE_TOR} || tor&) && python3 zeronet.py --ui_ip 0.0.0.0 --fileserver_port 26552
31 |
32 | #Expose ports
33 | EXPOSE 43110 26552
34 |
--------------------------------------------------------------------------------
/Dockerfile.arm64v8:
--------------------------------------------------------------------------------
1 | FROM alpine:3.12
2 |
3 | #Base settings
4 | ENV HOME /root
5 |
6 | COPY requirements.txt /root/requirements.txt
7 |
8 | #Install ZeroNet
9 | RUN apk --update --no-cache --no-progress add python3 python3-dev gcc libffi-dev musl-dev make tor openssl \
10 | && pip3 install -r /root/requirements.txt \
11 | && apk del python3-dev gcc libffi-dev musl-dev make \
12 | && echo "ControlPort 9051" >> /etc/tor/torrc \
13 | && echo "CookieAuthentication 1" >> /etc/tor/torrc
14 |
15 | RUN python3 -V \
16 | && python3 -m pip list \
17 | && tor --version \
18 | && openssl version
19 |
20 | #Add Zeronet source
21 | COPY . /root
22 | VOLUME /root/data
23 |
24 | #Control if Tor proxy is started
25 | ENV ENABLE_TOR false
26 |
27 | WORKDIR /root
28 |
29 | #Set upstart command
30 | CMD (! ${ENABLE_TOR} || tor&) && python3 zeronet.py --ui_ip 0.0.0.0 --fileserver_port 26552
31 |
32 | #Expose ports
33 | EXPOSE 43110 26552
34 |
35 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | This program is free software: you can redistribute it and/or modify
2 | it under the terms of the GNU General Public License as published by
3 | the Free Software Foundation, version 3.
4 |
5 | This program is distributed in the hope that it will be useful,
6 | but WITHOUT ANY WARRANTY; without even the implied warranty of
7 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 | GNU General Public License for more details.
9 |
10 | You should have received a copy of the GNU General Public License
11 | along with this program. If not, see
Directory: %s": "Tu empezaste a ayudar a distribuir %s.
Directorio: %s",
5 | "Help distribute all new optional files on site %s": "Ayude a distribuir todos los archivos opcionales en el sitio %s",
6 | "Yes, I want to help!": "¡Si, yo quiero ayudar!"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/OptionalManager/languages/fr.json:
--------------------------------------------------------------------------------
1 | {
2 | "Pinned %s files": "Fichiers %s épinglés",
3 | "Removed pin from %s files": "Fichiers %s ne sont plus épinglés",
4 | "You started to help distribute %s.
Directory: %s": "Vous avez commencé à aider à distribuer %s.
Dossier : %s",
5 | "Help distribute all new optional files on site %s": "Aider à distribuer tous les fichiers optionnels du site %s",
6 | "Yes, I want to help!": "Oui, je veux aider !"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/OptionalManager/languages/hu.json:
--------------------------------------------------------------------------------
1 | {
2 | "Pinned %s files": "%s fájl rögzítve",
3 | "Removed pin from %s files": "%s fájl rögzítés eltávolítva",
4 | "You started to help distribute %s.
Directory: %s": "Új segítség a terjesztésben: %s.
Könyvtár: %s",
5 | "Help distribute all new optional files on site %s": "Segítség az összes új opcionális fájl terjesztésében az %s oldalon",
6 | "Yes, I want to help!": "Igen, segíteni akarok!"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/OptionalManager/languages/jp.json:
--------------------------------------------------------------------------------
1 | {
2 | "Pinned %s files": "%s 件のファイルを固定",
3 | "Removed pin from %s files": "%s 件のファイルの固定を解除",
4 | "You started to help distribute %s.
Directory: %s": "あなたはサイト: %s の配布の援助を開始しました。
ディレクトリ: %s",
5 | "Help distribute all new optional files on site %s": "サイト: %s のすべての新しいオプションファイルの配布を援助しますか?",
6 | "Yes, I want to help!": "はい、やります!"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/OptionalManager/languages/pt-br.json:
--------------------------------------------------------------------------------
1 | {
2 | "Pinned %s files": "Arquivos %s fixados",
3 | "Removed pin from %s files": "Arquivos %s não estão fixados",
4 | "You started to help distribute %s.
Directory: %s": "Você começou a ajudar a distribuir %s.
Pasta: %s",
5 | "Help distribute all new optional files on site %s": "Ajude a distribuir todos os novos arquivos opcionais no site %s",
6 | "Yes, I want to help!": "Sim, eu quero ajudar!"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/OptionalManager/languages/zh-tw.json:
--------------------------------------------------------------------------------
1 | {
2 | "Pinned %s files": "已固定 %s 個檔",
3 | "Removed pin from %s files": "已解除固定 %s 個檔",
4 | "You started to help distribute %s.
Directory: %s": "你已經開始幫助分發 %s 。
目錄:%s",
5 | "Help distribute all new optional files on site %s": "你想要幫助分發 %s 網站的所有檔嗎?",
6 | "Yes, I want to help!": "是,我想要幫助!"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/OptionalManager/languages/zh.json:
--------------------------------------------------------------------------------
1 | {
2 | "Pinned %s files": "已固定 %s 个文件",
3 | "Removed pin from %s files": "已解除固定 %s 个文件",
4 | "You started to help distribute %s.
Directory: %s": "您已经开始帮助分发 %s 。
目录:%s",
5 | "Help distribute all new optional files on site %s": "您想要帮助分发 %s 站点的所有文件吗?",
6 | "Yes, I want to help!": "是,我想要帮助!"
7 | }
8 |
--------------------------------------------------------------------------------
/plugins/PeerDb/__init__.py:
--------------------------------------------------------------------------------
1 | from . import PeerDbPlugin
2 |
3 |
--------------------------------------------------------------------------------
/plugins/PeerDb/plugin_info.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "PeerDb",
3 | "description": "Save/restore peer list on client restart.",
4 | "default": "enabled"
5 | }
--------------------------------------------------------------------------------
/plugins/Sidebar/ZipStream.py:
--------------------------------------------------------------------------------
1 | import io
2 | import os
3 | import zipfile
4 |
5 | class ZipStream(object):
6 | def __init__(self, dir_path):
7 | self.dir_path = dir_path
8 | self.pos = 0
9 | self.buff_pos = 0
10 | self.zf = zipfile.ZipFile(self, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
11 | self.buff = io.BytesIO()
12 | self.file_list = self.getFileList()
13 |
14 | def getFileList(self):
15 | for root, dirs, files in os.walk(self.dir_path):
16 | for file in files:
17 | file_path = root + "/" + file
18 | relative_path = os.path.join(os.path.relpath(root, self.dir_path), file)
19 | yield file_path, relative_path
20 | self.zf.close()
21 |
22 | def read(self, size=60 * 1024):
23 | for file_path, relative_path in self.file_list:
24 | self.zf.write(file_path, relative_path)
25 | if self.buff.tell() >= size:
26 | break
27 | self.buff.seek(0)
28 | back = self.buff.read()
29 | self.buff.truncate(0)
30 | self.buff.seek(0)
31 | self.buff_pos += len(back)
32 | return back
33 |
34 | def write(self, data):
35 | self.pos += len(data)
36 | self.buff.write(data)
37 |
38 | def tell(self):
39 | return self.pos
40 |
41 | def seek(self, pos, whence=0):
42 | if pos >= self.buff_pos:
43 | self.buff.seek(pos - self.buff_pos, whence)
44 | self.pos = pos
45 |
46 | def flush(self):
47 | pass
48 |
49 |
50 | if __name__ == "__main__":
51 | zs = ZipStream(".")
52 | out = open("out.zip", "wb")
53 | while 1:
54 | data = zs.read()
55 | print("Write %s" % len(data))
56 | if not data:
57 | break
58 | out.write(data)
59 | out.close()
60 |
--------------------------------------------------------------------------------
/plugins/Sidebar/__init__.py:
--------------------------------------------------------------------------------
1 | from . import SidebarPlugin
2 | from . import ConsolePlugin
--------------------------------------------------------------------------------
/plugins/Sidebar/media/Class.coffee:
--------------------------------------------------------------------------------
1 | class Class
2 | trace: true
3 |
4 | log: (args...) ->
5 | return unless @trace
6 | return if typeof console is 'undefined'
7 | args.unshift("[#{@.constructor.name}]")
8 | console.log(args...)
9 | @
10 |
11 | logStart: (name, args...) ->
12 | return unless @trace
13 | @logtimers or= {}
14 | @logtimers[name] = +(new Date)
15 | @log "#{name}", args..., "(started)" if args.length > 0
16 | @
17 |
18 | logEnd: (name, args...) ->
19 | ms = +(new Date)-@logtimers[name]
20 | @log "#{name}", args..., "(Done in #{ms}ms)"
21 | @
22 |
23 | window.Class = Class
--------------------------------------------------------------------------------
/plugins/Sidebar/media/Menu.coffee:
--------------------------------------------------------------------------------
1 | class Menu
2 | constructor: (@button) ->
3 | @elem = $(".menu.template").clone().removeClass("template")
4 | @elem.appendTo("body")
5 | @items = []
6 |
7 | show: ->
8 | if window.visible_menu and window.visible_menu.button[0] == @button[0] # Same menu visible then hide it
9 | window.visible_menu.hide()
10 | @hide()
11 | else
12 | button_pos = @button.offset()
13 | left = button_pos.left
14 | @elem.css({"top": button_pos.top+@button.outerHeight(), "left": left})
15 | @button.addClass("menu-active")
16 | @elem.addClass("visible")
17 | if @elem.position().left + @elem.width() + 20 > window.innerWidth
18 | @elem.css("left", window.innerWidth - @elem.width() - 20)
19 | if window.visible_menu then window.visible_menu.hide()
20 | window.visible_menu = @
21 |
22 |
23 | hide: ->
24 | @elem.removeClass("visible")
25 | @button.removeClass("menu-active")
26 | window.visible_menu = null
27 |
28 |
29 | addItem: (title, cb) ->
30 | item = $(".menu-item.template", @elem).clone().removeClass("template")
31 | item.html(title)
32 | item.on "click", =>
33 | if not cb(item)
34 | @hide()
35 | return false
36 | item.appendTo(@elem)
37 | @items.push item
38 | return item
39 |
40 |
41 | log: (args...) ->
42 | console.log "[Menu]", args...
43 |
44 | window.Menu = Menu
45 |
46 | # Hide menu on outside click
47 | $("body").on "click", (e) ->
48 | if window.visible_menu and e.target != window.visible_menu.button[0] and $(e.target).parent()[0] != window.visible_menu.elem[0]
49 | window.visible_menu.hide()
50 |
--------------------------------------------------------------------------------
/plugins/Sidebar/media/Menu.css:
--------------------------------------------------------------------------------
1 | .menu {
2 | background-color: white; padding: 10px 0px; position: absolute; top: 0px; left: 0px; max-height: 0px; overflow: hidden; transform: translate(0px, -30px); pointer-events: none;
3 | box-shadow: 0px 2px 8px rgba(0,0,0,0.3); border-radius: 2px; opacity: 0; transition: opacity 0.2s ease-out, transform 1s ease-out, max-height 0.2s ease-in-out;
4 | }
5 | .menu.visible { opacity: 1; max-height: 350px; transform: translate(0px, 0px); transition: opacity 0.1s ease-out, transform 0.3s ease-out, max-height 0.3s ease-in-out; pointer-events: all }
6 |
7 | .menu-item { display: block; text-decoration: none; color: black; padding: 6px 24px; transition: all 0.2s; border-bottom: none; font-weight: normal; padding-left: 30px; }
8 | .menu-item-separator { margin-top: 5px; border-top: 1px solid #eee }
9 |
10 | .menu-item:hover { background-color: #F6F6F6; transition: none; color: inherit; border: none }
11 | .menu-item:active, .menu-item:focus { background-color: #AF3BFF; color: white; transition: none }
12 | .menu-item.selected:before {
13 | content: "L"; display: inline-block; transform: rotateZ(45deg) scaleX(-1);
14 | font-weight: bold; position: absolute; margin-left: -17px; font-size: 12px; margin-top: 2px;
15 | }
16 |
17 | @media only screen and (max-width: 800px) {
18 | .menu, .menu.visible { position: absolute; left: unset !important; right: 20px; }
19 | }
--------------------------------------------------------------------------------
/plugins/Sidebar/media/Prototypes.coffee:
--------------------------------------------------------------------------------
1 | String::startsWith = (s) -> @[...s.length] is s
2 | String::endsWith = (s) -> s is '' or @[-s.length..] is s
3 | String::capitalize = -> if @.length then @[0].toUpperCase() + @.slice(1) else ""
4 | String::repeat = (count) -> new Array( count + 1 ).join(@)
5 |
6 | window.isEmpty = (obj) ->
7 | for key of obj
8 | return false
9 | return true
10 |
--------------------------------------------------------------------------------
/plugins/Sidebar/media/RateLimit.coffee:
--------------------------------------------------------------------------------
1 | limits = {}
2 | call_after_interval = {}
3 | window.RateLimit = (interval, fn) ->
4 | if not limits[fn]
5 | call_after_interval[fn] = false
6 | fn() # First call is not delayed
7 | limits[fn] = setTimeout (->
8 | if call_after_interval[fn]
9 | fn()
10 | delete limits[fn]
11 | delete call_after_interval[fn]
12 | ), interval
13 | else # Called within iterval, delay the call
14 | call_after_interval[fn] = true
15 |
--------------------------------------------------------------------------------
/plugins/Sidebar/media/Scrollbable.css:
--------------------------------------------------------------------------------
1 | .scrollable {
2 | overflow: hidden;
3 | }
4 |
5 | .scrollable.showScroll::after {
6 | position: absolute;
7 | content: '';
8 | top: 5%;
9 | right: 7px;
10 | height: 90%;
11 | width: 3px;
12 | background: rgba(224, 224, 255, .3);
13 | }
14 |
15 | .scrollable .content-wrapper {
16 | width: 100%;
17 | height: 100%;
18 | padding-right: 50%;
19 | overflow-y: scroll;
20 | }
21 | .scroller {
22 | margin-top: 5px;
23 | z-index: 5;
24 | cursor: pointer;
25 | position: absolute;
26 | width: 7px;
27 | border-radius: 5px;
28 | background: #3A3A3A;
29 | top: 0px;
30 | left: 395px;
31 | -webkit-transition: top .08s;
32 | -moz-transition: top .08s;
33 | -ms-transition: top .08s;
34 | -o-transition: top .08s;
35 | transition: top .08s;
36 | }
37 | .scroller {
38 | -webkit-touch-callout: none;
39 | -webkit-user-select: none;
40 | -khtml-user-select: none;
41 | -moz-user-select: none;
42 | -ms-user-select: none;
43 | user-select: none;
44 | }
45 |
--------------------------------------------------------------------------------
/plugins/Sidebar/media_globe/Detector.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @author alteredq / http://alteredqualia.com/
3 | * @author mr.doob / http://mrdoob.com/
4 | */
5 |
6 | Detector = {
7 |
8 | canvas : !! window.CanvasRenderingContext2D,
9 | webgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),
10 | workers : !! window.Worker,
11 | fileapi : window.File && window.FileReader && window.FileList && window.Blob,
12 |
13 | getWebGLErrorMessage : function () {
14 |
15 | var domElement = document.createElement( 'div' );
16 |
17 | domElement.style.fontFamily = 'monospace';
18 | domElement.style.fontSize = '13px';
19 | domElement.style.textAlign = 'center';
20 | domElement.style.background = '#eee';
21 | domElement.style.color = '#000';
22 | domElement.style.padding = '1em';
23 | domElement.style.width = '475px';
24 | domElement.style.margin = '5em auto 0';
25 |
26 | if ( ! this.webgl ) {
27 |
28 | domElement.innerHTML = window.WebGLRenderingContext ? [
29 | 'Sorry, your graphics card doesn\'t support WebGL'
30 | ].join( '\n' ) : [
31 | 'Sorry, your browser doesn\'t support WebGL
',
32 | 'Please try with',
33 | 'Chrome, ',
34 | 'Firefox 4 or',
35 | 'Webkit Nightly (Mac)'
36 | ].join( '\n' );
37 |
38 | }
39 |
40 | return domElement;
41 |
42 | },
43 |
44 | addGetWebGLMessage : function ( parameters ) {
45 |
46 | var parent, id, domElement;
47 |
48 | parameters = parameters || {};
49 |
50 | parent = parameters.parent !== undefined ? parameters.parent : document.body;
51 | id = parameters.id !== undefined ? parameters.id : 'oldie';
52 |
53 | domElement = Detector.getWebGLErrorMessage();
54 | domElement.id = id;
55 |
56 | parent.appendChild( domElement );
57 |
58 | }
59 |
60 | };
61 |
--------------------------------------------------------------------------------
/plugins/Sidebar/media_globe/world.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HelloZeroNet/ZeroNet/454c0b2e7e000fda7000cba49027541fbf327b96/plugins/Sidebar/media_globe/world.jpg
--------------------------------------------------------------------------------
/plugins/Sidebar/plugin_info.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Sidebar",
3 | "description": "Access site management sidebar and console by dragging top-right 0 button to left or down.",
4 | "default": "enabled"
5 | }
--------------------------------------------------------------------------------
/plugins/Stats/__init__.py:
--------------------------------------------------------------------------------
1 | from . import StatsPlugin
--------------------------------------------------------------------------------
/plugins/Stats/plugin_info.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Stats",
3 | "description": "/Stats and /Benchmark pages.",
4 | "default": "enabled"
5 | }
--------------------------------------------------------------------------------
/plugins/TranslateSite/__init__.py:
--------------------------------------------------------------------------------
1 | from . import TranslateSitePlugin
2 |
--------------------------------------------------------------------------------
/plugins/TranslateSite/plugin_info.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "TranslateSite",
3 | "description": "Transparent support translation of site javascript and html files.",
4 | "default": "enabled"
5 | }
--------------------------------------------------------------------------------
/plugins/Trayicon/__init__.py:
--------------------------------------------------------------------------------
1 | import sys
2 |
3 | if sys.platform == 'win32':
4 | from . import TrayiconPlugin
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/es.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Reportar fallo/sugerir característica",
6 | "!Open ZeroNet": "!Abrir ZeroNet",
7 | "Quit": "Sair",
8 | "(active)": "(activo)",
9 | "(passive)": "(pasivo)",
10 | "Connections: %s": "Conecciones: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Recibido: %.2f MB | Enviado: %.2f MB",
12 | "Show console window": "Mostrar consola",
13 | "Start ZeroNet when Windows starts": "Iniciar Zeronet cuando inicie Windows"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/fr.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Rapport d'erreur/Demander une fonctionnalité",
6 | "!Open ZeroNet": "!Ouvrir ZeroNet",
7 | "Quit": "Quitter",
8 | "(active)": "(actif)",
9 | "(passive)": "(passif)",
10 | "Connections: %s": "Connexions: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Reçu: %.2f MB | Envoyé: %.2f MB",
12 | "Show console window": "Afficher la console",
13 | "Start ZeroNet when Windows starts": "Lancer ZeroNet au démarrage de Windows"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/hu.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Hiba bejelentés/ötletek",
6 | "!Open ZeroNet": "!ZeroNet megnyitása",
7 | "Quit": "Kilépés",
8 | "(active)": "(aktív)",
9 | "(passive)": "(passive)",
10 | "Connections: %s": "Kapcsolatok: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Fogadott: %.2f MB | Küldött: %.2f MB",
12 | "Show console window": "Parancssor mutatása",
13 | "Start ZeroNet when Windows starts": "ZeroNet indítása a Windows-al együtt"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/it.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Segnala bug/richiesta di una funzione",
6 | "!Open ZeroNet": "!Apri ZeroNet",
7 | "Quit": "Chiudi",
8 | "(active)": "(attivo)",
9 | "(passive)": "(passivo)",
10 | "Connections: %s": "Connessioni: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Ricevuto: %.2f MB | Inviato: %.2f MB",
12 | "Show console window": "Mostra finestra console",
13 | "Start ZeroNet when Windows starts": "Avvia ZeroNet all'avvio di Windows"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/jp.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "バグ報告/要望",
6 | "!Open ZeroNet": "!ZeroNetをブラウザで開く",
7 | "Quit": "閉じる",
8 | "(active)": "(アクティブ)",
9 | "(passive)": "(パッシブ)",
10 | "Connections: %s": "接続数: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "受信: %.2f MB | 送信: %.2f MB",
12 | "Show console window": "コンソールを表示",
13 | "Start ZeroNet when Windows starts": "Windows起動時にZeroNetも起動する"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/pl.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Zgłoś błąd / propozycję",
6 | "!Open ZeroNet": "!Otwórz ZeroNet",
7 | "Quit": "Zamknij",
8 | "(active)": "(aktywny)",
9 | "(passive)": "(pasywny)",
10 | "Connections: %s": "Połączenia: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Odebrano: %.2f MB | Wysłano: %.2f MB",
12 | "Show console window": "Pokaż okno konsoli",
13 | "Start ZeroNet when Windows starts": "Uruchom ZeroNet podczas startu Windows"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/pt-br.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Reportar bug/sugerir recurso",
6 | "!Open ZeroNet": "!Abrir ZeroNet",
7 | "Quit": "Sair",
8 | "(active)": "(ativo)",
9 | "(passive)": "(passivo)",
10 | "Connections: %s": "Conexões: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Recebido: %.2f MB | Enviado: %.2f MB",
12 | "Show console window": "Mostrar console",
13 | "Start ZeroNet when Windows starts": "Iniciar o ZeroNet quando o Windows for iniciado"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/tr.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "Hata bildir/geliştirme taleb et",
6 | "!Open ZeroNet": "!ZeroNet'i Aç",
7 | "Quit": "Kapat",
8 | "(active)": "(aktif)",
9 | "(passive)": "(pasif)",
10 | "Connections: %s": "Bağlantı sayısı: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "Gelen: %.2f MB | Gönderilen: %.2f MB",
12 | "Show console window": "Konsolu aç",
13 | "Start ZeroNet when Windows starts": "ZeroNet'i açılışta otomatik başlat"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/zh-tw.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "回饋问题/請求功能",
6 | "!Open ZeroNet": "!開啟 ZeroNet",
7 | "Quit": "退出",
8 | "(active)": "(主動模式)",
9 | "(passive)": "(被動模式)",
10 | "Connections: %s": "連線數: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "已收到: %.2f MB | 已傳送: %.2f MB",
12 | "Show console window": "顯示控制臺窗體",
13 | "Start ZeroNet when Windows starts": "在 Windows 啟動時執行 ZeroNet"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/languages/zh.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet Twitter": "ZeroNet Twitter",
3 | "ZeroNet Reddit": "ZeroNet Reddit",
4 | "ZeroNet Github": "ZeroNet Github",
5 | "Report bug/request feature": "反馈问题/请求功能",
6 | "!Open ZeroNet": "!打开 ZeroNet",
7 | "Quit": "退出",
8 | "(active)": "(主动模式)",
9 | "(passive)": "(被动模式)",
10 | "Connections: %s": "连接数: %s",
11 | "Received: %.2f MB | Sent: %.2f MB": "已接收: %.2f MB | 已发送: %.2f MB",
12 | "Show console window": "显示控制台窗口",
13 | "Start ZeroNet when Windows starts": "在 Windows 启动时运行 ZeroNet"
14 | }
15 |
--------------------------------------------------------------------------------
/plugins/Trayicon/lib/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HelloZeroNet/ZeroNet/454c0b2e7e000fda7000cba49027541fbf327b96/plugins/Trayicon/lib/__init__.py
--------------------------------------------------------------------------------
/plugins/Trayicon/lib/winfolders.py:
--------------------------------------------------------------------------------
1 | ''' Get windows special folders without pythonwin
2 | Example:
3 | import specialfolders
4 | start_programs = specialfolders.get(specialfolders.PROGRAMS)
5 |
6 | Code is public domain, do with it what you will.
7 |
8 | Luke Pinner - Environment.gov.au, 2010 February 10
9 | '''
10 |
11 | #Imports use _syntax to mask them from autocomplete IDE's
12 | import ctypes as _ctypes
13 | from ctypes import create_unicode_buffer as _cub
14 | from ctypes.wintypes import HWND as _HWND, HANDLE as _HANDLE,DWORD as _DWORD,LPCWSTR as _LPCWSTR,MAX_PATH as _MAX_PATH
15 | _SHGetFolderPath = _ctypes.windll.shell32.SHGetFolderPathW
16 |
17 | #public special folder constants
18 | DESKTOP= 0
19 | PROGRAMS= 2
20 | MYDOCUMENTS= 5
21 | FAVORITES= 6
22 | STARTUP= 7
23 | RECENT= 8
24 | SENDTO= 9
25 | STARTMENU= 11
26 | MYMUSIC= 13
27 | MYVIDEOS= 14
28 | NETHOOD= 19
29 | FONTS= 20
30 | TEMPLATES= 21
31 | ALLUSERSSTARTMENU= 22
32 | ALLUSERSPROGRAMS= 23
33 | ALLUSERSSTARTUP= 24
34 | ALLUSERSDESKTOP= 25
35 | APPLICATIONDATA= 26
36 | PRINTHOOD= 27
37 | LOCALSETTINGSAPPLICATIONDATA= 28
38 | ALLUSERSFAVORITES= 31
39 | LOCALSETTINGSTEMPORARYINTERNETFILES=32
40 | COOKIES= 33
41 | LOCALSETTINGSHISTORY= 34
42 | ALLUSERSAPPLICATIONDATA= 35
43 |
44 | def get(intFolder):
45 | _SHGetFolderPath.argtypes = [_HWND, _ctypes.c_int, _HANDLE, _DWORD, _LPCWSTR]
46 | auPathBuffer = _cub(_MAX_PATH)
47 | exit_code=_SHGetFolderPath(0, intFolder, 0, 0, auPathBuffer)
48 | return auPathBuffer.value
49 |
50 |
51 | if __name__ == "__main__":
52 | import os
53 | print(get(STARTUP))
54 | open(get(STARTUP)+"\\zeronet.cmd", "w").write("cd /D %s\r\nzeronet.py" % os.getcwd())
--------------------------------------------------------------------------------
/plugins/Trayicon/plugin_info.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Trayicon",
3 | "description": "Icon for system tray. (Windows only)",
4 | "default": "enabled"
5 | }
--------------------------------------------------------------------------------
/plugins/Trayicon/trayicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HelloZeroNet/ZeroNet/454c0b2e7e000fda7000cba49027541fbf327b96/plugins/Trayicon/trayicon.ico
--------------------------------------------------------------------------------
/plugins/UiConfig/__init__.py:
--------------------------------------------------------------------------------
1 | from . import UiConfigPlugin
2 |
--------------------------------------------------------------------------------
/plugins/UiConfig/languages/hu.json:
--------------------------------------------------------------------------------
1 | {
2 | "ZeroNet config": "ZeroNet beállítások",
3 | "Web Interface": "Web felület",
4 | "Open web browser on ZeroNet startup": "Bögésző megnyitása a ZeroNet indulásakor",
5 |
6 | "Network": "Hálózat",
7 | "File server port": "FIle szerver port",
8 | "Other peers will use this port to reach your served sites. (default: 15441)": "Más kliensek ezen a porton tudják elérni a kiszolgált oldalaidat (alapbeállítás: 15441)",
9 |
10 | "Disable: Don't connect to peers on Tor network": "Kikapcsolás: Ne csatlakozzon a Tor hálózatra",
11 | "Enable: Only use Tor for Tor network peers": "Bekapcsolás: Csak a Tor kliensekhez használja a Tor hálózatot",
12 | "Always: Use Tor for every connections to hide your IP address (slower)": "Mindig: Minden kapcsolatot a Tor hálózaton keresztül hozza létre az IP cím elrejtéséhez (lassabb)",
13 |
14 | "Disable": "Kikapcsolás",
15 | "Enable": "Bekapcsolás",
16 | "Always": "Mindig",
17 |
18 | "Use Tor bridges": "Tor bridge-ek használata",
19 | "Use obfuscated bridge relays to avoid network level Tor block (even slower)": "Tor elrejtő bridge-ek használata a hálózat szintű Tor tiltás megkerüléséhez (még lassabb)",
20 |
21 | "Discover new peers using these adresses": "Új kapcsolat felfedezése ezen címek használatával",
22 |
23 | "Trackers files": "Tracker file-ok",
24 | "Load additional list of torrent trackers dynamically, from a file": "További trackerek felfedezése dinamikusan, ezen file használatával",
25 | "Eg.: data/trackers.json": "Pl.: data/trackers.json",
26 |
27 | "Proxy for tracker connections": "Proxy tracker kapcsolatohoz",
28 |
29 | " configuration item value changed": " beállítás megváltoztatva",
30 | "Save settings": "Beállítások mentése",
31 | "Some changed settings requires restart": "A beállítások érvényesítéséhez a kliens újraindítása szükséges",
32 | "Restart ZeroNet client": "ZeroNet kliens újraindítása"
33 | }
--------------------------------------------------------------------------------
/plugins/UiConfig/media/config.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |