Compare commits

...

3815 commits

Author SHA1 Message Date
7edbda70f5 apply build template
Some checks failed
Build Docker Image on Commit / build-and-publish (push) Failing after 14s
2025-04-20 15:59:40 -07:00
canewsin
290025958f v0.9.0(4630) 2023-07-12 18:28:32 +05:30
canewsin
25c5658b72 Upgrade GH runner to 20.04 2023-07-12 18:22:16 +05:30
canewsin
2970e3a205 Fetch plugins changes 2023-07-12 01:25:48 +05:30
PramUkesh
866179f6a3
v0.8.6(4626) 2023-07-01 04:27:48 +05:30
PramUkesh
e8cf14bcf5
Add trackers to Config.py for failsafety incase missing trackers..txt file 2023-07-01 04:25:41 +05:30
PramUkesh
fedcf9c1c6
Added Proxy links 2023-07-01 03:21:32 +05:30
PramUkesh
117bcf25d9
Fix pysha3 dep installation issue 2023-07-01 02:56:49 +05:30
canewsin
a429349cd4 FileRequest -> Fix error wording 2023-03-24 02:24:14 +05:30
canewsin
d8e52eaabd FileRequest -> Remove Unnecessary check 2023-03-24 02:23:16 +05:30
canewsin
f2ef6e5d9c Fix Response when site is missing for actionAs 2023-02-24 16:56:10 +05:30
canewsin
dd2bb07cfb v0.8.5(4625) 2023-02-12 00:41:38 +05:30
Seto
06a9d1e0ff Fix openssl error in windows. 2023-02-10 18:51:36 +05:30
canewsin
c354f9e24d Use default theme-class for corrupt users.json file
where settings key is missing etc
Fixes Ui.UiServer Error 500: UiWSGIHandler error
2022-12-25 01:28:16 +05:30
canewsin
77b4297224 Update Stats Plugin 2022-12-25 01:26:53 +05:30
canewsin
edc5310cd2 v0.8.4(4620) 2022-12-11 05:01:55 +05:30
canewsin
99a8409513 Increase Def Min Site Size to 25MB 2022-12-11 04:30:31 +05:30
canewsin
3550a64837 v0.8.3(4611) 2022-12-11 03:21:22 +05:30
canewsin
85ef28e6fb ContentManager.py Improve Logging of Valid Signers 2022-12-11 03:21:22 +05:30
canewsin
1500d9356b SiteStrorage.py -> Fix accessing unassigned varible 2022-12-11 03:21:22 +05:30
canewsin
f1a71770fa ContentManager -> Support for multiSig 2022-12-11 03:21:22 +05:30
canewsin
f79a73cef4 main.py -> Fix accessing unassigned varible 2022-12-11 00:51:23 +05:30
canewsin
0731787518 v0.8.2(4610) 2022-11-01 18:10:15 +05:30
canewsin
ad95eede10 Config:: Skip loading missing tracker files 2022-11-01 18:06:32 +05:30
canewsin
459b0a73ca Move trackers to seperate file & Add more trackers 2022-11-01 18:01:03 +05:30
canewsin
b7870edd2e Fix Startup Error when plugins dir missing 2022-11-01 18:00:58 +05:30
Ganesh Chowdary Nune
d5703541be Added documentation for getRandomPort fn 2022-10-09 02:36:18 +05:30
canewsin
ba96654e1d
v 0.8.1-patch(4601) 2022-10-05 03:36:15 +05:30
canewsin
ac72d623f0
remove duplicate xescape(s) 2022-10-05 03:33:50 +05:30
canewsin
fd857985f6
v0.8.0(4600) 2022-10-01 02:22:50 +05:30
canewsin
966f671efe
Update CHANGELOG.md 2022-10-01 02:21:54 +05:30
caryoscelus
86109ae4b2 fix readdress loop
use better escaping in render

fixes #19
2022-09-15 19:18:23 +05:30
canewsin
611fc774c8
Remove Patreon badge 2022-06-13 23:07:57 +05:30
BratishkaErik
0ed0b746a4
Update README-ru.md (#177)
@BratishkaErik  Thanks for your contribution
2022-06-13 23:06:04 +05:30
canewsin
49e68c3a78 Include inner_path of failed request for signing in error msg and response 2022-06-11 01:36:01 +05:30
canewsin
3ac677c9a7 Don't Fail Silently When Cert is Not Selected
When Site doesn't have cert selected but has userdata, signing userdata fails silently without proper error message
2022-06-11 01:18:02 +05:30
canewsin
016cfe9e16 Console Log Updates, Specify min supported ZeroNet version for Rust version Protocol Compatibility
Reduce noise(error => warning) on file missing in sites.
2022-06-09 22:38:57 +05:30
canewsin
712ee18634
Update FUNDING.yml 2022-06-02 19:15:22 +05:30
canewsin
5579c6b3cc rev4591 2022-05-27 08:58:42 +05:30
canewsin
c3815c56ea Revert File Open to catch File Access Errors.
https://github.com/ZeroNetX/ZeroNet/issues/174
2022-05-27 08:38:20 +05:30
canewsin
b257338b0a
v 0.8.0(4590)
- Major Version Upgrade to reflect RCE reported by geekless.
2022-05-26 17:30:59 +05:30
canewsin
ac70f83879 v 0.7.9-patch(4586) 2022-05-26 15:41:47 +05:30
canewsin
2ad80afa10 actionUpdate response Optimisation 2022-05-26 11:48:15 +05:30
canewsin
fe048cd08c Update Plugins Repo 2022-05-26 11:47:25 +05:30
canewsin
f9d7ccd83c Fix Unhandled File Access Errors 2022-05-26 11:46:58 +05:30
canewsin
b29884db78
Create codeql-analysis.yml 2022-05-19 00:10:38 +05:30
canewsin
a5190234ab v 0.7.9(4585)
- Tracker Supply Improvements.
- First Party Tracker Update Service using Dashboard Site.
2022-04-08 23:31:12 +05:30
canewsin
00db9c9f87 Rust Version Compatibility for update Protocol msg
and diff patch
2022-04-08 23:12:10 +05:30
canewsin
02ceb70a4f Tracker Supply improvemets
- Removed Non Working Trakers.
 - Dynamically Load Trackers from Dashboard Site.
2022-03-26 18:39:01 +05:30
canewsin
7ce118d645 Fix Repo Url for Bug Report 2022-03-12 17:38:23 +05:30
canewsin
eb397cf4c7 Update Plugins Repo 2022-03-12 11:14:10 +05:30
Marek Küthe
f8c9f2da4f
remove old v2 onion service (#158) 2022-03-12 10:40:33 +05:30
canewsin
69d7eacfa4 v 0.7.9-beta (4581) 2022-03-06 18:23:17 +05:30
canewsin
f498aedb96 v0.7.8 (4580)
- Update Plugins with some bug fixes and Improvements
2022-03-02 20:17:14 +05:30
canewsin
5ee928852b v 0.7.6 (4565)
- Sync Plugin Updates
- Clean up tor v3 patch (#115)
    https://github.com/ZeroNetX/ZeroNet/pull/115
- Add More Default Plugins to Repo
- Doubled Site Publish Limits
- Update ZeroNet Repo Urls (#103)
- UI/UX: Increases Size of Notifications Close Button(#106)
- Moved Plugins to Seperate Repo
- Added `access_key` variable in Config, this used to access restrited plugins when multiuser plugin is enabled. When MultiUserPlugin is enabled we cannot access some pages like /Stats, this key will remove such restriction with access key.
- Added `last_connection_id_current_version` to ConnectionServer, helpful to estimate no of connection from current client version.
- Added current version:  connections to /Stats page. see the previous point.
2022-01-12 05:13:17 +05:30
canewsin
7078badefa Update Docker Image 2021-12-03 01:18:53 +05:30
canewsin
edd2760fed v 0.7.5 (4560) 2021-11-28 23:45:42 +05:30
canewsin
7d1ec41d09 v 0.7.3 (4556) 2021-11-28 22:35:33 +05:30
canewsin
7acd8df906 Fix xrange is undefined error
- xrange is undefined error in  Tor-v3 Patch Files
2021-11-28 22:06:50 +05:30
canewsin
a1eb6eede5 Fix Incorrect viewport on mobile while loading
https://github.com/HelloZeroNet/ZeroNet/issues/2474
2021-11-28 01:23:52 +05:30
canewsin
eab7fc2be4 Tor V3 Patch 2021-11-28 01:15:19 +05:30
ZeroNet
454c0b2e7e
Merge pull request #2716 from imachug/uifile-404-fix
Fix 404 error handler in UiFilePlugin
2021-01-25 03:24:19 +01:00
ZeroNet
03da34c5d6
Merge pull request #2714 from timgates42/bugfix_typo_positive
docs: fix simple typo, positibe -> positive
2021-01-25 03:23:46 +01:00
Ivanq
c3f4591f91 Fix 404 error handler in UiFilePlugin 2020-12-27 13:28:35 +03:00
Tim Gates
3ad7bc87e5
docs: fix simple typo, positibe -> positive
There is a small typo in src/util/UpnpPunch.py.

Should read `positive` rather than `positibe`.
2020-12-22 07:44:57 +11:00
ZeroNet
b4f4c12521
Merge pull request #2695 from kabitofu/test
Japanese Translation
2020-12-14 01:40:45 +01:00
kabitofu
39d86fec9c Japanese Translation 2020-12-04 13:07:32 +09:00
Tamas Kocsis
02c27b841f Rev4555 2020-12-03 20:05:41 +01:00
Tamas Kocsis
8dafbef6ad Fix sidebar menu display 2020-12-03 20:05:13 +01:00
Tamas Kocsis
c831d175ad Merge UiFileManager js 2020-12-03 20:04:58 +01:00
Tamas Kocsis
3cbfbae42d Move file listing binary extension list to separate file, add missing comma 2020-12-03 20:04:37 +01:00
Tamas Kocsis
a1105562cd Fix site listing show on big site visit 2020-12-03 20:04:09 +01:00
Tamas Kocsis
b3c9de5e47 Don't show tracker tor bridge warning if more that 3 trackers finished 2020-12-03 20:02:48 +01:00
Tamas Kocsis
3ffa3c2f79 Use svg for top-right zero button 2020-12-03 20:02:20 +01:00
ZeroNet
03273527da
Merge pull request #2694 from styromaniac/patch-3
Replaced logo-white.png with an SVG data URI. (logo-white.png deleted)
2020-12-03 19:59:40 +01:00
Styromaniac
2795e20b0c
Replaced logo-white.png with an SVG data URI. 2020-12-03 08:33:54 -05:00
ZeroNet
eb86df5fb6
Add Python 3.9 to github tests 2020-11-30 14:51:23 +01:00
Tamas Kocsis
ecfb6b6b3a Rev4553, Debug messages formatting Windows fix 2020-11-30 14:38:25 +01:00
Tamas Kocsis
1b4f93f14b Make Debug message test cases independent from line numbers, Windows support 2020-11-30 14:37:45 +01:00
ZeroNet
40db30a260
Merge pull request #2642 from imachug/better-logs
Use more unique yet short paths for logging
2020-11-30 14:08:50 +01:00
ZeroNet
3a4a5404c0
Merge pull request #2686 from kabitofu/test
Corrections and additions to the Japanese translation
2020-11-28 01:36:19 +01:00
kabitofu
2bb12a247b Japanese Translation 2020-11-27 17:49:21 +09:00
Tamas Kocsis
38a3ea6373 Rev4551, Keep uiserver running if fileserver bind failed 2020-11-26 02:01:41 +01:00
ZeroNet
2798ad6fb2
Readme formatting 2020-11-24 15:39:57 +01:00
ZeroNet
2e7b0071a3
Remove unnecessary html tag from readme 2020-11-24 15:38:12 +01:00
ZeroNet
12e82bc9c4
Merge pull request #2682 from canewsin/patch-4
Added New Google Play Links
2020-11-24 15:33:34 +01:00
canewsin
774691fa39 Added New Google Play Links 2020-11-23 09:36:37 +05:30
Tamas Kocsis
52d6c9fedf Rev4550, Show all modified files after click 2020-11-19 03:05:53 +01:00
ZeroNet
d68c635e9a
Merge pull request #2679 from hashy0917/patch-1
bug fix.
2020-11-19 02:40:47 +01:00
hashy0917
21557b5517
bug fix.
Fixed the part where an error occurs when setting to Japanese.
2020-11-17 19:25:23 +09:00
ZeroNet
11fe0ece67
Add XDA labs link for Android client 2020-11-14 03:15:13 +01:00
ZeroNet
92363d5227
Add .onion a address of zeronet.io website 2020-11-12 02:37:44 +01:00
ZeroNet
cf0c5db5b9
Replace Play Store link as Google removed it 2020-11-12 01:36:49 +01:00
Tamas Kocsis
57dda4e6d6 Rev4549, Fix startup OpenSSL lib find recursion error 2020-11-09 01:21:52 +01:00
Tamas Kocsis
0a3bf43e1c Rev4548 2020-11-03 02:53:15 +01:00
Tamas Kocsis
48455e3e45 Better cli test output 2020-11-03 02:52:50 +01:00
Tamas Kocsis
c515e26cd6 Fix OpenSSL dll/so location find patcher 2020-11-03 02:51:42 +01:00
Tamas Kocsis
5cac059ef4 Display warning if SSLCurve native load failed 2020-11-03 02:50:21 +01:00
Tamas Kocsis
8f6e27904c Display verification lib speedups on benchmark 2020-11-03 02:49:01 +01:00
Tamas Kocsis
e757f2a2d4 Display library versions at /Env url endpoint 2020-11-03 02:48:01 +01:00
Tamas Kocsis
b104d5dd41 Refactor /Stats page rendering to seprate functions 2020-11-03 02:44:31 +01:00
ZeroNet
f6106be733
Merge pull request #2670 from TTTaevas/py3
Fix typo in French translation
2020-11-03 02:34:34 +01:00
Taevas
9305a2e7ac Fix typo in French translation 2020-11-02 15:29:29 +01:00
Jabba
4f6833c488
Complete list of binary extensions (#2661) 2020-10-29 03:24:35 +01:00
Tamas Kocsis
e2b1cf3938 Revert "Travis CI: Run a current version of pytest (#2648)"
This reverts commit 147dd4bc35.
2020-10-29 02:49:04 +01:00
Tamas Kocsis
6fcfe5b394 Rev4540, More proper bigfile filtering for OptionalFileList 2020-10-29 02:44:07 +01:00
Tamas Kocsis
12013d64c8 Rev4539, Add more extensions to UiFileManager binary files 2020-10-29 01:38:49 +01:00
Jabba
54fb2fde7c
Adding OGG MIME (#2657)
* Adding OGG MIME

Fixing: https://github.com/HelloZeroNet/ZeroNet/issues/2656

* Adding ova and ogv extensions
2020-10-26 15:59:42 +01:00
Christian Clauss
147dd4bc35
Travis CI: Run a current version of pytest (#2648)
Pytest 4 --> 6
2020-10-26 15:47:15 +01:00
Christian Clauss
32c9d5fa70
GitHub Actions upgrade to actions/checkout@v2 (#2650)
* GitHub Actions upgrade to actions/checkout@v2

* Update tests.yml
2020-10-26 15:41:46 +01:00
Ivanq
dd08b89c81 Make tests pass on Python 3.5 2020-10-13 20:36:39 +03:00
Ivanq
6770b450b3 Handle src/gevent/... paths 2020-10-13 19:50:08 +03:00
Ivanq
9b2772b171 Use more unique yet short paths for logging 2020-10-13 19:12:46 +03:00
shortcutme
29dac8a188
Rev4538 2020-10-12 13:12:44 +02:00
Ivanq
352da6bf62
Allow sites to request several CORS permissions at once (#2631)
* Allow sites to request several CORS permissions at once

* Fix typo

* Don't wait for CORS site download
2020-10-12 13:00:40 +02:00
Tamas Kocsis
288050e5b4 Rev4537, Add warning on invalid file save in UiFileManager 2020-10-06 17:10:58 +02:00
Tamas Kocsis
785d2351eb Rev4536, Fix Cors permission request for connecting site 2020-10-05 19:02:22 +02:00
Tamas Kocsis
9d1bed11af Rev4533 2020-10-01 17:18:43 +02:00
Tamas Kocsis
b2342e64bd Fix file manager listing height calculation for many files 2020-10-01 17:18:33 +02:00
Tamas Kocsis
dcbfb8afe0 Fix browse files link for not installed domain plugins 2020-10-01 17:17:51 +02:00
Jabba
4b8dfc5114
Update requirements.txt (#2617)
* Update requirements.txt

See: https://github.com/HelloZeroNet/ZeroNet/pull/2616#issuecomment-697341526
2020-09-24 18:24:24 +02:00
Tamas Kocsis
c0baf8b68d Version 0.7.2, Rev4528 2020-09-21 18:28:12 +02:00
Tamas Kocsis
73dc69605b Merge sidebar js, css 2020-09-21 18:26:55 +02:00
Tamas Kocsis
52ed8c18ca Add browse files link to sidebar 2020-09-21 18:26:44 +02:00
Tamas Kocsis
19bc0358b5 Merge UiFileManager js, css 2020-09-21 18:25:53 +02:00
Tamas Kocsis
392350ff79 Codemirror file editor for UiFileManager plugin 2020-09-21 18:25:38 +02:00
Tamas Kocsis
f0b0f57643 UiFileManager plugin 2020-09-21 18:23:28 +02:00
Tamas Kocsis
85790f8866 Check sites on ip change 2020-09-21 18:20:49 +02:00
Tamas Kocsis
ce5b4c3eda Don't non-existent files as bad 2020-09-18 18:45:42 +02:00
Tamas Kocsis
fde3b51129 Formatting 2020-09-18 18:44:42 +02:00
Tamas Kocsis
550d02d473 Retry site update if it was failed last time 2020-09-18 18:44:28 +02:00
Tamas Kocsis
4da89580c1 Don't mark content.json as bad file if update failed 2020-09-18 18:43:54 +02:00
Tamas Kocsis
bf092b83ab Workaround for stuck iframe url in Firefox when using back button 2020-09-18 18:43:25 +02:00
Tamas Kocsis
0309b81695 SiteListModifiedFiles: Give error instead of exception if content file does not exists 2020-09-18 18:42:03 +02:00
Tamas Kocsis
e74fdc4036 Redirect homepage with / at the end 2020-09-09 18:29:53 +02:00
Tamas Kocsis
b9c65d75ef Move error log handler to config object to be able to catch plugin load errors 2020-09-09 18:29:24 +02:00
Tamas Kocsis
49f8e0bc3a Allow link to console tabs 2020-09-09 18:21:09 +02:00
Tamas Kocsis
c4f8c0177e Add mode to tracker announce logging 2020-09-08 19:36:54 +02:00
Tamas Kocsis
8c20927f68 Allow test port checker functions from CLI 2020-09-08 19:35:58 +02:00
Tamas Kocsis
5b09f7af41 New port checker: ipfingerprints.com, PortChecker minor rearranging 2020-09-08 19:35:23 +02:00
Tamas Kocsis
1695571afa Add browser-like header for port checker requests 2020-09-08 19:32:45 +02:00
Tamas Kocsis
8dc5aee8aa Js based redirecting template formatting 2020-09-08 19:32:10 +02:00
Tamas Kocsis
94765af0f3 Fix not downloaded site delete on startup 2020-09-08 19:28:41 +02:00
Tamas Kocsis
5a226baaa5 Reduce announce number for not recently added sites 2020-09-08 19:28:04 +02:00
Tamas Kocsis
b7bc197012 Only try to get more peers for timeout task if site is recently added 2020-09-08 19:26:18 +02:00
Tamas Kocsis
a0dfbe31f6 Add timeout for private key recover message 2020-09-06 17:06:26 +02:00
Tamas Kocsis
964545dd1f Remove unnecessary logging 2020-09-06 17:01:59 +02:00
Tamas Kocsis
817ab04941 Fix private key recover typo 2020-09-04 18:29:02 +02:00
Tamas Kocsis
91d0ce3a50 Save users.json of private key change 2020-09-04 18:21:52 +02:00
Tamas Kocsis
e97236201c Try to recover site privatekey from master seed when site owned switch enabled 2020-09-04 18:21:02 +02:00
Tamas Kocsis
e14f5bf847 Allow modified files query from non-admin sites 2020-09-04 18:15:56 +02:00
Tamas Kocsis
79f10ffe0c Return error when fileGet binary file 2020-09-04 18:15:16 +02:00
Tamas Kocsis
0bc9374a7d Optional stats to dirList websocket API command 2020-09-04 18:14:22 +02:00
Tamas Kocsis
8a71bf65cd Don't leak local path on delete error 2020-09-04 18:08:43 +02:00
Tamas Kocsis
9d198ff7f2 Display full path in 404 error instead of inner_path 2020-09-04 18:07:29 +02:00
Tamas Kocsis
cafeebf120 Fix wrapper_nonce adding to url 2020-09-04 18:07:03 +02:00
Tamas Kocsis
46fba195da Merge js, css 2020-09-04 17:57:56 +02:00
Tamas Kocsis
501bd51bd1 Only set title from content.json if wrapperSetTitle has not been called 2020-09-04 17:57:34 +02:00
Tamas Kocsis
f7874e1ca3 Fix loading bar hide bug 2020-09-04 17:56:16 +02:00
Tamas Kocsis
8d964d1b8e Fix infopanel overflow on mobile devices 2020-09-04 17:55:41 +02:00
Tamas Kocsis
051e404a80 Fix typo in Benchmark cli info success number 2020-09-04 17:52:26 +02:00
Tamas Kocsis
6c1abf4004 Don't switch to libev for newer versions of gevent 2020-09-04 17:49:23 +02:00
Tamas Kocsis
0907edb6b1 Remove obsolate auth_key generation 2020-09-04 17:35:48 +02:00
Tamas Kocsis
6ff14d1bbd Fix plugin config error when running update.py 2020-09-04 17:17:15 +02:00
Tamas Kocsis
4ad5c065f1 Don't display gui error when running from cli on Windows 2020-09-04 17:16:47 +02:00
ZeroNet
c17b8d53d3
Update changelog with 0.6.5, 0.7.0, 0.7.1 2020-09-03 16:56:41 +02:00
ZeroNet
9022a1098a
Merge pull request #2485 from geekless/sidebar-no-content-json
Allow opening the sidebar while content.json is not loaded
2020-07-20 18:00:09 +02:00
ZeroNet
6e758ff363
Merge pull request #2596 from shyam-sam/Dockerfile-arm64v8
arm64 arch docker image request #2568
2020-07-20 17:42:12 +02:00
SuperMan
29c3523353 arm64 arch docker image request #2568 2020-07-18 17:45:32 +05:30
shortcutme
47ff6c6801
Rev4496 2020-06-30 17:04:55 +02:00
shortcutme
6bd49e8aff
Fix killing greenlets gevent exception 2020-06-30 17:04:47 +02:00
shortcutme
ddbd5c7b19
Fix reset file server port with config web interface 2020-06-30 17:04:09 +02:00
shortcutme
635c3b27cd
Fix loading invalid site block list 2020-06-30 17:03:06 +02:00
shortcutme
6776dabdb3
Fix piecemap downlad error when invalid piecemap got downloaded 2020-06-30 17:02:39 +02:00
shortcutme
14cbaf47c8
Rev4493 2020-06-18 17:28:56 +02:00
shortcutme
4eb50377c3
Warning about deleting private key for owned sites 2020-06-18 17:23:15 +02:00
shortcutme
ea6016d004
Fix latest gevent compatibility 2020-06-18 17:22:45 +02:00
shortcutme
79d26060b3
Add site address hash to site info websocket response 2020-06-18 17:22:33 +02:00
shortcutme
97ad084c21
Ignore ipv6 tests if not supported by os 2020-06-18 17:22:08 +02:00
shortcutme
179e5cb651
Fix portchecker.co 2020-06-18 17:21:43 +02:00
ZeroNet
367745b5ea
Move Android Play store link next to download options 2020-06-16 18:25:58 +02:00
ZeroNet
5c38a78b79
Merge pull request #2573 from canewsin/patch-2
Added Android Play Store Link to Read Me
2020-06-16 18:24:48 +02:00
canewsin
a02ed56c69
Added Android Play Store Link to Read Me 2020-06-16 10:33:21 +05:30
ZeroNet
f868fed51d
Merge pull request #2558 from gqgs/ws-iterable
Avoid iterating in uninitialized result
2020-05-19 02:02:16 +02:00
Guilherme
e4f42b8ce3 Avoid iterating in uninitialized result 2020-05-11 11:51:10 -03:00
ZeroNet
eeb48fc72e
Merge pull request #2556 from gqgs/debug
Remove unnecessary debugger
2020-05-10 12:07:39 +02:00
Guilherme
85733abade Remove unnecessary debugger 2020-05-10 02:04:30 -03:00
shortcutme
8db4344171
Rev4486, Fix UiPassword cleanup error 2020-05-04 13:38:30 +02:00
ZeroNet
0a9391d28b
Merge pull request #2547 from anoadragon453/anoa/pluralize
Fix pluralize translation function
2020-05-03 17:51:26 +02:00
Andrew Morgan
cfef7ab071 Fix pluralize translation function 2020-05-03 14:31:20 +01:00
shortcutme
38c1727b94
Rev4485 2020-05-03 03:59:33 +02:00
shortcutme
36d96d484e
Workaround for UiPassword cookie issues with sandboxed iframes 2020-05-03 03:59:09 +02:00
shortcutme
439f8fc476
Fix UiPassword logout and session list url encoding 2020-05-03 03:57:17 +02:00
shortcutme
07faa3d6d3
Move wrapper necessary check to separate function 2020-05-03 03:56:06 +02:00
ZeroNet
3c7022ea9d
Merge pull request #2546 from anoadragon453/anoa/bigfile_seekable
Add missing seekable() class method to BigFile plugin
2020-05-02 11:23:30 +02:00
Andrew Morgan
a657afcd47 Add missing seekable() class method to BigFile plugin 2020-05-01 18:24:47 +01:00
ZeroNet
f3a839f422
Require final gevent 1.5.0 for Python 3.8 2020-04-12 12:15:10 +02:00
shortcutme
ad3920b26a
Rev4478, Skip slow updated files checking with large content.json 2020-04-11 13:34:18 +02:00
ZeroNet
8ffd8d7a3e
Merge pull request #2510 from filips123/patch-1
Use Gevent prerelease for Python 3.8
2020-04-08 21:38:43 +02:00
Filip Š
71001491df
Use Gevent prerelease for Python 3.8 2020-04-08 17:05:39 +02:00
ZeroNet
701765b53b
Merge pull request #2496 from canewsin/patch-2
Update LICENSE
2020-04-01 17:54:47 +02:00
ZeroNet
fa880d99f1
Merge pull request #2503 from imachug/compressed-keys
Support compressed keys
2020-03-31 00:48:28 +02:00
Ivanq
0a9a9b5a57 Support compressed keys 2020-03-30 09:40:06 +03:00
shortcutme
56acac8cd3
Rev4473, Fix Merger site skipping content load to db for some seconds after new site added 2020-03-25 04:13:16 +01:00
ZeroNet
995d3bf717
Merge pull request #2495 from pataquets/patch-1
Readme: Add Docker image info and docker pulls badge
2020-03-25 00:37:16 +01:00
canewsin
1de7485858
Update LICENSE 2020-03-25 03:30:41 +05:30
Alfonso Montero
e1c0fd6984
Readme: Add Docker image info and docker pulls badge 2020-03-24 21:16:33 +01:00
ZeroNet
108a3de433
Update Dockerfile 2020-03-24 02:26:54 +01:00
ZeroNet
740fe65355
Update Dockerfile 2020-03-24 02:09:57 +01:00
ZeroNet
abde3d4cf7
Update Dockerfile 2020-03-24 01:58:33 +01:00
ZeroNet
c90c887f8f
Merge pull request #2491 from imachug/import-sslcrypto
Import sslcrypto from lib
2020-03-21 21:50:35 +01:00
Ivanq
a4d91f7081 Import sslcrypto from lib 2020-03-21 22:52:56 +03:00
shortcutme
31d4304915
Rev4471, Allow files start with dot 2020-03-21 19:51:44 +01:00
shortcutme
1eec388252
Rev4469 2020-03-20 18:53:25 +01:00
shortcutme
70de3213d6
Fix peer save dictionary changed error 2020-03-20 18:52:58 +01:00
shortcutme
f41d022038
Log BrokenPipeError as warning 2020-03-20 18:52:18 +01:00
shortcutme
723d1f4370
Rev4467 2020-03-18 03:21:14 +01:00
shortcutme
ca94703fc3
Fix tray icon destroy overflow exception 2020-03-18 03:21:00 +01:00
shortcutme
a5971adbe6
Add data_dir to example UiConfig tracker list 2020-03-18 03:19:01 +01:00
ZeroNet
dfeebbabe8
Merge pull request #2487 from imachug/gevent-ws-fix2
Update gevent-ws to v2.0.7 to fix werkzeug
2020-03-17 21:49:54 +01:00
Ivanq
66194ce435 Update gevent-ws to v2.0.7 to fix werkzeug 2020-03-17 23:48:36 +03:00
Vadim Ushakov
2de3c9a544 Allow opening the sidebar while content.json is not loaded
If one opens the sidebar of a site not being downloaded yet, the following error occurs:

```
  Internal error: KeyError('content.json',): 'content.json'
  UiWebsocket.py line 79 > 235 > Sidebar/SidebarPlugin.py line 527 > 120 > ContentDbDict.py line 59
```

Also, the sidebar is not visible.

This fixes the both issues.

For sites without peers, the only way to delete the site was to navigate to ZeroHellow, scroll the left panel to "Connecting sites", and delete the site from the list. Now those sites can be deleted from the sidebar.
2020-03-17 23:09:40 +07:00
shortcutme
5fb342a825
Change to GPLv3 license
Based on https://github.com/HelloZeroNet/ZeroNet/issues/2273
2020-03-17 14:48:24 +01:00
ZeroNet
3156d2f94b
Merge pull request #2483 from imachug/gevent-ws-fix
Potential fix of BrokenPipeError
2020-03-17 14:25:11 +01:00
Ivanq
ba156bbdec Potential fix of BrokenPipeError 2020-03-17 07:54:56 +03:00
ZeroNet
6beb76eac8
Merge pull request #2482 from imachug/gevent-ws-insensitive
Upgrade gevent-ws to v2.0.5
2020-03-16 21:36:43 +01:00
Ivanq
d3d18234df Upgrade gevent-ws to v2.0.5 2020-03-16 20:50:10 +03:00
ZeroNet
faa24a8b41
Merge pull request #2478 from imachug/sslcrypto-weird
Switch to sslcrypto v4.0 to support OpenSSL without builtin curves
2020-03-16 17:43:30 +01:00
ZeroNet
f749228a2c
Merge pull request #2475 from imachug/gevent-ws-fix2
Disable process_result on websocket requests
2020-03-16 16:16:47 +01:00
Ivanq
7e17a4e967 Switch to sslcrypto v4.0 to support OpenSSL without builtin curves 2020-03-15 20:18:04 +03:00
Ivanq
19f003141b Disable process_result on websocket requests 2020-03-14 07:27:19 +03:00
ZeroNet
53a6063576
Merge pull request #2471 from imachug/patch-1
Search for any OpenSSL version in LD_LIBRARY_PATH
2020-03-10 21:34:39 +01:00
Ivanq
33af83b2cd
Search for any OpenSSL version in LD_LIBRARY_PATH 2020-03-10 22:31:26 +03:00
ZeroNet
3426d5fe63
Merge pull request #2466 from imachug/websocket
Fix websocket_client compatibility
2020-03-09 15:54:54 +01:00
ZeroNet
f2934c10b4
Merge pull request #2463 from canewsin/patch-1
Added Github Action Test Badge to ReadMe
2020-03-09 15:51:13 +01:00
Ivanq
a2457b2488 Forgot that Upgrade is case-insensitive 2020-03-09 11:06:35 +03:00
canewsin
193632c3f9
Added Github Action Test Badge to ReadMe 2020-03-07 17:30:27 +05:30
ZeroNet
a1c176bb3f
Merge pull request #2459 from imachug/github-actions
Add GitHub Actions workflow
2020-03-05 21:16:13 +01:00
Ivanq
02fd1dc4d0 Add GitHub Actions workflow 2020-03-05 23:03:23 +03:00
ZeroNet
296e4aab57
Fix sslcrypto thread safety (#2454)
* Use sslcrypto instead of pyelliptic and pybitcointools

* Fix CryptMessage

* Support Python 3.4

* Fix user creation

* Get rid of pyelliptic and pybitcointools

* Fix typo

* Delete test file

* Add sslcrypto to tree

* Update sslcrypto

* Add pyaes to src/lib

* Fix typo in tests

* Update sslcrypto version

* Use privatekey_bin instead of privatekey for bytes objects

* Fix sslcrypto

* Fix Benchmark plugin

* Don't calculate the same thing twice

* Only import sslcrypto once

* Handle fallback sslcrypto implementation during tests

* Fix sslcrypto fallback implementation selection

* Fix thread safety

* Add derivation

* Bring split back

* Fix typo

* v3.3

* Fix custom OpenSSL discovery
2020-03-05 17:54:46 +01:00
ZeroNet
7ba2c9344d
Merge pull request #2457 from imachug/segfault
Make ThreadPool a context manager to prevent memory leaks
2020-03-05 10:45:14 +01:00
Ivanq
09e65e1d95 Make ThreadPool a context manager to prevent memory leaks 2020-03-05 08:06:57 +03:00
shortcutme
c4f65a5d7b
Rev4462, Experimental fix for segfault on shutdown 2020-03-04 21:50:28 +01:00
ZeroNet
37a401fdef
Merge pull request #2449 from krzotr/polish-translation
Polish translation
2020-03-04 18:14:06 +01:00
ZeroNet
e7d1e1f097
Merge pull request #2455 from zyw271828/py3
Improve README-zh-cn.md according to latest README.md
2020-03-03 10:36:51 +01:00
zyw271828
6df3036f11
Improve README-zh-cn.md according to latest README.md 2020-03-03 13:12:54 +08:00
zyw271828
e2a582d892
Update "How can I create a ZeroNet site" section of README-zh-cn.md 2020-03-03 12:54:41 +08:00
zyw271828
aaabcb6b1a
Update "How to join" section of README-zh-cn.md 2020-03-03 12:48:18 +08:00
ZeroNet
7bf790003e
Merge pull request #2453 from krzotr/patch-7
Fixed `Cache-Control` for .js and .css files - 10 minutes cache
2020-03-02 18:25:16 +01:00
shortcutme
f46b945cdc
Rev4461 2020-03-02 17:09:21 +01:00
shortcutme
27761c5045
Fix merger site updating 2020-03-02 17:09:13 +01:00
shortcutme
e0bf4dc9ec
Skip announcing to trackers with unsupported address 2020-03-02 17:08:43 +01:00
shortcutme
1fc67a3d71
Rev4460, Fix mergersite update on slow storage 2020-03-02 16:44:34 +01:00
krzotr
5baacf963d
Fixed Cache-Control for .js and .css files 2020-02-29 00:51:41 +01:00
Krzysztof Otręba
b790bcac9b Polish translation 2020-02-28 01:24:44 +01:00
Ivanq
219b90668f
Switch from gevent-websocket to gevent-ws (#2439)
* Switch from gevent-websocket to gevent-ws

* Return error handling, add gevent_ws source to lib
2020-02-28 01:20:04 +01:00
krzotr
2862587c15
Fixed "LookupError: 'hex' is not a text encoding" on /StatsBootstrapper page (#2442)
* Fixed "LookupError: 'hex' is not a text encoding"

* Fixed  KeyError: 'ip4'
2020-02-27 00:48:26 +01:00
shortcutme
6218a92895
Rev4458 2020-02-25 16:47:28 +01:00
shortcutme
58f03e21ef
Change unreliable trackers 2020-02-25 16:47:04 +01:00
shortcutme
b85477787d
Workaround for Tor utf8 cookie file path encoding bug on Windows 2020-02-25 16:46:21 +01:00
shortcutme
6a1235bd45
Remove old Gevent RLock support 2020-02-25 16:45:55 +01:00
ZeroNet
33d6a9c402
Merge pull request #2438 from imachug/websocket
Avoid code duplication in bigfileUploadInit
2020-02-24 17:56:14 +01:00
Ivanq
17f65a5179 Avoid code duplication 2020-02-24 19:19:35 +03:00
Ivanq
f8e2cbe429
Allow uploading files via websocket (#2437)
* Allow uploading files via websocket

* Fix
2020-02-24 13:46:01 +01:00
shortcutme
f0a706f6ab
Rev4455, Fix new sites file downloading 2020-02-21 13:58:11 +01:00
shortcutme
8b994e42c2
Rev4452 2020-02-20 17:27:50 +01:00
shortcutme
ae9a76a6c9
Fix double sites.json loading on startup when adding missing sites 2020-02-20 17:27:31 +01:00
shortcutme
9b85d8638d
Don't allow run site api calls when site is deleting 2020-02-20 17:25:56 +01:00
shortcutme
a9c75a3146
Fix start dir parsing for command line and better description 2020-02-20 17:25:06 +01:00
shortcutme
1cc0ec3f31
Indepently configurable OpenSSL lib/bin file 2020-02-20 17:23:00 +01:00
shortcutme
b1819ff71d
Fix trayicon autostart script duplicated arguments 2020-02-20 17:19:16 +01:00
shortcutme
fca1033f83
Fix trayicon auto start script write/read with utf8 path 2020-02-20 17:18:59 +01:00
ZeroNet
32855d0479
Merge pull request #2426 from canewsin/patch-2
Added Custom Openssl Path for Native Clients and start_dir config
2020-02-19 17:20:24 +01:00
shortcutme
2c826eba2d
Rev4447, Fix Msgpack 1.0.0 compatibility 2020-02-19 16:48:14 +01:00
canewsin
8facd9ff84 Added Custom Openssl Path for Native Clients and start_dir config
This Parameter helpful where openssl path is not fixed always, we can also use this to reduce code verbosity by providing other like these and provide them as parameter

            if sys.platform.startswith("win"):
                self.openssl_bin = "tools\\openssl\\openssl.exe"
            elif config.dist_type.startswith("bundle_linux"):
                self.openssl_bin = "../runtime/bin/openssl"
            else:
                self.openssl_bin = "openssl"
Also Added Custom start_dir config option since android path issue of not valid "./" path, where files via provided path are not loading on some systems like Android client.

for more detailed conversation see pull request [#2422](https://github.com/HelloZeroNet/ZeroNet/pull/2422)
2020-02-18 23:09:16 +05:30
shortcutme
64e5e0c80e
Rev445, Fix and test random fail in CryptMessage decrypt 2020-02-18 15:28:14 +01:00
shortcutme
8aa4e27938
Rev4411 2020-02-13 17:26:29 +01:00
shortcutme
bc76bf291a
Fix site blocklist with address hash based blocking and move checking to server-side 2020-02-13 17:26:15 +01:00
shortcutme
70cc982e2e
Log actual disabled function for multiuser plugin 2020-02-13 17:24:59 +01:00
shortcutme
61ac6a30d3
Fix loading blocked raw sites 2020-02-13 17:24:22 +01:00
shortcutme
d2627f36d5
Pass all arguments on site need 2020-02-13 17:23:37 +01:00
shortcutme
d36324e0d3
More detailed info on http host error 2020-02-13 17:23:00 +01:00
shortcutme
113b57415f
More detailed info on origin error 2020-02-13 17:22:37 +01:00
shortcutme
fefd2474b1
Don't reload sites on listing 2020-02-13 17:22:09 +01:00
tangdou1
28ce08de8e
Update zh.json (#2413)
* Update zh.json

* Update zh.json

* Update zh.json
2020-02-11 16:12:06 +01:00
shortcutme
037f0a3ff4
Rev4404 2020-02-07 16:43:23 +01:00
shortcutme
a3546d56b0
Merge js 2020-02-07 16:42:26 +01:00
shortcutme
95bf4ecb42
Read 5MB of logs for non-default console tabs 2020-02-07 16:40:27 +01:00
shortcutme
c91f2f0a09
Move all optional file download to separate button on sidebar 2020-02-07 16:40:04 +01:00
shortcutme
6d425f30fe
Stop checkconnections with connectionserver 2020-02-07 16:38:42 +01:00
shortcutme
8e79a7da63
Fix incomplete loading of dbschema.json 2020-02-07 16:37:37 +01:00
shortcutme
10c02c31c2
Rev4401 2020-01-28 16:59:03 +01:00
shortcutme
a0f5e1bde8
Fix translations 2020-01-28 16:58:46 +01:00
shortcutme
2e9cff928c
Skip commit if already commiting 2020-01-28 16:58:14 +01:00
shortcutme
46210b2f04
Use peer ip in peer exchange if no active connection 2020-01-28 16:57:20 +01:00
shortcutme
6dae187e22
More detailed logging on write error 2020-01-28 16:56:35 +01:00
ZeroNet
a7e783a26b
Merge pull request #2403 from eduaddad/patch-5
CONFIGURATION ITEM VALUE CHANGED - should work now
2020-01-28 16:50:17 +01:00
ZeroNet
60af3ceda9
Merge pull request #2404 from eduaddad/patch-6
added the Save as .Zip translation to Brazilian Portuguese
2020-01-28 16:49:08 +01:00
shortcutme
11415fe082
Log mock ws caller to get more detail on random test fail 2020-01-24 16:05:19 +01:00
ZeroNet
df93fa0ffe
Add PGP public key link 2020-01-24 14:58:37 +01:00
Eduaddad
849d514f28
added to translation Save as .Zip
added to translation Save as .Zip
2020-01-22 14:00:19 -03:00
Eduaddad
4d8ee4bafb
CONFIGURATION ITEM VALUE CHANGED - should work now
CONFIGURATION ITEM VALUE CHANGED - should work now
2020-01-22 13:54:19 -03:00
shortcutme
ac8aaaff75
Rev4399 2020-01-22 16:37:48 +01:00
shortcutme
238ede9419
Only correct time if we have at least 9 connected peers 2020-01-22 16:37:07 +01:00
shortcutme
835174270e
Less wait for closing cursors 2020-01-22 16:36:52 +01:00
shortcutme
62a2ec7254
Make sure to commit before vacuum 2020-01-22 16:36:33 +01:00
shortcutme
a9368bb3c8
Don't allow parallel sites.json loading 2020-01-22 16:35:40 +01:00
shortcutme
e75e199334
Fix multi-line log events display in web console 2020-01-22 16:33:54 +01:00
shortcutme
2b7aebd89d
Fix optional file loading when sites.json load takes more than 1 sec 2020-01-22 16:33:30 +01:00
shortcutme
3e08eabc86
Proper error when piecemap download fails 2020-01-22 16:31:35 +01:00
shortcutme
a16d55c863
Fix compatibility with Snap package 2020-01-22 16:31:09 +01:00
ZeroNet
e51ae580b9
Merge pull request #2396 from eduaddad/patch-4
Update pt-br.json
2020-01-22 16:27:43 +01:00
ZeroNet
914576b9db
Change to full PGP fingerprint 2020-01-19 13:30:22 +01:00
Eduaddad
3edb34ec56
Update pt-br.json
more translations
2020-01-15 00:53:19 -03:00
shortcutme
224093b3dd
Rev4397, Fix big file invalid path errors 2020-01-09 16:35:05 +01:00
Ivanq
77c3e43978 Detect content encoding based on query string (#2385) 2020-01-07 10:34:14 +01:00
shortcutme
03350d7454
Rev4394 2020-01-04 16:56:42 +01:00
shortcutme
2b5e57e840
Fix updateing deleted site in contentdb 2020-01-04 16:55:56 +01:00
shortcutme
39442977db
Thread safe access and request log updating in optionalmanager 2020-01-04 16:55:40 +01:00
shortcutme
0af90aad37
Maxmind db as download source no longer works 2020-01-04 16:55:08 +01:00
shortcutme
c5d51c9cab
Verify cert in separate function 2020-01-04 16:54:34 +01:00
shortcutme
0dbcec8092
Merge wrapper 2020-01-04 16:54:20 +01:00
shortcutme
76e4b75c2d
Fix removing loading screen without loaded content 2020-01-04 16:54:13 +01:00
shortcutme
c1ad7914f1
Always update loading screen site too large message with site info received 2020-01-04 16:53:49 +01:00
shortcutme
9085a4b0cc
Less frequent update of progress bar 2020-01-04 16:53:11 +01:00
shortcutme
820346c98d
More logging to wrapper 2020-01-04 16:52:51 +01:00
shortcutme
995d87c167
Don't add escaping iframe message for link without target=_top 2020-01-04 16:52:18 +01:00
shortcutme
fe739fa848
Log tasks with larger priority 2020-01-04 16:48:56 +01:00
shortcutme
b6d0bf8f6b
Use msvcrt 110 and 120 when 110 is not avaliable 2020-01-04 16:48:37 +01:00
ZeroNet
aec1ab4ed2
Merge pull request #2378 from rllola/zeroname_doc_update
Update Zeroname updater documentation
2020-01-02 17:54:12 +01:00
rllola
7d5f3354b6 Update README; 'valueencoding' configuration required for rpc call; 2020-01-02 11:32:47 +01:00
shortcutme
feb58e4b0e
Rev4382, Fix is_prev_builtin startup error 2019-12-31 18:15:17 +01:00
shortcutme
163825c03e
Rev4381 2019-12-31 12:56:10 +01:00
shortcutme
3fc80f834d
New tests for worker task manager 2019-12-31 12:55:09 +01:00
shortcutme
20b0db7ddb
Thread safe task remove in failTask 2019-12-31 12:54:45 +01:00
shortcutme
b2e7cbb927
Refactor task adding with less locking 2019-12-31 12:51:52 +01:00
shortcutme
5987274edf
Name task adding lock 2019-12-31 12:50:39 +01:00
shortcutme
ba218974c4
Task remove optimization 2019-12-31 12:50:21 +01:00
shortcutme
721d4a22f1
Remove unnecessary log from worker task manager 2019-12-31 12:49:59 +01:00
shortcutme
32b0153d34
Log site address with getfile error 2019-12-31 12:46:01 +01:00
shortcutme
71d32d7414
Less slow query loggin 2019-12-31 12:45:36 +01:00
shortcutme
796ee572ce
Fix verify invalid json 2019-12-31 12:44:47 +01:00
shortcutme
60146a083c
Fix ui_websocket test result with None 2019-12-21 03:30:27 +01:00
shortcutme
df87bd41b4
Log WsMock sent data itself to figure out random Crypt test fail 2019-12-21 03:22:37 +01:00
shortcutme
3d73599deb
Don't retry bad files also in big file tests 2019-12-21 03:21:38 +01:00
shortcutme
48124e12d9
Rev4372 2019-12-21 03:05:49 +01:00
shortcutme
17fb740c51
Don't try to download bad files again in tests to avoid random test fails 2019-12-21 03:05:19 +01:00
shortcutme
c6b07f1294
Wait until checkmodification spawned pools are finishing 2019-12-21 03:04:36 +01:00
shortcutme
3ccce46314
Wait until downloadContent pool finishes 2019-12-21 03:03:49 +01:00
shortcutme
7c1da5da52
Abilty to disable file bad file retry at end of download 2019-12-21 03:03:32 +01:00
shortcutme
c5de1447c8
onComplete will be triggered by WorkerManager 2019-12-21 03:02:53 +01:00
shortcutme
e16ace433c
Better logging in site download content 2019-12-21 03:02:36 +01:00
shortcutme
975f53b95b
New logging format for tests 2019-12-21 03:01:45 +01:00
shortcutme
8a994b5559
Ask before UiWebsocket server shutdown action 2019-12-21 02:59:50 +01:00
shortcutme
2acf24c336
Fix ipv4 checking regexp 2019-12-21 02:59:18 +01:00
shortcutme
2c3f1ba7ad
Check if all task are complete on fail task 2019-12-21 02:59:04 +01:00
shortcutme
c01245a4e0
Log task fail 2019-12-21 02:58:48 +01:00
shortcutme
f119f7d0d2
Use faster and thread safe way to re-sort tasks 2019-12-21 02:58:35 +01:00
shortcutme
62d4edadf6
Fail task if no peer left to try 2019-12-21 02:57:53 +01:00
shortcutme
8bf17d3a69
Add reason for Worker actions 2019-12-21 02:57:25 +01:00
shortcutme
0881e274a9
Log lock waits for task adding in WorkerManager 2019-12-21 02:56:42 +01:00
shortcutme
7ca09ba75b
Fix updating key 0 in WorkerTaskManager 2019-12-21 02:55:22 +01:00
ZeroNet
bde8b30d5c
Upload logs after failure, remove sometimes failing coverage check 2019-12-20 17:32:49 +01:00
shortcutme
87d1c736e2
Fix log printing typo 2019-12-19 02:45:00 +01:00
shortcutme
eba81cc7d2
Print logs from subdirs 2019-12-19 02:36:36 +01:00
shortcutme
69eb831c7e
Rev4361 2019-12-19 02:17:21 +01:00
shortcutme
99e6326974
More compact stack logging 2019-12-19 02:17:13 +01:00
shortcutme
50bbe47bf2
Better logging on file update 2019-12-19 02:17:00 +01:00
shortcutme
8bfef12ad4
Don't try to pack unknown peer addresses 2019-12-19 02:16:41 +01:00
ZeroNet
6085cfd1a7
Merge pull request #2364 from Zaefarani/patch-1
Add Farsi (Persian) Translation to ZeroNet
2019-12-18 19:29:26 +01:00
shortcutme
d660a268e8
Rev4360 2019-12-18 16:43:58 +01:00
shortcutme
c161140a90
Add locking for db cursor 2019-12-18 16:43:46 +01:00
shortcutme
7af8d1cd93
Save last lock time 2019-12-18 16:42:47 +01:00
shortcutme
845b50915d
Rev4358 2019-12-18 15:32:50 +01:00
shortcutme
dbbad3097c
Add segfault catcher, log plugins to separate directory 2019-12-18 15:32:42 +01:00
shortcutme
1abaa6fddc
Benchmark only exits when running as test from cli 2019-12-18 15:24:40 +01:00
shortcutme
7ecf09a496
Allow to change test log dir with environmental variable 2019-12-18 15:24:05 +01:00
shortcutme
c0639fef75
Lock task adding to avoid race condition when getFileInfo switches 2019-12-18 15:23:16 +01:00
ZeroNet
c08d266822
Change to more simple way to create new site 2019-12-18 14:55:37 +01:00
Hamid reza Zaefarani
6bc3c168c6
Merge pull request #1 from decentralizedauthority/patch-1
Rename fa,json to fa.json
2019-12-18 14:45:00 +03:30
Hamid reza Zaefarani
1fe7127082
Rename fa,json to fa.json 2019-12-18 14:35:54 +03:30
Decentralized Authority
cfaaaf57ec
Rename fa,json to fa.json 2019-12-18 10:59:48 +00:00
shortcutme
93d2ee65fe
Validate json files in src and plugins dir 2019-12-17 21:30:01 +01:00
shortcutme
9c08e41b9e
Rev4355 2019-12-17 21:03:01 +01:00
shortcutme
abee87bbec
Wait for threadpool kill with 1s timeout to fix memory leak test 2019-12-17 21:02:48 +01:00
shortcutme
d4b6f79746
Display logs after failure 2019-12-17 21:01:04 +01:00
shortcutme
a7c26f893f
Rev4354 2019-12-17 20:46:29 +01:00
Hamid reza Zaefarani
24b8cdf87a
Add Farsi (Persian) Translation to ZeroNet
Persian Translation of ZeroNet Site
2019-12-17 23:15:51 +03:30
shortcutme
fd43aa61ef
Current gevent in PyPI is not fully compatible with Python3.8 2019-12-17 20:37:32 +01:00
shortcutme
77869830c5
Fix shutdown hang 2019-12-17 20:36:52 +01:00
shortcutme
87fc8ced5e
Accept only my exception when testing Noparallel 2019-12-17 16:06:13 +01:00
ZeroNet
909967629b
Remove incompatible tests 2019-12-17 15:34:43 +01:00
ZeroNet
afe0d82f18
Run only selected benchmark tests 2019-12-17 15:25:46 +01:00
shortcutme
1ad97a6696
Run internal test on CI 2019-12-17 15:16:23 +01:00
shortcutme
e7e8e59c1e
Rev4353 2019-12-17 15:08:42 +01:00
shortcutme
f3665b172f
Avoid unnecessary pool call 2019-12-17 15:07:32 +01:00
shortcutme
23b3cd3986
Better rebuild log message 2019-12-17 15:07:00 +01:00
shortcutme
f7ee6744af
Db busy event waited in getDb 2019-12-17 15:06:36 +01:00
shortcutme
ac45217816
Add reason for db close and rebuilds 2019-12-17 15:05:59 +01:00
shortcutme
8c51e81a0b
Fix double opening of dbs 2019-12-17 15:05:21 +01:00
shortcutme
9d777951dd
Fix console tabs display gitch on edge 2019-12-17 15:03:04 +01:00
shortcutme
2778b17f8d
Ignore trayicon destroy errors 2019-12-17 15:02:39 +01:00
shortcutme
98c98fbac7
Thread safe method to create directory for db 2019-12-17 15:02:18 +01:00
shortcutme
9b1f6337c3
Wait for cursor finish on db close 2019-12-17 15:02:04 +01:00
shortcutme
2019093431
Fix testing on slower storage 2019-12-17 15:01:15 +01:00
shortcutme
eac25caf28
Log packing peer arrors as debug 2019-12-17 15:00:23 +01:00
shortcutme
b421893434
Return timer greenet 2019-12-17 15:00:09 +01:00
shortcutme
f1b19f5fc7
Fix DbQuery logging 2019-12-17 14:59:54 +01:00
shortcutme
61f1a741fc
Test main loop caller 2019-12-17 14:52:58 +01:00
shortcutme
f01d335835
Test noparallel multi thread compatibility 2019-12-17 14:52:13 +01:00
shortcutme
5c1b34387c
Noparallel multi thread compatibility 2019-12-17 14:51:57 +01:00
shortcutme
dfd55c3957
Fix memory leak when using sleep in threads 2019-12-17 14:50:38 +01:00
shortcutme
b21895fa78
Kill threadpool properly 2019-12-17 14:50:10 +01:00
shortcutme
495d695c5a
Fix threadpool apply and spawn when threadpool is full 2019-12-17 14:49:50 +01:00
shortcutme
3309489c24
Only call the function in separate thread when in the main loop 2019-12-17 14:48:11 +01:00
shortcutme
8a5a75e68f
Allow pass calls to the main loop 2019-12-17 14:47:27 +01:00
shortcutme
c1df78b97f
Name threadpools 2019-12-17 14:43:33 +01:00
shortcutme
4c31aae97b
Refactor worker, fix concurrent write errors 2019-12-17 14:42:33 +01:00
shortcutme
0839fdfc5e
Add reason for db close 2019-12-17 14:35:49 +01:00
shortcutme
d062f01127
Log temp site events under different name 2019-12-17 14:34:53 +01:00
shortcutme
e91fb90a45
Fix tests when running for long time 2019-12-17 14:34:29 +01:00
shortcutme
6539ca5eb0
Log spy actions to file when running tests 2019-12-17 14:33:06 +01:00
shortcutme
b138ebc519
Capture fd for pytest 2019-12-17 14:32:43 +01:00
shortcutme
79c1cd15ab
Use libev when running test 2019-12-17 14:32:17 +01:00
shortcutme
10c1986c54
Fix site list changing during listing 2019-12-17 14:31:55 +01:00
shortcutme
d7cabb47ca
Log task numbers on content.json start 2019-12-17 14:31:41 +01:00
shortcutme
8de1714f08
Fix onComplete call when donwload end 2019-12-17 14:31:12 +01:00
shortcutme
20ba9cd589
Log site download time 2019-12-17 14:30:29 +01:00
shortcutme
af1ac9bce8
Try to find already running task for file before start a new one 2019-12-17 14:30:14 +01:00
shortcutme
31a6e3ee9a
Don't allow clone to run in parallel 2019-12-17 14:29:48 +01:00
shortcutme
dca1dcdd2d
Use always active connection in DbCursor 2019-12-17 14:28:52 +01:00
shortcutme
a54f5f3e9f
Change trackers to more stable onces 2019-12-17 14:26:14 +01:00
shortcutme
51f49cd45a
Always use libev if possible 2019-12-17 14:25:04 +01:00
shortcutme
eb63eb7b1d
Log startup errors in log file 2019-12-17 14:24:44 +01:00
shortcutme
b4f7e51e96
Limit stack size on formatting 2019-12-17 14:24:08 +01:00
shortcutme
c2d2189039
Log content init failed as info 2019-12-17 14:23:47 +01:00
shortcutme
1eda3258de
Always raise error on verify error 2019-12-17 14:23:31 +01:00
shortcutme
0171cb0844
Avoid get db_inner_path for every file on signing 2019-12-17 14:23:18 +01:00
shortcutme
08a0a63631
Create ssl contexts only once 2019-12-17 14:22:29 +01:00
shortcutme
8ed7d0385d
If possible use loaded db to get db file inner_path 2019-12-17 14:21:47 +01:00
shortcutme
02d45e9c39
Use separate threadpool for batch site storage operations 2019-12-17 14:20:49 +01:00
shortcutme
2a402a0674
Use thread-safe mode to create directories 2019-12-17 14:18:54 +01:00
shortcutme
1be56b5a39
Return exit code 1 if any test failed 2019-12-17 14:10:42 +01:00
shortcutme
1e175bc41f
Remove used cursors from benchmark db test 2019-12-17 14:10:05 +01:00
ZeroNet
c16569a6ab
Merge pull request #2363 from GiganticBlackBear/py3
Update hu.json
2019-12-16 16:45:48 +01:00
Gigantic Black Bear
d19cc64611
Update hu.json 2019-12-16 15:19:42 +00:00
shortcutme
958882c1c5
Revert "Switch to sslcrypto for cryptography tasks (#2338)"
This reverts commit fbc7b6fc4f.
2019-12-15 18:30:42 +01:00
ZeroNet
2f7323043f
Merge pull request #2358 from imachug/bencode
Switch to bencode_open
2019-12-15 12:49:04 +01:00
Ivanq
fbc7b6fc4f Switch to sslcrypto for cryptography tasks (#2338)
* Use sslcrypto instead of pyelliptic and pybitcointools

* Fix CryptMessage

* Support Python 3.4

* Fix user creation

* Get rid of pyelliptic and pybitcointools

* Fix typo

* Delete test file

* Add sslcrypto to tree

* Update sslcrypto

* Add pyaes to src/lib

* Fix typo in tests

* Update sslcrypto version

* Use privatekey_bin instead of privatekey for bytes objects

* Fix sslcrypto

* Fix Benchmark plugin

* Don't calculate the same thing twice

* Only import sslcrypto once

* Handle fallback sslcrypto implementation during tests

* Fix sslcrypto fallback implementation selection
2019-12-15 12:46:06 +01:00
Ivanq
3178b69172 Switch to bencode_open 2019-12-12 17:46:16 +03:00
shortcutme
28fcf3c1ea
Rev4327 2019-12-11 20:04:50 +01:00
shortcutme
71939097b0
Make execution order test more predictable 2019-12-11 20:04:39 +01:00
shortcutme
2fd337bb55
Add wasm content type 2019-12-11 20:03:28 +01:00
shortcutme
5e26161e84
Rev4325 2019-12-04 17:16:08 +01:00
shortcutme
04ecb89e9a
Avoid sending too many publish request to an outdated client 2019-12-04 17:15:42 +01:00
shortcutme
23f851343f
Fix exception when params is an iterator 2019-12-04 17:15:08 +01:00
shortcutme
5ce1782d05
Change journal and foreign keys mode on db connect 2019-12-04 17:14:50 +01:00
shortcutme
daee14533c
Fix site number changes when data collected for stats 2019-12-04 17:14:04 +01:00
ZeroNet
31f505b309
Merge pull request #2339 from ethernetcat/py3
Update jp.json
2019-12-04 15:40:51 +01:00
shortcutme
c8214bf3ea
Fix threadpool test premature end on some platforms 2019-12-04 12:47:47 +01:00
shortcutme
1935a69c04
Add session based log disable at test 2019-12-04 12:46:44 +01:00
shortcutme
ea5f64bfea
Only log at start of the test cases 2019-12-04 12:46:13 +01:00
shortcutme
3dd04b27de
Correct invalid UiConfig pt-br json file 2019-12-04 11:03:45 +01:00
ZeroNet
9940b7bff3
Merge pull request #2334 from eduaddad/patch-3
Translation update for latest changes
2019-12-04 11:00:11 +01:00
ethernetcat
901ccf2d14 Update jp.json 2019-12-04 17:52:33 +09:00
Eduaddad
6a1a821ed4
Translation update for latest changes
Translation update for latest changes
2019-11-30 12:04:25 -03:00
shortcutme
aa9fe09337
Remove unnecessary line from config 2019-11-30 02:19:18 +01:00
shortcutme
bdb655243f
Rev4322 2019-11-30 02:16:29 +01:00
shortcutme
566c29363f
Slower progress bar animation 2019-11-30 02:15:17 +01:00
shortcutme
37b8c0241f
Db threads modify in config interface 2019-11-30 02:14:54 +01:00
shortcutme
1a17645e93
Remove unnecessary import 2019-11-30 02:14:08 +01:00
shortcutme
5fba850d74
Don't close connection if it's already closed 2019-11-30 02:13:58 +01:00
shortcutme
bd90e0ce52
Add Db id to logging identifier 2019-11-30 02:13:39 +01:00
shortcutme
c24cfa721b
Lock db while connecting 2019-11-30 02:13:17 +01:00
shortcutme
1670d96908
Execute db commit in separate thread 2019-11-30 02:12:33 +01:00
shortcutme
ec3c44c5b3
Use ThreadPool lock in Db 2019-11-30 02:11:34 +01:00
shortcutme
12bfad8fe6
Don't execute query while commiting 2019-11-30 02:11:11 +01:00
shortcutme
594edc6e9a
Commit after executemany 2019-11-30 02:10:40 +01:00
shortcutme
99304a09ca
Log long db queries 2019-11-30 02:10:11 +01:00
shortcutme
5c93aadce3
Gevent block time resolution log to ms 2019-11-30 02:09:14 +01:00
shortcutme
f0c10efca6
Progress meter for site delete 2019-11-30 02:08:29 +01:00
shortcutme
c10dd5239e
Log test case start/end and debug message 2019-11-30 02:08:11 +01:00
shortcutme
fa0d1a50b5
Better test of threadpool 2019-11-30 02:07:40 +01:00
shortcutme
66a1c4d242
Multi-process and gevent loop friendly lock 2019-11-30 02:07:30 +01:00
shortcutme
b7c6b84826
Don't log killed worker write as error 2019-11-30 02:05:20 +01:00
shortcutme
1c587bde25
Avoid write race on same file 2019-11-30 02:04:59 +01:00
shortcutme
e1dc29c374
Rev4308 2019-11-27 03:08:20 +01:00
shortcutme
59e0ffd8e0
Remove unnecessary imports from CryptMessage 2019-11-27 03:08:01 +01:00
shortcutme
f7c767c1c8
Make Chart plugin compatible with db changes 2019-11-27 03:07:44 +01:00
shortcutme
fca9db7972
Try fix Recursive use of cursors ProgrammingError by creating new cursor for every execute and move Lock to db 2019-11-27 03:07:08 +01:00
shortcutme
afd23849a6
Log site delete as info 2019-11-27 03:04:49 +01:00
shortcutme
1b2eee058c
Log test case start and end 2019-11-27 03:03:31 +01:00
shortcutme
777486a5be
Try new way to avoid pytest io errors 2019-11-27 03:03:22 +01:00
shortcutme
8b6f221e22
Formatting 2019-11-27 03:02:18 +01:00
shortcutme
97ecb7e3aa
Rev4303 2019-11-25 14:50:16 +01:00
shortcutme
5df5e25d68
Better logging of recent peers 2019-11-25 14:49:40 +01:00
shortcutme
66a950a481
New, much faster worker task sorting 2019-11-25 14:43:28 +01:00
shortcutme
29346cdef5
Faster, async local ip discovery 2019-11-25 14:40:52 +01:00
shortcutme
4f8e941e39
Fix err type logging 2019-11-25 14:39:24 +01:00
shortcutme
756f5a1608
Fix display peer found time on /Stats page 2019-11-25 14:38:53 +01:00
shortcutme
416e7d6fe0
Fix too fast benchmark results statistics 2019-11-25 14:38:27 +01:00
shortcutme
7b210429b5
Multi threaded eciesDecrypt 2019-11-25 14:37:55 +01:00
shortcutme
c52d47b15f
Don't show notifications when testing 2019-11-25 14:35:31 +01:00
shortcutme
9a43626aa6
When testing don't register shutdown functions 2019-11-25 14:35:16 +01:00
shortcutme
c14e722303
Fix bug that someomes blocked plugins accessing connectionserver sitelist 2019-11-25 14:34:46 +01:00
shortcutme
07633ba79d
Fix local peers dropping out from recent peers 2019-11-25 14:33:18 +01:00
shortcutme
6ff7fe55fc
Make sure we use local peers if possible 2019-11-25 14:32:06 +01:00
shortcutme
a14c36cd3e
Add peer's site to str represetntation 2019-11-25 14:31:12 +01:00
shortcutme
c21fe3d23a
Prefer connecting to non-onion peers 2019-11-25 14:30:51 +01:00
d9xr92
89e8fd3d3a potential fix for #2323 (#2324)
* potential fix for #2323

* Update DbCursor.py

* replaced RLock with Lock
2019-11-23 13:22:36 +01:00
shortcutme
966f393e20
Rev4290 2019-11-20 14:08:49 +01:00
shortcutme
d85c27e67b
Merge config js 2019-11-20 14:08:19 +01:00
shortcutme
a5f8a53196
Fix change detection for integers on config interface 2019-11-20 14:08:02 +01:00
shortcutme
9299e5b614
Kill greenlets with notify 2019-11-20 14:07:33 +01:00
shortcutme
6c31a3b77e
Change fs thread number on config interface 2019-11-20 14:07:04 +01:00
shortcutme
6262c80886
Fix benchmark on Firefox 2019-11-20 14:06:27 +01:00
shortcutme
5aa115c88a
Heavier task in thread pool test to make sure it will pass 2019-11-19 02:25:28 +01:00
shortcutme
511587dd8b
Allow images from data uris 2019-11-19 02:19:14 +01:00
shortcutme
5d34bb9062
Rev4287 2019-11-19 02:17:32 +01:00
shortcutme
4025d753e3
Don't print errors happened in thread 2019-11-19 02:16:44 +01:00
shortcutme
58214c0ac3
Move file writes and reads to separate thread 2019-11-19 02:16:20 +01:00
shortcutme
5d113757df
Stop greenlets when deleting a site in test 2019-11-19 02:15:47 +01:00
shortcutme
b41a03674f
New configuration options for fs write and read thread count 2019-11-19 02:15:00 +01:00
shortcutme
8c1f64243f
Test CLI action parser 2019-11-19 02:14:29 +01:00
shortcutme
cdd9dd4f6f
Fix duplicate content_db connecting 2019-11-19 02:12:24 +01:00
shortcutme
57f2a43864
Formatting 2019-11-19 02:11:19 +01:00
shortcutme
74d7fb7835
Less verbose logging in site storage 2019-11-19 02:10:42 +01:00
shortcutme
dd61429e2f
Handle announcer thread killing properly 2019-11-19 02:09:55 +01:00
shortcutme
8f27f50b34
Log SQL statements in progress as warning 2019-11-19 02:09:36 +01:00
shortcutme
96e7fbdca1
Don't try to commit if no db connection 2019-11-19 02:08:30 +01:00
shortcutme
39352eb97e
Fix test function listing name 2019-11-19 02:08:03 +01:00
shortcutme
1c607645c7
Track and stop site connected greenlets on delete 2019-11-19 02:07:51 +01:00
shortcutme
2ad3493fb0
Test and benchmark of crypto function in CryptMessage plugin 2019-11-19 02:05:02 +01:00
shortcutme
331dc99086
Fix benchmark plugin test listing if not loaded before other plugins 2019-11-19 02:03:27 +01:00
shortcutme
4424c8272d
New refactored Benchmark plugin to test compatibility and meassure system performance 2019-11-19 01:48:31 +01:00
shortcutme
16162955af
New cli test action 2019-11-19 01:47:06 +01:00
shortcutme
23006e495f
FilePack plugin pass possible other parameters to site storage read function 2019-11-19 01:45:50 +01:00
shortcutme
4351af35f4
Don't load geoip db in parallel 2019-11-19 01:44:26 +01:00
shortcutme
e8af5db2e8
Keep track gevent block number, remove Benchmark from stats plugin 2019-11-19 01:43:39 +01:00
shortcutme
9d048371b7
Better way to patch gevent error handling 2019-11-19 01:42:00 +01:00
shortcutme
a187726ba8
Formatting 2019-11-19 01:40:39 +01:00
shortcutme
0ff1bcfd19
Remove not used variable and module import 2019-11-19 01:40:00 +01:00
shortcutme
08fee35bcf
Fix pytest output capturing error 2019-11-19 01:39:16 +01:00
shortcutme
08574bf676
Handle unkown variables when rendering template 2019-11-19 01:38:22 +01:00
shortcutme
5c27a0efcc
Rev4260, Fix UiConfig pt-br language json 2019-11-15 19:43:56 +01:00
ZeroNet
7576f96604
Merge pull request #2307 from nfenclova/py3
Replace usage of deprecated API 'cgi.parse_qsl'
2019-11-14 17:59:16 +01:00
Natalia Fenclová
456e330854 Replace usage of deprecated API 'cgi.parse_qsl'
Python 3.8.0 removed this deprecated API. We already use the replacement
`urllib.parse.parse_qsl` in `UIRequest.py`
2019-11-14 17:22:39 +01:00
ZeroNet
8d95eb937f
Longer timeout to close connections in ssl connection test 2019-11-11 17:14:36 +01:00
shortcutme
2f50fef787
Rev4259 2019-11-11 16:18:33 +01:00
shortcutme
ac69007292
Fix file rendering if content.json download failed 2019-11-11 16:18:25 +01:00
shortcutme
e8b0a3d1c4
Fix loading screen scrolling on smaller screens 2019-11-11 16:18:01 +01:00
Eduaddad
dfbbbd9381 translation update (#2275)
* translation update

translation update

* Update pt-br.json

* missing comma correction
2019-11-11 15:37:50 +01:00
ZeroNet
4ab339b375
Merge pull request #2278 from eduaddad/patch-2
text was duplicated and in Chinese
2019-11-11 15:37:24 +01:00
shortcutme
fce24cedbd
Rev4257 2019-11-07 02:48:17 +01:00
shortcutme
f9b62564ca
Fix logging in non-debug mode 2019-11-07 02:47:45 +01:00
shortcutme
d569d9488a
Deny invalid files on Windows 2019-11-07 02:47:19 +01:00
shortcutme
f172751df3
Test utf8 filename download 2019-11-07 02:44:54 +01:00
shortcutme
13233d47bd
Fix long running test 2019-11-07 02:44:33 +01:00
Josh
74d7d92a4d Allow all valid filenames to be added to content.json (#2141)
* Allow all valid filenames to be added to content.json

* Replace hex version of regex with non-hex version

* Add basic test for path validation with ASCII and UTF-8 filenames

* Amend path validation test to meet standards
2019-11-07 02:18:27 +01:00
ZeroNet
d3a0f5c268
Add macOS download option, change localhost to 127.0.0.1 2019-11-06 23:26:52 +01:00
ZeroNet
63f213a5d5
Merge pull request #2286 from cclauss/patch-1
Upgrade to the production version of Python 3.8
2019-11-04 19:52:37 +01:00
Christian Clauss
6d4c4d9f27
Upgrade to the production version of Python 3.8 2019-11-04 19:44:15 +01:00
Eduaddad
b2be4672ec
text was duplicated and in Chinese 2019-11-04 09:18:32 -03:00
Lola Dam
1bfe328a1b No restart after update (#2242) 2019-11-01 19:36:43 +01:00
shortcutme
1f453b6c13
Rev4253, Hotfix siteCreate CLI 2019-10-30 03:09:28 +01:00
shortcutme
ee8e3c3c9c
Use master_seed for siteCreate CLI by default 2019-10-30 03:07:06 +01:00
shortcutme
37f315dfc2
Rev4252 2019-10-30 02:31:04 +01:00
shortcutme
1e1e560795
Use master seed to create new site from cli 2019-10-30 02:30:01 +01:00
shortcutme
8d88cfcd68
Fix notification width calculation 2019-10-30 02:28:37 +01:00
shortcutme
74badf9c9c
Rev4250 2019-10-28 16:44:40 +01:00
shortcutme
86087550f1
Log ConnectionResetError as warning 2019-10-28 16:44:14 +01:00
shortcutme
8dfc200f24
Update cachable type list 2019-10-28 16:43:37 +01:00
shortcutme
cb4a4bd707
Add utf-8 charset header to more types 2019-10-28 16:43:19 +01:00
shortcutme
24ba2a150b
Remove limitations for img, font, media, style src in raw mode 2019-10-28 16:42:28 +01:00
shortcutme
e1d92bf0ec
Changing allow-origin to js files looks no longer necessary 2019-10-28 16:41:55 +01:00
shortcutme
270f3e9ffd
Use host to check same origin if referrer looks trimmed to host 2019-10-28 16:41:08 +01:00
shortcutme
e1f73697ff
Extend built-in content types list 2019-10-28 16:11:45 +01:00
shortcutme
e82155aac4
Rev4245, Fix target=_blank links 2019-10-26 20:36:53 +02:00
shortcutme
d7669413af
Log ConnectionAbortedError as warning 2019-10-26 20:17:09 +02:00
shortcutme
28d4fc5d12
Update location of bundled OpenSSL on macOS 2019-10-24 12:22:54 +02:00
Filip Š
dac4fcd52b Allow NOSANDBOX in local mode (#2238) 2019-10-24 12:01:31 +02:00
6543
8dff33b38a git ignore log folder (#2239) 2019-10-24 10:53:41 +02:00
shortcutme
6bae1f8a4b
Rev4243 2019-10-24 03:09:38 +02:00
shortcutme
10ceeb7f02
Remove no longer necessary files after cert generation 2019-10-24 03:09:28 +02:00
shortcutme
448bb3ce98
Fix OpenSSL cert generation using LibreSSL 2019-10-24 03:09:16 +02:00
shortcutme
0531d47721
Fix shutdown errors on macOS 2019-10-24 03:08:45 +02:00
shortcutme
b21719e2f2
Fix OpenSSL lib loading on macOS 2019-10-24 03:08:27 +02:00
Ornataweaver
2960db2352 simple English improvement (#2232) 2019-10-22 17:33:10 +02:00
ZeroNet
cb3629343b
Update requirements.txt 2019-10-22 17:22:30 +02:00
shortcutme
fa7013fdf7
Rev4241 2019-10-16 15:44:56 +02:00
shortcutme
db868dba81
Merge sidebar css 2019-10-16 15:44:38 +02:00
shortcutme
608a411d97
Db table rebuild as debug message 2019-10-16 15:43:28 +02:00
shortcutme
20c63c73b3
Support silent loading of verify lib 2019-10-16 15:43:07 +02:00
shortcutme
5ca3401eb9
Remove UiRequestPlugin from Zeroname plugin 2019-10-16 15:42:49 +02:00
ZeroNet
435a3c285e
Merge pull request #2218 from caryoscelus/py3
minor code improvement: super/init
2019-10-07 11:23:32 +02:00
caryoscelus
6405cae706 minor code improvement: super/init
`__init__` should only ever return None
2019-10-06 22:30:18 +00:00
shortcutme
6451e7f9f1
Console display fixes 2019-10-06 03:32:04 +02:00
shortcutme
127fa5fa82
Rev4238 2019-10-06 03:27:47 +02:00
shortcutme
63fd0a9fa1
Put the infopanel lower to avoid console interruption 2019-10-06 03:21:35 +02:00
shortcutme
344ad44854
Fix reload if there is hash in the url 2019-10-06 03:20:58 +02:00
shortcutme
43a5742258
Resolve domain in parsePath function 2019-10-06 03:20:16 +02:00
shortcutme
924a61309a
Cached isDomain / resolveDomain functions 2019-10-06 03:18:14 +02:00
shortcutme
9dd5c88da4
Monospace font when displaying errors 2019-10-06 03:15:57 +02:00
shortcutme
0598bcf332
Fix utf8 post data parsing 2019-10-06 03:15:20 +02:00
shortcutme
ead1b3e5f5
Log 403 as warning 2019-10-06 03:14:45 +02:00
shortcutme
dd493c87fa
Display WSGI errors to the browser 2019-10-06 03:13:32 +02:00
shortcutme
29640e614c
Admin API call to list server errors 2019-10-06 03:12:47 +02:00
shortcutme
73e0aa17c4
Don't encode byte responses 2019-10-06 03:10:43 +02:00
shortcutme
917a2e59ce
Fix compacting large json files 2019-10-06 03:10:20 +02:00
shortcutme
119e1a9bf0
Simple cache decorator 2019-10-06 03:09:48 +02:00
shortcutme
6eb79ba75e
Don't annunce site if not serving 2019-10-06 03:08:54 +02:00
shortcutme
1f9eafa619
Merge sidebar js, css 2019-10-06 03:08:32 +02:00
shortcutme
d5da404ed4
Log zeroname db load error 2019-10-06 03:08:09 +02:00
shortcutme
1b41aa70cc
Don't mess with console visibility on Windows 2019-10-06 03:07:52 +02:00
shortcutme
284b1a4f8a
Console filters to Warning, Error 2019-10-06 03:07:34 +02:00
shortcutme
fe432ad843
Open console with #ZeroNet:Console hash in url 2019-10-06 03:07:14 +02:00
shortcutme
15fca6bd12
User selection from a list in multiuser local mode 2019-10-06 03:05:39 +02:00
ZeroNet
57c0daa294
Merge pull request #2213 from filips123/sponsor-button
Display a sponsor button in repository (py3)
2019-10-02 18:20:19 +02:00
Filip Š
fee95654fa Create FUNDING.yml
(cherry picked from commit f08bea7f90)
2019-09-30 22:04:40 +02:00
shortcutme
bb436f9931
Rev4223 2019-09-28 17:17:47 +02:00
shortcutme
3682f0aed4
Wait for db close on tests 2019-09-28 17:03:43 +02:00
shortcutme
43c366d2fb
Restrict blocked site addition when using mergerSiteAdd 2019-09-28 17:02:27 +02:00
shortcutme
b21b885aa9
Move site add to separate function 2019-09-28 17:01:37 +02:00
shortcutme
6bb929a896
Merge branch 'py3' of https://github.com/HelloZeroNet/ZeroNet into py3 2019-09-19 16:38:25 +02:00
shortcutme
f5829f6012
Rev4221 2019-09-19 16:38:20 +02:00
shortcutme
d06b4abecf
Add multiuser admin status to server info 2019-09-19 16:38:05 +02:00
shortcutme
d7db631b95
Shut down UiServer if FileServer startup failed 2019-09-19 16:33:45 +02:00
shortcutme
93e6ec4933
Fix display site add prompt 2019-09-19 16:32:30 +02:00
Christian Seibold
2fbf2c7771 English Grammar Fix: Change "Forgot" to "Forget" in Sidebar (#2202)
* Change forgot to forget

English grammar fix

* Change forgot to forget

Fix English grammar
2019-09-18 19:49:53 +02:00
shortcutme
b474677db1
Remove pyelliptic from requirements because an OpenSSL 1.1 compatible version is bundled in the lib dir 2019-09-15 22:14:20 +02:00
shortcutme
dbcd8602c5
Rev4214 2019-09-15 22:12:09 +02:00
shortcutme
1793407748
Png and svg version of the logo 2019-09-15 22:12:03 +02:00
shortcutme
6f0d4a50d1
Add apple touch icon support for Safari 2019-09-15 22:11:51 +02:00
shortcutme
10817aefae
Fix pyelliptic OpenSSL 1.1 compatibility if it's also present in site-packages 2019-09-15 22:08:48 +02:00
shortcutme
4293a44c93
Don't try to find OpenSSL 1.0.x 2019-09-15 22:08:20 +02:00
shortcutme
96759e9303
Rev4210, Fix format exception if no args 2019-09-12 00:24:16 +02:00
shortcutme
448483371c
Formatting 2019-09-12 00:23:36 +02:00
Lola Dam
0738964e64 Save content.json of site even if limit size is reached (#2114)
* fix #2107; Still save the content.json received even if site size limit is reached but dont download files; Allow better distribution of latest version of content.json

* Added test

* Fix test for huge content file (now it fails)

* Dont download huge content.json file and update test

* Remove comments
2019-09-10 18:18:21 +02:00
ZeroNet
deec2e62ce
Add Linux bundle install method 2019-09-10 18:16:02 +02:00
ZeroNet
c52da69367
Check py3 branch build status 2019-09-10 18:08:45 +02:00
shortcutme
2de35266c4
Rev4208, Add details on Tor connection error 2019-09-10 15:43:42 +02:00
ZeroNet
e6b8097b43
Merge pull request #2187 from krzotr/patch-5
Set custom priority in FileNeed and FileGet command
2019-09-08 17:24:19 +02:00
krzotr
55c7585334
Set custom priority in FileNeed and FileGet command
When you use `FileNeed` or `FileGet` command the default priority is set to `6`.
You cannot change that value because is hardcoded.

Now you can set priority of downloading files manually:

```
this.cmd("fileNeed", {
    "inner_path": inner_path + "|all",
    "priority": 10
})
```
2019-09-08 11:51:46 +02:00
shortcutme
62d278a367
Version 0.7.1 2019-09-06 04:03:01 +02:00
shortcutme
38e20b7c31
Rev4206 2019-09-04 20:16:57 +02:00
shortcutme
d3fce8ca36
Support Linux bundle OpenSSL 2019-09-04 20:16:32 +02:00
shortcutme
2a7d7acce0
Support updating linux bundle 2019-09-04 20:15:49 +02:00
shortcutme
eab63c6af8
Keep file permissions on update rename workaround 2019-09-04 20:15:37 +02:00
shortcutme
4f0613689a
Formatting 2019-09-04 20:13:32 +02:00
shortcutme
743463dce9
Execute shutdown function before running update to avoid segfault on linux 2019-09-04 20:13:16 +02:00
shortcutme
0b04176f18
Rev4203, Change console encoding to utf8 on Windows 2019-09-03 12:00:25 +02:00
ZeroNet
166a65e1b1
Merge pull request #2183 from imachug/patch-2
Fix gevent.Timeout being not caught
2019-09-02 21:59:44 +02:00
Ivanq
5da4537d7c
Fix gevent.Timeout being not caught 2019-09-02 19:34:29 +00:00
ZeroNet
b9e71c9f6f
Merge pull request #2181 from imachug/patch-1
Fix UnicodeDecodeError when OpenSSL is not found
2019-09-02 21:10:15 +02:00
Ivanq
500c96abe2
Fix UnicodeDecodeError when OpenSSL is not found
Fixes #2180
2019-09-02 14:35:28 +00:00
shortcutme
149c4f5c7b
Rev4200 2019-09-02 14:17:46 +02:00
shortcutme
76bc9fcddf
Open sidebar with location hash 2019-09-02 14:17:35 +02:00
shortcutme
f999f167b1
Offer access with ip address on invalid host error 2019-09-02 02:10:52 +02:00
shortcutme
9ac96cdd50
Don't leak allowed origins in error message 2019-09-02 02:09:53 +02:00
shortcutme
3c4bc6ae35
Always update merger sites db on content.json update 2019-09-02 02:08:07 +02:00
ZeroNet
879b504b0f
Merge pull request #2179 from krzotr/patch-4
KeyError: 'piece_size' in `fileNeed` command in BigfilePlugin when try to download non-optional files with `|all`
2019-08-30 21:05:46 +02:00
Krzysztof Otręba
baa5df1d01 fixed KeyError: 'piece_size' when try to download non-optional file using '|all' 2019-08-30 18:59:19 +02:00
shortcutme
912c958ac0
Rev4197 2019-08-26 03:21:04 +02:00
shortcutme
d166a16a24
Use function flagging in plugins 2019-08-26 03:20:07 +02:00
shortcutme
1bd1ddf410
Test function flagging 2019-08-26 03:15:29 +02:00
shortcutme
7890771faa
Test permissions of websocket 2019-08-26 03:11:24 +02:00
shortcutme
376fd0d439
Use flags instead of permission list 2019-08-26 03:09:48 +02:00
shortcutme
c414e6caa2
Support action async call flag 2019-08-26 03:08:57 +02:00
shortcutme
ed7a3b2356
Get action permissions from flag db 2019-08-26 03:02:30 +02:00
shortcutme
adffbd1973
New function flagging decorator class to keep track permissions 2019-08-26 02:55:01 +02:00
shortcutme
6750682e4f
Rev4191 2019-08-23 03:42:31 +02:00
shortcutme
d1fb4067e7
Hide trackers proxy settings if tor always set on /Config page 2019-08-23 03:40:44 +02:00
shortcutme
ab9fe173a8
Don't use trackers proxy in tor always mode 2019-08-23 03:40:29 +02:00
shortcutme
8a7ae368d8
No opened services if we are in tor always mode 2019-08-23 03:40:20 +02:00
shortcutme
248fc5f015
Use re.sub to replace template variables 2019-08-23 03:39:50 +02:00
shortcutme
e16611f15a
Allow websocket connection originates from earlier accepted hostnames 2019-08-23 03:39:16 +02:00
Ivanq
24b3651d2e Allow blob: protocol (#2166)
* Allow blob: protocol

* Fix quotes
2019-08-20 12:42:01 +02:00
ZeroNet
0e236e53fd
Merge pull request #2167 from imachug/merge-media
Add --merge_media config option
2019-08-20 12:10:39 +02:00
Ivanq
61ba9848e5 Add --merge_media config option 2019-08-20 08:16:35 +00:00
Ivanq
01ff89315b Add GitLab CI/CD support (#2163)
* Use GitLab CI/CD

* Force colored tests

* Get rid of an error

* Mark tests as slow

* Disable codecov & coveralls

* Python 3.5-3.8

* Add Python 3.4

* Support both OpenSSL 1.1.0 and 1.1.1+

* Test both OpenSSL 1.1.0 and 1.1.1+

* Fix OpenSSL 1.1.1

* Fix Python 3.4 build
2019-08-19 17:30:31 +02:00
shortcutme
155d8d4dfd
Rev4188, Allow only white listed values for open_browser 2019-08-19 13:42:49 +02:00
ZeroNet
c7822ed6e6
Merge pull request #2160 from imachug/patch-1
Allow files with `..` as a name substring
2019-08-19 13:35:29 +02:00
Ivanq
1ed40b3b82
Allow files with .. as a name substring 2019-08-19 07:09:32 +00:00
shortcutme
18dc359cfc
Rev4187 2019-08-18 03:03:22 +02:00
shortcutme
b871849df4
Add origin validation to websocket connections 2019-08-18 03:03:02 +02:00
shortcutme
7d1ca3862d
Make missing IPv6 a warning not an error 2019-08-18 03:02:30 +02:00
shortcutme
2a887870ff
Rev4185 2019-08-17 20:35:00 +02:00
shortcutme
1d5bde01cc
Deny plugin add request in multiuser mode 2019-08-17 20:34:21 +02:00
shortcutme
8537939d26
Disable UDP in proxy mode 2019-08-17 20:34:04 +02:00
shortcutme
fcb3ac3917
Only change default proxy to tor in tor always mode 2019-08-17 20:33:43 +02:00
shortcutme
d63a4b3912
Rev4181 2019-08-15 03:19:23 +02:00
shortcutme
6a245a202c
Fix server connections encryption 2019-08-15 03:19:05 +02:00
shortcutme
429043f60c
CLI peerPing command display connection encryption info only once 2019-08-15 03:09:53 +02:00
shortcutme
8f491fe6e1
Use SSLContext for connection encryption, add fake SNI, ALPN 2019-08-15 03:08:40 +02:00
shortcutme
92358bafc0
Wider max notification width to allow blacklist button in same line 2019-08-15 03:06:13 +02:00
shortcutme
d93e89899b
Fix tracker proxy PySocks import 2019-08-15 03:05:46 +02:00
shortcutme
2bdd073608
Move resolveDomain to SiteManager for easier resolver plugins 2019-08-15 03:05:29 +02:00
shortcutme
7801937f74
Rev4176, Fix update of plugins 2019-08-13 21:07:26 +02:00
shortcutme
1d7e0c47dd
Merge branch 'py3' of https://github.com/HelloZeroNet/ZeroNet into py3 2019-08-12 17:58:28 +02:00
shortcutme
7b9b48e62d
Rev4175, Console and file logging disable support 2019-08-12 17:58:23 +02:00
shortcutme
d610f94e7d
Display TLS 1.3 support on /Stats page 2019-08-12 17:56:06 +02:00
ZeroNet
7742f2f5fb
Merge pull request #2137 from imachug/patch-1
Fix preferring CLI argument over zeronet.conf
2019-08-11 14:51:23 +02:00
Ivanq
3f7e22497d
Fix preferring CLI argument over zeronet.conf
Fix using open_browser from CLI arguments in case there are several `--open_browser` arguments, which often happens after restarts.
2019-08-11 12:18:55 +03:00
shortcutme
e745760520
Rev4172 2019-08-09 13:18:57 +02:00
shortcutme
bd5c2b1daa
Also try to load OpenSSL dll from Python/DDLs directory 2019-08-09 13:18:40 +02:00
shortcutme
0bbeede975
Don't try to display bigfile limit settings if no bigfile plugin enabled 2019-08-09 13:17:48 +02:00
shortcutme
30865c9d1c
Rev4169 2019-08-08 23:37:49 +02:00
shortcutme
1cfe874893
Use find_library first to locate libeay32 2019-08-08 23:37:43 +02:00
shortcutme
5da46ca29c
Cleanup whitespace in pyelliptic 2019-08-08 23:37:21 +02:00
shortcutme
cc21cbd1bd
Use relative import in pyelliptic 2019-08-08 23:36:58 +02:00
shortcutme
79ba4a9d23
Rev4167 2019-08-08 14:39:02 +02:00
shortcutme
44ef0cbe59
Always load plugins abc sorted 2019-08-08 14:37:42 +02:00
shortcutme
88f2b39576
Don't try to connect to onion addresses if not supported by the client 2019-08-08 14:37:19 +02:00
shortcutme
bf10cdef63
Add some delay on pex error before try the next peer 2019-08-08 14:36:33 +02:00
shortcutme
3696db89ab
Don't increment tracker error number if no internet connection 2019-08-08 14:35:58 +02:00
shortcutme
eeaa5d21d8
Start unrealible trackers on force reannounce 2019-08-08 14:35:35 +02:00
shortcutme
f4bec3bb4d
Avoid starting new workers on possibly unvalaible file 2019-08-08 14:35:04 +02:00
shortcutme
dc6f3cf0b2
Merge branch 'py3' of https://github.com/HelloZeroNet/ZeroNet into py3 2019-08-07 14:13:00 +02:00
shortcutme
b5a1310add
Rev4165 2019-08-07 14:12:53 +02:00
shortcutme
b22343f65c
Support multiple trackers_file argument 2019-08-07 14:12:45 +02:00
shortcutme
b9b317e213
Remove accidently left print on plugin load 2019-08-07 14:11:58 +02:00
shortcutme
6cd18bbf04
Display more clean error on users.json/sites.json load error 2019-08-07 14:11:30 +02:00
ZeroNet
8c6400e4d6
Correct venv install 2019-08-06 14:56:45 +02:00
shortcutme
b6e1559a80
Rev4163 2019-08-03 01:35:37 +02:00
shortcutme
605ae75dda
Re-compile UiConfig js, css, backdrop to bottom popup 2019-08-03 01:35:00 +02:00
shortcutme
39f318fbd5
Add plugin version information to server_info 2019-08-03 01:34:21 +02:00
shortcutme
21def81439
Fix js, css merging with absolute merged_path 2019-08-03 01:34:00 +02:00
shortcutme
7e9ab8321a
Add plugin description data 2019-08-03 01:32:55 +02:00
shortcutme
4094d3a9bf
Plugin to install, update and delete third-party plugins using the web interface 2019-08-03 01:31:11 +02:00
shortcutme
0877fec638
Restrict plugin commands in multi-user mode 2019-08-03 01:29:27 +02:00
shortcutme
f40c3e6b81
Add notification messages max-width 2019-08-02 20:11:00 +02:00
shortcutme
bb705ae863
Fix source code reloader crash on directory modifications/file deletions 2019-08-02 16:19:35 +02:00
shortcutme
c4a3a53be0
Also reload source code on file changes in installed plugins 2019-08-02 16:19:05 +02:00
shortcutme
713ff17e91
Allow load installed third-party plugins and enable/disable plugins in config file data/plugins.json 2019-08-02 16:18:37 +02:00
shortcutme
0c659a477d
Remove hard-coded translate files directory 2019-08-02 16:16:19 +02:00
shortcutme
26678a65f8
Limit notifications max with 2019-08-02 16:15:45 +02:00
shortcutme
c5116fb318
Modify testAction command to use handleRequest instead of directly calling the function 2019-08-02 16:14:44 +02:00
shortcutme
fa970fa102
Test CryptMessage plugin using testAction function 2019-08-02 16:14:17 +02:00
shortcutme
fbafd23177
Add OpenSSL 1.1 support to CryptMessage plugin by using radfish's pyelliptic version 2019-08-02 16:13:54 +02:00
shortcutme
be742c78e7
Formatting for better readability 2019-08-02 16:06:22 +02:00
shortcutme
3e97c154a0
Remove hard-coded directory path from plugins 2019-08-02 16:05:19 +02:00
shortcutme
1eb97ea381
Delayed save of sites.json 2019-08-02 14:06:25 +02:00
shortcutme
f6e06456b0
Use advaced json dumper to save sites.json and users.json 2019-08-02 14:06:05 +02:00
shortcutme
5e90cd9714
Move advanced json formatter to helper.py 2019-08-02 14:05:14 +02:00
shortcutme
06406fa46c
Avoid bare exceptions 2019-08-02 14:04:18 +02:00
ZeroNet
08b7034d6f
Merge pull request #2116 from filips123/patch-2
Add response to some commands
2019-08-02 10:52:37 +02:00
Filip Š
5b91aef4ec
Add response to some commands 2019-08-01 19:16:10 +02:00
shortcutme
d8a121cd06
Rev4129 2019-07-18 03:34:09 +02:00
shortcutme
902a1b1c88
Fix OpenSSL dll loading on Windows 2019-07-18 03:33:56 +02:00
shortcutme
c9a2b86c16
Log possible OpenSSL cert generation error message at the same line 2019-07-18 03:33:35 +02:00
shortcutme
27fcb70774
Log loaded verify lib path and load time 2019-07-18 03:32:45 +02:00
shortcutme
e488841031
Display loaded verify lib path in benchmark 2019-07-18 03:32:22 +02:00
shortcutme
6cffa1c0ca
Change maxstdio using ctypes as win32file module is not included with Python3 by default 2019-07-18 03:31:57 +02:00
shortcutme
d3e8fcea47
Rev4126 2019-07-17 16:31:38 +02:00
shortcutme
9526424a47
Display error message dialog on Windows for startup errors 2019-07-17 16:31:32 +02:00
shortcutme
149278abd0
Skip reload on attribute changes 2019-07-17 16:30:56 +02:00
shortcutme
314c8b22db
Fix parsing config file with % in value 2019-07-17 16:30:32 +02:00
shortcutme
c502688ce3
Internals renamed to Console 2019-07-17 16:30:17 +02:00
shortcutme
866346b059
Fix and test bootstrapper hash cache reload from db 2019-07-17 16:29:54 +02:00
shortcutme
de8286829a
Remove outdated cn changelog 2019-07-16 13:41:44 +02:00
ZeroNet
18c407bfc2
Merge pull request #2096 from geekless/missing-encodeResponse
Add missing @helper.encodeResponse
2019-07-15 10:59:03 +02:00
Vadim Ushakov
076684176b Add missing @helper.encodeResponse in StatsPlugin.py and BootstrapperPlugin.py 2019-07-15 14:50:24 +07:00
Vadim Ushakov
a2cb1615b3 Move the BitTorrent related code from SiteAnnouncer.py (#2078)
* Move the BitTorrent related code from SiteAnnouncer.py to a separate plugin

* AnnounceBitTorrentPlugin.py: add missing `from Debug import Debug`
2019-07-10 16:12:25 +02:00
ZeroNet
6b5fa140b9
Try use pypi gevent for py3.8 tests 2019-07-10 12:48:08 +02:00
shortcutme
356d0521e6
Rev4122 2019-07-10 03:15:56 +02:00
shortcutme
5a08ab93d3
Ignore file attribute changes when reloading source code 2019-07-10 03:15:46 +02:00
shortcutme
8185f4dfda
Test getFile inner_path security 2019-07-10 03:14:30 +02:00
shortcutme
f4f0e2afa8
Allow like parameters in database queries 2019-07-10 03:14:09 +02:00
shortcutme
67d6b1e724
Fix double logging when running tests 2019-07-10 03:12:56 +02:00
shortcutme
e34a9d452a
Allow filter optional files by inner path 2019-07-10 03:11:20 +02:00
ZeroNet
2819a36469
Merge pull request #2084 from tangdou1/patch-5
Update zh.json
2019-07-09 03:01:13 +02:00
tangdou1
8815b4e0c3
Update zh.json 2019-07-08 10:05:34 +08:00
ZeroNet
960635b993
Fix win download link 2019-07-08 02:51:16 +02:00
shortcutme
f9dcb29e92
Remove development test version warning, add windows instuctions, remove outdated instuctions 2019-07-08 02:41:30 +02:00
ZeroNet
5a746769d0
Merge pull request #2073 from filips123/fix-infinite-reloading
Fix infinite reloading when system theme changes
2019-07-06 23:25:35 +02:00
Filip Š
87b4500467 Fix infinite reloading when system theme changes 2019-07-05 18:43:54 +02:00
ZeroNet
951e47469a
Merge pull request #2060 from imachug/default-subdir-clone
Fix siteCloning subdirectory with -default files
2019-07-05 17:13:29 +02:00
shortcutme
c1db963c76
Rev4112, Fix loading screen glitch, Change unstable trackers 2019-07-04 14:39:41 +02:00
ZeroNet
a252ec36f0
Merge pull request #2069 from imachug/patch-1
Guess content type correctly
2019-07-04 11:34:01 +02:00
Ivanq
33b478199a
Guess content type correctly
Fix e.g. vue.min.js being reported as text/plain instead of text/javascript.
2019-07-04 12:09:07 +03:00
shortcutme
21f285e099
Rev4111 2019-07-03 18:37:35 +02:00
shortcutme
fec312ed09
Better pytest atexit logging error workaround 2019-07-03 18:37:13 +02:00
shortcutme
eb2627721e
Fix pytest 5.x compatibility 2019-07-03 18:36:41 +02:00
shortcutme
ff32f822ba
Raise exception instead of using assert 2019-07-03 18:35:55 +02:00
ZeroNet
80bfccd9d3
Merge pull request #2066 from geekless/Dockerfile-fix-caching
Fix the order of commands in Dockerfile to make use of the caching
2019-07-03 16:22:03 +02:00
ZeroNet
eb5a24064a
Merge pull request #2067 from rllola/fix-travis
fix pytest version to 4.6.3 to avoid it to broke for python 3.8 dev
2019-07-03 16:21:23 +02:00
rllola
b971ccc673 fix pytest version to 4.6.3 to avoid it to broke for python 3.8 dev 2019-07-03 15:48:18 +02:00
Vadim Ushakov
945687bdad Fix the order of commands in Dockerfile to make use of the caching of intermediate Docker images.
In py2 version, `COPY . /root` was placed after `RUN apk ...`, so that the result of `RUN apk ...` can be cached by Docker.

In py3 version, the commands were reordered to make the file `/root/requirements.txt` available for `pip install`. That prevents caching, and the docker image every time is rebuild from scrach.

To enable the caching back again, we can `COPY` just the single file `requirements.txt` before running other commands. Since the file is unmodified most of the time, the resulting image can be effectively cached. The other ZeroNet files are copied after doing `RUN apk ...`, as in the previous version.
2019-07-03 19:18:54 +07:00
ZeroNet
6f56d0a944
Update .travis.yml 2019-07-03 11:44:12 +02:00
ZeroNet
66c48ba4ec
Update to latest packages before tests 2019-07-02 16:03:41 +02:00
ZeroNet
f83ade8d33
Merge pull request #2061 from imachug/dotdot
Allow some paths to contain .. but not ../
2019-07-01 17:56:27 +02:00
ZeroNet
eae0d1b2a6
Merge pull request #1959 from tangdou1/patch-1
Change default value to 10MB
2019-07-01 17:45:37 +02:00
Ivanq
743f92d15e Allow some paths to contain .. but not ../ 2019-07-01 18:17:42 +03:00
shortcutme
822dec5c03
Rev4110 2019-07-01 16:28:56 +02:00
shortcutme
40b84755de
Add some fixed content_type 2019-07-01 16:28:37 +02:00
shortcutme
1b307166ee
Formatting 2019-07-01 16:27:40 +02:00
shortcutme
7a483e7912
Add short address to site_info 2019-07-01 16:27:34 +02:00
shortcutme
841230fe80
Call onClosed function if websocket is disconneced 2019-07-01 16:27:20 +02:00
shortcutme
900ae4e1ea
Remove notification about port open status on startup 2019-07-01 16:26:57 +02:00
shortcutme
72b6d6c676
Make wrapper compatible with sidebar console function 2019-07-01 16:26:37 +02:00
shortcutme
f979ed133f
Workaround for pytest 0.4.1+ atexit logging errors 2019-07-01 16:25:45 +02:00
shortcutme
fb2cf5f04d
More detailed logging of file change event 2019-07-01 16:24:48 +02:00
shortcutme
62401b24ec
Add r string literal for regexps 2019-07-01 16:24:23 +02:00
shortcutme
43f833e604
Allow multiple values of same key in the config file 2019-07-01 16:20:13 +02:00
shortcutme
612a3f4401
Fix parsing config file for lines that has no values 2019-07-01 16:19:32 +02:00
shortcutme
4c2cf99fd2
Add console function to sidebar 2019-07-01 16:19:12 +02:00
shortcutme
aebd9b410d
Fix feedlistfollow request before siteinfo 2019-07-01 16:08:21 +02:00
Ivanq
8eee9caa01 Fix siteCloning subdirectory with -default files 2019-07-01 09:49:03 +03:00
Ivanq
d278a30d19 Allow sites to lock pointer (#2059)
Add `allow-pointer-lock` to iframe sandbox
2019-06-30 16:39:17 +02:00
Ivanq
1117569148 Fix starting ZeroNet via start.py (#2052) 2019-06-28 00:58:58 +02:00
Lola Dam
753396ac0c Try and catch block for dbRebuild (#2047)
* Try and catch block for dbRebuild

* Use self.log.error and not logging

* Use self.log.error and not logging in SiteStorage also

* Check if the rebuild is working
2019-06-23 14:21:50 +02:00
shortcutme
9a267ffcaf
Rev4016, Fix updater 2019-06-12 02:57:18 +02:00
ZeroNet
6254143fc6
Fix noparallel ignoreclass test 2019-06-11 18:24:44 +02:00
shortcutme
862e19a263
Rev4104, Don't start blocking Noparallel calls in separate greenlet to be able to catch exceptions. 2019-06-11 17:04:37 +02:00
shortcutme
eeef6fe65f
Rev4102, Fix fileGet test 2019-06-06 03:17:42 +02:00
shortcutme
c05916477c
Merge branch 'py3' of https://github.com/HelloZeroNet/ZeroNet into py3 2019-06-06 02:49:14 +02:00
shortcutme
63d7e73cff
Rev4101 2019-06-06 02:49:11 +02:00
shortcutme
8cb629fb55
Return True on rebuildDb success 2019-06-06 02:27:59 +02:00
shortcutme
d596f28f46
Log non-file read errors on fileGet 2019-06-06 02:27:35 +02:00
shortcutme
8f26c0aeae
Test null byte file download bug fix 2019-06-06 02:27:09 +02:00
ZeroNet
e4978d8a05
Use dev version of gevent for Python 3.8 2019-06-04 22:27:16 +02:00
ZeroNet
4f43d977ed
Install cffi files to compile gevent 2019-06-04 20:05:33 +02:00
ZeroNet
d0c39e6bf4
Test using Python 3.8-dev 2019-06-04 19:48:39 +02:00
ZeroNet
0965d98dbd
Also test with Python 3.8 2019-06-04 18:54:47 +02:00
shortcutme
45fea827af
Rev4100 2019-06-04 16:18:59 +02:00
shortcutme
350ee13d66
Fix serving binary files with zero characters in it. 2019-06-04 16:18:52 +02:00
shortcutme
bb7af2e8ed
Fix closing progress notification at 100% 2019-06-04 16:18:02 +02:00
Lola Dam
9cda561091 Show error message when db failed to rebuild (#2043)
* Show error message when db failed to rebuild; fix #1908;

* Forgot file
2019-06-04 13:54:35 +02:00
shortcutme
d38846f126
Rev4099, Fix ZipStream for older Python versions 2019-05-31 15:08:30 +02:00
shortcutme
3b764439af
Rev4098 2019-05-30 04:29:57 +02:00
shortcutme
d1e404f093
New updater that supports updating bundle files 2019-05-30 04:29:47 +02:00
shortcutme
6c4440c2d1
Less verbose Tor controller logging 2019-05-30 04:28:57 +02:00
shortcutme
8e2a7c2b2d
Respect optionalHelp when checking files 2019-05-30 04:28:41 +02:00
shortcutme
fce30baa12
Check files in offline mode on update 2019-05-30 04:28:09 +02:00
shortcutme
c63215c992
Don't download geolite db in offline mode 2019-05-30 04:27:40 +02:00
shortcutme
815fe02c83
Make sidebarGetPeers an async command 2019-05-30 04:27:20 +02:00
shortcutme
e2e1a5b38c
Fix streamZip variable name 2019-05-30 04:27:01 +02:00
shortcutme
4222c31b3e
Don't push body of content.json with updates if larger than 10kb 2019-05-30 04:26:41 +02:00
shortcutme
e5d3b0e7b8
Use openssl from tools directory on Windows 2019-05-30 04:24:58 +02:00
shortcutme
422064e092
Only show console after app close in debug mode 2019-05-30 04:24:42 +02:00
shortcutme
d548c6bdfa
Add new line after benhmark errors 2019-05-30 04:24:17 +02:00
shortcutme
efb7b147af
Fix broken zip file generation 2019-05-30 04:24:01 +02:00
shortcutme
0f8b220f59
Merge sidebar js 2019-05-29 16:03:48 +02:00
shortcutme
1bba253156
Rev4094 2019-05-29 16:03:32 +02:00
shortcutme
a2d29a4531
Only display sign error if there is no stored privatekey 2019-05-29 16:03:10 +02:00
shortcutme
589869c5ed
Move progress display to separate function 2019-05-29 16:02:34 +02:00
shortcutme
7b41922c2d
Use user certificate if possible for signing using sidebar, more sign, publish to separate functions 2019-05-29 16:02:10 +02:00
Lola Dam
7262fbfb4e Added optional redirect value for siteClone (#2032)
* Added optional redirect value; see #1891

* Return address of the newly cloned site
2019-05-28 18:05:52 +02:00
Lola Dam
9c0e8ee833 Better error message if private key not stored when assigning (#2033)
* Return a more instructive message in case the privatekey is not found when attempting to sign

* Fix typo
2019-05-28 18:04:49 +02:00
Ivanq
9119d72b9b Fix calling start.py to reopen browser (#2029)
* Fix calling start.py to reopen browser

* Move below
2019-05-24 16:36:29 +02:00
shortcutme
891aac4713
Rev4093 2019-05-21 15:57:49 +02:00
shortcutme
2fa006d74e
Fix loading json files with utf8 content 2019-05-21 15:54:36 +02:00
shortcutme
a6c97a304f
Remove empty exception from config.py 2019-05-21 15:53:53 +02:00
shortcutme
cfa4f8fa63
Fix log_dir exception on startup fail 2019-05-21 15:53:32 +02:00
shortcutme
ce0cf09b10
Fix sidebar zip generation 2019-05-21 15:52:58 +02:00
shortcutme
1567fb745d
Fix sidebar site download with utf8 title 2019-05-21 15:52:44 +02:00
ZeroNet
416f563261
Exclude third-party pybitcointools from flake8 test 2019-05-20 17:17:49 +02:00
ZeroNet
25d6eea906
Merge pull request #2026 from imachug/js-modules
ECMAScript modules
2019-05-20 17:06:17 +02:00
ZeroNet
4e819ac035
Merge pull request #2025 from imachug/fileneed-timeout
Handle fileNeed timeout
2019-05-20 17:05:23 +02:00
ZeroNet
dbcaa6bf85
Merge pull request #2006 from imachug/cryptmessage-bitcoin
Add privToPub and pubToAddr commands
2019-05-20 17:04:38 +02:00
Ivanq
3205187090 Rename commands to have ecc... prefix 2019-05-19 15:52:36 +03:00
Ivanq
ed85981409 Fix JS modules 2019-05-19 15:45:34 +03:00
Ivanq
5d920ff7df Handle gevent.Timeout error 2019-05-19 15:42:11 +03:00
ZeroNet
5456f0e106
Merge pull request #2020 from cclauss/patch-1
Travis CI: Use flake8 to find Python syntax errors
2019-05-17 17:30:13 +02:00
cclauss
8962c16670
Declare 'err' because Python 3 has stricter scoping rules
I Python 3, __err__ will go out of scope after the __try / except__ block.  This change preserves the value after the end of the __try / except__ block.
2019-05-17 12:33:10 +02:00
cclauss
2ed1572c3c
Travis CI: Use flake8 to find Python syntax errors
Also, put the execution steps in order:
1. before_install -->
2. install -->
3. before_script -->
4. script -->
5. after success -->
6. notifications
2019-05-17 09:00:25 +02:00
ZeroNet
89cb673502
Merge pull request #2016 from cclauss/patch-1
.travis.yml: The 'sudo' tag is now deprecated in Travis CI
2019-05-16 23:16:14 +02:00
ZeroNet
98c9c8dd43
Merge pull request #2018 from cclauss/patch-2
Fix Python 3 syntax errors in zonename_updater.py
2019-05-16 23:13:10 +02:00
cclauss
fd46f141ea
Fix Python 3 syntax errors in zonename_updater.py 2019-05-16 19:39:16 +02:00
cclauss
41aec089bc
.travis.yml: The 'sudo' tag is now deprecated in Travis CI 2019-05-16 00:00:52 +02:00
cclauss
31697022fd
Add Python 3.4 2019-05-15 23:59:36 +02:00
cclauss
948a1c3d03
.travis.yml: The 'sudo' tag is now deprecated in Travis CI
[Travis are now recommending removing the __sudo__ tag](https://blog.travis-ci.com/2018-11-19-required-linux-infrastructure-migration).

"_If you currently specify __sudo: false__ in your __.travis.yml__, we recommend removing that configuration_"

Also, removed Python 3.4 because it is EOL  https://devguide.python.org/devcycle/#end-of-life-branches
2019-05-15 22:36:48 +02:00
shortcutme
20371895c9
Rev4090, Remove fs paths from error responses 2019-05-02 18:02:56 +02:00
shortcutme
617027eb52
Rev4089, Support compressed addresses in libsecp256k1 sign verification 2019-05-02 17:38:36 +02:00
shortcutme
6b9106b178
Test verify of compressed and uncompressed address signature 2019-05-02 17:18:31 +02:00
shortcutme
6207ccd559
Fix pex result parsing when there is no connection 2019-05-02 17:17:57 +02:00
shortcutme
043ac5a510
Log renaming 2019-05-02 17:17:00 +02:00
Ivanq
4eaeade618 Add privToPub and pubToAddr commands 2019-05-01 08:04:39 +03:00
shortcutme
f318f76994
Add missing function 2019-04-29 17:18:02 +02:00
shortcutme
fd085d2d37
Rev4086, Fix verify content.json files without files_optional 2019-04-29 16:54:07 +02:00
shortcutme
327f580218
Rev4085 2019-04-29 16:44:19 +02:00
shortcutme
7bef78e10f
Fix newsfeed sql query with many parameters 2019-04-29 16:44:13 +02:00
shortcutme
b54916b1dc
Show console after got hidden in non-debug mode 2019-04-29 16:43:34 +02:00
ZeroNet
c2ab102c0e
Merge pull request #1999 from filips123/py3
Support for detection of system's theme
2019-04-29 16:35:55 +02:00
ZeroNet
3f3e73455b
Merge pull request #2001 from imachug/build-all
Build wrapper all.js to support web notifications
2019-04-29 16:32:35 +02:00
Ivanq
4f09a5111b Build wrapper all.js to support web notifications 2019-04-27 18:19:16 +03:00
Filip Š
baf820bcdb Support for detection of system's theme 2019-04-26 18:23:25 +02:00
ZeroNet
538f69235f
Merge pull request #1985 from rllola/fix-zeroname-local
New ZeronameLocal plugin with connection to namecoin node
2019-04-26 12:58:50 +02:00
ZeroNet
2b9f1257be
Merge pull request #1993 from imachug/notifications
Support web notifications
2019-04-26 12:58:18 +02:00
Ivanq
6e58e8d50f Don't require WebNotifications permission 2019-04-26 12:55:33 +03:00
shortcutme
90420f1a89
Merge branch 'py3' of https://github.com/HelloZeroNet/ZeroNet into py3 2019-04-23 02:01:45 +02:00
shortcutme
021b822c4f
Rev4080 2019-04-23 02:01:40 +02:00
shortcutme
4ac54845fc
Fix double logging when testing 2019-04-23 02:00:59 +02:00
shortcutme
4c9d3ee3a6
Test big file renames 2019-04-23 02:00:11 +02:00
shortcutme
e688671972
Fix rename error variable problem in site storage 2019-04-23 01:59:59 +02:00
shortcutme
6bd63ff42a
Test file renames 2019-04-23 01:59:12 +02:00
shortcutme
efc5211451
Test optional file renames in OptionalManager plugin 2019-04-23 01:58:37 +02:00
shortcutme
f2bf5b12bd
Support optional file rename in OptionalManager plugin 2019-04-23 01:58:21 +02:00
shortcutme
dccda1af92
Pass optionalRemoved return value 2019-04-23 01:57:57 +02:00
shortcutme
4ca0e6b781
Support file renames in content.json if the sha512 hash is the same 2019-04-23 01:56:11 +02:00
shortcutme
4016e7c217
Test Bigfile plugin using tostring where it possible 2019-04-23 01:55:05 +02:00
rllola
907a26a8b9 Take care of the exceptions so it wont crash zeronet if someting goes wrong. 2019-04-20 20:23:59 +02:00
ZeroNet
dc23bfeb87
Merge pull request #1994 from imachug/ecdsa
A third small ECDSA fix
2019-04-20 13:20:03 +02:00
shortcutme
4bfd4bd714
Rev4074, Fix Ecdsa functions in cryptmessage plugin 2019-04-20 09:48:56 +02:00
Ivanq
9ddb984004 Rename Push notifications to Web notifications 2019-04-19 22:19:25 +03:00
Ivanq
e618c0e9ef Add closePushNotification 2019-04-19 22:19:25 +03:00
Ivanq
b55d2b53df Support Notification API 2019-04-19 22:19:25 +03:00
Ivanq
5733ec8363 Fix 2019-04-19 22:16:59 +03:00
Ivanq
d7d75a1fe8 Fix ECDSA on CryptMessage (#1987)
* Add ecdsaSign and ecdsaVerify

* Fix return

* Fix unicode

* Update CryptMessagePlugin.py

* Remove .encode("utf8")

* Fix keys during ECDSA signing
2019-04-19 19:34:07 +02:00
rllola
ef6ccb330b Dont raise an error if domain has more than one subdomain and just return None 2019-04-18 15:27:49 +02:00
shortcutme
afbacdfc96
Rev4073 2019-04-18 12:23:55 +02:00
shortcutme
5842441062
Remove unused function 2019-04-18 12:22:57 +02:00
shortcutme
f083301b4c
Allow larger packets 2019-04-18 12:22:38 +02:00
shortcutme
8edbecce3c
Fix diffing 2019-04-18 12:21:59 +02:00
shortcutme
b114c52c0d
Allow pluginned classes in memory on reload 2019-04-18 12:21:50 +02:00
shortcutme
4671f47222
Fix bigfile piecefield standalone run test 2019-04-18 12:21:33 +02:00
rllola
4be0e1ee7f Forgot to cache in one 'if' 2019-04-17 18:34:53 +02:00
ZeroNet
dd4c213805
Merge pull request #1989 from radfish/PR-py3--translate-bytearray-fix
Ui, Translate: fix bytearray format string for Py 3.4
2019-04-17 11:29:16 +02:00
redfish
7e57a8f71e Ui,Translate: remove bytearray format string
Py 3.4 does not support bytearray format strings
for % operator: b"%s" % s
2019-04-16 20:54:55 -04:00
rllola
86d3d35619 Disable Zeroname plugin 2019-04-16 20:07:30 +02:00
rllola
f195111354 Using http.client instead of requests module 2019-04-16 16:23:09 +02:00
radfish
ec6fd48b86 Bigfile: fix piece field bitmask to be used as bytearray consistently (#1982)
* Bigfile: make Piecefield array a bytearray

We want an array of characters. Py2 strings made sense to
use as an array of characters, but Py3 strings are different
and no longer a good choice.

* Bigfile: store bits as binary instead of char

* BigFile: rename to/from string -> to/from bytes

Since the type was changed to bytearray.
2019-04-16 15:14:19 +02:00
radfish
1516d55a88 Sidebar: rename media-globe/ to media_globe/ (#1973)
So that it can be an importable package.
This is in preparation for setuptools packaging.
2019-04-16 11:34:55 +02:00
Ivanq
bdb0dc32a7 Add ECDSA actions to CryptMessage (#1984)
* Add ecdsaSign and ecdsaVerify

* Fix return

* Fix unicode

* Update CryptMessagePlugin.py
2019-04-15 22:55:01 +02:00
shortcutme
5ff2f792e6
Rev4070, Fix Multiuser plugin import order, Run coverage before optional plugins 2019-04-15 22:54:17 +02:00
shortcutme
8246505289
Rev4069 2019-04-15 22:48:55 +02:00
shortcutme
526a5d3fb1
Fix compatibility with Python <=3.5 2019-04-15 22:48:43 +02:00
shortcutme
f970815645
Run tests in debug mode 2019-04-15 22:48:16 +02:00
shortcutme
f83c77e7ea
Fix plugin error message 2019-04-15 22:48:09 +02:00
shortcutme
654cce92cd
Rev4068 2019-04-15 22:24:00 +02:00
shortcutme
8f0bfbc553
Test Multiuser and Bootstrapper plugins 2019-04-15 22:23:30 +02:00
shortcutme
bc39e52f56
Rev4066 2019-04-15 22:20:16 +02:00
shortcutme
a822238735
Use 1544 port for tor in tests 2019-04-15 22:19:38 +02:00
shortcutme
b168772d7f
Create user for tests if necessary 2019-04-15 22:19:16 +02:00
shortcutme
034e104c06
Log fileserver startup error for tests 2019-04-15 22:19:00 +02:00
shortcutme
0c0f117bc3
Don't parse config file for tests 2019-04-15 22:18:40 +02:00
shortcutme
1d4ab8833b
Test and enforce proper import plugin order in debug mode 2019-04-15 22:18:18 +02:00
shortcutme
90fee9788d
Always translate html files to avoid compatibility problems with brackets in url 2019-04-15 22:16:47 +02:00
shortcutme
bf7597e1b2
Add simple test for Multiuser plugin 2019-04-15 22:16:05 +02:00
shortcutme
54ff940c2b
Fix Bootstrapper plugin py3 compatibility 2019-04-15 22:15:42 +02:00
shortcutme
446641c31c
Always commit before Db VACUUM 2019-04-15 22:11:44 +02:00
shortcutme
572d55752c
Avoid random websocket test fails 2019-04-15 16:54:49 +02:00
shortcutme
04394d8ced
Rev4064 2019-04-15 16:29:01 +02:00
shortcutme
c7ea66bfef
Fix shutdown before file_server started 2019-04-15 16:07:18 +02:00
shortcutme
bfc5e2dce6
Support live changing offline mode 2019-04-15 15:49:53 +02:00
shortcutme
a7e8293d1a
Add offline mode info to server info 2019-04-15 15:49:34 +02:00
shortcutme
698f0cc230
Fix isServing check in site info formatting 2019-04-15 15:49:04 +02:00
shortcutme
f414f0746c
Don't update site in offline mode 2019-04-15 15:48:16 +02:00
shortcutme
235b8f359c
Don't create new connections in offline mode 2019-04-15 15:47:17 +02:00
shortcutme
2326cf3de8
Ignore incoming connections in offline mode 2019-04-15 15:47:05 +02:00
shortcutme
b8879853d5
Support closing all current connection in ConnectionServer 2019-04-15 15:46:53 +02:00
shortcutme
498fd4bf01
Don't listen ConnectionServer if not started 2019-04-15 15:46:37 +02:00
shortcutme
996f326c74
Store if UiServer is running 2019-04-15 15:45:07 +02:00
shortcutme
43b68faf73
Merge Ui all.js 2019-04-15 15:44:04 +02:00
shortcutme
8429ad7db7
Use global ZeroNet-Internal url to access Websocket 2019-04-15 15:42:24 +02:00
shortcutme
879b522914
Disable portcheck in offline mode 2019-04-15 15:16:38 +02:00
shortcutme
be584aa3d1
Change offline mode in /Config page 2019-04-15 15:12:08 +02:00
shortcutme
b82f57e7a2
Fix small file upload using bigfile plugin 2019-04-15 15:07:31 +02:00
shortcutme
998ec3eb4f
Disable all site serving using a global offline argument 2019-04-15 15:06:25 +02:00
radfish
f6e3a74567 [setuptools packaging] access modules via imports (#1969) 2019-04-15 12:31:33 +02:00
ZeroNet
6d8f55cf75
Merge pull request #1983 from krzotr/patch-3
OptionalManager file info - set bytes_downloaded to total file size if a file is fully downloaded
2019-04-15 12:21:28 +02:00
rllola
c4d8466195 Delete old plugin 2019-04-14 22:58:05 +02:00
rllola
36ff506dfe Added 'requests' dependency to requierements.txt 2019-04-14 22:44:04 +02:00
rllola
af1fb7aaa6 Also recognise 'map' namecoin standard way of registering for domain 2019-04-14 22:41:26 +02:00
rllola
1a944735df New ZeronameLocal plugin with connection to namecoin node 2019-04-14 16:58:58 +02:00
krzotr
1c8fba4286
OptionalManager file info - set bytes_downloaded to file size if a file is fully downloaded 2019-04-13 23:07:13 +02:00
shortcutme
0260b30335
Rev4059 2019-04-12 15:03:58 +02:00
shortcutme
0f72085c2a
Also return ws error to websocket connection 2019-04-12 15:03:43 +02:00
shortcutme
6ad8a10f37
Fix invalid ws request response value 2019-04-12 15:03:19 +02:00
shortcutme
8a38983dfc
Better logging of ws connection for siteCmd CLI action 2019-04-12 15:02:04 +02:00
shortcutme
9f5600b7f7
Rev4057, Log invalid result from websocket 2019-04-11 16:33:36 +02:00
shortcutme
a7632889a2
Rev4056 2019-04-11 01:30:04 +02:00
shortcutme
58a4bf479c
Only send env details if in debug mode 2019-04-11 01:29:56 +02:00
shortcutme
1ce4f99b80
Send noscript header to error messages and OPTIONS request 2019-04-11 01:29:32 +02:00
shortcutme
f94ecb3ec5
Fix error 404 on uimedia route 2019-04-11 01:28:00 +02:00
shortcutme
ce7c22fd57
Ignore items with no date_added in newsfeed 2019-04-11 01:18:52 +02:00
shortcutme
a5c7e59601
Rev4054, Escape error detail to avoid XSS (reported by krzotr) 2019-04-11 00:37:55 +02:00
ZeroNet
efbf70726f
Merge pull request #1975 from krzotr/patch-2
Updated to python 3.6 in Dockerfile
2019-04-10 23:43:50 +02:00
krzotr
490b1dc01b
Updated python version in Dockerfile 2019-04-10 23:08:09 +02:00
shortcutme
ec81965393
Rev4053 2019-04-10 19:59:56 +02:00
shortcutme
21536b8948
More clear logging when pinging unencrypted connections 2019-04-10 19:59:37 +02:00
shortcutme
100c2c8741
Set serial by command line to avoid .srl file creation 2019-04-10 19:59:02 +02:00
shortcutme
d47e4a3e0e
More detailed error logging on ssl handshake fail 2019-04-10 19:58:37 +02:00
shortcutme
0c9ea8f580
Merge branch 'py3' of https://github.com/HelloZeroNet/ZeroNet into py3 2019-04-10 14:57:32 +02:00
shortcutme
2320eb8723
Rev4052 2019-04-10 14:57:24 +02:00
shortcutme
17bbeefeca
Fix getWebsocket 2019-04-10 14:57:06 +02:00
shortcutme
31372e269d
Give notification to all connected clients about ZeroNet update 2019-04-10 14:56:47 +02:00
shortcutme
ac799a60da
Stop fs watcher with UiServer 2019-04-10 14:56:10 +02:00
radfish
6a1d716ba1 test: refer to test data path via variable (#1964) 2019-04-10 11:30:35 +02:00
ZeroNet
ed12cc1186
Merge pull request #1952 from tangdou1/patch-6
Update TrayiconPlugin.py for IPV6 compatibility
2019-04-09 17:53:04 +02:00
ZeroNet
8370ac8426
Merge pull request #1970 from radfish/PR-py3--import-plugins
[setuptools packaging] PluginManager: get plugins path via import
2019-04-09 17:51:05 +02:00
shortcutme
a20ff59572
Rev4050 2019-04-09 16:21:46 +02:00
shortcutme
8587f01caa
Fix update script target directory 2019-04-09 16:21:39 +02:00
shortcutme
c7078be407
Always verify client update 2019-04-09 15:07:56 +02:00
shortcutme
718a00974b
Merge js 2019-04-09 15:06:33 +02:00
shortcutme
d612676a80
Log closing websocket when updating event 2019-04-09 15:06:27 +02:00
shortcutme
d7bcfb415b
Fix js merging white space stripping 2019-04-09 15:06:09 +02:00
shortcutme
6928a17e61
Rev4048 2019-04-08 18:15:23 +02:00
shortcutme
d097092e8e
Merge js 2019-04-08 18:15:02 +02:00
shortcutme
79eb6573be
Support listing bad files with API 2019-04-08 18:14:45 +02:00
shortcutme
ffed8c9181
Add updatesite, dist_type, verify lib to serverinfo for admin sites 2019-04-08 18:14:31 +02:00
shortcutme
ff8573635d
Limit max width of notification 2019-04-08 18:13:58 +02:00
shortcutme
643244ffd1
Less visible changed files notification number 2019-04-08 18:13:18 +02:00
shortcutme
9fd059aef8
Give admin permission to updater site 2019-04-08 18:12:58 +02:00
shortcutme
6764a7ad2f
Fix js merging 2019-04-08 18:12:43 +02:00
shortcutme
5642d0aae6
Also ignore db -wal and -shm temp db files when signing 2019-04-08 18:12:29 +02:00
shortcutme
763e5f4ac0
Fix too short sleep 2019-04-08 18:12:00 +02:00
shortcutme
87abdb92e9
Fix bigfile upload 2019-04-08 18:11:46 +02:00
ZeroNet
447ab47d59
Merge pull request #1971 from radfish/PR-py3--bump-interpreter
[setuptools packaging] zeronet: bump script interpreter to python3
2019-04-08 01:57:58 +02:00
redfish
9ed88f25f0 zeronet: bump script interpreter to python3 2019-04-07 19:41:19 -04:00
redfish
73814550e5 PluginManager: get plugins path via import
* skip __pycache__ when loading
2019-04-07 18:50:23 -04:00
ZeroNet
226f7dea65
Merge pull request #1962 from radfish/PR-py3--sys-geoip
Sidebar: use geoip db from system if exists
2019-04-07 12:04:44 +02:00
ZeroNet
ed3de771e8
Merge pull request #1963 from radfish/PR-py3--dead-ssl-code
[setuptools packaging] remove some  dead code related to openssl, pyelliptic
2019-04-07 12:03:17 +02:00
ZeroNet
edf3cf3b65
Merge pull request #1966 from radfish/PR-py3--ui-pathlib
[setuptools packaging] Ui: extend actionFile to accept pathlib.Path
2019-04-07 12:01:07 +02:00
ZeroNet
7a54615156
Merge pull request #1965 from radfish/PR-py3--cfg-paths-no-dec
[setuptools packaging] config: path.expanduser returns py3 strings
2019-04-07 11:56:18 +02:00
redfish
1e1f967292 Ui: extend actionFile to accept pathlib.Path 2019-04-06 22:22:34 -04:00
redfish
6f5d4fdc51 config: path.expanduser returns py3 strings
And strings have no decode method.
2019-04-06 22:16:37 -04:00
redfish
e7a6be035e zeronet: no openssl.closeLibrary in pyelliptic
Not in pyelliptic 2.0.1 (PyBitmessage fork of pyelliptic)
2019-04-06 20:13:56 -04:00
redfish
ee762f349c zeronet: remove ref to opensslVerify
This module is no longer used. Not in lib/
2019-04-06 20:13:56 -04:00
redfish
4d98b05e6c Sidebar: use geoip db from system if exists 2019-04-06 17:24:25 -04:00
ZeroNet
4f4591658d
Merge pull request #1960 from imachug/start-browser
Fix double --open_browser
2019-04-06 23:13:12 +02:00
Ivanq
0c70e95232
Use spaces instead of tabs 2019-04-06 15:02:18 +03:00
Ivanq
594e8b8c20 Fix double --open_browser 2019-04-06 08:30:45 +03:00
tangdou1
4c358b9f08
Big File is bigger than 10MB
Big File is an optional file which is bigger than 10MB, so the default value should be at least 10MB.
2019-04-06 11:57:58 +08:00
shortcutme
7b1594c69c
Rev4044 2019-04-04 13:29:36 +02:00
shortcutme
6d27feba97
New updater site for Python3 version 2019-04-04 13:29:26 +02:00
shortcutme
4363dcbbc1
Distribtion type config value for future support in the updater script 2019-04-04 13:29:11 +02:00
shortcutme
a208f47b6a
Fix sidebar opening for fast mouse movements 2019-04-04 13:28:38 +02:00
shortcutme
84268cd43c
Updater script 2019-04-04 13:28:02 +02:00
shortcutme
380c32dee2
Worker stats on stop 2019-04-04 13:27:46 +02:00
shortcutme
bfc7e7c33f
Only start worker if there is valid task for it 2019-04-04 13:27:21 +02:00
shortcutme
8594e4ce4a
Add reason for startWorkers 2019-04-04 13:27:06 +02:00
shortcutme
752dabe554
Openssl dll find patch to libeay32 2019-04-04 13:25:10 +02:00
shortcutme
042db64a00
Fix multiuser plugin py3 compatibility 2019-04-04 13:24:42 +02:00
shortcutme
f55fd8d861
Avoid re-define variable name 2019-04-04 13:24:26 +02:00
ZeroNet
cc41572d48
Merge pull request #1953 from tangdou1/patch-4
ipv6 compatibility
2019-04-03 15:54:54 +02:00
tangdou1
42de962cbf
ipv6 compatibility 2019-04-03 19:56:14 +08:00
tangdou1
f527b8225f
IPV6 compatibility 2019-04-03 19:54:19 +08:00
ZeroNet
dd9ccfa3d2
Merge pull request #1947 from radfish/PR-py3--cryptmsg-base64-type
CryptMessage: base64 arg type byte-array; File: set error message before use
2019-04-01 01:15:59 +02:00
ZeroNet
24b6780c1f
Merge pull request #1946 from tangdou1/patch-5
Update README.md
2019-04-01 01:15:20 +02:00
redfish
941571f71f file: set error message before using it
Fixes this exception:

Unhandled exception: [(<class 'UnboundLocalError'>,
UnboundLocalError("local variable 'err' referenced before assignm>
 Traceback (most recent call last):
   File "src/gevent/greenlet.py", line 766, in gevent._greenlet.Greenlet.run
   File "/opt/zeronet/src/util/RateLimit.py", line 57, in <lambda>
     thread = gevent.spawn_later(time_left, lambda: callQueue(event))  # Call this function later
   File "/opt/zeronet/src/util/RateLimit.py", line 42, in callQueue
     return func(*args, **kwargs)
   File "/opt/zeronet/src/File/FileRequest.py", line 185, in actionUpdate
     self.response({"error": "File invalid: %s" % err})
UnboundLocalError: local variable 'err' referenced before assignment
2019-03-31 16:25:26 -04:00
redfish
65be9f438b CryptMessage: pass byte-array type to base64
Fixes this error upon sending a message in ZeroMail:
WebSocket handleRequest error: TypeError: a bytes-like object is
required, not 'str' in UiWebsocket.py line 83 > UiWebsocket.py line 269
> CryptMessage/CryptMessagePlugin.py line 80 >
CryptMessage/CryptMessagePlugin.py line 80 > base64.py line 58
2019-03-31 14:05:15 -04:00
tangdou1
15d13ac9f6
Update README.md 2019-03-31 13:47:47 +08:00
ZeroNet
6df3acaf1e
Merge pull request #1943 from radfish/PR-py3--req
requirements: pyelliptic any version, websocket_client
2019-03-31 00:24:15 +01:00
redfish
b6ee24dcd5 readme: mention distro packages; also formatting 2019-03-30 09:50:10 -04:00
redfish
1a3e5b7893 requirements: main websocket package
'websocket' doesn't look like the right one.
2019-03-30 09:50:10 -04:00
shortcutme
5df8e10b95
Rev4033 2019-03-29 02:31:46 +01:00
shortcutme
bddf2d6537
Fix fileGet command 2019-03-29 02:31:14 +01:00
shortcutme
3d05bdcb63
Log file command errors 2019-03-29 02:31:05 +01:00
shortcutme
52e28eefce
Use lowercase filename for content type guess 2019-03-29 02:30:43 +01:00
shortcutme
b5b0626251
Add name for websocket event on site deletion 2019-03-29 02:30:26 +01:00
shortcutme
4a4f311cf8
Better logging of cert generation 2019-03-29 02:29:55 +01:00
shortcutme
bad4d14cf6
Save OpenSSL rand file in data directory to avoid error message on Windows 2019-03-29 02:29:32 +01:00
shortcutme
b814a633c6
Don't reset broken ssl client list on cleanup 2019-03-29 02:28:46 +01:00
shortcutme
73524d70dc
Switch back to default log file naming because of broken rotate file deleting 2019-03-29 02:28:03 +01:00
shortcutme
9fad83e46c
More detailed logging on archive open error 2019-03-29 02:27:26 +01:00
shortcutme
9fbf4771f2
Fix directory commands on packed files 2019-03-29 02:26:50 +01:00
shortcutme
41cd7da5bd
Rev4026 2019-03-27 03:13:14 +01:00
shortcutme
3d975fd767
Fix libeay32.dll location 2019-03-27 03:12:21 +01:00
shortcutme
f8f857c820
Fix atomicWrite non existing tmpold removal 2019-03-27 03:12:02 +01:00
shortcutme
9546ed0bb6
Try to connect to tor before starting own one under windows 2019-03-27 03:11:38 +01:00
shortcutme
a3f957427f
Make sure the test went without unnecessary reconnects 2019-03-27 03:10:58 +01:00
shortcutme
9b36c55422
Fix pytest warning 2019-03-27 03:10:29 +01:00
shortcutme
b6286372fb
Better cleanup after tests 2019-03-27 03:10:21 +01:00
shortcutme
74e71a1971
Fix http tracker announce compatibility 2019-03-27 03:09:47 +01:00
shortcutme
9050f1a039
Show crypto cipher on peerPing command 2019-03-27 03:09:28 +01:00
shortcutme
de303bf453
Modern crypto ciphers 2019-03-27 03:09:09 +01:00
shortcutme
3d8d3a9237
Randomize SSL subject (merged ValdikSS's commit) 2019-03-27 03:08:37 +01:00
shortcutme
cf354d59fb
Fix incoming connection implicit crypt 2019-03-27 03:06:46 +01:00
shortcutme
706852d9a7
Fix Stats page rendering in non-debug mode, reduce source code size 2019-03-27 03:06:22 +01:00
shortcutme
63e405c27e
Rev4022 2019-03-23 03:42:26 +01:00
shortcutme
33e8c6fb73
Fix ipv6 port checker 2019-03-23 03:41:52 +01:00
shortcutme
faba28dd94
Proper handle of sigterm signal, log reason of shutdown 2019-03-23 03:41:42 +01:00
shortcutme
16f36824e6
Fix benchmark on Python 3.5 2019-03-23 03:40:42 +01:00
shortcutme
5c1ec0b141
Ecies encrypted string length can be different in rare cases 2019-03-23 03:38:30 +01:00
shortcutme
e24d1016a5
Fix bigfile upload post request return value 2019-03-23 03:38:04 +01:00
shortcutme
a82ee338ef
Rev4017, Fix Bigfile test, Python 3.4 compatibility 2019-03-21 02:48:21 +01:00
shortcutme
60405bf222
Rev4016, Add ad test Python 3.4 compatibility 2019-03-21 02:22:22 +01:00
shortcutme
1da6c8c84e
Fix Python 3.7 test 2019-03-20 01:07:18 +01:00
shortcutme
32329c1817
Rev4015 2019-03-20 01:06:56 +01:00
shortcutme
4aee7a6c61
Make openLocked always return BlockingIOError on fail 2019-03-20 01:05:52 +01:00
shortcutme
e6c2937c1b
Rev4014 2019-03-20 00:50:44 +01:00
shortcutme
1bbf9b62ad
Test on multiple python versions 2019-03-20 00:50:32 +01:00
shortcutme
fa9e024b42
Base58 package is required for libsecp256k verify 2019-03-20 00:50:18 +01:00
shortcutme
8c52038671
Switch to WAL mode as it's faster on older sqlite 2019-03-20 00:49:51 +01:00
shortcutme
7aff97b6ff
Fix loading json files to db on Python 3.5 2019-03-20 00:49:27 +01:00
shortcutme
77530f13ee
Fix content.json update and verify on Python 3.5 2019-03-20 00:48:51 +01:00
shortcutme
0a1c22530a
More clear paramter name for verify 2019-03-20 00:48:09 +01:00
shortcutme
e6c0fe0370
OpenSSL config file to lib dir 2019-03-20 00:47:43 +01:00
shortcutme
63ba0a5551
Fix tests on Python 3.5 2019-03-20 00:46:57 +01:00
shortcutme
c7bfe0d537
Fix Upnp test 2019-03-20 00:46:16 +01:00
shortcutme
05887c976a
Test on Python 3.5 using travis, temporary disable docker build until stable release 2019-03-19 17:02:39 +01:00
ZeroNet
ccc8fda24f
Merge pull request #1926 from 0polar/patch-4
Fix unable to open context menu on Windows
2019-03-19 16:42:21 +01:00
ZeroNet
abb458bdd3
Merge pull request #1925 from 0polar/patch-1
Fix "no module" error
2019-03-19 16:41:48 +01:00
ZeroNet
41429dd254
Merge pull request #1922 from 0polar/patch-2
Fix wrong module name
2019-03-19 16:41:05 +01:00
ZeroNet
268a39e93b
Merge pull request #1923 from 0polar/patch-3
pip install in right way
2019-03-19 16:40:39 +01:00
0polar
8411c60d4a
Fix unable to open context menu on Windows
Python3 string no need decoding or encoding
2019-03-19 20:56:30 +08:00
0polar
de91f7ec15
Fix "no module" error
Since added into pip requirements.txt, no need to `from...`
2019-03-19 20:36:26 +08:00
0polar
6094af819b
Update requirements.txt 2019-03-19 20:15:55 +08:00
0polar
5f21563d7d
Update README.md 2019-03-19 20:11:01 +08:00
0polar
5b9afe70b2
pip install in right way 2019-03-19 20:00:30 +08:00
0polar
27f47460e3
Fix wrong module name
Exception: You probably meant to install and run gevent-websocket
2019-03-19 19:59:12 +08:00
shortcutme
ad1bd045f7
Rev4011 2019-03-18 03:38:11 +01:00
shortcutme
9a9a8bfdc7
Fix peer loading 2019-03-18 03:37:05 +01:00
shortcutme
c88152cac2
Use shared cursor where possible 2019-03-18 03:36:44 +01:00
shortcutme
61c72ac3ea
Fix SQLite concurrency errors 2019-03-18 03:36:12 +01:00
shortcutme
84c39f3baa
Less sensitive db progress handler 2019-03-18 03:33:51 +01:00
shortcutme
7d6ef195fd
Don't allow to run db on different thread 2019-03-18 03:33:28 +01:00
shortcutme
52ac972332
Keep need commit status if commit failed 2019-03-18 03:33:06 +01:00
shortcutme
9aa599f9d2
Close and commit all db at exit 2019-03-18 03:32:42 +01:00
shortcutme
a5ce7e5a1f
Rev4006 2019-03-18 01:08:35 +01:00
shortcutme
f8511bf199
Display error if try to start with Python2 2019-03-18 01:08:20 +01:00
shortcutme
cfdc6bac7b
Remove test lock files after test 2019-03-18 01:08:02 +01:00
shortcutme
33e4c088b9
Upnp opening function return success value 2019-03-18 01:07:46 +01:00
shortcutme
a620bf2174
Fix lang html variable on config page 2019-03-18 01:06:45 +01:00
shortcutme
e77d63294e
Fix config page 2019-03-18 01:06:04 +01:00
shortcutme
82c55ba038
Rev4003, Fix peer sorting if no ping delay yet 2019-03-16 04:57:59 +01:00
shortcutme
e1394d7a7d
Fix socks package name 2019-03-16 04:48:56 +01:00
shortcutme
9f99fa8edc
Remove not working tracker 2019-03-16 04:26:59 +01:00
shortcutme
02e67a901f
Import global maxminddb module 2019-03-16 04:26:27 +01:00
shortcutme
f331f5e92c
Add maxminddb as requirement 2019-03-16 04:26:13 +01:00
shortcutme
6e5bf5fef6
Decode masgpack hash key values as byte 2019-03-16 04:22:49 +01:00
shortcutme
c7b4e28f82
Version 0.7.0, Rev4001 2019-03-16 03:53:37 +01:00
shortcutme
9235ecfe7b
Add warning, installation method to readme 2019-03-16 03:53:22 +01:00
shortcutme
7f234721ec
Add required modules 2019-03-16 03:48:58 +01:00
shortcutme
242b3edbc4
Fix BigFilePiecefiled typo 2019-03-16 03:44:13 +01:00
shortcutme
b7894faa96
Fix AnnounceShare backward compatibility 2019-03-16 03:44:01 +01:00
shortcutme
f3a4b9c709
Fix announce py3 compatibility 2019-03-16 03:43:11 +01:00
shortcutme
ea638dd0e0
Fix Noparallel test on slower machines 2019-03-16 03:02:59 +01:00
shortcutme
f0b53c4cbb
Add bundled pybitcointools 2019-03-16 03:01:50 +01:00
shortcutme
3eae349a0a
Remove included win_inet_pton, websocket, rsa, socks, pyelliptic, pybitcointools, pyasn1, opensslVerify, merkletools, geventwebsocket, BitcoinECC, bencode module 2019-03-16 02:58:49 +01:00
shortcutme
ff5004cb8d
Remove included maxminddb 2019-03-16 02:52:12 +01:00
shortcutme
567855e2d2
TestHelper formatting 2019-03-16 02:49:41 +01:00
shortcutme
d20da5d803
1ms is the minimum sleep with new gevent 2019-03-16 02:46:33 +01:00
shortcutme
b98a9d2e80
Commit before vacuum 2019-03-16 02:45:37 +01:00
shortcutme
955164aa3c
New configuration option to use libsecp256k1 for speedup 2019-03-16 02:45:06 +01:00
shortcutme
db8f9988eb
Use log extension for rolled log file names 2019-03-16 02:44:22 +01:00
shortcutme
9b2cae8e33
Don't log geventwebsocket module debug messages 2019-03-16 02:43:45 +01:00
shortcutme
ac325c5c5e
Py3 compatibility of FileRequest module 2019-03-16 02:43:07 +01:00
shortcutme
e92f3ea100
New watchdog module based file change watching 2019-03-16 02:42:43 +01:00
shortcutme
75d8338f2d
Debug stack formatting include module names 2019-03-16 02:41:09 +01:00
shortcutme
a1b5dad1c8
New Db connection type to avoid corruption 2019-03-16 02:40:32 +01:00
shortcutme
0e2f7fb122
Use global rsa module 2019-03-16 02:39:11 +01:00
shortcutme
ee631730c7
Remove sha1 sum function 2019-03-16 02:38:47 +01:00
shortcutme
f7fd445c73
Test sha sum parameter type properly 2019-03-16 02:38:38 +01:00
shortcutme
5c0fc38272
Remove not used ECC cert generation 2019-03-16 02:37:48 +01:00
shortcutme
6df0321962
Py3 compatibilty of CryptConnection module 2019-03-16 02:37:38 +01:00
shortcutme
65d19d350c
We don't support old style sign verification anymore 2019-03-16 02:36:45 +01:00
shortcutme
bc93796727
Add faster libsecp256k1 support for sign verification, Remove old style signing support, 2019-03-16 02:36:11 +01:00
shortcutme
6f0531c663
Test CryptMessage ui_websocket result more reliable way 2019-03-16 02:33:38 +01:00
shortcutme
545acebbaf
New CryptMessage test functions for ecies crypto 2019-03-16 02:33:09 +01:00
shortcutme
af49404320
Remove support of old request type 2019-03-16 02:32:10 +01:00
shortcutme
717802860d
Create new unpacker object if client sending new-style, bin-type compatible msgpack streams 2019-03-16 02:31:49 +01:00
shortcutme
edd3f35790
Use new Msgpack library for unpacking 2019-03-16 02:30:54 +01:00
shortcutme
20806a8c97
ZeroName plugin Py3 compatibility 2019-03-16 02:27:26 +01:00
shortcutme
f071cc5c04
Make Stats page Py3 compatible, Add libsecp256k1 testing, Xy packing format, Reduce code duplication 2019-03-16 02:27:04 +01:00
shortcutme
90c9078bf5
Remove unnecessary logging of Sidebar loadGlobe 2019-03-16 02:25:20 +01:00
shortcutme
203e70afbc
Py3 compatibility of PeerDb plugin 2019-03-16 02:24:36 +01:00
shortcutme
2599e54fd0
Py3 compatibility of FilePack plugin 2019-03-16 02:24:17 +01:00
shortcutme
2737425242
Py3 compatibility of UiPassword plugin 2019-03-16 02:23:46 +01:00
shortcutme
40569eee2e
Py3 compatibility of CryptMessage plugin, Rename ecies crypto function names to make it more clear 2019-03-16 02:23:00 +01:00
shortcutme
883c2851ff
Py3 compatibility of ContentFilter plugin 2019-03-16 02:20:32 +01:00
shortcutme
4fe4d0a7e7
BEGIN / END no longer necessary as there is no autocommit in new db module 2019-03-16 02:18:53 +01:00
shortcutme
a46d8fe7f3
Hash id of the hashmap changed because of use_bin_type msgpack packing 2019-03-16 02:15:37 +01:00
shortcutme
dd70d27a0e
Use new Msgpack modue for testing Bigfile plugin 2019-03-16 02:14:43 +01:00
shortcutme
b46ee0c495
Use Msgpack module in Bigfile plugin 2019-03-16 02:14:08 +01:00
shortcutme
28ffb3fd18
Ignore sha3 warning of merkletools module 2019-03-16 02:13:17 +01:00
shortcutme
d1456850d1
Py3 compatibility in Bigfile piecefield 2019-03-16 02:12:45 +01:00
shortcutme
050e2febab
Log add types with zero announce request 2019-03-16 02:12:03 +01:00
shortcutme
f56c8ef755
Save shared trackers files as utf8 2019-03-16 02:11:38 +01:00
shortcutme
1a9529157f
Backward compatibility with tracker sharing response 2019-03-16 02:11:22 +01:00
shortcutme
8c5c3cb7a6
Use Msgpack module in BroadcastServer plugin 2019-03-16 02:09:27 +01:00
shortcutme
8ab9b06185
Subtl module py3 compatibility 2019-03-16 02:06:28 +01:00
shortcutme
91c5556f21
Remove old gevent compatibility patches 2019-03-16 02:05:27 +01:00
shortcutme
95cf47d9a4
Test site download with all avaliable crypto lib 2019-03-16 01:01:30 +01:00
shortcutme
dfad2370aa
Test file locking 2019-03-16 01:01:06 +01:00
shortcutme
331e25cc41
Test content rules with all avaliable crypto lib 2019-03-16 01:00:49 +01:00
shortcutme
6dcf7e8088
Remove testing of old signature 2019-03-16 01:00:21 +01:00
shortcutme
99690a6145
Test longer string signing 2019-03-16 00:59:27 +01:00
shortcutme
27bcc3c685
Test sign and verify with all crypto lib avaliable 2019-03-16 00:59:11 +01:00
shortcutme
bb60558968
Test hashing functions 2019-03-16 00:57:50 +01:00
shortcutme
af38a3927a
Test utf8 diffing 2019-03-16 00:57:03 +01:00
shortcutme
bf6771152e
Test backward compatibility to py2 byte-less msgpack unpacker 2019-03-16 00:56:50 +01:00
shortcutme
48b6c81b36
Test msgpack streaming with binary data 2019-03-16 00:56:25 +01:00
shortcutme
d95da7372a
Feed Msgpack unpacker as byte 2019-03-16 00:54:27 +01:00
shortcutme
231037b0fe
Test Msgpack result 2019-03-16 00:54:12 +01:00
shortcutme
c481d20ce8
Use new libs in Msgpack tests 2019-03-16 00:54:00 +01:00
shortcutme
dc32556983
Add utf8 and binary data to msgpack test vector 2019-03-16 00:53:18 +01:00
shortcutme
d7b43f4722
Same priority file download order does not matter 2019-03-16 00:51:32 +01:00
shortcutme
ca29fcec7d
findHashId order does not matter 2019-03-16 00:50:25 +01:00
shortcutme
bd637d661a
Test translate of utf8 strings 2019-03-16 00:49:09 +01:00
shortcutme
ef8174af70
All problematic characters will be escaped 2019-03-16 00:48:56 +01:00
shortcutme
dee562437b
Rename hashfield pack functions to bytes 2019-03-16 00:42:21 +01:00
shortcutme
a1a4a73260
Save sites.json as utf8 2019-03-16 00:41:26 +01:00
shortcutme
627edeb0f2
Py3 support in announce requests 2019-03-16 00:33:12 +01:00
shortcutme
16f29b65f2
Use if in protocol port detection 2019-03-16 00:32:50 +01:00
shortcutme
6d2a863af5
Sleep a bit before creating new file_server to allow connection closing 2019-03-16 00:15:43 +01:00
shortcutme
35e61a0c69
More reliable UiWebsocket testing 2019-03-16 00:15:19 +01:00
shortcutme
c474699695
Different crypto lib fixture 2019-03-16 00:14:58 +01:00
shortcutme
1e2dadf75e
Log test to log/cmd.log 2019-03-16 00:14:11 +01:00
shortcutme
002303a765
Db rebuilding error display, reconnect bug fix 2019-03-16 00:11:52 +01:00
shortcutme
59426c31f7
SiteStorage Py3 compatibility 2019-03-16 00:10:49 +01:00
shortcutme
fd895d0ef5
Tormanager only disconnect if connected 2019-03-16 00:08:04 +01:00
shortcutme
8220272953
Py3 encoding support in TorManager 2019-03-16 00:05:23 +01:00
shortcutme
c8fc1ebefa
Remove tor downloading for windows 2019-03-16 00:04:09 +01:00
shortcutme
ac9531eb98
Use global socks module 2019-03-16 00:03:05 +01:00
shortcutme
56d68ce161
Open translate language file as utf8 2019-03-16 00:02:13 +01:00
shortcutme
a3ef3b34e1
Support multi-line notification 2019-03-16 00:01:52 +01:00
shortcutme
30e348f965
Remove empty line from wrapper template 2019-03-16 00:01:15 +01:00
shortcutme
b981ddadca
Encode error repose to bytes 2019-03-16 00:00:35 +01:00
shortcutme
bcd721e2ef
Always display title if there is content.json file 2019-03-16 00:00:04 +01:00
shortcutme
a96ff8399f
Open template as utf8 file 2019-03-15 23:59:30 +01:00
shortcutme
2f4dec45a6
Decode path as utf8 2019-03-15 23:58:18 +01:00
shortcutme
b216e42397
Fix modified files checking 2019-03-15 23:57:30 +01:00
shortcutme
9b6c624554
Allow cloning if content.json update fails 2019-03-15 23:57:06 +01:00
shortcutme
12154613c2
Write use file as binary 2019-03-15 23:56:16 +01:00
shortcutme
a42dee5a44
unpackOnionAddress Py3 support 2019-03-15 23:55:40 +01:00
shortcutme
d4d86172f0
Cmp function backport and Utf8 to Byte response decorator helper funcations 2019-03-15 23:55:23 +01:00
shortcutme
a49f454826
Lock files in binary mode, with one byte 2019-03-15 23:53:48 +01:00
shortcutme
cd9a965057
atomicWrite Py3 support, full stack logging 2019-03-15 23:50:33 +01:00
shortcutme
f5bc26e9fe
Use binary format for atomicWrite 2019-03-15 23:49:55 +01:00
shortcutme
c55d69d587
Python3 has builtin inet_pton support 2019-03-15 23:49:13 +01:00
shortcutme
e508357cfb
RateLimit py3 support 2019-03-15 23:48:46 +01:00
shortcutme
1c578b2b3f
Remove SSL patches for old Python/Gevent support, patch ctypes find_library to find openssl libs 2019-03-15 23:48:28 +01:00
shortcutme
4ce2ef732d
Rename StreamingMsgpack to Msgpack, add helpers 2019-03-15 23:33:04 +01:00
shortcutme
65705aba10
Fix UpnpPunch py3 compatibility 2019-03-15 23:32:05 +01:00
shortcutme
e97873fb7e
UpnpPunch gets custom logger 2019-03-15 23:31:13 +01:00
shortcutme
13d1df3cef
Only log worker download status if small ammount of task present 2019-03-15 23:30:34 +01:00
shortcutme
7ffb7db888
Add task statistics logging every 15sec 2019-03-15 23:29:04 +01:00
shortcutme
74366379ba
Only log added task in verbose mode 2019-03-15 23:26:33 +01:00
shortcutme
6b89d05a3c
Disable update 2019-03-15 23:10:29 +01:00
shortcutme
b0b9a4d33c
Change to Python3 coding style 2019-03-15 21:06:59 +01:00
shortcutme
fc0fe0557b
Ignore *.bak files 2019-03-15 18:47:31 +01:00
ZeroNet
116347ef66
Merge pull request #1921 from rllola/tracker-announcer
If no port defined in tracker url assume it is port 80
2019-03-10 23:42:07 +01:00
rllola
58516913b4 if protocol https choose port 443 2019-03-10 22:19:37 +01:00
rllola
fb836fcf6f If no port defined in tracker url assume it is port 80; fix #1917 2019-03-09 18:41:50 +01:00
ZeroNet
1ad44ace0a
Merge pull request #1916 from rllola/ld-library-path-openssl
Ld library path openssl
2019-03-06 16:05:54 +01:00
rllola
32ddaed376 Actually at ALL the path in the environnement variable and look for the openssl lib 2019-03-05 18:58:47 +01:00
rllola
4e388e5dc2 Find openssl lib in LD_LIBRARY_PATH 2019-03-05 18:33:29 +01:00
shortcutme
44c467f472
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2019-02-24 02:29:42 +01:00
shortcutme
f90d0d2dae
Rev3853 2019-02-24 02:29:35 +01:00
shortcutme
b47920169f
Test unsupported pex peers removing 2019-02-24 02:29:27 +01:00
shortcutme
81bf349871
Remove ipv6 and onion from pex result if not supported 2019-02-24 02:29:08 +01:00
shortcutme
9d849a16ec
Use defaultdict to for findHashId result 2019-02-24 02:28:42 +01:00
ZeroNet
383749a9c0
Merge pull request #1911 from rllola/zeroname-fix-waitforblock
Zeroname fix waitforblock
2019-02-21 16:55:49 +01:00
rllola
5e2feb5803 Fix the second cal to getinfo/getblockchaininfo; Verify version before doing the call. 2019-02-21 16:10:42 +01:00
rllola
93645681b0 Use waitfornewblock if namecoin version 16.0 or higher 2019-02-21 14:39:58 +01:00
shortcutme
174e8d3c19
Rev3852 2019-02-16 23:49:20 +01:00
shortcutme
511a5c0d1f
Nonce based CSP not supported in Safari yet 2019-02-16 23:49:10 +01:00
shortcutme
c92c840c41
Make sigterm listen optional (fixes macOS problem) 2019-02-16 23:48:18 +01:00
shortcutme
952a1a1da8
Rev3851, Fix typo with onion address detection 2019-02-16 20:50:49 +01:00
ZeroNet
e89cb4cc0e
Merge pull request #1901 from anoadragon453/patch-3
Fix typo
2019-02-16 20:28:37 +01:00
ZeroNet
89cc70091c
Merge pull request #1900 from anoadragon453/patch-2
Remove unnecessary str replace
2019-02-16 20:28:22 +01:00
ZeroNet
cfaa2c542d
Merge pull request #1896 from rllola/zeroname-namecoin-version
Zeroname plugin improvement
2019-02-16 20:27:38 +01:00
Andrew Morgan
c6bbe9e020
Fix typo 2019-02-15 21:22:13 +00:00
Andrew Morgan
15d2fd4581
Remove unnecessary str replace
Presumably left over from before it got moved out into a script.
2019-02-15 21:19:29 +00:00
shortcutme
819c2b0bc3
Rev3850 2019-02-14 15:52:30 +01:00
shortcutme
30984c62fa
Change trackers to more reliable ones 2019-02-14 15:52:22 +01:00
shortcutme
bd649cfb33
Remove ui_server allowed http host learning 2019-02-14 15:49:10 +01:00
shortcutme
5c57cd6541
Support https trackers, add browser-like user agent for tracker http requests 2019-02-14 15:48:36 +01:00
rllola
02e2080ce2 Added test for new standard; Check version for compatibility with namecoin newer version; update README 2019-02-12 23:06:21 +01:00
rllola
c00601743c Added README for zeroname plugin with instructions 2019-02-12 22:09:47 +01:00
shortcutme
523f8dae2a
Rev3846 2019-02-09 13:57:08 +01:00
shortcutme
4e56fe9fc3
Fix sitePublish CLI command if no client is running 2019-02-09 13:56:44 +01:00
shortcutme
2829146598
Merge wrapper js, css 2019-02-09 13:56:21 +01:00
shortcutme
b5ed158cc6
Fix closed display of infopanel if sidebar opened 2019-02-09 13:56:12 +01:00
shortcutme
7314f20563
Set number of changed files for closed infopanel 2019-02-09 13:55:53 +01:00
shortcutme
0559eb1a9a
Rev3844 2019-02-05 15:55:23 +01:00
shortcutme
40f732cd48
Only show modified files notification if site is owned 2019-02-05 15:55:12 +01:00
shortcutme
eb837e3685
Close button for site modified files notification 2019-02-05 15:54:32 +01:00
shortcutme
8ddfbf37c3
New siteSetSettingsValue to change site specific setting 2019-02-05 15:52:01 +01:00
shortcutme
0729ea1c38
Version 0.6.5, Rev3840 2019-02-02 00:13:09 +01:00
shortcutme
39541fe348
Modified site source admin panel 2019-02-02 00:12:50 +01:00
shortcutme
259c5199d6
siteListModifiedFiles admin command 2019-02-02 00:11:47 +01:00
shortcutme
af0b563036
Remove unnecessary character 2019-02-02 00:11:02 +01:00
shortcutme
c2b879ccab
Rev3831, Fix Stats page compatibility with latest gevent 2019-01-31 00:39:45 +01:00
shortcutme
8447c6d79f
Rev3829 2019-01-30 14:58:20 +01:00
shortcutme
46fb61c68c
Consider port opened if we have external ip on the interface 2019-01-30 14:58:11 +01:00
shortcutme
860ef650f9
Support IPv6 in Tor always mode by creating ipv4 sockets with ipv6 address 2019-01-30 14:53:33 +01:00
shortcutme
ef6f9b9d70
Don't try to open ports in Tor mode 2019-01-30 14:52:41 +01:00
shortcutme
9f701c8f35
IPv6 supported in tor mode 2019-01-30 14:52:26 +01:00
shortcutme
e18d3d0c93
Only return valid ips from getInterfaceIps 2019-01-30 14:51:45 +01:00
blurHY
dd46a64e79 Fix atexit not working on SIGTERM (#1882) 2019-01-30 14:47:16 +01:00
shortcutme
31a7effa5f
Rev3827, Share FileServer between sites for non-main CLI commands 2019-01-29 03:17:24 +01:00
shortcutme
42f3f405ea
Rev3826 2019-01-29 03:04:06 +01:00
shortcutme
1b612f7112
Check master seed length for cryptGetPrivatekey CLI command 2019-01-29 03:03:42 +01:00
shortcutme
6e364ce4b9
Wait until site sync finished before cloning 2019-01-29 03:02:57 +01:00
shortcutme
89eb44f3ef
Spawn port check on separate thread when changing ip_external config value 2019-01-29 03:02:22 +01:00
shortcutme
53364d6ddc
Add 169.254.* to local ips, remove unnecessary brackets 2019-01-29 03:00:06 +01:00
shortcutme
4631f2223b
Add public ips from local adapters to external ip list 2019-01-29 02:59:15 +01:00
shortcutme
20fb9ab97d
Only reload source code on create and change event 2019-01-29 02:57:41 +01:00
shortcutme
dcbac42571
Change unstable tracker 2019-01-29 02:57:18 +01:00
shortcutme
0258d926a2
Fix loading multi-line values from config 2019-01-29 02:54:56 +01:00
shortcutme
e79e60f0bb
Fix change detection for textareas in Config page 2019-01-29 02:54:30 +01:00
shortcutme
ef0c0b1e32
Rev3821 2019-01-26 20:43:04 +01:00
shortcutme
14631c65a6
Avoid user creaton when rendering sidebar after site deletion 2019-01-26 20:42:46 +01:00
shortcutme
f706f7508e
Store detected external ips to separate variable 2019-01-26 20:42:27 +01:00
shortcutme
6662b4f047
Test sql queries with lots of variables 2019-01-26 20:40:58 +01:00
shortcutme
13c453d610
Embed query values if more than 100 specified 2019-01-26 20:40:34 +01:00
shortcutme
e8026ef074
Non-private external ip for tests 2019-01-26 20:39:31 +01:00
shortcutme
cefc6f8eac
Test private ip match 2019-01-26 20:38:30 +01:00
shortcutme
bf809ac118
Save users.json immedietly after site creation 2019-01-26 20:31:37 +01:00
shortcutme
88ba0c1154
Don't detect cjdns ips as private ips 2019-01-26 20:31:05 +01:00
shortcutme
43d2d5334a
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2019-01-26 03:14:03 +01:00
shortcutme
de41efbaf8
Rev3818, Fix peerPing cli command 2019-01-26 03:13:47 +01:00
ZeroNet
81419ca68b
Merge pull request #1879 from tangdou1/patch-1
Update zh.json
2019-01-25 23:34:49 +01:00
shortcutme
276cbc0ace
Rev3817, Support limits for feed search 2019-01-25 14:26:38 +01:00
tangdou1
6ada5110a4
Update zh.json 2019-01-25 15:04:43 +08:00
tangdou1
f6ee45249d
Update zh.json 2019-01-25 14:50:05 +08:00
shortcutme
be36a20249
Rev3815 2019-01-25 01:26:50 +01:00
shortcutme
5173597868
Remove empty lines from multi-line config values 2019-01-25 01:26:39 +01:00
shortcutme
86657529c9
Live update ip_external 2019-01-25 01:24:28 +01:00
shortcutme
6460b7b0a1
Parse ip_external on portCheck function call 2019-01-25 01:23:46 +01:00
shortcutme
3b91be8449
Change ip_external on Config page 2019-01-25 01:22:26 +01:00
ZeroNet
055aea58bb
Merge pull request #1877 from d14na/patch-1
Add support for tilde `~` in filenames.
2019-01-24 15:54:07 +01:00
shortcutme
1914c69c47
Rev3812 2019-01-24 15:20:56 +01:00
shortcutme
fdb06ad973
Cleaner way to record external ips from port checkers 2019-01-24 15:20:37 +01:00
shortcutme
37979b4f9c
Support multiple external ips 2019-01-24 15:20:08 +01:00
shortcutme
0a03c30e8a
findHashId will return real address used by the connection 2019-01-24 15:19:19 +01:00
shortcutme
e8dbf1511b
More clean way to return locally found hash_ids for findHashId 2019-01-24 15:18:12 +01:00
D14na
f163abb4a5
Add support for tilde ~ in filenames.
(source: https://webpack.js.org/guides/code-splitting)

It appears that webpack (bundled w/ the VueJS CLI) will concatenate `chunk` names using the `~` to create one long "bundled" filename. This creates a problem when executing `isValidRelativePath` which DOES NOT allow `~`.

__An example error when signing:__
`Site:1... - [ERROR] Invalid filename: js/about~privacy~search.3c7ce85b.js`

A fix is to use the same name for each file/chunk, but then that breaks the optimizations of code splitting. Is there any reason NOT to permit tilde `~` as a valid filename character? _(NOTE: this may only be an issue if using vue-router)_
2019-01-24 08:41:27 -05:00
ZeroNet
fa99f3dbbe
Merge pull request #1876 from tangdou1/patch-1
Fix a bug
2019-01-24 11:48:10 +01:00
tangdou1
76e21a6378
Fix a bug 2019-01-24 10:00:18 +08:00
ZeroNet
0d3c403f08
Merge pull request #1873 from goofy-mdn/patch-1
Update fr.json
2019-01-23 16:12:17 +01:00
goofy-mdn
7c6ff85acd
Update fr.json
minor typofix
2019-01-23 15:44:14 +01:00
shortcutme
4d60c61512
Rev3808, Use cjdns compatible ipv6 address to test route 2019-01-23 14:21:25 +01:00
ZeroNet
31376ee2fd
Merge pull request #1870 from tangdou1/patch-1
Update all.js
2019-01-23 12:55:37 +01:00
ZeroNet
b067bbd935
Merge pull request #1871 from tangdou1/patch-2
Update zh.json
2019-01-23 12:54:37 +01:00
tangdou1
f980170a82
Update zh.json 2019-01-23 19:05:29 +08:00
tangdou1
8b7ef14f65
Update all.js 2019-01-23 19:00:19 +08:00
ZeroNet
5eb8549aef
Merge pull request #1869 from tangdou1/patch-1
Update all.js
2019-01-23 10:57:06 +01:00
tangdou1
728b76aa7e
Update all.js 2019-01-23 17:24:21 +08:00
shortcutme
c20ed92fab
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2019-01-23 02:19:08 +01:00
shortcutme
13f6a8da53
Rev3807 2019-01-23 02:19:04 +01:00
shortcutme
28426f3ee3
Fix ip_mode description 2019-01-23 02:18:31 +01:00
shortcutme
fb925745ba
Make notification compatible with latest noscript 2019-01-23 02:15:23 +01:00
shortcutme
271cb66c69
Fix port re-check 2019-01-23 02:14:31 +01:00
shortcutme
b3f2812191
Add ip network support to stats page 2019-01-23 02:13:29 +01:00
shortcutme
1824363f86
Support dual stack listening 2019-01-23 02:13:13 +01:00
shortcutme
439d2bcf7f
Remove unused setIpExternal funtcion 2019-01-23 02:11:59 +01:00
shortcutme
447f5fd5c8
Store opened port status per IP version 2019-01-23 02:11:31 +01:00
shortcutme
ce78e330d3
Async serverPortcheck ZeroFrame API call 2019-01-23 02:07:11 +01:00
tangdou1
7a47d58ad4 Update zh.json for more respect (#1867)
* Update zh.json

* Update zh.json

* Update zh.json
2019-01-22 11:00:17 +01:00
ZeroNet
e9f467ed77
Merge pull request #1864 from tangdou1/patch-2
Fix a small bug
2019-01-21 14:01:25 +01:00
tangdou1
aedfb1d8da Update zh.json (#1863)
* Update zh.json

* Update zh.json
2019-01-21 14:01:04 +01:00
tangdou1
0ab424c0d2 Update the source of translation (#1865)
* Update zh.json

* Update zh-tw.json

* Update tr.json

* Update sl.json

* Update sk.json

* Update ru.json

* Update pt-br.json

* Update pl.json

* Update nl.json

* Update it.json

* Update hu.json

* Update fr.json

* Update es.json

* Update de.json

* Update da.json

* Update zh.json

* Update zh-tw.json

* Update tr.json

* Update sl.json

* Update sk.json

* Update ru.json

* Update pt-br.json

* Update pl.json

* Update nl.json

* Update it.json

* Update hu.json

* Update fr.json

* Update es.json

* Update de.json

* Update da.json
2019-01-21 14:00:44 +01:00
tangdou1
674b1efa0f
Fix a bug
there is no portCheck function
2019-01-21 10:46:06 +08:00
shortcutme
a7509988af
Rev3802, Fix pytest warnings 2019-01-20 20:02:31 +01:00
shortcutme
f58f738fe4
Rev3801 2019-01-20 19:16:56 +01:00
shortcutme
ba9228b142
Is downloading status based on bad_files 2019-01-20 19:15:21 +01:00
shortcutme
0beef302c6
Ipv6 compatibility in AnnounceZero plugin 2019-01-20 19:13:00 +01:00
shortcutme
da538f6424
AnnounceShare compatibility with refactored port checker 2019-01-20 19:12:11 +01:00
shortcutme
8384c2cba3
Ipv6 compatible AnnounceShare test 2019-01-20 19:11:15 +01:00
shortcutme
fbf430fac9
Ipv6 compatible bigfile test 2019-01-20 19:10:52 +01:00
shortcutme
29516304b0
Reset cert data before running crypt test 2019-01-20 19:10:40 +01:00
shortcutme
c853de4315
Ipv6 tracker 2019-01-20 19:08:49 +01:00
shortcutme
e2d17fe20f
Ipv6 test of address packing and unpacking 2019-01-20 19:08:15 +01:00
shortcutme
9e5be7ffcf
Fix noparallel test on slow cpu 2019-01-20 19:07:48 +01:00
shortcutme
44dc3035a5
Make network test compatible with ipv6 2019-01-20 19:07:16 +01:00
shortcutme
468666cdc8
Optimize getOnion function with less lock 2019-01-20 16:51:42 +01:00
shortcutme
00972f5d73
Fix stuck starting when tor client is already running 2019-01-20 16:51:13 +01:00
shortcutme
bffe6e7a32
Tor service ipv6 support 2019-01-20 16:50:55 +01:00
shortcutme
cc3bb912be
Ipv6 support for adding peers by query string 2019-01-20 16:49:52 +01:00
shortcutme
9a64b6080d
Formatting 2019-01-20 16:31:41 +01:00
shortcutme
42156edc76
Opened ipv6 port support for tracker request 2019-01-20 16:31:30 +01:00
shortcutme
7ae98477d5
Separate function for parsing tracker addresses 2019-01-20 16:29:38 +01:00
shortcutme
626b6f5ccd
Formatting 2019-01-20 16:28:47 +01:00
shortcutme
9c82de7df2
Ipv6 support of opened services 2019-01-20 16:28:42 +01:00
shortcutme
e7de562b93
Don't request ipv6 trackers if not supported by the client 2019-01-20 16:27:59 +01:00
shortcutme
06d679d1ca
Support ipv6 in findHashIds response parsing 2019-01-20 16:27:12 +01:00
shortcutme
33cf30a07b
Formatting 2019-01-20 16:26:17 +01:00
shortcutme
6ac1960c47
Support ipv6 for Pex request parsing 2019-01-20 16:26:04 +01:00
shortcutme
1350096545
Support ipv6 for Checkport request 2019-01-20 16:23:53 +01:00
shortcutme
18b9df62e4
Support ipv6 in findHashIds request 2019-01-20 16:23:37 +01:00
shortcutme
42495a9914
Support ipv6 in Pex request 2019-01-20 16:22:32 +01:00
shortcutme
b2f25d7f0a
Store if there was an incoming connection for port open checker 2019-01-20 16:20:41 +01:00
shortcutme
30b71328b9
Turn ipv6 representation of ipv4 addresses to simple ips for incoming connections 2019-01-20 16:20:01 +01:00
shortcutme
7c97e37dc3
Support ipv6 binding for connection server 2019-01-20 16:19:14 +01:00
shortcutme
f42d088fbc
Log supported ip types when binding 2019-01-20 16:18:48 +01:00
shortcutme
a5e63de016
Check if there is ipv6 support in user's system 2019-01-20 16:18:24 +01:00
shortcutme
f7d3718457
Set ConnectionServer default ip for tests based on ip_type 2019-01-20 16:16:55 +01:00
shortcutme
3fa0f1b9e8
Don't correct local time with p2p timecorrection value 2019-01-20 16:15:47 +01:00
shortcutme
f1a54bd7d0
Set strict timeout for connection handshake 2019-01-20 16:15:32 +01:00
shortcutme
1803e47c02
Support creating ipv6 connections 2019-01-20 16:15:07 +01:00
shortcutme
296e44deec
Store ip_type in Connection variable 2019-01-20 16:14:00 +01:00
shortcutme
c546065611
Peerdb ipv6 loading 2019-01-20 16:11:56 +01:00
shortcutme
7e759e6ae8
Ipv6/ipv4 compatible bootstrapper tests 2019-01-20 16:11:08 +01:00
shortcutme
a9608c096e
New bootstrapper tests announce and backward compatibility 2019-01-20 16:10:24 +01:00
shortcutme
4db723fa6f
New bootstraper db format with ipv6 support 2019-01-20 16:08:51 +01:00
shortcutme
64e8efbc07
Fix ipv6 address placing to sidebar map 2019-01-20 03:28:49 +01:00
shortcutme
15f4bc5bd6
Add filesrver_ip_type to config page 2019-01-20 03:28:22 +01:00
shortcutme
ce6668ef8c
Avoid adding supported crypto multiple times 2019-01-20 03:27:44 +01:00
shortcutme
f60ab3e01f
Add local ipv6 address 2019-01-20 03:26:45 +01:00
shortcutme
78a7aa91c0
Add ipv6 address to blacklist 2019-01-20 03:26:12 +01:00
shortcutme
a574f3d173
Fix get settings of not visited site 2019-01-20 03:22:17 +01:00
shortcutme
c9223686d2
Formatting helper 2019-01-20 03:21:38 +01:00
shortcutme
c86afe29ba
GetIpType and createSocket helper functions 2019-01-20 03:21:27 +01:00
shortcutme
0c56a7a23b
Support ipv6 address packing/unpacking 2019-01-20 03:21:07 +01:00
shortcutme
b66676de85
Support absolute path and {data_dir} variable for trackers_file 2019-01-20 03:16:37 +01:00
shortcutme
c7a468eb14
Bind file server to ipv6 interfaces according to fileserver_ip_type config value 2019-01-20 03:15:21 +01:00
shortcutme
1c5b5e3621
Move port checking to separate file, add ipv6 port check 2019-01-20 03:13:54 +01:00
shortcutme
d78c757b52
Automatically run all file_server tests in ipv4 and ipv6 enviroment 2019-01-20 03:11:33 +01:00
shortcutme
9871a4e36f
Fix test gevent monkey patching 2019-01-20 03:10:39 +01:00
shortcutme
3e82595193
Store site download time 2019-01-20 03:10:07 +01:00
shortcutme
044456cd98
Add win_inet_pton package for missing socket functions 2019-01-20 03:09:46 +01:00
shortcutme
c0ba724578
Enable ipv6 for testing 2019-01-20 03:08:34 +01:00
ZeroNet
79daa12b06
Merge pull request #1847 from BoboTiG/fix-invalid-seq-warnings
Fix DeprecationWarning: invalid escape sequence
2019-01-20 01:51:27 +01:00
Lola Dam
1f1e6006ec Support namecoin standard 'map' for subdomain name (#1856)
* Support namecoin standard 'map' for subdomain name

* Proper naming for variables

*  naming fix and added one case for namecoin standard
2019-01-15 16:25:33 +01:00
shortcutme
8ee8acf655
Rev3750, Allow log_level changes 2019-01-10 14:11:46 +01:00
shortcutme
5e928769ec
Add log level to config page 2019-01-10 14:11:30 +01:00
shortcutme
a0b60a8347
Apply log level changes 2019-01-10 14:10:07 +01:00
shortcutme
dbe2a7b240
Fix QueryJson on non-list nodes 2019-01-10 14:09:50 +01:00
Mickaël Schoentgen
e8298726ca Fix DeprecationWarning: invalid escape sequence
Signed-off-by: Mickaël Schoentgen <contact@tiger-222.fr>
2019-01-06 15:15:47 +01:00
shortcutme
4c675b8311
Rev3748, Fix content filter for non existing domains 2019-01-05 19:07:27 +01:00
shortcutme
1ab9bc40a5
Rev3747. Dont show tor meek proxy on configuration page if it's not supported 2019-01-04 14:33:27 +01:00
shortcutme
859c81c81b
Rev3746, Fix open_browser parsing with non-main cli command 2019-01-02 02:31:04 +01:00
shortcutme
83ed87cec0
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2019-01-02 01:21:05 +01:00
shortcutme
9b6feb4a01
Rev3745, Fix tor bridges config file parsing with True value 2019-01-02 01:21:00 +01:00
ZeroNet
40841b9b07
Update README.md 2018-12-31 01:37:33 +01:00
shortcutme
d1227b6447
Rev3744, Fix typo 2018-12-30 12:28:19 +01:00
shortcutme
fc417e7273
Rev3743, Fix argument parsing on unknown command 2018-12-30 12:09:22 +01:00
shortcutme
bda238344c
Test isIp, isPrivateIp 2018-12-19 13:25:20 +01:00
shortcutme
45add916f4
Rev3742, Move isIp to helper, fix inet_prton error 2018-12-19 13:15:59 +01:00
Andrew Morgan
ca549cf081 Allow IP addresses via WebSocket API (#1819)
* Allow IP addresses via WebSocket API

* Switch to socket. Add host
2018-12-18 14:36:14 +01:00
shortcutme
fb3c5eaafa
Rev3741 2018-12-15 18:40:14 +01:00
shortcutme
8e4873cf2a
Do a quick content.db check on startup 2018-12-15 18:39:39 +01:00
shortcutme
47316741c1
Allow only CREATE in indexes 2018-12-15 17:48:19 +01:00
shortcutme
86dd57d13e
Fix typo in comment 2018-12-15 17:47:34 +01:00
shortcutme
4fe6ae9811
Allow only SELECT in storage.query 2018-12-15 17:45:17 +01:00
shortcutme
edc1a71d0d
Rev3739, Fix atomicWrite of non existent file 2018-12-13 21:17:36 +01:00
shortcutme
ed74403850
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-12-13 21:15:14 +01:00
Thunder33345
9454c05b7e Added issue templates for suggestions (#1814)
* Rename .github/ISSUE_TEMPLATE.md to .github/ISSUE_TEMPLATE/Bug Reports.md

* Update issue templates

* Rename Bug Reports.md to bugs.md

* Update issue templates

oh well apparently it only likes it if you use it's editor

* Delete bug_report.md

* Delete bugs.md
2018-12-12 17:58:40 +01:00
ZeroNet
cdd7f4b6bb
Merge pull request #1800 from caryoscelus/sidebar-fix
Minor fix in sidebar plugin
2018-12-10 16:46:20 +01:00
shortcutme
e4819c1753
Rev3738, More strict csp, No csp on Edge
Edge does not supports nonce on external scripts
2018-12-10 02:29:21 +01:00
ZeroNet
e8e0a19758
Merge pull request #1805 from SuperSandro2000/patch-1
Update Dockerfile
2018-12-08 13:58:01 +01:00
Sandro Jäckel
a8a271e6fb
Update Dockerfile
Update to Alpine 3.8
Apply best practices eg:
- Don't upgrade
- Add --no-cache-dir to pip install
- Remove removing of any tmp folder as it is deprecated
- Format RUN block nicer
2018-12-08 13:32:28 +01:00
caryoscelus
fc6aa7cc1c Minor fix in sidebar plugin
Under certain conditions content["files"] is present, but is None,
which led to exception and thus failure of the whole sidebar.
2018-12-05 10:05:43 +00:00
shortcutme
b0140a655f
Rev3737 2018-12-04 14:16:37 +01:00
shortcutme
ef7ee02f65
Cleanup chart db 10 minutes after startup 2018-12-04 14:16:22 +01:00
shortcutme
3d1d5c1151
Delete old chart entries 2018-12-04 14:16:06 +01:00
shortcutme
e0c56c6342
Fix log directory path bug 2018-12-04 14:15:48 +01:00
shortcutme
2ceada84a6
Rev3736, Fix sidebar content signing changer links 2018-12-04 01:45:01 +01:00
shortcutme
5b50a113d1
Rev3735, certList admin command 2018-11-30 15:56:20 +01:00
shortcutme
fe52cc7797
Rev3734 2018-11-29 14:33:45 +01:00
shortcutme
3923f2baf4
Allow block sites based on sha256 hashed address 2018-11-29 14:32:55 +01:00
shortcutme
0157ade1c9
Don't autodelete optional files from owned files 2018-11-29 14:32:32 +01:00
shortcutme
a863c743c4
Rev3729 2018-11-27 11:30:41 +01:00
shortcutme
62d3b6a3f2
Remove not used variables in getStartDir 2018-11-27 11:30:22 +01:00
shortcutme
e435274329
Convert win-style path to unix-style path for log and data dir 2018-11-27 11:29:55 +01:00
shortcutme
55380298f1
Rev3728 2018-11-26 00:21:22 +01:00
shortcutme
71e65119ae
Add script nonce for blacklisted site page 2018-11-26 00:21:01 +01:00
shortcutme
dc788043ff
Escape notification in ContentFilter plugin 2018-11-26 00:20:37 +01:00
shortcutme
a98c465c9a
Use injectScript for Multiuser plugin notification 2018-11-26 00:19:49 +01:00
shortcutme
dace0671c2
Add script nonce for Multiuser notification script inject 2018-11-26 00:18:46 +01:00
shortcutme
0882f9dd3c
Use redirect API call for logging in using UiPassword plugin 2018-11-26 00:18:08 +01:00
shortcutme
c734e13753
Escape pinned file names 2018-11-26 00:17:29 +01:00
shortcutme
b54483db51
Variables in underline translation helper will be escaped by default 2018-11-26 00:16:53 +01:00
shortcutme
5d0bf2e80b
Replace html tags separately in sidebar html as it would be escaped otherwise 2018-11-26 00:16:19 +01:00
shortcutme
46e694a5c8
Add script nonce when loading js for globe in sidebar 2018-11-26 00:14:30 +01:00
shortcutme
e0756a56a4
Add script_nonce for UiConfig plugin 2018-11-26 00:13:58 +01:00
shortcutme
55e2a2fd5d
Source code reloader only once in every 5 seconds 2018-11-26 00:13:21 +01:00
shortcutme
eecc257822
Make unknown site request a bad action everywhere 2018-11-26 00:12:54 +01:00
shortcutme
36f2998c91
Test if js works in raw and normal mode 2018-11-26 00:12:12 +01:00
shortcutme
131926cad8
Make current url getting compatible with chromedriver 2018-11-26 00:11:58 +01:00
shortcutme
d588327c1c
Change wget to getUrl 2018-11-26 00:11:25 +01:00
shortcutme
68c7f502b4
Use chromedriver instead of phantomjs for testing 2018-11-26 00:10:43 +01:00
shortcutme
06fa669f8c
Test escaping in translation underline helper 2018-11-26 00:09:46 +01:00
shortcutme
d3885eefda
Automatically escape all variables in translation underline func helper 2018-11-26 00:09:24 +01:00
shortcutme
74e551cf1a
Escape error messages 2018-11-26 00:08:41 +01:00
shortcutme
a1333d8d6b
Detailed log certSelect error messages 2018-11-26 00:08:22 +01:00
shortcutme
3dfb40b57e
Use redirect after cloning the site 2018-11-26 00:07:23 +01:00
shortcutme
316cd7710f
Use injectScript in certSelect 2018-11-26 00:07:08 +01:00
shortcutme
cbefc5b81e
Merge wrapper js 2018-11-26 00:05:17 +01:00
shortcutme
233e161327
New injectScript and redirect command for UiServer 2018-11-26 00:05:04 +01:00
shortcutme
7cbbc33319
Expose script nonce for wrapper js obj 2018-11-26 00:04:06 +01:00
shortcutme
61cc0a1864
Add nonce attribute to all scripts in wrapper 2018-11-26 00:03:21 +01:00
shortcutme
99f01475a0
Disallow unknown script by using csp header for wrapper 2018-11-26 00:02:35 +01:00
shortcutme
481e029600
Rev3707 2018-11-21 19:28:43 +01:00
shortcutme
5ff22467a6
Sanitize error message 2018-11-21 19:28:30 +01:00
shortcutme
3fd44a1813
Validate merger type before asking permission 2018-11-21 19:28:11 +01:00
shortcutme
224a354480
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-11-21 03:37:10 +01:00
shortcutme
18cdf5d89d
Rev3704 2018-11-21 03:37:05 +01:00
shortcutme
293afa6059
Replace dead trackers 2018-11-21 03:36:55 +01:00
shortcutme
06fbcde815
Fix setLocalStorage call before websocket connection 2018-11-21 03:32:12 +01:00
shortcutme
4195a72621
Only create default json table if it's not defined in dbschema 2018-11-21 03:31:12 +01:00
ZeroNet
d3bf001752
Merge pull request #1781 from hugbubby/patch-2
Fixed a line in the gentoo instructions.
2018-11-19 13:26:27 +01:00
hugbubby
d4604cba34
Fixed a line in the gentoo instructions.
That keyword only works for one specific iteration of the package. It is wrong for the current version, and this is a more appropriate command.
2018-11-19 05:37:29 -06:00
ZeroNet
221b4a9391
Merge pull request #1780 from mymage/patch-1
Update it.json
2018-11-13 17:09:55 +01:00
mymage
5f5d4d7987
Update it.json
Some fixes
2018-11-12 20:46:42 +01:00
shortcutme
8a17fe927f
Change docs url to self hosted 2018-11-08 02:43:51 +01:00
shortcutme
090d1e900e
Rev3703 2018-11-08 01:37:01 +01:00
shortcutme
d0f9d4de02
Fix invalid user auth address matching 2018-11-08 01:36:12 +01:00
shortcutme
6bc1ac1156
Support pattern based cert signers 2018-11-08 01:35:15 +01:00
shortcutme
c77e403f27
Logging init refactor, log rotate support 2018-11-08 01:32:31 +01:00
shortcutme
5178a288ca
Fix error message testing 2018-11-08 01:31:23 +01:00
shortcutme
7c6702057d
Test invalid cert user id 2018-11-08 01:30:56 +01:00
shortcutme
c1aad3882c
Test signers pattern 2018-11-08 01:30:32 +01:00
shortcutme
8cf30893f2
Don't close idle db connection during rebuild 2018-11-08 01:20:33 +01:00
shortcutme
da9af181dd
Support accepted_pattern for certSelect API call 2018-11-08 01:16:08 +01:00
shortcutme
92e3c028bb
Make cert domains case sensitive 2018-11-08 01:12:27 +01:00
shortcutme
cf7d194dbf
Remove missing optional files from content.json on cloning 2018-11-07 22:48:35 +01:00
shortcutme
eae6a34bfc
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-10-30 04:50:28 +01:00
shortcutme
d9f851f0c1
Rev3688 2018-10-30 04:50:24 +01:00
shortcutme
9590dce8a4
Return ok for site clone, Fix typo in comment 2018-10-30 04:49:42 +01:00
shortcutme
5af77449fa
Move html variable replacement for new function, add site_modified variable, don't send length header for html files 2018-10-30 04:49:11 +01:00
shortcutme
2c39ab01ea
ZeroNet logo for fixbutton 2018-10-30 04:47:19 +01:00
shortcutme
035d70cf57
Spawn site announce to new async line 2018-10-30 04:44:43 +01:00
shortcutme
8c76e258d7
Give 10 second timeout for reannounce 2018-10-30 04:43:58 +01:00
shortcutme
f05c7ffbfa
Fix parsing invalid files for db 2018-10-30 04:43:21 +01:00
shortcutme
a49fcb0176
Fix verification for files without sign 2018-10-30 04:41:45 +01:00
shortcutme
87503b875a
Set timeout for connection 2018-10-30 04:41:11 +01:00
shortcutme
d89d770e73
Log less precise time for connection cleanup 2018-10-30 04:41:02 +01:00
shortcutme
083d64d151
Add site to connection log 2018-10-30 04:40:34 +01:00
shortcutme
281f379ced
Use the Db cursor to delete peers 2018-10-30 04:39:59 +01:00
shortcutme
9dab48d135
Only show multiuser master key on click and allow download as file 2018-10-30 04:39:13 +01:00
shortcutme
56221ebc95
Support limiting maximum bigfile size 2018-10-30 04:38:18 +01:00
ZeroNet
0b4b1cb3f3
Merge pull request #1741 from hugbubby/patch-1
Updated gentoo section
2018-10-27 11:50:17 +02:00
hugbubby
30e417a614
Updated gentoo section
1. Not all installations have layman, and it's being phased out.
2. Need to `emerge --sync` after adding a new repository.
3. Added a line that adds the zeronet service to the default autostart runlevel (under optional)
2018-10-26 19:16:55 -05:00
shortcutme
538de08c07
Rev3673, Fix sidebar input fields on mobile 2018-10-24 13:59:10 +02:00
shortcutme
f540645d80
Rev3672, Fix Config page fileserver port changing 2018-10-24 13:31:42 +02:00
shortcutme
a58743b820
0.6.4 Changelog 2018-10-23 23:59:32 +02:00
ZeroNet
0ed1499d02
Merge pull request #1730 from krixano/patch-2
Import Debug in Db/Db.py
2018-10-20 15:38:26 +02:00
shortcutme
5158a710dc
Rev3671, Fix theme with multiuser plugin 2018-10-20 13:34:49 +02:00
Christian Seibold
413b6cc43c
Import Debug in Db/Db.py 2018-10-20 01:58:35 -05:00
shortcutme
82a10f2558
Version 0.6.4, Rev3670 2018-10-20 02:36:29 +02:00
shortcutme
b97acb3174
Dark theme for loading screen 2018-10-20 02:36:08 +02:00
shortcutme
451976c3c8
Support themeclass variable in html files 2018-10-20 02:35:48 +02:00
shortcutme
8e6494c451
Remove unused code, junk lines 2018-10-20 02:34:26 +02:00
shortcutme
3579f9e0c4
Support global user settings 2018-10-20 02:28:58 +02:00
shortcutme
39d442a05d
Fix getConnectablePeers for low peer sites 2018-10-20 02:26:29 +02:00
shortcutme
0045206735
Merge UI js 2018-10-20 02:22:38 +02:00
shortcutme
7f46767411
Fix undefined in title 2018-10-20 02:22:29 +02:00
shortcutme
5414691f1f
Remove unnnecessary debug 2018-10-20 02:22:20 +02:00
shortcutme
13731fb094
Rename jquery easings file 2018-10-20 02:21:54 +02:00
ZeroNet
40ab9d9366
Merge pull request #1717 from rllola/pyinstaller-browser-fix
Make it compatible with pyinstaller for browser build
2018-10-17 10:54:18 +02:00
rllola
93d6129732 Make it compaticle with pyinstaller for browser build 2018-10-16 07:12:57 +02:00
ZeroNet
776e214789
Merge pull request #1690 from ZeroNetPlus/jquery
[Ready to be merged] Updated jQuery
2018-10-15 17:29:08 +02:00
shortcutme
d8f6621c7d
Rev3660 2018-10-15 13:19:41 +02:00
shortcutme
aca2b4423e
Fix zh-tw lang detection 2018-10-15 13:19:33 +02:00
shortcutme
204e3f8e3e
Change unreliable tracker 2018-10-15 13:19:16 +02:00
shortcutme
f54443d7f8
Reset pinned cache on file deletion 2018-10-15 13:18:18 +02:00
shortcutme
3d82ad9222
Fix optional used bytes calculation 2018-10-15 13:18:00 +02:00
shortcutme
393c66385f
Add pinning notification based on number of files 2018-10-15 13:17:42 +02:00
shortcutme
b008195abd
Set pin using ContentManager function 2018-10-15 13:16:55 +02:00
shortcutme
ad2c11413e
Allow to filter to pinned files on optionalfilelist 2018-10-15 13:16:35 +02:00
shortcutme
1e2853c950
Update hashfield on update peer numbers 2018-10-15 13:15:36 +02:00
shortcutme
171e5d3766
Fix typo on optional file deletion 2018-10-15 13:15:11 +02:00
shortcutme
46535cc7a8
File deletion based on type 2018-10-15 13:14:43 +02:00
shortcutme
16b40a731a
Test pinned cache, download piece queue reset, pinned optional file delete 2018-10-15 13:13:43 +02:00
shortcutme
9b4b9334a3
Remove pinned status of a file on file deletion 2018-10-15 13:12:46 +02:00
shortcutme
96d40d9816
Don't modify pinned status on file downloaded 2018-10-15 13:12:27 +02:00
shortcutme
407b003cd6
Add all piece of an optional file to download queue if one of the piece is downoaded 2018-10-15 13:11:23 +02:00
shortcutme
8129d5e6af
Don't remove pinned files from download queue 2018-10-15 13:10:34 +02:00
shortcutme
c12454a8e9
Don't delete pinned file if it removed by owner 2018-10-15 13:09:43 +02:00
shortcutme
0f49d412b5
Stop auto pinning files larger than 20MB 2018-10-15 13:07:53 +02:00
shortcutme
b33551e62e
Exclude files larger than 20MB from garbage collection 2018-10-15 13:06:50 +02:00
shortcutme
8bb4d149b6
Fix comment typo 2018-10-15 13:05:24 +02:00
shortcutme
854fda4530
Skip updating hashfiled of inactive sites 2018-10-15 13:05:18 +02:00
shortcutme
0deea7133d
Stop downloading bigfile piece if file removed 2018-10-15 13:03:36 +02:00
shortcutme
1eaa8afc5f
Only display the filename on sidebar download queue 2018-10-15 13:02:13 +02:00
shortcutme
1fc364fa07
Remove unused lines from dbCursor 2018-10-15 13:01:44 +02:00
shortcutme
f275ba36a1
Skip table creation on error 2018-10-15 13:01:17 +02:00
shortcutme
1aa741a25b
Always change db cursor settings 2018-10-15 13:01:04 +02:00
shortcutme
6b2f619096
Fix updateHashfield optional file detection 2018-10-15 12:59:28 +02:00
shortcutme
f74ddc1010
Don't delete connecting sites at startup 2018-10-15 12:59:04 +02:00
shortcutme
6a240919bf
Test archived before 2018-10-15 12:58:39 +02:00
shortcutme
2518867d50
Allow to also list connecting site with siteList API command 2018-10-15 12:58:14 +02:00
shortcutme
046b95d5b1
Rev3620 2018-10-08 15:35:32 +02:00
shortcutme
12dab27729
Skip tracker status with no value yet 2018-10-08 15:34:40 +02:00
ZeroNet
29964aa90c
Merge pull request #1683 from geekless/Zeroname-fixes
Allow using other domain resolver plugins along with Zeroname
2018-10-08 15:19:44 +02:00
ZeroNet
f0f7b86c7d
Merge pull request #1693 from krixano/patch-1
Add "allow-presentation" to iframe
2018-10-08 10:48:55 +02:00
Christian Seibold
2d437975a8
Add allow presentation to iframe
Allows zites to use the Presentation API
2018-10-07 20:01:30 -05:00
Daniell Mesquita
a9502a11d6 Update jQuery easing
Signed-off-by: Daniell Mesquita <daniellplasmmer@gmail.com>
2018-10-07 15:03:11 -03:00
Daniell Mesquita
6aa502b1a5 Updated jQuery
Signed-off-by: Daniell Mesquita <daniellplasmmer@gmail.com>
2018-10-07 15:00:02 -03:00
Vadim Ushakov
ea40d212c2 Allow using other domain resolver plugins along with Zeroname
Fixes several closely related bugs in Zeroname Plugin, those prevent correct work of other domain resolvers:

1. get(), isDomain(): when an address doesn't look like a valid domain, pass control to the next plugin in a chain.

3. Move the .bit-domain matching logic to a separate method isBitDomain().

2. get(), need(): use isBitDomain(), not isDomain() to check if domain resolving is needed in order to not interfere with other domain resolvers.

4. Also rewrite isAddress() to make it look similar to the new implementation of isDomain().
2018-10-06 12:35:14 +07:00
shortcutme
befed2200e
Rev3619 2018-10-05 15:09:35 +02:00
shortcutme
7afe1807b7
Merge sidebar js 2018-10-05 15:08:42 +02:00
shortcutme
91478aa128
Add TLS version of the connection to stats page 2018-10-05 15:08:28 +02:00
shortcutme
424b36ffca
Avoid double removing tag on sidebar close 2018-10-05 15:08:12 +02:00
shortcutme
52f7dc71e6
Fix typo in private key confirmation 2018-10-05 15:07:55 +02:00
shortcutme
402e6e7433
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-10-04 15:44:27 +02:00
shortcutme
6592906d0d
Rev3618 2018-10-04 15:44:07 +02:00
shortcutme
678f4102a5
Confirmation of private key forgot 2018-10-04 15:43:25 +02:00
shortcutme
c70e3bb3dd
Add comment to detection of Android float issue 2018-10-04 15:43:12 +02:00
shortcutme
b089355b5a
Fix detaction of pt-br system language 2018-10-04 15:42:45 +02:00
shortcutme
00cf1badfc
Fix error on invalid cli action 2018-10-04 15:42:11 +02:00
shortcutme
07159ea5df
Remove invalid characters from language setting 2018-10-04 15:41:28 +02:00
ZeroNet
52f3b8b507
Merge pull request #1640 from tangdou1/patch-3
Update zh.json
2018-10-02 18:33:39 +02:00
ZeroNet
d1387e50e2
Merge pull request #1643 from DaniellMesquita/patch-3
Update pt-br.json
2018-10-02 18:33:17 +02:00
ZeroNet
65112b6008
Merge pull request #1644 from DaniellMesquita/master
Update Sidebar's pt-br.json
2018-10-02 18:32:50 +02:00
shortcutme
4e4dc30a91
Rev3616 2018-09-30 21:57:14 +02:00
shortcutme
70292dac00
Don't allow to take the ownership of the updater site with the API 2018-09-30 21:56:36 +02:00
shortcutme
e46cb2f240
Fix content type indentification 2018-09-30 21:55:48 +02:00
shortcutme
9fee86df59
Always return lower cased content type 2018-09-30 21:54:50 +02:00
Daniell Mesquita
19b61a32af
Update pt-br.json 2018-09-22 17:12:33 -03:00
Daniell Mesquita
60091a2b5e
Update pt-br.json 2018-09-22 16:08:07 -03:00
tangdou1
68d246a3e9
Update zh.json 2018-09-22 22:45:22 +08:00
tangdou1
9749f59b5a
Update zh.json 2018-09-22 22:37:41 +08:00
shortcutme
15c09a0f03
Rev3612 2018-09-21 20:40:38 +02:00
ZeroNet
971212e7e9
Merge pull request #1635 from tangdou1/patch-1
Fix bootstrapper is blocked by itself
2018-09-21 20:30:29 +02:00
tangdou1
807d461289
Fix bootstrapper is blocked by itself
Make the bootstrapper server can add its own ip and port in its own bootstrapper.db as a peer.
2018-09-21 14:05:27 +08:00
shortcutme
e033b72942
Rev3611 2018-09-21 02:19:01 +02:00
shortcutme
98b476de71
Load current users before creating a new one 2018-09-21 02:18:29 +02:00
shortcutme
8fd2af1870
Private key save and fogot to sidebar 2018-09-21 02:17:53 +02:00
shortcutme
2a1849d027
Rev3609, Don't validate valid pattern in UiConfig if the field is hidden 2018-09-17 17:48:15 +02:00
shortcutme
d04b759913
Allow more time inaccuracy for noparallel test 2018-09-17 15:40:44 +02:00
shortcutme
2772e705ae
Rev3608 2018-09-17 15:34:03 +02:00
shortcutme
d44a4e8ae2
Sidebar optimization and dummy static page for uncoming internal page 2018-09-17 15:33:45 +02:00
shortcutme
53a40fa914
Stop worker if the file is not required anymore 2018-09-17 15:32:32 +02:00
shortcutme
86d1d4898a
Remove task on file write error 2018-09-17 15:31:10 +02:00
shortcutme
e4af2d5e86
Pick up task that is taken by idle peer 2018-09-17 15:30:48 +02:00
shortcutme
d124e2ed15
Support deletion of of all user submitted content that is older than specified date 2018-09-17 15:30:02 +02:00
shortcutme
00c9c14efb
Support listmodified before and after argument 2018-09-17 15:28:53 +02:00
shortcutme
6fc66b7b13
Move file forgot to separate function 2018-09-17 15:27:29 +02:00
shortcutme
9658c2d553
Stop downloadcontent pool if reached 95% of site limit 2018-09-17 15:27:11 +02:00
shortcutme
577761a6bb
Add cache to default settings 2018-09-17 15:25:17 +02:00
shortcutme
6c610c509f
Rename RemoveGoodFileTasks to RemoveSolvedFileTasks and add result argument 2018-09-17 15:24:44 +02:00
shortcutme
1eacc26ef9
Always call addPeer command with strip ip address and int port 2018-09-17 15:20:31 +02:00
shortcutme
5f33516054
Cleanup unreliable trackers easier if reached the shared tracker limit 2018-09-17 15:20:02 +02:00
shortcutme
0766205cb0
Missing changelog for 0.6.3 2018-09-17 15:18:45 +02:00
ZeroNet
0825626fc9
Merge pull request #1506 from eduaddad/patch-1
Create pt-br.json
2018-09-16 13:08:08 +02:00
ZeroNet
470352ddc8
Merge pull request #1610 from DaniellMesquita/patch-1
fix pull request #1597
2018-09-16 13:06:46 +02:00
ZeroNet
5ccff7b406
Merge pull request #1615 from adrelanos/patch-1
add Whonix instructions
2018-09-16 13:03:29 +02:00
Patrick Schleizer
66c03c6798
add Whonix instructions 2018-09-15 13:01:59 -04:00
Daniell Mesquita
d7912c6973 fix pull request #1597
Signed-off-by: Daniell Mesquita <plasmmer@outlook.com>
2018-09-14 16:59:45 -03:00
ZeroNet
afa20c92e8
Merge pull request #1597 from DaniellMesquita/patch-1
Added brazillian portuguese translation for Config
2018-09-13 11:27:19 +02:00
ZeroNet
95562a8965
Merge pull request #1599 from tangdou1/patch-1
Create zh.json for config page
2018-09-13 11:25:07 +02:00
tangdou1
a1abbd406d
Create zh.json 2018-09-13 11:35:47 +08:00
Daniell Mesquita
b05d125db2
Added brazillian portuguese translation for Config 2018-09-12 22:43:37 -03:00
shortcutme
54efe5a351
Rev3597 2018-09-13 03:12:29 +02:00
shortcutme
8594fa8199
Don't try to load english translation files 2018-09-13 03:12:02 +02:00
shortcutme
238667d989
Hungarian translate for configuration page 2018-09-13 03:11:35 +02:00
shortcutme
87536619e3
Translate support for configuration page 2018-09-13 03:11:24 +02:00
shortcutme
84ab076fe8
Rev3594 2018-09-07 11:34:11 +02:00
shortcutme
57f3cee390
Fix fileGet return when file is not existent 2018-09-07 11:33:57 +02:00
shortcutme
714aea2e27
RequestFullscreen API does not requires confirmation anymore as you can call it directly 2018-09-07 11:33:40 +02:00
shortcutme
52081f4a2a
Make Accept a problematic string as it brokes jquery script loading 2018-09-07 11:32:44 +02:00
shortcutme
b88b422e2f
Rev3591 2018-09-06 00:57:21 +02:00
shortcutme
d3499e71ef
FileGet use return function instead of calling response 2018-09-06 00:56:36 +02:00
shortcutme
c7d94548be
Support returning empty list as reponse 2018-09-06 00:55:54 +02:00
shortcutme
c866932861
Full fileList/fileGet/dirList support for packed files 2018-09-06 00:54:57 +02:00
shortcutme
317bd2fcec
Rev3588 2018-09-05 14:34:00 +02:00
shortcutme
b06ba06f40
Add timecorrection to server info 2018-09-05 14:33:31 +02:00
shortcutme
dc52a8a08b
Use shared file_server object when generating server info for websocket 2018-09-05 14:33:21 +02:00
shortcutme
5f1e7ffd0c
Correct sent time with timecorrection value 2018-09-05 14:32:43 +02:00
shortcutme
21a80650b0
Cache timecorrection value 2018-09-05 14:32:23 +02:00
shortcutme
3b7ec3d913
Lowercased Timecorrection function 2018-09-05 14:32:01 +02:00
shortcutme
f1c89f0917
Stats page show peer reputation 2018-09-05 14:31:26 +02:00
shortcutme
8692ea1a74
Rev3585 2018-09-04 15:44:23 +02:00
shortcutme
a5c25ce438
Dont add removed trackers to announcer stats 2018-09-04 15:43:52 +02:00
shortcutme
12d494bf38
Limit peer reputation increase from tracker 2018-09-04 15:43:20 +02:00
shortcutme
f0f9b93694
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-09-02 02:34:50 +02:00
shortcutme
a97f5a8488
Rev3582 2018-09-02 02:34:47 +02:00
shortcutme
a4224555d2
Increase gzipped json file size limit 2018-09-02 02:33:44 +02:00
shortcutme
1b0055ac61
Less reputation for onion peers 2018-09-02 02:26:42 +02:00
shortcutme
7dcde3e585
Store peer reputation, time_found in peer db 2018-09-02 02:26:17 +02:00
shortcutme
4fe33268ac
Don't allow parallel rebuild 2018-09-02 02:24:07 +02:00
shortcutme
b84abea670
Order more peers for connected peers simply by reputation 2018-09-02 02:23:46 +02:00
shortcutme
a5fcc7d65f
Sort recent peers by reputation 2018-09-02 02:23:19 +02:00
shortcutme
313d9a4ef9
Need less peer sites with less peers 2018-09-02 02:23:06 +02:00
shortcutme
658aace8f1
Increase peer reputation when found by tracker 2018-09-02 02:22:35 +02:00
shortcutme
49562d43c3
Change peer reputation on connection success and error 2018-09-02 02:22:21 +02:00
shortcutme
4241b62760
Log peer reputation on connect 2018-09-02 02:21:48 +02:00
shortcutme
47fcee4df8
Limit peer reputation 2018-09-02 02:21:38 +02:00
shortcutme
6c2eae29f5
Sort trackers in stats page 2018-09-02 02:20:02 +02:00
shortcutme
3869cb9bf3
Show incoming and outgoing connection separatley in stats page 2018-09-02 02:19:51 +02:00
shortcutme
89c871f171
Fix newsfeed listing during new site added 2018-09-02 02:18:57 +02:00
shortcutme
12c95e6fca
Fix marking peers from zero trackers 2018-09-02 02:18:11 +02:00
shortcutme
2affb9b863
Configurable wokring shared trackers limit 2018-09-02 02:17:42 +02:00
shortcutme
710a85429e
Remove unreliable shared trackers earlier if we have atleast 4 working one 2018-09-02 02:17:18 +02:00
ZeroNet
2efa6f5cb1
Merge pull request #1558 from imachug/cors-fix
Allow 'fileList' (and other) commands on CORS
2018-08-31 19:07:18 +02:00
Ivanq
3f1a103e82 Allow 'fileList' command on CORS 2018-08-31 19:46:45 +03:00
shortcutme
1ce87ecfa8
Rev3576 2018-08-29 19:58:33 +02:00
shortcutme
e102d256b2
Formatting 2018-08-29 19:58:23 +02:00
shortcutme
3b6b79229f
Db table stats 2018-08-29 19:58:18 +02:00
shortcutme
70c1e57ff0
Shared tracker found time to stats page 2018-08-29 19:57:54 +02:00
shortcutme
ad02f384d2
Connection time correction on stats page 2018-08-29 19:57:38 +02:00
shortcutme
0efa6a5816
Time correction to stats page 2018-08-29 19:56:27 +02:00
shortcutme
6edabeeecc
Log hashfield query time 2018-08-29 19:55:50 +02:00
shortcutme
b96559b76f
Reduce connection requirements on startup 2018-08-29 19:55:04 +02:00
shortcutme
3a9ded9315
On startup don't run more than 5 checkSite at the same time 2018-08-29 19:54:31 +02:00
shortcutme
ee97eb6d27
Calculate media time correction from connections 2018-08-29 19:53:44 +02:00
shortcutme
16f7dafcdf
Only record offline internet if there was message received before 2018-08-29 19:53:24 +02:00
shortcutme
1cce926ef8
Record handshake time for connections 2018-08-29 19:52:55 +02:00
shortcutme
1cf50e5fcd
Fix chart collection when there is no site 2018-08-29 19:52:24 +02:00
shortcutme
d8654edd2c
Fix comment 2018-08-29 19:52:10 +02:00
shortcutme
f3b97dedc8
Fix time_found record for tracker stats 2018-08-29 19:51:26 +02:00
shortcutme
b45bbff97c
Rev3571 2018-08-27 11:51:07 +02:00
shortcutme
23284e1f35
Reduce the reannounce to unreliable trackers not just single announces 2018-08-27 11:50:53 +02:00
shortcutme
c9c6a4b867
Less frequent reannounce to zero trackers 2018-08-27 11:50:13 +02:00
shortcutme
069c59d3d7
Only allow zero trackers to be shared 2018-08-27 11:49:24 +02:00
shortcutme
4f2352355f
Return True when adding new tracker 2018-08-27 11:49:05 +02:00
shortcutme
984f50b792
Working tracker list default type 2018-08-27 11:48:52 +02:00
shortcutme
426309a8f5
Stop discovering new trackers after 5 working one 2018-08-27 11:48:39 +02:00
shortcutme
b4b4694eb5
Only add one new tracker from one source 2018-08-27 11:48:25 +02:00
shortcutme
5505a8609d
Fix AnnounceShare source code reloading 2018-08-27 11:48:11 +02:00
shortcutme
030ad0a8de
Rev3568 2018-08-26 22:58:56 +02:00
shortcutme
71d05a6fc2
Global stats to reduce tracker request for unreliable trackers 2018-08-26 22:58:27 +02:00
shortcutme
867cf478b1
Log tracker request mode on error 2018-08-26 22:57:34 +02:00
shortcutme
b43a05b662
Don't increase request tracker number before actually sending it 2018-08-26 22:57:09 +02:00
shortcutme
92db3878cf
Don't include skipped trackers to report 2018-08-26 22:56:46 +02:00
shortcutme
b6d11d6be3
Fix request number counting with zero trackers 2018-08-26 22:56:20 +02:00
shortcutme
669572b0e6
Fix udp tracker lib error reporting 2018-08-26 22:55:31 +02:00
shortcutme
5887f90202
Wait handshake done before sending other request to connections 2018-08-26 22:54:45 +02:00
shortcutme
81d50ed3bb
Add trackers to stats page 2018-08-26 22:53:01 +02:00
shortcutme
9bdf3ad0c8
Only log new tacker discovery if it was not added before 2018-08-26 22:52:30 +02:00
shortcutme
0b38d73cc5
AnnounceZero return None on skipped announce due batching 2018-08-26 22:52:21 +02:00
shortcutme
7a3dbf626e
Only share trackers with success in last hour 2018-08-26 22:50:46 +02:00
shortcutme
767ec1795a
Reset shared tracker error number on startup 2018-08-26 22:45:44 +02:00
shortcutme
ecbf230293
Fix site update on non existent sites 2018-08-26 22:44:55 +02:00
shortcutme
839b63e389
Tracker stat skip data with no status information 2018-08-26 22:44:31 +02:00
shortcutme
73078531aa
Rev3565 2018-08-26 02:58:05 +02:00
shortcutme
c5c3f7a667
Don't reannounce site if just added 2018-08-26 02:57:02 +02:00
shortcutme
8738817eab
Fix tor logging on message fail 2018-08-26 02:56:41 +02:00
shortcutme
33877c73bb
Test tracker address validity 2018-08-26 02:56:24 +02:00
shortcutme
0e3698fa2f
Announce to next tracker on fail 2018-08-26 02:55:08 +02:00
shortcutme
65f48800b9
Allow tracker list to be extended by plugins 2018-08-26 02:53:39 +02:00
shortcutme
7738e6a381
Fix tracker annonce sleeping formatting 2018-08-26 02:53:15 +02:00
shortcutme
ca3b01f898
Allow tracker connection to loopback to same client 2018-08-26 02:52:42 +02:00
shortcutme
e05c432d14
Store if it's tracker connection on connect 2018-08-26 02:52:23 +02:00
shortcutme
53a8c2d574
Fix trayicon compatibility with latest gevent 2018-08-26 02:48:36 +02:00
shortcutme
6783fb9010
Formatting 2018-08-26 02:47:58 +02:00
shortcutme
a7adb517ca
Only return small number of peers if no new site added by the peer 2018-08-26 02:47:43 +02:00
shortcutme
b7a66295f6
Start local peer discovery async to avoid double announce 2018-08-26 02:46:12 +02:00
shortcutme
27f2c44532
AnnounceShare plugin 2018-08-26 02:45:37 +02:00
shortcutme
efd1efad4d
Rev3550 2018-08-16 16:23:04 +02:00
shortcutme
b2ea4c758d
Handle error on file listing API calls 2018-08-16 16:22:17 +02:00
shortcutme
cfce057783
Support streaming bigfile for zip file listing and reading 2018-08-16 16:21:21 +02:00
shortcutme
5854beebc6
Fix Bigfile tell 2018-08-16 16:20:21 +02:00
shortcutme
879eb6295d
BigFile lock seek and read until previous request finished, fix seek relative to bigfile end 2018-08-16 16:20:11 +02:00
eduaddad
3ae761dd9d
Create pt-br.json
translation into brazilian portuguese
2018-08-14 16:59:33 -03:00
shortcutme
f5ab2f63c0
Rev3546 2018-08-13 02:45:02 +02:00
shortcutme
c89170a22d
Allow first local ip find method to fail 2018-08-13 02:44:50 +02:00
shortcutme
84b36e72e4
Prefer non-onion peers when sidebar copy peers to clipboard 2018-08-13 02:43:23 +02:00
ZeroNet
9298922601
Merge pull request #1498 from radfish/PR--fix-log-warn
Fix issues with log messages related to Tor errors
2018-08-09 03:26:54 +02:00
ZeroNet
9913e7198c
Merge pull request #1496 from tangdou1/patch-1
small update in zh.json
2018-08-09 03:19:15 +02:00
redfish
9bd10d5102 TorManager: correct the Tor error log message
On Linux, there is no self-bundled Tor, so the message was not correct
because it was stating that self-bundled Tor was being started.
2018-08-02 23:47:24 +00:00
redfish
4c62840cef TorManager: escalate log error for Tor auth
This errorr is fatal for Tor usage (on Linux). Let's make escalate
it. Also see the previous commit, without which, this error doesn't
even get printed at all.
2018-08-02 23:42:50 +00:00
redfish
e6f0a86c5a main: logging: do not override the warn level
This fixes the very annoying problem where the log messages with
level WARNING are not printed, while log messages with lower
level INFO are printed. This is very confusing behavior and should
be avoided. This was due to this override. If there is too much
logging output in debug mode, then let's deescalate the level
of the frequently-printed log messages down to DEBUG level.
2018-08-02 23:40:44 +00:00
tangdou1
c9da6d2ee2
small update in zh.json
small update in zh.json
2018-08-01 18:05:25 +08:00
shortcutme
f33350a4ef
Rev3542, Trackers file path always relative to executable 2018-07-21 04:25:40 +02:00
shortcutme
debe9959e4
Fix saving browser open setting 2018-07-21 04:24:35 +02:00
shortcutme
a357b021ba
Rev3540 2018-07-19 20:44:25 +02:00
shortcutme
f7099b2bc7
Load trackers file on startup 2018-07-19 20:43:46 +02:00
shortcutme
8d3b1d10d2
Fix typo 2018-07-19 20:43:33 +02:00
shortcutme
f143000f4a
Fix parsing udp trackers with request path 2018-07-19 20:43:14 +02:00
shortcutme
7954caf957
Force reannounce not yet download site on refresh 2018-07-19 20:42:53 +02:00
shortcutme
a07a31a2bb
Copy site url with peers link to sidebar 2018-07-19 20:42:04 +02:00
shortcutme
405394707f
Shorter download site button title 2018-07-19 20:40:55 +02:00
ZeroNet
f13b8d1557
Merge pull request #1479 from vitorio/master
Support removing donation link / custom donation text
2018-07-18 13:58:09 +02:00
shortcutme
6e1f4fada9
Rev3537, Allow to add peers to site with get request 2018-07-17 02:09:14 +02:00
ZeroNet
892ef23ca0
Merge pull request #1487 from rllola/fix-rev-3535
Fix rev 3535 big javascript file
2018-07-16 23:01:12 +02:00
rllola
8e1c0a7fa4 Fix rev 3535 big javascript file 2018-07-16 17:32:18 +02:00
shortcutme
113e7e0d3d
Rev3535 2018-07-16 01:56:37 +02:00
shortcutme
ea619ce99a
Fix tor disabling for tests 2018-07-16 01:56:19 +02:00
shortcutme
e9c7d6a0cc
Add bigfile test for dynamic file allocation 2018-07-16 01:55:58 +02:00
shortcutme
2f57e9cbee
Bigfile test formatting fix 2018-07-16 01:55:41 +02:00
shortcutme
0de16855b0
Merge config js, css 2018-07-16 01:55:15 +02:00
shortcutme
4fedace179
Css for custom tracker proxy field 2018-07-16 01:55:09 +02:00
shortcutme
8d2da6f30b
Add animation helper for config 2018-07-16 01:54:39 +02:00
shortcutme
8f427b727c
Save config storage item for value 2018-07-16 01:54:30 +02:00
shortcutme
f1f0332d22
Config filed for custom socks proxy for trackers 2018-07-16 01:54:07 +02:00
shortcutme
7c0541034a
Restrict port to numbers 2018-07-16 01:53:34 +02:00
shortcutme
e8895a4d76
Only save if values validated 2018-07-16 01:52:51 +02:00
shortcutme
a42bcfceb6
Validate config values before saving 2018-07-16 01:52:27 +02:00
shortcutme
fcda2e8706
Reset restart loading status on weboscket connection 2018-07-16 01:52:10 +02:00
shortcutme
efe3680cd7
Fix typo 2018-07-16 01:51:32 +02:00
shortcutme
272e30d761
Separate config renderer related functions to separate file 2018-07-16 01:51:18 +02:00
shortcutme
30940fad2e
Set value to default one on pending reset 2018-07-16 01:49:12 +02:00
shortcutme
d772280147
Global announcer statistics admin API call 2018-07-16 01:48:27 +02:00
shortcutme
7475fa69fa
Support custom proxy for tracker connections 2018-07-16 01:47:49 +02:00
shortcutme
ec8b53263c
Store last announce error time 2018-07-16 01:36:23 +02:00
shortcutme
0f567385a8
Only check size on file request for smaller files 2018-07-16 01:35:35 +02:00
shortcutme
dae1197ce4
Pass the real file size on bigfile request as the size on the disk can be smaller 2018-07-16 01:34:48 +02:00
shortcutme
1296ab9b60
Only pre-allocate up to 5MB from big files 2018-07-16 01:34:21 +02:00
shortcutme
b1575a979e
Rev3524, Fix saving for single line config values 2018-07-10 04:00:16 +02:00
shortcutme
d677eb1698
Rev3523 2018-07-10 03:46:05 +02:00
shortcutme
71ad1d9906
Properly handle saving on multiline config settings 2018-07-10 03:45:57 +02:00
shortcutme
731b79fc6c
Store copy of variables of list config items to be able to read the original value 2018-07-10 03:45:33 +02:00
shortcutme
e001448adb
Add config link to loading screen 2018-07-10 03:43:57 +02:00
shortcutme
3041064d21
Reload trackers file on value change 2018-07-10 03:43:31 +02:00
shortcutme
30134dbbc9
Store API changeable configuration keys in Config.py 2018-07-10 03:40:56 +02:00
shortcutme
4208885e36
Store pending configuration values 2018-07-10 03:39:33 +02:00
shortcutme
656f48b354
Support open_browser disable even if it's started with start.py 2018-07-10 03:37:38 +02:00
shortcutme
68eb9a37ca
Strip ending / character when using url as function name 2018-07-10 03:36:09 +02:00
shortcutme
6c4ce03d59
Reload trackers file before start downloading new site 2018-07-10 03:34:23 +02:00
shortcutme
86e4679e04
Skip tracker announce on incalid url pattern 2018-07-10 03:34:06 +02:00
shortcutme
71806e6f95
Trackers loaded from trackers_file will be appended to trackers instead of replacing it 2018-07-10 03:33:32 +02:00
shortcutme
7e8a93e974
Load trackers files in announceSites loop 2018-07-10 03:32:37 +02:00
shortcutme
b87ad9cd2f
Fix disabled tor startup 2018-07-10 03:31:39 +02:00
shortcutme
10bab2b6e4
UiConfig plugin 2018-07-10 03:30:47 +02:00
shortcutme
5aab10fab2
Support client restart without updating 2018-07-10 03:28:02 +02:00
shortcutme
77aa23a375
Make UiWebsocket admin_commands and async_commands class variables for easier extension 2018-07-10 03:24:34 +02:00
vitorio
b09da2641e Preserve site address 2018-07-07 10:55:20 -05:00
vitorio
26b0a7d75d Support removing donation link / custom donation test 2018-07-07 01:15:40 -05:00
shortcutme
b6bf38b85c
Rev3504 2018-07-06 22:57:27 +02:00
shortcutme
b6424b4596
Fix sk translation 2018-07-06 22:57:18 +02:00
shortcutme
dc2051fb59
Skip invalid translate files 2018-07-06 22:56:54 +02:00
shortcutme
8bdc61ddcc
Rev3503, Ignore invalid site translation files 2018-07-05 01:59:10 +02:00
ZeroNet
d4a25230ec
Merge pull request #1474 from mkg20001/patch-1
de.json: Fix typo
2018-07-04 01:58:40 +02:00
Maciej Krüger
e548a4b6aa
de.json: Fix typo
Net{ => z}werkverbindung
2018-07-03 23:40:25 +02:00
ZeroNet
8607fe43a6
Merge pull request #1473 from rubo77/patch-1
de.json - correct german translation
2018-07-03 23:15:32 +02:00
Ruben Barkow
718178c1b6
de.json - correct german translation 2018-07-03 21:42:14 +02:00
ZeroNet
930205b1c9
Merge pull request #1469 from Biosias/patch-1
Adding few translations
2018-07-03 13:55:19 +02:00
shortcutme
ec05e6864a
Rev3502, Start fileserver to new greenlet to fix siteDownload and siteAnnounce CLI action 2018-07-02 15:42:16 +02:00
Biosias
e08a702408
Adding few translations 2018-07-02 01:00:42 +02:00
shortcutme
d5b31a5545
Rev3501 2018-06-29 14:20:54 +02:00
shortcutme
811c694f80
Ignore filter includes from removed sites 2018-06-29 14:20:44 +02:00
shortcutme
8775222a61
Add missing word to websocket error message 2018-06-29 14:18:27 +02:00
shortcutme
3aebdae305
Log last announce time on force announce 2018-06-29 14:18:09 +02:00
shortcutme
d3122020b9
Rev3500 2018-06-28 14:07:43 +02:00
shortcutme
822ea1b450
Fix site blacklisting using sidebar 2018-06-28 14:07:06 +02:00
shortcutme
515057c7d0
Update multiuser plugin with new filter commands 2018-06-28 14:06:28 +02:00
shortcutme
54b93febba
Fix included file content leaking to filters.json 2018-06-28 14:05:57 +02:00
shortcutme
5d0600a0af
Rev3499 2018-06-28 02:39:55 +02:00
shortcutme
1ca2b40bf9
Fix IE Edge compatibility on notification button clicks 2018-06-28 02:39:46 +02:00
shortcutme
ff85241962
More detailed not supported browser error message 2018-06-28 02:39:20 +02:00
shortcutme
bc227b5f56
Rev3498, Go back to homepage and less inviting open site button on blocked site page 2018-06-28 02:03:47 +02:00
shortcutme
283231ac6e
Remove renamed Mute plugin 2018-06-25 15:13:56 +02:00
shortcutme
fc46bb65f8
Version 0.6.3, Rev3495 2018-06-25 14:41:34 +02:00
shortcutme
c5ca4dd7b3
Change dead tracker 2018-06-25 14:40:51 +02:00
shortcutme
c493f732f9
New ContentFilter plugin for shared site and user blocklist 2018-06-25 14:35:26 +02:00
shortcutme
a59fb4fd1e
Send file updated event to site on signing 2018-06-25 14:33:14 +02:00
shortcutme
f671e699e6
Reset after_load actions before plugin reload 2018-06-25 14:30:04 +02:00
shortcutme
05fb60f809
Log plugin load time 2018-06-25 14:29:51 +02:00
shortcutme
e564470490
Remove renamed plugin Mute 2018-06-25 14:29:42 +02:00
shortcutme
c7a8a3933e
Display standard http error instead of exception on path security error 2018-06-25 14:28:42 +02:00
shortcutme
e1fdb90da6
Reset filters.json before tests 2018-06-25 14:25:19 +02:00
shortcutme
df0562d6b4
Make sure to sanitize request url 2018-06-25 14:23:38 +02:00
shortcutme
9afc39d5f1
Add signing parameters to sitePublish 2018-06-25 14:22:24 +02:00
shortcutme
4a1c4df861
Prefer PEP8 style 2018-06-25 14:13:05 +02:00
shortcutme
b054ed6e03
SiteAdd admin API call 2018-06-25 14:12:13 +02:00
shortcutme
8a02a51d0c
Rev3478 2018-06-21 21:57:35 +02:00
shortcutme
da64785ea4
Only announce site on http request if not paused 2018-06-21 21:57:25 +02:00
shortcutme
8b91abd0dc
Use FileServer to avoid plugin incompatiblity problems 2018-06-21 21:57:06 +02:00
shortcutme
b6364941a0
Don't start file server twice 2018-06-21 21:56:20 +02:00
shortcutme
4fdd362ed5
Avoid starting multiple discover request for same unknown client 2018-06-21 21:55:32 +02:00
shortcutme
7bff5f562c
Rev3477 2018-06-03 12:47:24 +02:00
shortcutme
3de13a2e6d
Fix tracker statistics 2018-06-03 12:47:17 +02:00
shortcutme
329e885da7
Wait tor connections until tor client startup 2018-06-03 12:46:47 +02:00
shortcutme
d125551c0d
Proritize currently requested site update 2018-06-03 12:46:00 +02:00
shortcutme
250741e431
Fix firefox websocket disconnect on download link click 2018-06-03 12:35:12 +02:00
ZeroNet
22d6a32e4e
Merge pull request #1445 from JeremyRand/trans-proxy
Support accessing ZeroNet via a transparent proxy.
2018-06-02 17:52:12 +02:00
ZeroNet
11c66f6ce4
Merge pull request #1444 from JeremyRand/port-80
Fix 403 error when listening on 127.0.0.1:80.
2018-06-02 17:50:07 +02:00
JeremyRand
4ffd642732
Support accessing ZeroNet via a transparent proxy. 2018-06-02 12:17:10 +00:00
JeremyRand
f7f6b15ef1
Fix 403 error when listening on 127.0.0.1:80. 2018-06-02 10:24:00 +00:00
shortcutme
efcb1715ee
Rev3470 2018-06-01 02:44:10 +02:00
shortcutme
8f5bcdff99
Start file server for cli commands for Tor support. 2018-06-01 02:43:53 +02:00
shortcutme
a0b2a8ba74
Optional connection timeout checker 2018-05-31 19:43:39 +02:00
shortcutme
3013ee083d
Longer timeouts in tor always mode 2018-05-31 19:43:09 +02:00
shortcutme
0ae14f673c
Change skyts tracker address 2018-05-31 19:40:37 +02:00
shortcutme
b4eb09d5e9
Rev3468, Ignore newsfeed items with invalid date_added value 2018-05-30 17:16:45 +02:00
ZeroNet
49d1bc08c3
Merge pull request #1437 from imachug/patch-1
Allow fileQuery as CORS command
2018-05-28 10:47:09 +02:00
ZeroNet
e9e5c41f79
Merge pull request #1439 from imachug/fix-sign-zeroid
Fix signing&publishing file owned by ZeroID/other provider user
2018-05-28 10:38:26 +02:00
Ivanq
fac3721dfd Fix signing&publishing file owned by ZeroID/other provider user. Fixes my old PR lol 2018-05-26 12:15:23 +03:00
Ivanq
e687d5db69
Allow fileQuery as CORS command 2018-05-24 13:16:18 +03:00
ZeroNet
4fa48f7940
Merge pull request #1435 from Radtoo/master
Support dumping sites larger than 2GB by allowing zip64
2018-05-23 13:40:07 +02:00
Radtoo
f7fa770fc5 Support dumping sites larger than 2GB by allowing zip64 2018-05-23 03:48:25 +02:00
ZeroNet
a311366ee7
Merge pull request #1432 from imachug/cors-fix
Add fileList, dirList as CORS commands
2018-05-22 12:16:30 +02:00
ZeroNet
9675ef1293
Merge pull request #1421 from ppsfassa/master
add Japanese
2018-05-22 12:14:42 +02:00
ZeroNet
f004000d5c
Merge pull request #1424 from rwv/patch-1
Update README-zh-cn.md docker conf to port 26552
2018-05-22 12:10:28 +02:00
ZeroNet
9fb7e1b46d
Merge pull request #1413 from saber28/patch-1
Improve Orbot Compatibility
2018-05-22 11:24:27 +02:00
Ivanq
c2f5a12ce1 Add fileList, dirList as CORS commands 2018-05-19 12:15:13 +03:00
Takumi
671fb3476c Re add jp 2018-05-19 17:10:11 +09:00
seedgou
c28a168868
Update README-zh-cn.md docker conf to port 26552 2018-05-17 10:37:45 +08:00
Takumi
3057302baa add Japanese 2018-05-12 17:36:57 +09:00
saber28
94bc33f61c
Improve Orbot Compatibility
Use password auth first to work with orbot
2018-05-05 09:58:14 +08:00
shortcutme
e874730679
Rev3464, Download site as zip 2018-05-02 02:31:31 +02:00
shortcutme
1ae84c11ad
Remove tor files 2018-04-29 15:31:30 +02:00
shortcutme
9cb2bc4825
Rev3465 2018-04-29 14:54:19 +02:00
shortcutme
2bd69b2681
Force reannounce to all trackers after meek bridges enabled 2018-04-29 14:53:31 +02:00
shortcutme
f3b17d4896
Force reannounce if announce is enabled on update 2018-04-29 14:52:56 +02:00
shortcutme
8f5a1ce1b6
Ignore tor data only 2018-04-29 14:52:02 +02:00
shortcutme
2aa0021a08
Rev3463 2018-04-29 13:06:25 +02:00
shortcutme
81ec684025
Show tracker error message on high error percentage 2018-04-29 13:06:07 +02:00
shortcutme
247b89aec5
Fix non-ascii tracker error message logging 2018-04-29 13:05:02 +02:00
shortcutme
8b09a02028
Start ConnectinServer before loading site list 2018-04-29 13:04:38 +02:00
shortcutme
597c5063f3
Rev3462, Fix ConnectionServer testcases 2018-04-29 03:05:36 +02:00
shortcutme
4843719c58
Rev3461 2018-04-29 02:46:11 +02:00
shortcutme
d7c1c0d04c
Tor subprocess check separate function 2018-04-29 02:45:56 +02:00
shortcutme
4fa43fdf60
Trust that shutdown signal will kill tor 2018-04-29 02:45:39 +02:00
shortcutme
cafb9ddcf4
No need to announce if no peer as checkModifications will do 2018-04-29 02:45:10 +02:00
shortcutme
3f6b8def05
Move ConnectionServer listen to separate function to allow TorManager start before connections 2018-04-29 02:44:46 +02:00
shortcutme
40f0ea95ce
Rev3459 2018-04-29 01:02:59 +02:00
shortcutme
ca3b02229f
Fix announcer typo 2018-04-29 01:02:39 +02:00
shortcutme
8039aa3eb1
Report port 1 to trackers as not connectable to improve compatibility 2018-04-29 01:02:24 +02:00
shortcutme
5a494ca50e
Less verbose tracker logging 2018-04-29 01:01:13 +02:00
shortcutme
ef8e8c5a30
New tracker 2018-04-29 01:00:50 +02:00
shortcutme
a19629d105
Start tor_manager with ConnectionServer 2018-04-29 01:00:37 +02:00
shortcutme
6e598c74f5
Fake utorrent peer_id to avoid possible tracker ban 2018-04-29 00:59:45 +02:00
shortcutme
35cf4f3009
Rev3456, Fix SiteAnnouncer import 2018-04-28 22:31:54 +02:00
shortcutme
150d3df9b5
Rev3455 2018-04-28 22:10:26 +02:00
shortcutme
ceff73ee5b
Make AnnounceLocalPlugin and AnnounceZeroPlugin compatible with SiteAnnouncer class 2018-04-28 22:10:16 +02:00
shortcutme
595b2e40d9
Merge ui js, css 2018-04-28 22:08:43 +02:00
shortcutme
9d09401dc1
Rename Permisson Grant to Accept 2018-04-28 22:08:34 +02:00
shortcutme
d9ad3ae2c9
Disabled button formatting 2018-04-28 22:05:51 +02:00
shortcutme
26cb600ae3
Display tor bridge enable button if all tracker connection fails 2018-04-28 22:05:38 +02:00
shortcutme
435210b73c
Add tracker info to loading screen 2018-04-28 22:04:58 +02:00
shortcutme
8dc465f244
Don't readd wrapper_nonce of site size error as we generate a new one on reload 2018-04-28 22:02:29 +02:00
shortcutme
8e708dc02a
Log wrapper nonce errors 2018-04-28 22:02:10 +02:00
shortcutme
b53b6723cc
Allow tor_use_bridges and trackers_proxy to be set with configSet 2018-04-28 22:01:48 +02:00
shortcutme
af4b4ae85c
Get new wrapper nonce API command to proper reload iframe content 2018-04-28 22:01:12 +02:00
shortcutme
0e84bf95da
AnnouncerInfo API command for tracker status 2018-04-28 22:00:15 +02:00
shortcutme
8e93470b94
Add tor bridge info to serverinfo 2018-04-28 21:59:39 +02:00
shortcutme
7cdb1caaf2
Fix websocket sending on error 2018-04-28 21:59:27 +02:00
shortcutme
bf346a6ed1
AnnouncerChanges event channel for websocket for tracker changes 2018-04-28 21:59:12 +02:00
shortcutme
c0101933bd
Call pex announce from announcer class 2018-04-28 21:54:03 +02:00
shortcutme
24a7c26819
Fix tor status logging with foreign languages 2018-04-28 21:53:36 +02:00
shortcutme
13019941b3
Make sure to shutdown tor client if we started it 2018-04-28 21:53:12 +02:00
shortcutme
a0451065a2
Start with bridges if tor_use_bridges enabled 2018-04-28 21:52:01 +02:00
shortcutme
54b87c19b1
Fix TorManager without main module loaded 2018-04-28 21:51:35 +02:00
shortcutme
8828f21f2e
Always create TorManager object with ConnectionServer, move tormanager start to sperate function 2018-04-28 21:51:14 +02:00
shortcutme
7fee135bf5
Check if we can enable meek bridges 2018-04-28 21:50:01 +02:00
shortcutme
b69e466de0
Add loading of new SiteAnnounce class 2018-04-28 21:49:31 +02:00
shortcutme
37fcf2fed7
Fix deletion with missing content.json files 2018-04-28 21:49:12 +02:00
shortcutme
8f69575b95
Fix SiteManager logging message 2018-04-28 21:48:36 +02:00
shortcutme
2f71c2b784
Refactor and move announcer code to separate class 2018-04-28 21:48:21 +02:00
shortcutme
f3a809a495
Fix publish logging message 2018-04-28 21:47:43 +02:00
shortcutme
ad955b157b
My port and ip is no longer necessary for updates 2018-04-28 21:47:33 +02:00
shortcutme
a87b6c7022
Announce on update if no peers 2018-04-28 21:47:11 +02:00
shortcutme
5104d0d250
Always have connectionserver for site 2018-04-28 21:46:50 +02:00
shortcutme
add83c4c7a
Missing content.json is a debug message 2018-04-28 21:45:28 +02:00
shortcutme
42b9ec819b
More verbose dbdict json loading logging 2018-04-28 21:45:13 +02:00
shortcutme
e93f9eb080
Use tor connection for trackers if trackers_proxy enabled 2018-04-28 21:44:06 +02:00
shortcutme
0244db9182
Fix config save line parsing without values 2018-04-28 21:43:22 +02:00
shortcutme
461f9c7ad6
New settings: trackers_proxy, tor_use_bridges 2018-04-28 21:42:57 +02:00
shortcutme
fd8e1ed623
Rev3417 2018-04-18 22:07:14 +02:00
shortcutme
79b89f8a1b
Don't create new user on websocket event 2018-04-18 22:06:58 +02:00
shortcutme
6b33ad8a32
Handle cases when the user does not have site added yet 2018-04-18 22:06:18 +02:00
shortcutme
40cf4f2c2a
Don't override create_user parameter 2018-04-18 22:06:00 +02:00
shortcutme
d5ef1488b2
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-04-18 21:40:33 +02:00
shortcutme
3beab611a3
Rev3415, Fix FireFox wrapper_nonce url injection 2018-04-18 21:40:29 +02:00
ZeroNet
89a67c0749
Merge pull request #1377 from rllola/docker-port
Force the use of port 15441 inside the container
2018-04-18 13:31:34 +02:00
shortcutme
fd842c43a6
Rev3412, Change no longer working trackers 2018-04-18 13:13:20 +02:00
shortcutme
e51788ac05
Make sure that we close UDP sockets of local peer discovery 2018-04-18 13:11:50 +02:00
rllola
9b046ecc75 Change to port 26552 2018-04-18 04:10:11 +02:00
shortcutme
aa68e69a18
Rev3411 2018-04-12 19:28:59 +02:00
shortcutme
2e573e95e5
Fix multiuser plugin deauth 2018-04-12 19:26:44 +02:00
shortcutme
e95bc31def
Fix logging and shutdown 2018-04-12 19:25:50 +02:00
shortcutme
4eb843fd8c
Delay saving users.json 2018-04-12 19:25:13 +02:00
shortcutme
05db08c8d2
Move new site auth address generation to separate function 2018-04-12 19:24:21 +02:00
shortcutme
513de18af5
Remove unused code 2018-04-12 19:22:38 +02:00
shortcutme
151a6ce9e3
UserManager exclusive logging 2018-04-12 19:22:06 +02:00
shortcutme
d4a1764d20
Rev3408, Use fixed 15441 port in tor always mode 2018-04-06 18:18:10 +02:00
ZeroNet
59c6ee7ade
Merge pull request #1378 from imachug/security
Fix mergerSiteAdd typo
2018-04-06 10:48:11 +02:00
Ivanq
4fbfa1d579 Fix mergerSiteAdd typo 2018-04-06 11:40:23 +03:00
shortcutme
5285699a21
Rev3407, Fix connection timeout checker 2018-04-06 00:51:14 +02:00
rllola
75879de47a Force the use of port 15441 inside the container 2018-04-06 00:25:53 +02:00
shortcutme
e23dc5bda3
Rev3406 2018-04-04 15:34:21 +02:00
shortcutme
8998bf85bd
Handle connection errors when running peerPing command 2018-04-04 15:34:07 +02:00
shortcutme
7b1601c840
Ping port 15441 by default 2018-04-04 15:33:39 +02:00
shortcutme
026b6a4b01
Handle shutdown request properly if not file server is running 2018-04-04 15:33:25 +02:00
shortcutme
d927e85eca
ConnectionServer is not running by default 2018-04-04 15:33:02 +02:00
shortcutme
a877a9fd91
Proper cleanup local announcer listener after testcase 2018-04-04 15:31:55 +02:00
shortcutme
abc481604f
Rev3404, Fix bigfile upload 2018-04-04 12:39:46 +02:00
shortcutme
c703458e00
Rev3403, Fix uploading small files with bigfile plugin 2018-04-04 10:24:38 +02:00
tangdou1
75861db84b Update Chinese translation (#1370)
* Update zh.json

* Update zh.json
2018-04-04 03:50:04 +02:00
shortcutme
223957084a
Rev3402 2018-04-03 14:51:11 +02:00
shortcutme
8c0c0868e3
Add SiteCmd CLI command for ZeroFrame API calls 2018-04-03 14:50:58 +02:00
shortcutme
a65d21d7e4
Fix site cleanup after test 2018-04-03 14:50:09 +02:00
shortcutme
82e6bc5d31
Use websocket connection instead of fileserver to execute commands from CLI 2018-04-03 14:49:40 +02:00
shortcutme
09f1ad0625
Add websocket client to allow API command requests from CLI 2018-04-03 14:47:43 +02:00
shortcutme
852aaae52e
Randomize fileserver port 2018-04-03 14:45:04 +02:00
shortcutme
270922b460
Fix implicit ssl connection typo 2018-04-03 14:43:41 +02:00
shortcutme
b39da7e356
Change unreliable trackers 2018-04-03 14:43:12 +02:00
shortcutme
a438803a5a
Change zero.booth.moe tracker to https port 2018-04-03 14:42:16 +02:00
shortcutme
1b8b3cf1ee
Fix site loading with Zeroname plugin 2018-04-03 14:40:47 +02:00
shortcutme
c2176ba27d
Add current fileserver port to stats page 2018-04-03 14:40:29 +02:00
dqwyy
a69f898e12 Update zh-tw.json (#1360)
* Update zh-tw.json

* Update zh-tw.json
2018-03-31 18:21:28 +02:00
shortcutme
0139d862b5
Rev3395 2018-03-29 03:20:08 +02:00
shortcutme
0459c75dc0
Make file verification process handle correctly different files with same has_id by using new isDownloaded function 2018-03-29 03:19:26 +02:00
shortcutme
547242b1cb
Make siteVerify CLI command compatible with new verifyFiles return value 2018-03-29 03:17:45 +02:00
shortcutme
b8d83c7ec4
Mark site with has_bigfile if new bigfile found 2018-03-29 03:16:47 +02:00
shortcutme
5c644d1b36
Make Bigfile plugin compatible with optionalDownloaded changes 2018-03-29 03:15:49 +02:00
shortcutme
7d3d0f7ceb
Add test for different files with same hash_id 2018-03-29 03:13:37 +02:00
shortcutme
101d2ea9b6
Check optional file downloaded status from sql if optionalmanager is present 2018-03-29 02:59:59 +02:00
shortcutme
af7c7da735
Optional file downloaded checking by separate function 2018-03-29 02:59:11 +02:00
shortcutme
c1397bbaf7
Attach optionalmanager events to ContentManager instead of WorkerManager 2018-03-29 02:58:24 +02:00
shortcutme
16a9f38844
Use renamed optionalRemoved function 2018-03-29 02:57:06 +02:00
shortcutme
508d2472e9
Only verify content after valid signiture 2018-03-29 02:55:53 +02:00
shortcutme
f162987a4f
Rename optionalRemove to optionalRemoved and accept hash only by id 2018-03-29 02:54:52 +02:00
shortcutme
17be72e55e
Process delayed queries every second 2018-03-29 02:50:23 +02:00
shortcutme
d61cd96d8f
VerifyFiles call returns more detailed statistics 2018-03-29 02:49:06 +02:00
shortcutme
6daf583b4b
Only log detailed message type error with debug_socket argument 2018-03-29 02:45:33 +02:00
shortcutme
b23a4c8288
Only apply outline to iframe when sidebar opened 2018-03-29 02:44:43 +02:00
shortcutme
b1240426cd
For 3d rending to progress bar 2018-03-29 02:44:00 +02:00
shortcutme
30ab2cf9a7
Transform progressbar with scale instead of changing width 2018-03-29 02:42:57 +02:00
shortcutme
0c985a5fda
Use current user cert to query file rules for non-existent files 2018-03-29 02:41:30 +02:00
shortcutme
049d326836
Test optionalmanager with travis 2018-03-29 02:39:51 +02:00
ZeroNet
960bf3f3bf
Merge pull request #1328 from tangdou1/patch-1
update Chinese translation (simplified) for new functions
2018-03-22 01:30:18 +01:00
ZeroNet
edf959f26d
Merge pull request #1329 from tangdou1/patch-2
update Chinese translation (traditional) for new functions
2018-03-22 01:29:59 +01:00
shortcutme
077d9d3918
Increase selenium test timeouts 2018-03-21 21:40:44 +01:00
shortcutme
76c4a6bb7c
Rev3377, Fix sidebar animation 2018-03-21 18:05:22 +01:00
shortcutme
ee81aea2fa
Wait until title in link security test 2018-03-20 22:27:32 +01:00
shortcutme
0cf6fb2c9d
Rev3376 2018-03-20 21:59:34 +01:00
shortcutme
9d3913ed70
Also delete piecemap on bigfile deletion 2018-03-20 21:58:51 +01:00
shortcutme
d275dfea2f
Log 403 error as error 2018-03-20 21:55:45 +01:00
shortcutme
11d8485399
Move file modification permission check to separate function 2018-03-20 21:55:12 +01:00
shortcutme
6b926b12a4
Don't try to delete optional file twice on fileDelete API command 2018-03-20 21:54:33 +01:00
shortcutme
9adec79401
Formatting 2018-03-20 21:53:39 +01:00
shortcutme
c3b146611b
Rev3372, Cosmetic changes on open site directory button 2018-03-19 16:05:14 +01:00
ZeroNet
a454f3de6e
Merge pull request #1325 from imachug/show-directory
Add "Open site directory" button
2018-03-19 15:56:02 +01:00
shortcutme
b29d17d39a
Rev3371 2018-03-19 02:58:53 +01:00
shortcutme
ff3fdd4c72
Get privatekey from master seed CLI action 2018-03-19 02:58:38 +01:00
shortcutme
0533f29e7a
Only recover file piecefield if we already hashed it 2018-03-19 02:57:54 +01:00
shortcutme
75adfebf9f
Rev3370 2018-03-18 21:27:35 +01:00
shortcutme
e96435378a
Fix typo 2018-03-18 21:27:26 +01:00
shortcutme
ccdfe77356
Display more detailed info on content sign error 2018-03-18 21:27:04 +01:00
shortcutme
adf39b6f6a
Avoid loading user content.json file on isArchived check 2018-03-18 21:26:20 +01:00
shortcutme
ad1d81dccf
Cache inner_path to sha512 hash for bigfiles to avoid loading content.json every time 2018-03-18 21:25:28 +01:00
shortcutme
8828629a30
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-03-14 22:34:48 +01:00
shortcutme
1ead9b59ba
Rev3367 2018-03-14 22:34:27 +01:00
shortcutme
c401cabee7
Only start separate HS for every site in tor always mode 2018-03-14 22:33:41 +01:00
shortcutme
1549f2aa4d
Don't share global HS with any site 2018-03-14 22:33:21 +01:00
shortcutme
89beb12d59
Set up HS for global at startup 2018-03-14 22:32:49 +01:00
shortcutme
4083e552fd
Formatting 2018-03-14 22:32:28 +01:00
shortcutme
3d7dea52a0
Always load my sites from sites.json 2018-03-14 22:32:15 +01:00
shortcutme
c5f77a1c38
Handle global onion address correctly in needConnections 2018-03-14 22:31:58 +01:00
shortcutme
3561ddf7d3
Do check needConnection for evey site after startup to have up to date protected ip list 2018-03-14 22:31:21 +01:00
shortcutme
81e96d25ba
Handle request using global onion address 2018-03-14 22:30:08 +01:00
shortcutme
1ad966bd80
In passive mode if we have send onion address for every connection not just for tor network 2018-03-14 22:29:00 +01:00
shortcutme
4f472982da
Use broken ssl ip list instead of peer_id 2018-03-14 22:26:59 +01:00
shortcutme
f1396b65b9
Blacklist myself on peer id match 2018-03-14 22:26:08 +01:00
shortcutme
ba12489c34
Log my and remote handshake 2018-03-14 22:25:53 +01:00
shortcutme
4586d3be78
Send my local time as int in the handshake 2018-03-14 22:25:27 +01:00
shortcutme
2204e0cf9c
Fix message parsing after data left in unpacker 2018-03-14 22:24:38 +01:00
shortcutme
8787774764
Use implicit ssl for connections 2018-03-14 22:24:06 +01:00
shortcutme
feb00d5b8a
Option to force encryption to all outgoing connection 2018-03-14 22:22:45 +01:00
shortcutme
660fc982ca
Fix packed file request 2018-03-14 22:22:04 +01:00
shortcutme
1189c76691
Add existing bigfiles to piecefield if they were downloaded outside of ZeroNet 2018-03-14 22:21:45 +01:00
tangdou1
27a3414a27
Update zh-tw.json for new function 2018-03-13 16:12:04 +08:00
tangdou1
4d717a5c19
Update zh.json for new functions
Update zh.json for new functions --"Sign and publish" and incoming function "Open site directory"
2018-03-13 15:17:58 +08:00
tangdou1
e7744eace9
update zh.json
update zh.json for incoming "Open site directory" function
2018-03-13 15:05:44 +08:00
ZeroNet
3bdb6a237f
Merge pull request #1326 from imachug/siteinfo-cors
'siteInfo' can be used as 'actionAs' argument for CORS sites
2018-03-11 09:47:05 +01:00
Ivanq
98dc46e01a 'siteInfo' can be used as 'actionAs' argument for CORS sites 2018-03-11 11:21:54 +03:00
Ivanq
a88f56bec3 Add 'Open site directory' button 2018-03-11 11:14:17 +03:00
shortcutme
fbc10b8e32
Rev3356 2018-03-10 02:06:09 +01:00
shortcutme
42fd7b216d
Don't allow siteSetAutodownloadBigfileLimit for proxies 2018-03-10 02:05:03 +01:00
shortcutme
511731f0b4
Add current timestamp to handshake for future time consensus feature 2018-03-10 02:04:14 +01:00
shortcutme
ad23021b29
More correct title for bad files on sidebar 2018-03-10 02:03:30 +01:00
shortcutme
05a37b3a9c
Display local peers number in sidebar 2018-03-10 02:03:12 +01:00
shortcutme
8ca368f9c7
Bigfile autodownload size limit field to sidebar 2018-03-10 02:02:58 +01:00
shortcutme
dd924f389f
Display and change per-site bigfile autodownload with sidebar 2018-03-10 02:01:49 +01:00
shortcutme
bbb54d6a6a
Support per site max autodownload bigfile size limit changing via API 2018-03-10 02:00:51 +01:00
shortcutme
96e9cc9c32
Correct cli settings help 2018-03-10 02:00:12 +01:00
shortcutme
b1f16857fc
Support per-site auto download bigfile size limit 2018-03-10 01:59:55 +01:00
shortcutme
738fd1a09b
Rev3354, Fix ajax loading files from archives 2018-03-09 15:01:45 +01:00
shortcutme
645249afa9
Rev3353, Pass arguments of storage walk, Email notify of build fail 2018-03-08 14:27:40 +01:00
shortcutme
a51d794885
Rev3352 2018-03-08 14:20:18 +01:00
shortcutme
9d1f491a89
More visible sidebar scrollbar 2018-03-08 14:19:42 +01:00
shortcutme
e8a0d56ff8
Support fileList command of archives 2018-03-08 14:18:55 +01:00
shortcutme
7048987157
Rev3351, Fix sites with utf8 title 2018-03-07 10:23:13 +01:00
shortcutme
e03731fd24
Allow html formatting in wrapper prompt display 2018-03-07 03:10:13 +01:00
shortcutme
7097859b79
Rev3350 2018-03-06 12:09:54 +01:00
shortcutme
e87df8a57a
NOSANDBOX is as dangerous as ADMIN command 2018-03-06 12:09:39 +01:00
shortcutme
982fb27f58
Close notification on input enter 2018-03-06 12:07:07 +01:00
shortcutme
0d1a5846a1
Merge sidebar js 2018-03-06 12:06:21 +01:00
shortcutme
b9e79f8d98
Fix sidebar navigation error 2018-03-06 12:05:58 +01:00
shortcutme
666ef49924
sidebarGetHtmlTag is an admin command 2018-03-06 12:05:08 +01:00
shortcutme
d2ea8a001f
Remove unused private key input field from sidebar 2018-03-06 12:04:49 +01:00
shortcutme
16efba2b91
Merge wrapper js 2018-03-06 12:03:10 +01:00
shortcutme
e93b5c3c1c
Create wrapper html tags based on attributes instead of raw html 2018-03-06 12:02:39 +01:00
shortcutme
9dabd1f344
Wrapper escape apos characters 2018-03-06 12:01:39 +01:00
shortcutme
e96dd14e0d
Display wrapper security errors and fix Firefox navigation blank pages 2018-03-06 12:01:21 +01:00
shortcutme
3e970df09b
Simple replace wrapper template variables instead of python formatting to allow use braces 2018-03-06 12:00:30 +01:00
shortcutme
b0a8c4d278
Change http headers from list to dict 2018-03-06 11:58:56 +01:00
shortcutme
b55832df34
Fix local peer discovery SO_REUSEPORT exception on older kernels 2018-03-06 11:51:49 +01:00
shortcutme
4c7013644f
Rev3340 2018-02-27 02:49:04 +01:00
shortcutme
4859ffdf54
We are compatible with every msgpack version again 2018-02-27 02:48:34 +01:00
shortcutme
bca5d8a6c5
Use msgpack pip package everywhere 2018-02-27 02:48:15 +01:00
shortcutme
af57083afd
Handle ip change on onion connection correctly 2018-02-27 02:46:56 +01:00
shortcutme
f10233a0a6
New msgpack compatible stream handling 2018-02-27 02:46:26 +01:00
shortcutme
4b9455e84d
Still not works on latest msgpack 2018-02-23 16:26:27 +01:00
shortcutme
9305612419
Use renamed msgpack pip package instead msgpack-python 2018-02-23 16:05:03 +01:00
shortcutme
357fd895bf
Add msgpack test 2018-02-23 15:44:07 +01:00
shortcutme
d7ae583473
msgpack bug fixed in 0.5.6 2018-02-23 15:43:40 +01:00
shortcutme
f8f4718474
List pip package versions after install 2018-02-23 15:43:21 +01:00
shortcutme
304d2f0874
Due to a bug it does not works on msgpack 0.5.5 2018-02-23 02:25:50 +01:00
shortcutme
bda31aea59
Rev3337, Fix big site download button 2018-02-22 23:34:18 +01:00
shortcutme
dea669ac26
Rev3335 2018-02-21 03:15:16 +01:00
shortcutme
40693471e9
Merge sidebar and wrapper js 2018-02-21 03:15:04 +01:00
shortcutme
bee8aac0cc
Don't allow NOSANDBOX permission on a proxy as it can leak cookies 2018-02-21 03:14:43 +01:00
shortcutme
2f2c49cc47
Make multiuser plugin compatible with wrapper modifications 2018-02-21 03:14:15 +01:00
shortcutme
b57a9f5c58
Make cert selection compatible with wrapper modifications 2018-02-21 03:13:27 +01:00
shortcutme
6afe2dd720
New NOSANDBOX permission to remove sandboxed iframe restrictions 2018-02-21 03:12:51 +01:00
shortcutme
aef3ecc3f2
Stop page load if opener is present 2018-02-21 03:11:50 +01:00
shortcutme
01ce86ce18
Don't display permission request if site already has 2018-02-21 03:10:23 +01:00
shortcutme
99362c78bf
Move handleMessage to separate function 2018-02-21 03:09:48 +01:00
shortcutme
c0bf9a9a76
Add cmd function to Wrapper 2018-02-21 03:09:36 +01:00
shortcutme
1833b3e89f
Remove logging injected html 2018-02-21 03:09:01 +01:00
shortcutme
6b71f91775
Verify mouse and keyboard events to avoid non-user verification on notification prompts 2018-02-21 03:08:52 +01:00
shortcutme
5275988f37
Move isProxyRequest and gotoSite to minimal ZeroFrame wrapper 2018-02-21 03:06:48 +01:00
shortcutme
93162beaa0
Allow to set get parameter to reload 2018-02-21 03:06:21 +01:00
shortcutme
61699c7477
Allow small tag in messages 2018-02-21 03:05:11 +01:00
shortcutme
a1a2434d98
Rename wrapper onLoad to onPageLoad 2018-02-21 03:05:02 +01:00
shortcutme
fd56ddaa54
Remove wrapper object reference before loading iframe to enhance security 2018-02-21 03:03:01 +01:00
shortcutme
c438b9f8a5
Create a restricted ZeroFrame wrapper 2018-02-21 03:02:00 +01:00
shortcutme
91e83b3397
Fix missing earth on sidebar 2018-02-21 03:00:07 +01:00
shortcutme
50bfc8db09
Sidebar save sidebar object to local variable 2018-02-21 02:59:41 +01:00
shortcutme
3d0a20452f
Fix site archived download test 2018-02-20 10:18:35 +01:00
shortcutme
b60e6a7d85
Version 0.6.2 changelog 2018-02-18 06:38:42 +01:00
shortcutme
c5b8495477
Rev3329 2018-02-18 05:49:35 +01:00
shortcutme
809632794f
Allow broadcast to fail 2018-02-18 05:49:26 +01:00
shortcutme
62ecc1cbc1
Rename Unique to site to No certificate 2018-02-18 05:46:49 +01:00
shortcutme
cd822156c9
Rev3328, Fix CLI siteDownload, siteAnnounce, siteNeedFile commands 2018-02-13 13:18:40 +01:00
shortcutme
e85c5e3b36
Rev3327, Add compatbility with new msgpack version 2018-02-13 01:35:21 +01:00
shortcutme
194d57c85f
Run plugin tests until first fail 2018-02-13 00:30:24 +01:00
shortcutme
02ab6d8f59
Rev3326 2018-02-12 17:07:50 +01:00
shortcutme
a548426c39
Formatting 2018-02-12 17:06:36 +01:00
shortcutme
5f851c7880
Maximum 10 findhash in one round 2018-02-12 17:06:18 +01:00
shortcutme
f91e264889
Only try peers that is not working currently 2018-02-12 17:05:58 +01:00
shortcutme
514f8396b7
Add missing import for port checking 2018-02-12 17:05:20 +01:00
shortcutme
d5eac963a9
Increase local peer timeout 2018-02-12 17:04:40 +01:00
shortcutme
c39ff89fab
Read only what we need 2018-02-12 14:28:45 +01:00
shortcutme
3f19f64efd
Properly recover extra data from unpacker 2018-02-12 14:27:38 +01:00
shortcutme
9135a1a1cc
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-02-11 01:48:21 +01:00
shortcutme
39366bfbf1
Rev3323, Fix bigfile download to non-existent directory 2018-02-11 01:48:17 +01:00
ZeroNet
5eeec0a828
Merge pull request #1281 from RedbHawk/master
Added README-ru.md file + new line in original readme.md
2018-02-10 21:19:59 +01:00
RedbHawk
4f28a0f84b Added README-ru.md 2018-02-10 22:51:20 +04:00
shortcutme
56f057143e
Rev3321 2018-02-10 15:34:01 +01:00
shortcutme
39568737dd
Tor connect error and uPnP punch error are not critical 2018-02-10 15:33:54 +01:00
shortcutme
13e0d9b306
Configurable file logging level 2018-02-10 15:32:13 +01:00
shortcutme
d6b7159db1
Rev3319 2018-02-10 01:09:16 +01:00
shortcutme
2575476086
Some trackers does not accept port 0, so we send port 1 as not-connectable 2018-02-10 01:08:31 +01:00
shortcutme
211d68f590
Only parse dict result from udp tracker 2018-02-10 01:08:20 +01:00
shortcutme
3e51b888cb
Add left bytes to request to improve tracker compatibility 2018-02-10 01:04:23 +01:00
shortcutme
ff8f41c1eb
Request less peers in update mode 2018-02-10 01:03:49 +01:00
shortcutme
c6fd61ddf3
Don't display warnings if not in debug mode 2018-02-10 01:01:15 +01:00
shortcutme
9ca4b823bb
Add tracker countries 2018-02-10 01:00:50 +01:00
shortcutme
f513737628
Change to more reliable trackers 2018-02-10 01:00:35 +01:00
shortcutme
90051972d4
Don't log BroadcastServer shutdown socket closing 2018-02-10 00:58:42 +01:00
shortcutme
6fa37c618b
Fix announce time limit typo 2018-02-10 00:58:05 +01:00
shortcutme
47db295088
Rev3318 2018-02-09 17:47:58 +01:00
shortcutme
6405ca5cef
Start LocalAnnouncer for testing 2018-02-09 17:47:18 +01:00
shortcutme
2ba74d9232
Don't start broadcast server by default on testing 2018-02-09 17:46:33 +01:00
shortcutme
ed09595a87
More verbose logging on BroadcastServer shutdown 2018-02-09 17:46:09 +01:00
shortcutme
7c35bcdead
Don't response if server is stopped 2018-02-09 17:45:43 +01:00
shortcutme
189627c89e
Handle situation when binding fails 2018-02-09 17:45:12 +01:00
shortcutme
07bf8ef3b1
Allow udp port reuse 2018-02-09 17:44:53 +01:00
shortcutme
32d902d37f
Send discover request delayed on unknown peer discover request to allow the reponse arrive first 2018-02-09 17:43:33 +01:00
shortcutme
3028a8ebc9
Rev3313, Remove local announcer binding to ip to make test pass on linux 2018-02-09 14:15:43 +01:00
shortcutme
5c503203dc
Add automatized test of AnnounceLocal 2018-02-09 11:53:39 +01:00
shortcutme
644f65b5e4
Version 0.6.2, Rev3312 2018-02-09 11:42:44 +01:00
shortcutme
f593199af7
Add metavar to cli argument help 2018-02-09 11:42:31 +01:00
shortcutme
26a5f12a8e
Generalize local announcer logging 2018-02-09 11:42:17 +01:00
shortcutme
f3257a6743
Fix announcing without local announcer 2018-02-09 11:42:08 +01:00
shortcutme
9f35efc31d
Revert "Version 0.6.2, Rev3310"
This reverts commit 98c6add637.
2018-02-09 11:39:36 +01:00
shortcutme
98c6add637
Version 0.6.2, Rev3310 2018-02-08 18:16:50 +01:00
shortcutme
3904dcda39
Add comment for reputation 2018-02-08 18:15:32 +01:00
shortcutme
6376f7dd56
AnnounceLocal plugin 2018-02-08 18:14:33 +01:00
shortcutme
ae0a78dfb1
Message from local peer does not means internet connection 2018-02-08 18:12:08 +01:00
shortcutme
1ad021ffa9
Fix comment formatting 2018-02-08 18:11:56 +01:00
shortcutme
ee6ab8e82a
Store site manager to file server 2018-02-08 18:11:45 +01:00
shortcutme
b56c985a63
FileServer accept plugins 2018-02-08 18:09:57 +01:00
shortcutme
abbf6ae2c8
Fix peer added count 2018-02-08 18:08:08 +01:00
shortcutme
403ec56ef8
Remove from recent peers of peer remove 2018-02-08 18:07:09 +01:00
shortcutme
a6e67fa9c3
Generalized tracker result log format for pex 2018-02-08 18:06:45 +01:00
shortcutme
b6a401d697
Get loading status based on property 2018-02-08 18:06:19 +01:00
shortcutme
23be1d18a4
Store site list change time 2018-02-08 18:05:50 +01:00
shortcutme
d721d459eb
Sites always a dict to keep the reference 2018-02-08 18:05:23 +01:00
shortcutme
e1dd0f0979
Only recover sites from sites.json that had peers 2018-02-08 18:04:41 +01:00
shortcutme
866947c445
Fix symlinked data site deletion 2018-02-08 18:03:55 +01:00
shortcutme
8ff3bbc9a7
Local ip not added to ips 2018-02-08 18:02:40 +01:00
shortcutme
498191261c
Don't log local ips on query 2018-02-08 18:02:25 +01:00
shortcutme
f9091ea951
Don't connect to myself 2018-02-08 18:01:48 +01:00
shortcutme
8b9d75d726
Don't mark passive local connections as not connectable 2018-02-08 18:01:34 +01:00
shortcutme
7e4a4459b4
Don't multiplex local connection 2018-02-08 17:59:27 +01:00
shortcutme
70fd33e587
Message from local peer does not means internet connection 2018-02-08 17:58:44 +01:00
shortcutme
a265c2a7ca
Pass peer discovery source to addPeer 2018-02-08 17:57:26 +01:00
shortcutme
fee5766abf
Move config import to right place 2018-02-08 17:54:38 +01:00
shortcutme
03573e46f5
Use pregenerated address hash 2018-02-08 17:54:27 +01:00
shortcutme
64b4789bc1
Generalize tracker logging 2018-02-08 17:54:09 +01:00
shortcutme
13e651c822
Store and prefer recent peers from trackers and local peer discovery 2018-02-08 17:53:17 +01:00
shortcutme
7d3fd6f5b6
Only add recent peers if there is more 2018-02-08 17:51:44 +01:00
shortcutme
0c91fd396e
De-duplicate peers before publishing 2018-02-08 17:51:10 +01:00
shortcutme
1827e1e033
Force announce on startup 2018-02-08 17:50:40 +01:00
shortcutme
771dce4c8c
Pre-generate site address hash 2018-02-08 17:50:23 +01:00
shortcutme
ab2fe909f0
Prefer connected workers 2018-02-08 17:49:40 +01:00
shortcutme
6fb9c6ef05
Rev3234, Ignore unknown characters from connection logging 2018-01-30 18:59:26 +01:00
shortcutme
9b41950e4c
Rev3233 2018-01-30 14:29:57 +01:00
shortcutme
bc09b6280b
Add index.html as default inner_path to uirequest 2018-01-30 14:29:38 +01:00
shortcutme
3e7a4f593a
Fix tor PEX test as private peers no longer got exchanged 2018-01-30 14:29:10 +01:00
shortcutme
679a88c095
Rev3232 2018-01-30 14:00:39 +01:00
shortcutme
97d1d0d63b
Fix cleanup sites with no modified date 2018-01-30 13:59:59 +01:00
shortcutme
ee30f78ab0
Fix logging utf8 chars in connections 2018-01-30 13:59:39 +01:00
shortcutme
566b689ca6
Don't connect to private ip addresses in tor always mode 2018-01-30 13:59:18 +01:00
shortcutme
c2edbb30b5
Don't send private ip addresses on pex 2018-01-30 13:58:01 +01:00
shortcutme
a6f86329c5
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-01-28 16:44:56 +01:00
shortcutme
05c1df81ad
Rev3230 2018-01-28 16:44:52 +01:00
shortcutme
327badb3ca
Allow dbQuery and userGetSettings for Cors permissioned sites 2018-01-28 16:44:23 +01:00
shortcutme
335a7a76b1
Remove unnecessary imports from cors plugin 2018-01-28 16:43:50 +01:00
shortcutme
1566da1f8f
MergerSite plugin pass other arguments of hasSitePermission 2018-01-28 16:43:23 +01:00
shortcutme
1250b45694
Fix bigfile info on non-existent files 2018-01-28 16:42:56 +01:00
shortcutme
48e8b956d2
Only add myself to connect blacklist if running other cli action 2018-01-28 16:42:23 +01:00
shortcutme
56e80f7c0c
Add per-cmd site permission query 2018-01-28 16:41:42 +01:00
ZeroNet
bd6cb3e5be
Merge pull request #1267 from valkheim/master
Fix git directory name
2018-01-28 13:31:17 +01:00
Charles Paulet
f2db4b2d1b Fix git directory name 2018-01-28 13:26:28 +01:00
shortcutme
4a823c57d5
Rev3229 2018-01-27 12:25:03 +01:00
shortcutme
2f74f64d65
Longer timeout for updates and large files before other peers started working on it 2018-01-27 12:24:50 +01:00
shortcutme
d44677e46f
Don't keep connections for sites that not modified in last week 2018-01-27 12:21:25 +01:00
shortcutme
4afb6b3d9c
Limit connections to 512 by default 2018-01-27 12:20:40 +01:00
shortcutme
18d3e8905e
Longer timeout for tor peers 2018-01-27 12:19:57 +01:00
shortcutme
fd14a4ac80
Don't create connection to blacklisted peer 2018-01-27 12:19:37 +01:00
shortcutme
cc48a0ad86
Turn on gevent block logging by default 2018-01-27 12:15:18 +01:00
shortcutme
aad1a836db
Fix date of 0.6.1 release 2018-01-25 16:24:09 +01:00
shortcutme
3d3bcaba7a
Changelog for 0.6.1 2018-01-25 16:23:05 +01:00
ZeroNet
201169c4d7
Merge pull request #1254 from AceLewis/master
Gratipay shut down so removing
2018-01-22 10:45:02 +01:00
Alexander Lewis
1ff6c701e8 Gratipay shut down so removing
Gratipay shut down so people can't donate to the project through it
anymore.
2018-01-22 10:40:49 +01:00
shortcutme
3fb9f900f6
Rev3225, Handle correctly and test out of range bigfile requests 2018-01-21 18:56:30 +01:00
shortcutme
9c4093dc7c
Rev3224, Small cosmetic changes on sidebar Sign and publish button 2018-01-21 18:14:12 +01:00
ZeroNet
acfe4deacf
Merge pull request #1231 from imachug/issue-1229
Sign & Publish in one button
2018-01-21 17:50:39 +01:00
shortcutme
342f9f6096
Rev3223, Fix error when using ip wihout city entry 2018-01-20 12:11:43 +01:00
shortcutme
f5b4936197
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2018-01-20 11:49:21 +01:00
shortcutme
0c6c7d2725
Rev 3222, Use eval in bench for older pytyhon compatibility, Remove unnecessary print from chart archive 2018-01-20 11:49:17 +01:00
ZeroNet
136772073d
Merge pull request #1102 from zwgshr/master
Fix the import path
2018-01-20 00:36:35 +01:00
shortcutme
f5846853b3
Bump rev in config 2018-01-19 13:52:27 +01:00
shortcutme
6db011d807
Rev3221, Revert to afterLoad execution immediately after plugins loaded to avoid problems with plugins 2018-01-19 02:51:16 +01:00
shortcutme
fe59352800
Version 0.6.1, Rev3220 2018-01-19 02:34:32 +01:00
shortcutme
dedf6cd92f
Support initial calls for console bench function 2018-01-19 02:32:44 +01:00
shortcutme
99fdbcd1fe
Fix ratelimit test 2018-01-19 02:32:11 +01:00
shortcutme
005358f4bf
Use separate db connection for rebuilding 2018-01-19 02:31:46 +01:00
shortcutme
ea1cd63929
Log hashfield change time on send 2018-01-19 02:30:52 +01:00
shortcutme
c8ac4c0278
Update content update time after successful listmodifications 2018-01-19 02:29:18 +01:00
shortcutme
49a332724e
No connected peers if no connection server 2018-01-19 02:27:40 +01:00
shortcutme
a21c417c0b
Better announce logging 2018-01-19 02:27:19 +01:00
shortcutme
155f05cb63
Trigger onLoaded after config loaded 2018-01-19 02:27:00 +01:00
shortcutme
6d644922d5
Don't display greenlet errors twice 2018-01-19 02:24:29 +01:00
shortcutme
b0a125c113
Ignore case in file merge order 2018-01-19 02:23:33 +01:00
shortcutme
d17cb3fafc
Helper for avg calculation 2018-01-19 02:21:54 +01:00
shortcutme
814fa881d0
skip on invalid received hash ids 2018-01-19 02:20:20 +01:00
shortcutme
fd451ae766
Make indexes and tables optional 2018-01-19 02:18:40 +01:00
shortcutme
089bb92f70
Record last query time on every command 2018-01-19 02:18:19 +01:00
shortcutme
5b6e1f699d
Add db id to logging 2018-01-19 02:17:23 +01:00
shortcutme
03c469ff3a
Formatting 2018-01-19 02:16:50 +01:00
shortcutme
c122dc108a
Record received and sent requests 2018-01-19 02:16:33 +01:00
shortcutme
22c682f393
Move peer location query to separate function, optimize location cache 2018-01-19 02:15:43 +01:00
shortcutme
d7b6c54b08
Move get used optional file size to separate function 2018-01-19 02:14:29 +01:00
shortcutme
a715650af6
Only spawn close archive once 2018-01-19 02:13:59 +01:00
shortcutme
a72da8af56
Chart plugin 2018-01-19 02:13:17 +01:00
ZeroNet
9b3a50c124
Merge pull request #1240 from imachug/issue-1239
Don't handle `open` or `success` in error message as a sign of port being opened
2018-01-14 10:24:21 +01:00
Ivanq
5d7b8cfd48 Return dict object, not single None value 2018-01-14 09:38:55 +03:00
Ivanq
6318c0889a Don't check error message for 'open' when checking port 2018-01-14 09:35:03 +03:00
shortcutme
0aae28e836
Rev3179 2018-01-05 20:23:35 +01:00
shortcutme
b298571395
Change unreliable tracker 2018-01-05 20:23:29 +01:00
shortcutme
4f6a496c36
Test named db select arguments 2018-01-05 20:22:56 +01:00
shortcutme
a3a7af73bd
Fix named db query list parameters when query ends with parameter 2018-01-05 20:22:25 +01:00
ZeroNet
520fd6e063
Merge pull request #1230 from imachug/db-array
Handle :param being an array
2018-01-05 20:19:52 +01:00
Ivanq
bcc3b4d3ac Add sign/publish code 2017-12-31 19:48:28 +03:00
Ivanq
5ff8d6be38 Set font 2017-12-31 19:42:27 +03:00
Ivanq
0f5658e65e Handle clicking ':' 2017-12-31 18:56:17 +03:00
Ivanq
b89eb4f1e8 Make button and style ':' sign 2017-12-31 18:01:54 +03:00
Ivanq
9546817ad2 Add menu 2017-12-31 16:16:02 +03:00
Ivanq
6a31ce3e2e Add vertical line 2017-12-30 22:01:52 +03:00
Ivanq
905095317c Update all.js 2017-12-30 21:46:53 +03:00
Ivanq
d8ff0e1745 Add return false 2017-12-30 21:45:55 +03:00
Ivanq
f9ac614147 Autoscroll 2017-12-30 19:22:49 +03:00
Ivanq
581a18f83d 'Publish' cuts off 2017-12-30 18:39:07 +03:00
Ivanq
f2c76c0a3b Lowercase 2017-12-30 17:45:19 +03:00
Ivanq
7121a96ebd Simple realisation 2017-12-30 17:43:56 +03:00
Ivanq
8986d8037a Typos 2017-12-30 12:16:16 +03:00
Ivanq
d97631fb8c str() 2017-12-30 12:06:07 +03:00
Ivanq
be1eb14fd0 Handle dict value being a list 2017-12-30 10:06:05 +03:00
shortcutme
92e353be40
Rev3178, Skip sites with not database in newsfeed 2017-12-27 11:09:16 +01:00
shortcutme
c595ba3dc0
Send email on failed tests 2017-12-27 11:07:49 +01:00
shortcutme
ccd002b97f
Rev3177, Import missing SafeRe module 2017-12-20 23:35:49 +01:00
shortcutme
c7d067ea3c
Rev3176, Skip listing ignored directories on signing 2017-12-20 23:25:25 +01:00
ZeroNet
adbf787bd4
Merge pull request #1205 from imachug/union
Parse both UNION and UNION ALL
2017-12-19 20:53:21 +01:00
shortcutme
7ee5cbe473
Rev3175, Make getConnectablePeers return not-connected peers by default 2017-12-19 16:14:13 +01:00
shortcutme
c9c1d10ee4
Rev3173, Don't display Cors permission ask if already has, Fix error on Cors request on non-existent site 2017-12-18 02:37:09 +01:00
shortcutme
b5452bce6b
Rev3171, Allow 127.0.0.1 peers for testing reasons 2017-12-15 12:28:48 +01:00
shortcutme
6628b07bba
Rev3170 2017-12-15 12:14:09 +01:00
shortcutme
8f34afc630
Send websocket update on site limit change 2017-12-15 12:13:35 +01:00
shortcutme
1ac69ae315
New UiWebsocket API command to run commands as other site 2017-12-15 12:13:19 +01:00
shortcutme
8a331e7400
UiWebsocket handleRequest takes parsed request intead of raw message 2017-12-15 12:11:27 +01:00
shortcutme
ca42740e1b
Don't add peer 127.0.0.1 and 0.0.0.0 2017-12-15 12:10:36 +01:00
shortcutme
1d5c0597d9
Ignore site list order 2017-12-15 01:58:57 +01:00
Ivanq
7576e60797 Parse both UNION and UNION ALL 2017-12-14 22:15:12 +03:00
shortcutme
acc734d22d
Rev3167, Fix newsfeed queries with multiple params 2017-12-12 23:46:05 +01:00
shortcutme
8ab7d26cd1
Rev3165, Avoid UI block when rubilding a merger site 2017-12-12 11:06:32 +01:00
shortcutme
e86375f721
Rev3164 2017-12-11 19:56:37 +01:00
shortcutme
fde44d78d7
Rev3164, Skip feed if no site for it 2017-12-11 19:35:27 +01:00
shortcutme
a2567277c6
Rev3163 2017-12-11 19:21:41 +01:00
shortcutme
feda6f88ff
Add Newsfeed query time statistics 2017-12-11 19:21:17 +01:00
shortcutme
74e5f5310b
Rev3161 2017-12-07 15:25:50 +01:00
shortcutme
51fdf95295
Allow ajax ranged requests 2017-12-07 15:25:32 +01:00
shortcutme
0009b1b7d1
Allow site fullscreen functions 2017-12-07 15:23:51 +01:00
shortcutme
74e50e209a
Rev3158, Fix site clone with sites larger that 10MB 2017-12-04 16:04:10 +01:00
shortcutme
1208294747
Remove unused variable, more clear comment on state object 2017-12-02 15:35:32 +01:00
shortcutme
3de182a4ed
Rev3157, Fix websocket utf8 error when requesting files from different sites at the same time 2017-12-02 15:31:36 +01:00
shortcutme
90ff9ac7fb
Rev3155, Avoid UI hang during db rebuild 2017-12-02 02:38:17 +01:00
shortcutme
6b92d011d2
Rev3153, Download missing sites from sites.json 2017-11-30 19:38:56 +01:00
shortcutme
8b9a8997ac
Rev3151 2017-11-29 13:50:03 +01:00
shortcutme
9df86ecaa9
Show proxy user seed on certficate added instead of first visit 2017-11-29 13:49:41 +01:00
shortcutme
cfeb2797e3
Merge wrapper js 2017-11-29 13:48:30 +01:00
shortcutme
06a50b189d
Use empty placeholder if not specified 2017-11-29 13:48:20 +01:00
shortcutme
7c1a4e353d
Allow inject html command from ui server 2017-11-29 13:48:07 +01:00
shortcutme
2b611ae798
Rev3148, Fix big site size calculation 2017-11-28 18:16:37 +01:00
shortcutme
fdd82f7ac4
Rev3146, Limit noparallel queue to one call 2017-11-20 03:13:58 +01:00
shortcutme
ea9d345548
Rev3144 2017-11-19 18:22:28 +01:00
shortcutme
24372470f6
My_ip no longer required to be sent via updates 2017-11-19 18:21:47 +01:00
shortcutme
51f1781df4
Move bad file checking to separate function, root content.json does not requires file_info 2017-11-19 18:21:10 +01:00
shortcutme
972bef4f7d
Add invalid content.json to bad files 2017-11-19 18:19:45 +01:00
shortcutme
a2da8eca68
Master startup by waiting less between site update checks 2017-11-19 18:18:26 +01:00
shortcutme
620d8caea9
Always use peer's real ip instead of reported one using update parameter 2017-11-19 18:18:08 +01:00
ZeroNet
4ddaa9b57f
Merge pull request #1188 from FARHZ/master
Fix logic BigfilePlugin.py
2017-11-19 14:54:36 +01:00
FARHZ
22bb77e7a0
Fix logic BigfilePlugin.py 2017-11-19 10:43:30 -02:00
ZeroNet
3582b2c114
OS X is macOS now 2017-11-19 10:56:53 +01:00
ZeroNet
9db715ee17
Merge pull request #1172 from ajmeese7/master
Update README.md
2017-11-19 10:55:29 +01:00
shortcutme
1aaa1ba975
Issue template for Github 2017-11-18 00:49:44 +01:00
shortcutme
35bd5e8595
UPnP formatting 2017-11-17 18:09:02 +01:00
shortcutme
86e607c403
Catch all exception on uPnP port opening 2017-11-17 18:08:45 +01:00
ZeroNet
c7247fc462
Merge pull request #1179 from Biosias/master
Adding Slovak translation (sk.json)
2017-11-12 18:41:43 +01:00
Biosias
25add764e4
Add files via upload
Adding Slovak translation (sk.json)
2017-11-11 17:26:29 +01:00
shortcutme
7d8490bdcb
Rev3139 2017-11-10 11:16:30 +01:00
shortcutme
f8fe426f70
Filter search query by type 2017-11-10 11:16:08 +01:00
shortcutme
9b61ae44ab
Store search query parameters in separate variable 2017-11-10 11:15:57 +01:00
shortcutme
991e59d0fc
Filter search by site 2017-11-10 11:15:10 +01:00
shortcutme
7f3cf9583c
Find filters in search query 2017-11-10 11:15:01 +01:00
shortcutme
ff7ac90785
Rev3137 2017-11-09 13:33:18 +01:00
shortcutme
b01e381087
Async port opening using different nic ips 2017-11-09 13:33:02 +01:00
shortcutme
5026f1b0a8
Delay RateLimit call after delayed call triggered 2017-11-09 13:32:21 +01:00
shortcutme
9d09890457
Rev3135, Add fileNeed command compatibility to merger sites 2017-11-06 13:16:46 +01:00
shortcutme
4483180569
Rev3134 2017-11-05 23:45:08 +01:00
shortcutme
4465146615
Update server_info on port open status change 2017-11-05 23:43:51 +01:00
shortcutme
3b7750c24e
Send serverChanged event on Tor status change 2017-11-05 23:43:03 +01:00
shortcutme
7962baa2da
Also join to serverChanged channel by default 2017-11-05 23:42:33 +01:00
shortcutme
6f37654303
Send serverChanged event on server_info changes 2017-11-05 23:42:14 +01:00
shortcutme
2781e31be0
Keep track of websocket connections 2017-11-05 23:40:59 +01:00
shortcutme
b39d86d020
serverChanged channel 2017-11-05 23:37:53 +01:00
shortcutme
754a3db1b9
Allow multiple channel joins by one command 2017-11-05 23:37:32 +01:00
shortcutme
bc1d79a07d
Fix pice_size typo 2017-11-05 23:34:31 +01:00
ZeroNet
8242e91238
Merge pull request #1165 from imachug/dbquery
DbQuery and Newsfeed bug
2017-11-04 13:01:05 +01:00
Aaron Meese
ff24899a62
Update README.md
Added proper hyphenation and changed OSX to OS X
2017-10-30 11:04:56 -05:00
shortcutme
c3250378ee
Rev3128, Allow modals for sites 2017-10-30 15:15:40 +01:00
shortcutme
9d4515954b
Rev3127, Fix UiWebsocket async message response skip 2017-10-29 23:39:36 +01:00
shortcutme
46455737cc
Rev3126 2017-10-28 02:40:42 +02:00
shortcutme
09413f5fc7
Only zoom sidebar globe if mouse button is pressed down 2017-10-28 02:40:35 +02:00
shortcutme
2e74b73ba0
Verify signatures using CLI 2017-10-28 02:39:49 +02:00
Ivanq
818983831a Newsfeed: Add brackets around WHERE 2017-10-26 18:34:53 +03:00
Ivanq
c64e97f0d6 DbQuery: WHERE without AND is still WHERE 2017-10-26 18:32:05 +03:00
shortcutme
9034449e96
Fix fileInfo test 2017-10-26 10:50:56 +02:00
shortcutme
00b6842f35
Rev3125 2017-10-26 10:43:51 +02:00
shortcutme
99e5af67b7
Make BigfileUploadInit merger sites compatible 2017-10-26 10:43:45 +02:00
shortcutme
e8f049a765
Strip / from content.json location of file_info 2017-10-26 10:43:10 +02:00
shortcutme
53afd97346
Alway start workers for slow tasks 2017-10-26 10:40:41 +02:00
shortcutme
604792a4dd
Call response function for return values of UiWebsocket actions 2017-10-26 10:40:02 +02:00
shortcutme
9b83c683b5
Reload content.json info after bigfile upload 2017-10-26 10:35:46 +02:00
shortcutme
9d511ba165
Rev3122, Auto ignore database file 2017-10-22 11:13:09 +02:00
shortcutme
c519239d87
Add more detail on cli signing error 2017-10-22 11:11:26 +02:00
shortcutme
9f39bee486
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-10-21 11:03:17 +02:00
shortcutme
fa409e63f8
Rev3120 2017-10-21 11:03:09 +02:00
shortcutme
e048fa6c6a
Target 6 connections per site 2017-10-21 11:02:40 +02:00
shortcutme
940d583f9a
Fix site violation bug when using Tor 2017-10-21 11:02:27 +02:00
shortcutme
ed965041e6
Report progress on GeoLite2 download 2017-10-21 11:01:57 +02:00
ZeroNet
1a5e661e14 Merge pull request #1155 from xfq/patch-1
Update README-zh-cn.md
2017-10-18 09:58:25 +02:00
Fuqiao Xue
0f7ed0e04d Update README-zh-cn.md 2017-10-18 12:53:10 +08:00
shortcutme
d50603f722
Rev3114, Add details to permission requests 2017-10-17 17:02:56 +02:00
shortcutme
e3931e8892
Changelog for 0.6.0 2017-10-17 10:52:16 +02:00
shortcutme
4efcfa8bf4
Rev3112, Allow user rules based on auth address 2017-10-16 20:26:41 +02:00
shortcutme
9551d11f5c
Rev3110 version update 2017-10-16 15:13:02 +02:00
shortcutme
b40ef09108
Rev3110 2017-10-16 15:12:34 +02:00
shortcutme
95d9d4ee9a
Add hashid to optional files stat 2017-10-16 15:12:17 +02:00
shortcutme
75cf8bbb0a
Change arument order of siteSign API call 2017-10-16 15:11:43 +02:00
shortcutme
c40f0c6919
Fix uploading bigfile to non-user directory 2017-10-16 15:11:19 +02:00
shortcutme
231df44c94
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-10-16 01:44:02 +02:00
shortcutme
807dc866e5
Rev3106, Cancel other part downloads when delete optional file 2017-10-16 01:43:51 +02:00
ZeroNet
3d5c25efe4 Merge pull request #1146 from anoadragon453/patch-1
Cross off big file support on README :)
2017-10-15 09:53:36 +02:00
Andrew Morgan
5a7a80f932 Cross off big file support on README :)
Got that one squared away.
2017-10-14 19:40:44 -07:00
shortcutme
3f52f78af2
Rev3105, Change tracker domain due GFW banned zeronet.io domain 2017-10-14 12:51:31 +02:00
shortcutme
a66b71fb9c
Rev3104, Fix bigfile signing via command line 2017-10-13 11:27:45 +02:00
shortcutme
65eff6b6d9
Rev3102 2017-10-13 01:23:43 +02:00
shortcutme
027ee83c6f
Wait 0.1s for new tasks before shut down worker 2017-10-13 01:23:26 +02:00
shortcutme
60af54a17e
Start find optional files if no peers to try 2017-10-13 01:23:09 +02:00
shortcutme
19c335e39a
Fix bytes sent stats 2017-10-13 01:22:16 +02:00
shortcutme
d32303de57
Increase buffer size for file streaming 2017-10-13 01:21:45 +02:00
shortcutme
de360a8585
Received and sent connection command statistics 2017-10-13 01:21:05 +02:00
shortcutme
24c1596048
Keep track last received command for connection 2017-10-13 01:19:34 +02:00
shortcutme
9484a27801
Sent and Received command statistics 2017-10-13 01:17:27 +02:00
shortcutme
c8eb93db07
Bigfile stats 2017-10-13 01:17:07 +02:00
shortcutme
3c8867bf72
Also display last received command for connection 2017-10-13 01:16:44 +02:00
shortcutme
ef2f1d56d4
Display short encryption for connections to reduce with 2017-10-13 01:16:11 +02:00
shortcutme
046877599e
Don't create empty piecefield for every optional file 2017-10-13 01:15:43 +02:00
shortcutme
b322b750c2
Don't load empty piecefields from sites.json 2017-10-13 01:15:21 +02:00
shortcutme
4a75d9d4f5
Rev3099 2017-10-11 14:30:12 +02:00
shortcutme
68ea4d02cb
Don't reset bad file counter after restart, but limit to 20 2017-10-11 14:29:54 +02:00
shortcutme
8b3ff6454f
Limit connections to 500, backlog to 100 2017-10-11 14:22:23 +02:00
shortcutme
de28643e20
Rev3098 2017-10-10 14:58:52 +02:00
shortcutme
3030e00b21
Fix bigfile display if no piecemap info present 2017-10-10 14:58:43 +02:00
shortcutme
7ba3d86af4
Ignore invalid updatePiecefields response 2017-10-10 14:58:13 +02:00
ZeroNet
2f3b3ebf2b Merge pull request #1135 from filips123/patch-1
Add Slovenian translate.
2017-10-10 14:55:56 +02:00
Filip Š
136a0fbe28 Add Slovenian translate. 2017-10-07 20:16:20 +02:00
shortcutme
7905e12fc3
Rev3097, Add peer info for bigfiles even if it's not downloaded 2017-10-06 00:42:19 +02:00
shortcutme
07caaa6b48
Fix removed is_pinned flag on content.json update 2017-10-05 19:24:39 +02:00
shortcutme
59a04f101d
Remove unnecessary file 2017-10-05 14:05:48 +02:00
shortcutme
4265c4126a
Change Bigfile plugin directory case 2017-10-05 13:26:40 +02:00
shortcutme
0e85beec30
Rev3094 2017-10-04 17:27:08 +02:00
shortcutme
f1276beb97
Bump prority for non-user json files 2017-10-04 17:27:01 +02:00
shortcutme
365ba9b5f4
Force start peers for optional files 2017-10-04 17:26:43 +02:00
shortcutme
f997a69ebc
Run checkTask for every task 2017-10-04 17:26:21 +02:00
shortcutme
e2b6dd37b7
Only announce once per checkTask loop 2017-10-04 17:25:56 +02:00
shortcutme
bc9bddf918
Make sure the hashfield response is correct 2017-10-04 17:25:33 +02:00
shortcutme
b41570b663
Avoid console windows when setting sparse flag on Windows 2017-10-04 17:25:14 +02:00
shortcutme
4c6e01d38d
Run Bigfile plugin tests 2017-10-04 17:24:49 +02:00
shortcutme
8ef1ef0ce5
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-10-04 14:40:35 +02:00
shortcutme
e4fc4ca410
Version 0.6.0, Rev3091 2017-10-04 13:36:29 +02:00
shortcutme
0b9bc56959
Test sub-directory files in user diretories 2017-10-04 13:36:14 +02:00
shortcutme
e9beeb85fc
Use with to open files to avoid keeping them open in case of errors 2017-10-04 13:35:55 +02:00
shortcutme
a71e82c315
Test user sub-directories inner_path 2017-10-04 13:35:15 +02:00
shortcutme
d176150248
Test multiple length of message for signing 2017-10-04 13:34:50 +02:00
shortcutme
ab9fa9ec0c
Mark data/optional.* as optional for test site 2017-10-04 13:34:14 +02:00
shortcutme
3d57fbb1b8
Use the real size of content.json instead of predefine it 2017-10-04 13:33:26 +02:00
shortcutme
f0f9240fc8
getDirname strips the leading / chars 2017-10-04 13:33:00 +02:00
shortcutme
b1bfe39cd5
Use merged getFile function call to download file using streaming 2017-10-04 13:32:39 +02:00
shortcutme
c82b19687a
Spy object also stores the called object 2017-10-04 13:31:49 +02:00
shortcutme
be755fe25e
Custom logging for tests to spot possible performance bottlenecks easier 2017-10-04 13:30:17 +02:00
shortcutme
8e2be5cfe2
Add Merkletools package for bigfile plugin 2017-10-04 13:29:32 +02:00
shortcutme
cf1154f2c5
Initial version of bigfile plugin 2017-10-04 13:28:59 +02:00
shortcutme
f7ce401564
Function to remove invalid characters from file path 2017-10-04 13:25:07 +02:00
shortcutme
5dbaf02e33
Add content.json location to getFileInfo 2017-10-04 13:24:44 +02:00
shortcutme
2ef537ee6c
Fox user_address detection for sub-directories in user directory 2017-10-04 13:24:22 +02:00
shortcutme
74048ce53f
Update site size on startup and file archival 2017-10-04 13:20:39 +02:00
shortcutme
96ceb253e8
GetTotal size also return optional sum of optional file sizes 2017-10-04 13:19:19 +02:00
shortcutme
aa9e8b067f
Send websocket event on optional file deletion 2017-10-04 13:17:36 +02:00
shortcutme
e5963f8a76
OptionalFileDelete API call only works on downloaded files 2017-10-04 13:17:18 +02:00
shortcutme
e5b851b171
Add progress information to bigfiles 2017-10-04 13:16:02 +02:00
shortcutme
282f06b65e
Filter for OptionalFileList API call that allows to list non-downloaded files and only bigfiles 2017-10-04 13:15:44 +02:00
shortcutme
e8a439cad3
Mark my optional files using directory on signing instead of file path 2017-10-04 13:14:24 +02:00
shortcutme
cd025316db
Auto-pin downloaded bigger files 2017-10-04 13:13:00 +02:00
shortcutme
6e55c8b7c7
Allow ranged SQL queries 2017-10-04 13:10:41 +02:00
shortcutme
38c663ee95
Use WHERE 1 for queries without argument 2017-10-04 13:10:26 +02:00
shortcutme
ca473d6c3b
Allow plugins on ContentManager 2017-10-04 12:51:37 +02:00
shortcutme
36b74e1c6a
ContentManager logging improvements 2017-10-04 12:51:24 +02:00
shortcutme
8e3e96fe65
Create storage object after site settings loaded 2017-10-04 12:50:24 +02:00
shortcutme
0f0f3894ff
request from directory . should drop forbidden error 2017-10-04 12:48:48 +02:00
shortcutme
a2182e8a8d
Invalid nonce requests automatically shows wrapper now 2017-10-04 12:48:16 +02:00
shortcutme
4042de460e
actionFile allows file details to be passed as parameter 2017-10-04 12:46:06 +02:00
shortcutme
0dd34403a2
Combinate isfile and filesize query to one function 2017-10-04 12:44:34 +02:00
shortcutme
edb9d3f719
Media files requested from non-seeded site not wokring anymore 2017-10-04 12:42:05 +02:00
shortcutme
1f5db0aa24
Nonce checking moved to route command 2017-10-04 12:41:14 +02:00
shortcutme
74b2408668
Move path checking to parsePath 2017-10-04 12:39:08 +02:00
shortcutme
f53612bef7
Media request should start with normal characters 2017-10-04 12:38:44 +02:00
shortcutme
4d991cda6d
Also serve htm files with wrapper 2017-10-04 12:37:56 +02:00
shortcutme
6984575901
Remove dead reload code 2017-10-04 12:37:34 +02:00
shortcutme
75b44f6980
Raise SecurityError on invalid path 2017-10-04 12:37:22 +02:00
shortcutme
3c46f60042
Show wrapper automatically if wrapper nonce is invalid 2017-10-04 12:35:15 +02:00
shortcutme
7dbc323f76
ZeroNet-internal virtual path on UiServer for internal commands 2017-10-04 12:33:43 +02:00
shortcutme
903b62ba7c
Make fileNeed API command async 2017-10-04 12:32:40 +02:00
shortcutme
53da40fe5d
Allow to show site directory in local file browser 2017-10-04 12:31:57 +02:00
ZeroNet
fdb7b4cc0f Use Python 2.x for ZeroNet 2017-10-04 09:23:21 +02:00
shortcutme
d0f85f3d04
String / from left during dirname conversion 2017-10-03 16:05:01 +02:00
shortcutme
49d863fa54
Reduce indent by using continue instead of if 2017-10-03 16:04:03 +02:00
shortcutme
6fe5e2b751
Speed up task competition by wait 10*0.1 sec for task finish instead of 1x1sec before start wokring on it 2017-10-03 16:02:49 +02:00
shortcutme
59d45f445a
Always start findOptional if no worker running but there is tasks 2017-10-03 16:01:02 +02:00
shortcutme
09d19da3bc
Always update hashfield for peer during findHash 2017-10-03 15:58:51 +02:00
shortcutme
1036d0e4a0
Allow second peer for same task only if priority is above 10 2017-10-03 15:58:01 +02:00
shortcutme
8ba4201237
More agressive optional file finding 2017-10-03 15:56:58 +02:00
shortcutme
7c69118c2c
Move peer adding to separate function 2017-10-03 15:55:42 +02:00
shortcutme
6238bb7f2d
Multiplexing support for peers (disabled by default) 2017-10-03 15:55:07 +02:00
shortcutme
42ea01dde9
No extra time for larger files task timeout 2017-10-03 15:53:59 +02:00
shortcutme
c0b8e802ec
Fix findhash initial delay 2017-10-03 15:53:00 +02:00
shortcutme
43bd8a2d6c
Stop findhash if all task finished during the findhash call 2017-10-03 15:52:37 +02:00
shortcutme
e85efe2c64
Restart find optional files algorithm if new task started since running the function 2017-10-03 15:52:04 +02:00
shortcutme
988d169687
Fix asked_peers ignore for optional files 2017-10-03 15:51:17 +02:00
shortcutme
43e6f374fa
Don't increase priority when addTask called again 2017-10-03 15:49:52 +02:00
shortcutme
c91011e6ea
Pass file info for addTask call 2017-10-03 15:49:08 +02:00
shortcutme
f45c0b2377
Log time taken for optonal file download 2017-10-03 15:48:36 +02:00
shortcutme
9b8eeb6a73
WorkerManager addTask returns task instead of event 2017-10-03 15:47:46 +02:00
shortcutme
468fe8f266
Move json formatting to separate function 2017-10-03 15:30:10 +02:00
shortcutme
5ccdfbd40a
Update site optional size on save 2017-10-03 15:29:52 +02:00
shortcutme
ad969dcca7
Move file download allowed checking to separate function 2017-10-03 15:29:26 +02:00
shortcutme
08b31416f3
Move needFileInfo to separate function 2017-10-03 15:28:37 +02:00
shortcutme
c494b01435
Update hashfiled more often 2017-10-03 15:26:53 +02:00
shortcutme
c0e69e91a1
Always use streamFile for files bigger than 512k, increase file reads to 1MB for larger files 2017-10-03 15:26:39 +02:00
shortcutme
1c029981ae
Raise exception when no response received 2017-10-03 15:23:25 +02:00
shortcutme
f9e64bc874
Log inner_path and location for peer request in verbose mode 2017-10-03 15:23:03 +02:00
shortcutme
8d26a572dd
Hashlib-like truncated sha512/256 object 2017-10-03 15:22:05 +02:00
shortcutme
936371a7ec
Support digest output for sha512sum 2017-10-03 15:20:50 +02:00
shortcutme
628cc992e9
Don't send ok result when update is queued 2017-10-03 15:19:34 +02:00
shortcutme
636813c603
Reduce connection cpu usage by socket send time 2017-10-03 15:19:09 +02:00
shortcutme
2eb6cc8f55
Don't add myself to findhash result if ip detection failed 2017-10-03 15:07:26 +02:00
shortcutme
8ae9b5261e
Unify handling Stream and Get file requests 2017-10-03 15:03:56 +02:00
shortcutme
d6d9e911fe
Load Peer class after it got pluginned 2017-10-03 14:58:47 +02:00
shortcutme
797abdea80
Load config class after it got pluginned 2017-10-03 14:58:24 +02:00
shortcutme
7153982981
Allow to register callback after the pluginned classes got generated 2017-10-03 14:57:44 +02:00
shortcutme
fcfd428b54
Enable plugins for Peer class 2017-10-03 14:56:42 +02:00
shortcutme
20e3dc5fa7
Only enable source code reloading for normal action 2017-10-03 14:55:28 +02:00
shortcutme
32ca6ac1a7
Move site cache generation to separate function to allow plugins to extend it 2017-10-03 14:40:13 +02:00
shortcutme
02ad7542b3
Temporary disable P2P port checking until more client start supporting it 2017-10-03 14:39:04 +02:00
shortcutme
57c042ef79
Use recent peers for P2P port checking 2017-10-03 14:38:33 +02:00
shortcutme
614a18913e
Switch context during newsfeed queries to avoid blocking the client 2017-10-03 14:37:50 +02:00
shortcutme
bfb7392198
Site has optional files if any of the peers has hashfield 2017-10-03 14:37:15 +02:00
shortcutme
7eca3f4bc5
Display other peers optional files if we has not downloaded anything 2017-10-03 14:36:50 +02:00
shortcutme
52a468d9fd
Allow 10 second for reponse 2017-10-03 14:34:21 +02:00
shortcutme
2cf86642a2
Run connection cleanup every 15 seconds 2017-10-03 14:32:31 +02:00
shortcutme
e76164c7a9
Change the posistion of handleStream function 2017-10-03 14:32:02 +02:00
shortcutme
bf0d359116
Increase buffer size to 64k to better performance for big files 2017-10-03 14:31:39 +02:00
shortcutme
5f37bf3eef
Enable TCP_NODELAY if supported 2017-10-03 14:31:16 +02:00
shortcutme
d8453384ab
Separate socket creation and connection to be able to cancel it 2017-10-03 14:30:19 +02:00
shortcutme
f4cdc31788
Lock socket during sending data 2017-10-03 14:27:29 +02:00
ZeroNet
20a063105c Merge pull request #1124 from imachug/zeronetpy3
Move server info formatting to Config.py; use it via getConfig console command
2017-09-25 21:48:42 +02:00
Ivanq
f8f26f0a89 Return log_dir, data_dir, src_dir as result of getConfig 2017-09-25 19:10:17 +03:00
Ivanq
522e9ebf39 Show config via getConfig console command 2017-09-25 19:09:59 +03:00
ZeroNet
27a9ea78b8 Merge pull request #1122 from imachug/siteclone
Allow siteClone for non-admin sites
2017-09-22 11:01:43 +02:00
Ivanq
7fa019321c Check site before cloning 2017-09-22 08:28:39 +03:00
Ivanq
f98f52a50e Allow siteClone not for admin sites 2017-09-22 08:24:18 +03:00
ZeroNet
bc71555a73 Merge pull request #1070 from anoadragon453/small_gram_fix
Small English grammer fixes
2017-09-21 13:46:11 +02:00
shortcutme
d3d7489232
Rev2192, Fix incorrect site detection when using async commands with Cors or MergerSite plugin 2017-09-20 17:06:09 +02:00
ZeroNet
94cd5d32e5 Merge pull request #1117 from imachug/showdirectory
Allow 'backup' or 'log' as directories
2017-09-18 10:35:43 +02:00
Ivanq
db339eecd3 Allow 'backup' or 'log' as directories 2017-09-16 21:57:20 +03:00
ZeroNet
99dd5d5f63 Merge pull request #1112 from imachug/merger-0
MergerSite: Add actionFileList and actionDirList proxy
2017-09-10 09:29:09 +02:00
ZeroNet
53cd2cdbf3 Merge pull request #1114 from imachug/binary
Read files as binary in fileGet()
2017-09-10 09:28:45 +02:00
Ivanq
4bbea46b90 Read files as binary in fileGet() 2017-09-10 09:46:21 +03:00
Ivanq
38230c62e6 MergerSite: Add actionFileList and actionDirList proxy 2017-09-10 08:53:07 +03:00
shortcutme
932db9bbe4
Rev2190 2017-09-02 14:28:40 +02:00
shortcutme
bfd3d18a10
Fix multiuser plugin compatibility 2017-09-02 14:28:01 +02:00
shortcutme
b584c586ec
Fix longer signers_sign signing 2017-09-02 14:26:39 +02:00
张文广
11463dbba5 Fix the import path 2017-08-31 11:45:47 +08:00
ZeroNet
8fdfba97d9 Merge pull request #1096 from grez911/master
Added explanation of convertion actionWrapper response to list
2017-08-25 11:12:11 +02:00
grez911
158f9e37e5 Added explanation of convertion actionWrapper response to list 2017-08-25 11:05:48 +03:00
ZeroNet
28fbf5a802 Merge pull request #1091 from grez911/master
Added exception handling for broken user.json
2017-08-24 16:29:18 +02:00
grez911
905976a1b6 Added exception handling for broken user.json 2017-08-22 17:43:55 +03:00
shortcutme
5ad614743b
Rev2187 2017-08-19 18:55:48 +02:00
shortcutme
ebdb1ed322
Fix permission limiting with uppercase function names 2017-08-19 18:55:39 +02:00
shortcutme
b1989ef02e
Limit optional file commands in multiuser mode 2017-08-19 18:55:21 +02:00
ZeroNet
ded6025eee Merge pull request #1082 from grez911/master
Fix: ui_restrict now working with ui_password
2017-08-18 23:55:57 +02:00
Sergei Bondarenko
d591df39cc Fix: ui_restrict now working with ui_password
https://github.com/HelloZeroNet/ZeroNet/issues/207
2017-08-18 22:42:14 +03:00
ZeroNet
d44f08382a Merge pull request #1076 from grez911/master
Added P2P portcheck
2017-08-18 14:47:38 +02:00
shortcutme
5e926ec98e
Rev2186 2017-08-18 14:47:08 +02:00
shortcutme
a27422a0fb
Bootstrapper SQL query optimizations 2017-08-18 14:46:35 +02:00
shortcutme
2af08c0ba1
Only return 5 peers if more than 500 site queired 2017-08-18 14:46:06 +02:00
shortcutme
b6c0c955c5
Limit bootstrap queries to 1s 2017-08-18 14:45:48 +02:00
shortcutme
32a0f96ecd
Batch onion update 2017-08-18 14:45:06 +02:00
shortcutme
37ef2802de
Log announce times 2017-08-18 14:44:24 +02:00
shortcutme
9f762a0230
Bootstrapper use python date functions instead of sqlite 2017-08-18 14:43:28 +02:00
shortcutme
f1c320dd22
Log sign errors 2017-08-18 14:38:58 +02:00
shortcutme
4c7500e248
Fix getDirname description 2017-08-18 14:37:56 +02:00
grez911
8487056edb Small fix in P2P portcheck 2017-08-18 11:43:06 +03:00
grez911
bf69d24566 Deleted unnecessary import statement 2017-08-18 11:38:26 +03:00
grez911
1fc2a917d4 Fix P2P port check 2017-08-18 11:29:41 +03:00
Sergei Bondarenko
c0a96983a7 Update FileServer.py 2017-08-16 14:32:47 +03:00
Sergei Bondarenko
a4132c9cb1 Update FileServer.py 2017-08-16 09:40:54 +03:00
grez911
5c5e4b914c Added P2P portcheck 2017-08-15 20:17:42 +03:00
shortcutme
1db2327b3d
Rev2180, Allow ajax requests using ajax_key http get parameter 2017-08-15 02:40:38 +02:00
shortcutme
0a380dc0ab
Rev2180 2017-08-09 14:22:17 +02:00
shortcutme
29aa1b7b93
Log file diffing timings 2017-08-09 14:21:59 +02:00
shortcutme
5a08545e2d
Only recalculate site sizes on exit 2017-08-09 14:21:44 +02:00
shortcutme
65d68fb8ac
Compile Ui js 2017-08-09 14:21:09 +02:00
shortcutme
d093764731
New API command: fileNeed to request optional file 2017-08-09 14:20:49 +02:00
shortcutme
24982aee42
Log invalid wrapper messages 2017-08-09 14:20:20 +02:00
shortcutme
ef4a4acbc0
Only display read error in verbose mode 2017-08-09 14:19:56 +02:00
shortcutme
b503d59c49
Support gzip compressed database files 2017-08-09 14:19:39 +02:00
shortcutme
f451ce6c91
6MB LimitedGzip file helper to avoid gzip bombs 2017-08-09 14:19:09 +02:00
shortcutme
4f729aa98f
Only use pure-python msgpack for socket streaming 2017-08-09 14:17:58 +02:00
shortcutme
bdb5e1597c
Sign automatically on sidebar save button if possible 2017-08-09 14:15:44 +02:00
shortcutme
6a1c5d96ac
Disable bz2 support due incompatibility issues 2017-08-09 14:15:10 +02:00
Andrew (anoa)
c1aff56cf2
Small grammer fixes 2017-08-04 15:13:31 -07:00
shortcutme
bfd57561b7
Rev2170 2017-07-31 14:39:27 +02:00
shortcutme
4cd393e4d8
Auto download optional files command line argument 2017-07-31 14:39:21 +02:00
shortcutme
ac230219ee
DB cleanup error is not fatal 2017-07-31 14:35:48 +02:00
shortcutme
c96dce3d0b
Fix site cleanup from content.db 2017-07-31 14:35:01 +02:00
shortcutme
9e13994c54
Formatting SslPatch 2017-07-31 14:34:18 +02:00
shortcutme
b8d68e2589
Fix undefined ssl error 2017-07-31 14:34:06 +02:00
ZeroNet
5f753d41d4 Merge pull request #1061 from cclauss/patch-3
import binascii
2017-07-31 13:49:13 +02:00
ZeroNet
d2d335314d Merge pull request #1062 from cclauss/patch-6
data_unpack --> data_unpacked
2017-07-31 13:48:41 +02:00
ZeroNet
545f4964a1 Merge pull request #1060 from cclauss/patch-5
import threading and queue.Empty
2017-07-31 13:47:06 +02:00
ZeroNet
7e88c4431a Merge pull request #1059 from cclauss/patch-4
import math
2017-07-31 13:46:09 +02:00
cclauss
e1d3a31c6c data_unpack --> data_unpacked
@shortcutme Is this the right way to fix these two undefined name errors?
2017-07-31 13:08:22 +02:00
cclauss
231195ba0a import binascii
Solves the undefined name on line 30
2017-07-31 12:28:55 +02:00
cclauss
6cb700b302 import threading and queue.Empty
Fixes the undefined name on line 644
2017-07-31 12:26:15 +02:00
cclauss
504b147cee import math
Resolves the undefined name on line 54
2017-07-31 12:06:11 +02:00
ZeroNet
d9b3078f7b Merge pull request #1058 from cclauss/patch-3
from Debug import Debug
2017-07-31 12:05:06 +02:00
cclauss
b35bff4164 from Debug import Debug
Solves the unresolved name on lines 164 and 200
2017-07-31 11:55:03 +02:00
shortcutme
5b6d4f972e
Version 0.5.7 Changelog 2017-07-30 02:20:30 +02:00
shortcutme
eb97ea4f34
Rev2169 2017-07-29 13:46:04 +02:00
shortcutme
a69531c4c9
Emulate short click for mobile 2017-07-29 13:45:57 +02:00
shortcutme
527c2b4f54
Sidebar close button for small screens 2017-07-29 13:44:54 +02:00
shortcutme
467cd480cf
Rev2168, Only avoid reload site on every missing file 2017-07-29 12:49:38 +02:00
shortcutme
6610914fdb
Rev2167, Skip downloading if no connection server specified 2017-07-28 22:57:41 +02:00
shortcutme
fa96ab453f
Rev2166, Mobile friendly notifications 2017-07-28 15:36:49 +02:00
shortcutme
5bdc3b4fb5
Rev2165 2017-07-27 16:30:37 +02:00
shortcutme
eee073c103
Publish incoming updates to more peers 2017-07-27 16:30:21 +02:00
shortcutme
35efd6b107
ServerShowdirectory admin API command to show directory 2017-07-27 16:29:39 +02:00
shortcutme
f45ecb6cf4
Log problematic pattern 2017-07-27 16:29:12 +02:00
shortcutme
db8fe8d890
Version 0.5.7, Rev2163 2017-07-19 22:52:35 +02:00
shortcutme
bd9f88416c
Rev2162 2017-07-19 16:48:40 +02:00
shortcutme
cbac57dc88
Plugin to request cross-site resource access 2017-07-19 16:48:24 +02:00
shortcutme
504d7812e5
Fix exception if no path_parts returned 2017-07-19 16:46:37 +02:00
shortcutme
b88ee9a87a
Only allow to sign content.json files 2017-07-19 16:45:28 +02:00
shortcutme
2aba9cc3c2
Only download content.json files as content 2017-07-19 16:45:12 +02:00
shortcutme
961fcbf660
Rev2160, Fix sidebar typo 2017-07-18 22:39:48 +02:00
shortcutme
56c9ac8e46
Rev2159 2017-07-18 20:57:41 +02:00
shortcutme
1f7b25b60c
Ignore http protocol in same origin comparison 2017-07-18 20:57:33 +02:00
shortcutme
34ec05d4b4
Fix notification id collision 2017-07-18 20:55:53 +02:00
shortcutme
bf672bdec3
Add new test to unsafe matches 2017-07-18 20:55:04 +02:00
shortcutme
bb27e3124f
Remove files without info on retry bad files 2017-07-18 20:54:39 +02:00
shortcutme
551aa3ef67
Raise exception on unsupported dbschema version 2017-07-18 20:53:52 +02:00
ZeroNet
de550d7cae Merge pull request #1027 from cclauss/patch-2
Old style exceptions --> new style
2017-07-18 20:51:48 +02:00
ZeroNet
f50ec0eeee Merge pull request #1028 from flibustier/dockerfile
Revamped Dockerfile 🐋
2017-07-17 23:20:56 +02:00
Jon P
6e51b5ba32 Update Dockerfile 2017-07-17 16:08:18 +02:00
ZeroNet
8281176873 Merge pull request #1023 from anoadragon453/master
Small grammar fix
2017-07-17 15:10:09 +02:00
cclauss
eaa344abca Update main.py 2017-07-16 22:57:28 +02:00
cclauss
1f22009360 Update SiteManagerPlugin.py 2017-07-16 22:53:11 +02:00
cclauss
7d7272a266 Update SidebarPlugin.py 2017-07-16 22:51:01 +02:00
cclauss
83e372ce47 Update SidebarPlugin.py 2017-07-16 22:50:03 +02:00
cclauss
8db16a1421 Update PeerDbPlugin.py 2017-07-16 22:48:35 +02:00
cclauss
21d0b829d3 Update UiWebsocketPlugin.py 2017-07-16 22:47:22 +02:00
cclauss
08219a0285 Update ContentDbPlugin.py 2017-07-16 22:46:13 +02:00
cclauss
d426b6bb02 Update NewsfeedPlugin.py 2017-07-16 22:43:57 +02:00
cclauss
688c240b35 Update MutePlugin.py 2017-07-16 22:42:29 +02:00
cclauss
b82cf8d08d Update FilePackPlugin.py 2017-07-16 22:39:42 +02:00
cclauss
c44cb11800 Update CryptMessagePlugin.py 2017-07-16 22:38:47 +02:00
cclauss
b9e0275417 Update __init__.py 2017-07-16 22:35:14 +02:00
Andrew (anoa)
dc82f7ab3e
Small grammar fix 2017-07-15 00:30:25 -07:00
shortcutme
a6ce2a0253
Rev2156 2017-07-15 01:32:39 +02:00
shortcutme
a0d85d7d83
Prompt new site addition in raw mode 2017-07-15 01:32:15 +02:00
shortcutme
6a4882d81d
Test SafeRe repetition limit 2017-07-15 01:31:08 +02:00
shortcutme
ac1a03d17b
Don't allow more than 10 repetitions in one pattern 2017-07-15 01:30:53 +02:00
shortcutme
0e930efd95
Cache SafeRe patterns 2017-07-15 01:30:35 +02:00
shortcutme
d281f112d9
Rev2154, Fix same origin checking in proxy mode 2017-07-14 11:08:22 +02:00
shortcutme
5a42cb92cd
Rev2153 2017-07-14 10:37:19 +02:00
shortcutme
3459d35ed2
Test unsafe regex pattern recognization 2017-07-14 10:37:09 +02:00
shortcutme
699a8be721
Test unsafe patterns in dbschema 2017-07-14 10:36:41 +02:00
shortcutme
1f4a5643db
Test unsafe regex patterns on sign and verify 2017-07-14 10:36:18 +02:00
shortcutme
492408def7
Use class variable to store test site privatekey 2017-07-14 10:35:44 +02:00
shortcutme
74763465a8
Use SafeRe to match file patterns in dbschema.json 2017-07-14 10:34:57 +02:00
shortcutme
c069d4f67c
Use SafeRe to match user defined patterns in content.json 2017-07-14 10:34:18 +02:00
shortcutme
bf41c7b651
Detect potentionally unsafe regex patterns 2017-07-14 10:31:42 +02:00
shortcutme
3f5a5b4f9b
Rev2151 2017-07-13 19:33:16 +02:00
shortcutme
b60a1ec455
Test invalid filenames 2017-07-13 19:33:07 +02:00
shortcutme
13157eea1e
Move included content verification to separate function, fix root content.json file path verification 2017-07-13 19:32:54 +02:00
shortcutme
dd11f87673
Rev2148, Fix signing typo 2017-07-13 15:03:04 +02:00
shortcutme
87910a236b
Rev2147 2017-07-13 15:00:23 +02:00
shortcutme
096675c87e
Add unit to verification error 2017-07-13 15:00:04 +02:00
shortcutme
7d3beeb9e0
Enforce valid relative paths on verification 2017-07-13 14:59:17 +02:00
shortcutme
96a097e33d
Separate isValidRelativePath function 2017-07-13 14:58:52 +02:00
shortcutme
1bb3140f5b
Move file hashing to separate funcion to allow easier extension 2017-07-13 14:58:16 +02:00
shortcutme
6bf3d34c6c
Rev2145 2017-07-12 12:28:28 +02:00
shortcutme
3cd7e4e48e
Better way to strip pyc/pyd from config file path 2017-07-12 12:28:21 +02:00
shortcutme
2777c4c537
Read max 6MB from archive to protect against tar/zipbombs 2017-07-12 12:28:03 +02:00
shortcutme
e525ea2431
Rev2144, Fix CSP header in FilePack plugin, Allow media-src and font-src from self source 2017-07-11 23:00:33 +02:00
shortcutme
c8f37674c6
Rev2142, Fix random wrong data dir path 2017-07-11 21:03:24 +02:00
shortcutme
12ca870e38
Rev2141 2017-07-10 02:42:50 +02:00
shortcutme
f630e6c25e
Test raw access security 2017-07-10 02:42:41 +02:00
shortcutme
7c6bea6ddd
Fix raw site access without / at the site address end 2017-07-10 02:42:28 +02:00
shortcutme
efbef25c76
UserSetSettings, UserGetSettings Websocket API commands 2017-07-10 02:41:01 +02:00
shortcutme
1384da4691
Rev2137 2017-07-09 14:54:20 +02:00
shortcutme
26a250d1df
Media isMediaRequestAllowed no longer required for origin checking 2017-07-09 14:12:53 +02:00
shortcutme
426fe561c9
Cleanup not used wrapper opener check 2017-07-09 14:12:13 +02:00
shortcutme
5950b04c40
Add allow-origin header for media requests from same origin to fix css font support 2017-07-09 14:11:44 +02:00
shortcutme
434cfce32a
More simple same origin test for media files cross-site access 2017-07-09 14:11:06 +02:00
shortcutme
febdea6c64
Serve files without wrapper if requested using /raw/ prefix 2017-07-09 14:10:01 +02:00
shortcutme
6c0062dbc1
Rev2132 2017-07-06 00:09:47 +02:00
shortcutme
49735b7e55
Fix not internal error on request files from not seeded sites 2017-07-06 00:09:35 +02:00
shortcutme
1d6168f457
Download, svg, xml, flash, pdf files instead of displaying to avoid js execution 2017-07-06 00:09:05 +02:00
shortcutme
2a161f4421
Never allow cross-origin file request 2017-07-06 00:08:32 +02:00
shortcutme
f30b2b6fc2
Rev2130, Use SslPatch to load openssl library, Fix Android 6 openssl loading 2017-07-04 01:12:58 +02:00
shortcutme
ebbe19131b
Rev2128, Update to OpenSSL v1.0.2l 2017-06-30 10:13:25 +02:00
shortcutme
03cabcb07c
Rev2127, Fix delete files without file_info 2017-06-27 18:08:28 +02:00
shortcutme
401d3ec1c9
Rev2125, Fix missing if line 2017-06-21 00:03:26 +02:00
shortcutme
fd1f104f4e
Rev2124 2017-06-20 20:32:59 +02:00
shortcutme
66e2192e65
Add --silent option to disable logging to terminal 2017-06-20 20:32:51 +02:00
shortcutme
0d6d19502f
Format json reply for peerCmd command line action 2017-06-20 20:29:11 +02:00
shortcutme
a7b22e2055
Fix error on exit for peers without site 2017-06-20 20:28:35 +02:00
shortcutme
71fbcee76c
Fix error on exiting when there is no stream_server started 2017-06-20 20:28:09 +02:00
shortcutme
e157894694
Rev2122 2017-06-20 11:20:48 +02:00
shortcutme
f08f354eb6
More detailed file size match error logging 2017-06-20 11:20:43 +02:00
shortcutme
23db93d20f
Fix invalid update logging 2017-06-20 11:20:30 +02:00
shortcutme
67212ee29e
Rev2121 2017-06-19 16:19:04 +02:00
shortcutme
15d8589069
Fix typo, less verbose socket logging 2017-06-19 16:18:37 +02:00
shortcutme
14cd9315c1
Don't try to send to closed socket 2017-06-19 16:18:20 +02:00
shortcutme
f1786c2ee6
Handle unknown message type 2017-06-19 16:16:43 +02:00
shortcutme
7d9cb65ba1
Catch message type errors on connection parsing 2017-06-19 16:16:13 +02:00
shortcutme
9f72fdeb41
Display sign error on command line siteSign command failure 2017-06-19 16:14:36 +02:00
shortcutme
b7106995b7
Test size errors on getFile 2017-06-19 16:14:14 +02:00
shortcutme
dca3c775d1
Test expect exact sign and verification errors 2017-06-19 16:13:58 +02:00
shortcutme
916709a7e4
Allow less peer error if for popular sites 2017-06-19 16:13:06 +02:00
shortcutme
066f54f521
Only log listModification request in verbose mode 2017-06-19 16:12:41 +02:00
shortcutme
64199c7ded
Reduce logging on tracker error 2017-06-19 16:12:24 +02:00
shortcutme
79ca1069ec
Display exact sign error to UI on failure 2017-06-19 16:11:47 +02:00
shortcutme
43c8dacd70
Catch and log exact verification errors on worker download 2017-06-19 16:10:49 +02:00
shortcutme
f773bf3336
Add file_size to request to avoid unnecessary download 2017-06-19 16:10:18 +02:00
shortcutme
9a9bd71634
Catch file verification errors on update request 2017-06-19 16:07:36 +02:00
shortcutme
25657ebdca
Log to site instead of fileserver 2017-06-19 16:04:17 +02:00
shortcutme
c7146613a1
Store inner path to variable on update request to save some complexity 2017-06-19 16:02:52 +02:00
shortcutme
c58d28861d
Raise RequestError instead of Exception of fileGet error 2017-06-19 16:01:41 +02:00
shortcutme
ff69b04216
Catch verify exceptions on manual site files verification process 2017-06-19 15:57:02 +02:00
shortcutme
7653cba247
SiteVerify command line action display verify error 2017-06-19 15:49:39 +02:00
shortcutme
b0ee0dae93
Remove old testing code 2017-06-19 15:48:50 +02:00
shortcutme
0224863b1f
Only use positive sizes to calculate size sum of content.json 2017-06-19 15:48:33 +02:00
shortcutme
94c7ce9f42
Sign raise error instead of return False 2017-06-19 15:47:47 +02:00
shortcutme
2a3b8a7692
Verify raise exception instead of return False 2017-06-19 15:47:03 +02:00
shortcutme
fec3ff7d8e
Remove bad files that has no info 2017-06-19 15:40:13 +02:00
shortcutme
4b346243eb
On clone sign content.json after all other files copied 2017-06-19 15:39:14 +02:00
shortcutme
c2b177434d
Drop error if want to publish non existent file 2017-06-19 15:38:05 +02:00
shortcutme
c5d90ddd19
Start new workers if lots of tasks left 2017-06-19 15:36:07 +02:00
shortcutme
d607696a75
Update websocket site_info on own setting change 2017-06-19 15:33:23 +02:00
shortcutme
4088c88a56
Sidebar check siteSign result 2017-06-19 15:32:58 +02:00
ZeroNet
3489d5de09 Merge pull request #984 from imachug/privatekey
Don't ask user for privatekey if file can be signed with auth_privatekey
2017-06-15 22:38:02 +02:00
shortcutme
db8c85d249
Version 0.5.6, Changelog 2017-06-15 22:23:00 +02:00
Ivanq
f4a040064c Don't ask user for privatekey if file can be signed with auth_privatekey 2017-06-15 21:18:15 +03:00
shortcutme
a89f66e8b5
Rev2109 2017-06-15 19:50:11 +02:00
shortcutme
e9ce137e14
Display invalid hosts 2017-06-15 19:49:51 +02:00
shortcutme
2f7bfa95b2
Fix multi value argument command line parsing 2017-06-15 19:49:00 +02:00
shortcutme
c84fcf2034
Support manual ui_host command line parameter 2017-06-15 19:48:01 +02:00
shortcutme
0d3fa43f00
Remove unnecessary ui ip replace 2017-06-15 19:43:23 +02:00
shortcutme
2e04ba1880
Bind ui server to ipv4 address 2017-06-15 19:42:38 +02:00
ZeroNet
85b2a81568 Merge pull request #869 from MRoci/master
Root content.json "signers"  field as a list
2017-06-15 15:24:00 +02:00
shortcutme
0725464388
Fix database loading 2017-06-15 13:33:51 +02:00
shortcutme
f506ac9701
Faster getPath 2017-06-15 13:30:36 +02:00
shortcutme
97b3563e6b
Rev2105, Fix database updating when path contains special characters 2017-06-15 13:30:06 +02:00
MRoci
9ac5746e3c Changed this assignment to have the "signers" field in root's
content.json as a list and not a dictionary to mantain uniformity with
"includes" "signers" field and for not having a dict with empty values
2017-06-13 18:20:39 +02:00
shortcutme
1f83b6691b
Fix CoffeeScript 1.12 support 2017-06-13 14:24:10 +02:00
shortcutme
1f1cbf01d7
Rev2103 2017-06-13 14:21:07 +02:00
shortcutme
eefe7e1b5a
Don't add obsolete old signature format 2017-06-13 14:20:58 +02:00
shortcutme
bc02de4b18
ZeroName only match .bit domains 2017-06-13 14:19:43 +02:00
shortcutme
42874038e2
Only allow UI requests from safe hosts 2017-06-13 14:19:23 +02:00
shortcutme
d55fbd1728
Remove obsolete auth_key_sha512 2017-06-13 14:18:17 +02:00
shortcutme
aa402ebaf3
Fix typo 2017-06-13 14:13:09 +02:00
shortcutme
ae21f056d5
Error if no peer connection found 2017-06-13 14:12:48 +02:00
shortcutme
a4a23f3ea0
Fix site lock violation logging 2017-06-13 14:12:13 +02:00
ZeroNet
7a996b3c8d Merge pull request #976 from Pupiloho/patch-1
Add Spanish Translation
2017-06-13 13:09:03 +02:00
ZeroNet
2db48b8c22 Merge pull request #977 from Pupiloho/patch-2
Add Spanish Translation
2017-06-13 13:08:47 +02:00
ZeroNet
90e7a69926 Merge pull request #978 from Pupiloho/patch-3
Add Spanish Translation
2017-06-13 13:08:38 +02:00
ZeroNet
3c7de29ca7 Merge pull request #979 from Pupiloho/patch-4
Add Spanish Translation
2017-06-13 13:08:29 +02:00
ZeroNet
9dbd6d881f Merge pull request #981 from imachug/filerules
Allow fileRules for root content.json
2017-06-13 13:07:43 +02:00
Ivanq
67395b5e47 Allow fileRules for root content.json 2017-06-13 11:36:38 +03:00
Kûipumu
47d585768b Add Spanish Translation
First revision, orthography checked.
2017-06-12 15:49:45 -04:00
Kûipumu
0f65783266 Add Spanish Translation
First revision, orthography checked.
2017-06-12 15:44:37 -04:00
Kûipumu
fa3a981c19 Add Spanish Translation
First revision, orthography verified.
2017-06-12 15:40:21 -04:00
Kûipumu
868e956c3f Add Spanish Translation 2017-06-12 15:33:47 -04:00
shortcutme
742c2fe684
Rev2099, Keep tor client running until update finished 2017-06-06 00:05:43 +02:00
shortcutme
1d06d30812
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-06-05 01:09:22 +02:00
shortcutme
5801863b76
Rev2098 2017-06-05 01:09:17 +02:00
shortcutme
7fc2681252
Display update errors instead of crashing 2017-06-05 01:08:27 +02:00
shortcutme
eae2d59da7
Fix zeronet.conf parsing on standalone update.py running 2017-06-05 01:08:11 +02:00
shortcutme
4c11c96164
Fix socket proxy skip on updating 2017-06-05 01:07:39 +02:00
ZeroNet
dd5fba69d6 Merge pull request #952 from leycec/lnxinstall
Arch and Gentoo Linux Installation Instructions
2017-06-03 08:34:33 +02:00
shortcutme
653219d1de
Rev2096 2017-06-03 00:54:26 +02:00
shortcutme
6167dda01d
Compact json list output 2017-06-03 00:53:59 +02:00
shortcutme
0b7d1ad90d
Add callback for certSelect 2017-06-03 00:53:40 +02:00
shortcutme
5e6f6c5b85
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-05-30 01:04:50 +02:00
shortcutme
f0f32cf25c
Rev2092, Prefer recent peers when starting workers 2017-05-30 01:04:45 +02:00
ZeroNet
daefbada16 Merge pull request #957 from ArtemMolotov/master
Small fix russian translation
2017-05-28 21:55:02 +02:00
Artem Molotov
d6721f0656 Small fix russian translation 2017-05-28 18:22:35 +03:00
shortcutme
de363b57ce
Rev2091, Port opening error should not prevent ZeroNet startup 2017-05-26 12:22:35 +02:00
shortcutme
e291555e60
Rev2090, Fix ssl patch library finding, Changelog for 0.5.5 2017-05-26 12:14:43 +02:00
leycec
0c0ec30560 Arch and Gentoo Linux installation instructions 2017-05-25 19:56:21 -04:00
ZeroNet
5d6169c232 Merge pull request #949 from grez911/master
fix incorrect variable order in file_path.replace
2017-05-24 18:57:36 +02:00
Sergei Bondarenko
830f98573e fix incorrect variable order in file_path.replace 2017-05-24 19:28:02 +03:00
shortcutme
b0d574dfb0
Rev2089, Close the transaction on failed peer db save 2017-05-24 10:40:10 +02:00
shortcutme
b73742839b
Rev2088 2017-05-24 10:29:19 +02:00
shortcutme
89bb12de71
Search for success message instead of error when portchecking 2017-05-24 10:28:59 +02:00
shortcutme
ed11ae283f
Use https for portchecker.co 2017-05-24 10:27:02 +02:00
shortcutme
fb43dfb4f2
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-05-23 12:42:16 +02:00
shortcutme
6dc084c3ab
Rev2087 2017-05-23 12:42:09 +02:00
shortcutme
ba9cd9b0ca
Fix undefined placeholder 2017-05-23 12:42:02 +02:00
shortcutme
aacde33614
File size limit default to 10MB 2017-05-23 12:41:37 +02:00
shortcutme
3f59727ab6
Formatting 2017-05-23 12:40:42 +02:00
ZeroNet
b028eee90e Merge pull request #942 from grez911/master
fix issue #936
2017-05-23 00:03:37 +02:00
Sergei Bondarenko
a871b5dbe7 fix issue #936
os.path.join(*file_path.split("/")) construction drops leading slash from string thus making absolute path relative. It leads into problems in case if data_dir differs from directory where is zeronet installed.
2017-05-22 20:31:44 +03:00
shortcutme
7900578077
Rev2082, Log websocket receive errors 2017-05-22 11:34:16 +02:00
MuxZeroNet
35a18bd0b2 Weak password warning (#938)
* Weak password warning

* Update UiWebsocket.py

* Don't implement print with an O(n^2) iteration

* Rename method

* Fix logging, uncaught exception in addNotes

and pushes a notification when UI server is bound to the whole Internet.

* Remove memo comments. Remove terminal hue.
2017-05-22 11:13:45 +02:00
shortcutme
e6680b4f60
Version 0.5.5, Rev2081, Lack of JS notification 2017-05-18 23:03:26 +02:00
shortcutme
077b3df3cd
Rev2080 2017-05-18 03:07:43 +02:00
shortcutme
edd726ac9f
Site upgrade support in clone command 2017-05-18 03:07:32 +02:00
shortcutme
cbf184846a
Fix permissionAdd/Remove admin command 2017-05-18 03:05:45 +02:00
shortcutme
2677ad92d3
Fix multi-line confirmation dialog 2017-05-18 03:05:02 +02:00
shortcutme
f9c0c21714
Update CoffeeScript to 1.12.6 2017-05-16 10:56:12 +02:00
shortcutme
442c01eabf
Rev2068, Deny blacklist add/remove in multiuse mode 2017-05-14 22:59:47 +02:00
shortcutme
d467aabd4c
Rev2067, Fix inner_path stripping 2017-05-11 18:18:12 +02:00
shortcutme
f4f4aa0e50
Rev2066 2017-05-11 18:03:12 +02:00
shortcutme
ffb67ab23e
No placeholder for privatekey prompt 2017-05-11 18:02:56 +02:00
shortcutme
1a3b48a60d
Sidebar blacklist button on deletion 2017-05-11 18:02:37 +02:00
shortcutme
84b535767b
By default nothing is domain 2017-05-11 18:02:05 +02:00
shortcutme
5908d2ca53
RenderWrapper showloadingscreen parameter 2017-05-11 18:01:16 +02:00
shortcutme
27a582634f
Don't check referrer for html files 2017-05-11 18:00:57 +02:00
shortcutme
47245f485a
ActionFile security check 2017-05-11 17:59:46 +02:00
shortcutme
545459be88
RenderWrapper with parameters 2017-05-11 17:59:12 +02:00
shortcutme
b5d3995874
GetSiteUrl based on if it's proxy request 2017-05-11 17:57:29 +02:00
shortcutme
487f5cb8c2
Fix unicode url redirects 2017-05-11 17:56:01 +02:00
shortcutme
cc31081f1c
Different design for second button of wrapperConfirm 2017-05-11 17:55:38 +02:00
shortcutme
a9b9902e60
Placeholder support for displayPrompt 2017-05-11 17:55:09 +02:00
shortcutme
f183e756f3
Multi button support for wrapperConfirm 2017-05-11 17:54:48 +02:00
shortcutme
9ec050341b
Site blacklist to Mute plugin 2017-05-11 17:53:29 +02:00
shortcutme
bf042ce7a3
Rev2060, Only boost all.js and all.css priority, really fix download priority test 2017-05-07 21:34:44 +02:00
shortcutme
d2cf613872
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-05-07 21:21:35 +02:00
shortcutme
f67cb7b145
Rev2059, Fix download test, boost priority on request by 15, Adjust default priorities 2017-05-07 21:21:26 +02:00
ZeroNet
9f5ea86ebd Merge pull request #928 from probonopd/patch-1
Allow running from usr/share/zeronet
2017-05-07 21:01:52 +02:00
probonopd
b8fb53ba20 Allow running from usr/share/zeronet 2017-05-07 19:51:53 +02:00
shortcutme
db744f576e
Rev2058 2017-05-07 18:19:24 +02:00
shortcutme
3f772d1e1e
Boost priority for essential files to allow concurrent requests 2017-05-07 18:19:08 +02:00
shortcutme
438bdbc141
Protect peers for low traffic sites from closing 2017-05-07 18:15:23 +02:00
shortcutme
728e497057
Display database rebuilding progressbar 2017-05-07 18:14:13 +02:00
shortcutme
d346a532ff
Rev2056, Add local client to sidebar peer numbers 2017-05-06 18:08:32 +02:00
shortcutme
34a6337c01
Rev2055, Don't add ? to url if start with # using replaceState and pushState 2017-05-06 17:27:49 +02:00
lmath
e42631932b Fix Sidebar button for touch device & CHANGELOG-zh-cn & FreeBSD installation instructions (#916)
* Disallow change optional limit on public proxy

* Add Chinese for Mute plugins

* add FreeBSD installation instructions to README-zh-cn.md

* Fix Sidebar button for touch device

* Add CHANGELOG-zh-cn.md

* Why merging junk left? Remove it!
2017-05-06 02:13:26 +02:00
ZeroNet
e9b2c76a88 Merge pull request #912 from mishfit/allowEmptyFileQueryFilters
Allow empty fileQuery filters
2017-05-06 02:11:29 +02:00
mishfit
270eb677c7 allow empty file query filters 2017-04-21 03:26:17 -06:00
shortcutme
9a772eaecc
Upadte changelog 2017-04-14 17:50:42 +02:00
shortcutme
fae5d22e86
Rev2054, Outgoing socket binding support 2017-04-14 16:05:42 +02:00
shortcutme
c5629adf23
Rev2050, Fix archive benchmark hash calculation and zip homogenization 2017-04-14 11:52:01 +02:00
shortcutme
9b480b41e1
Rev2049, Delete test.tar.bz2 after benchmark 2017-04-14 11:13:29 +02:00
shortcutme
fbed15318b
Fix file request testcase 2017-04-14 00:34:40 +02:00
shortcutme
14c906561d
Rev2048, Stop sending detailed exception as response to file request 2017-04-14 00:26:20 +02:00
shortcutme
e125895615
Rev2047, Add archive benchmark 2017-04-13 22:54:16 +02:00
shortcutme
6bef5ca7f4
Version 0.5.4, Rev2046 2017-04-13 16:27:38 +02:00
shortcutme
f33f1faeea
Only keep last 10 files opened 2017-04-13 16:27:30 +02:00
shortcutme
b261dc5dfd
Boost workers after 50 tasks 2017-04-13 16:27:05 +02:00
shortcutme
164a9b947f
Rev2045 2017-04-12 17:37:55 +02:00
shortcutme
46440565dd
Disable siteSetLimit on proxies 2017-04-12 17:37:13 +02:00
shortcutme
49adea1654
siteSetLimit returns with ok on success 2017-04-12 17:36:50 +02:00
shortcutme
169cf2e6ae
Support optional db files 2017-04-12 17:36:03 +02:00
shortcutme
dafe9981a2
Rev2043, Fix selected domain display 2017-04-12 00:45:48 +02:00
shortcutme
c78af9773c
Rev2042 2017-04-12 00:32:30 +02:00
shortcutme
1a7a22eb91
Set added cert 2017-04-12 00:32:19 +02:00
shortcutme
4c7ff9bb53
Fix unhandled expcetion on invalid cert 2017-04-12 00:31:37 +02:00
shortcutme
1ee592f5b7
Rev2039 2017-04-10 12:19:59 +02:00
shortcutme
10632c15ef
Fix target_onion on connection recovery 2017-04-10 12:19:23 +02:00
shortcutme
25bb14037c
Better site lock violation logging 2017-04-10 12:18:21 +02:00
shortcutme
d7db7a8060
Rev2035, Dont sign same onion address multiple time 2017-04-10 01:16:34 +02:00
ZeroNet
fe2344ea12 Merge pull request #894 from mkg20001/patch-1
Build docker image locally
2017-04-09 22:29:03 +02:00
Maciej Krüger
7898b237fc Update .travis.yml 2017-04-09 22:13:37 +02:00
shortcutme
f3edd8013d
Rev2034, Fix leaking users.json via webui 2017-04-09 16:54:28 +02:00
ZeroNet
279e2ae865 Merge pull request #884 from MuxZeroNet/patch-15
Update TestWeb.py tests
2017-04-09 16:28:36 +02:00
shortcutme
c056384bd5
Rev2033 2017-04-09 12:05:11 +02:00
shortcutme
a06ce64bbf
Limit maximum number of tor hidden service created 2017-04-09 12:05:04 +02:00
shortcutme
7e314287d6
Bootstrapper support same onion address for multiple sites 2017-04-09 12:04:23 +02:00
shortcutme
7bda72027a
Site lock validation based on target_onion 2017-04-09 12:03:25 +02:00
shortcutme
c5c0df838f
Store requested onion address instead of site_lock 2017-04-09 12:02:24 +02:00
shortcutme
75d94aaf06
Choose from current hidden services if over tor_hs_limit 2017-04-09 11:58:18 +02:00
shortcutme
16bfb35109
No positive preference for peers with more than 5 shared sites to avoid centralization 2017-04-09 11:57:35 +02:00
shortcutme
6c8a7e3cfa
Old onion peers less likely working 2017-04-09 11:54:15 +02:00
ZeroNet
409841a3cf Merge pull request #834 from MuxZeroNet/patch-13
[Open for more Tests] StemPort Plugin
2017-04-08 22:20:06 +02:00
ZeroNet
ffa3055a33 Merge pull request #890 from AwesomeTurtle/awesometurtle-selenium-travis
fix(CI): add selenium to travis
2017-04-08 21:16:17 +02:00
Mathieu Tortuyaux
41aa15ec26 fix(CI/test): start client with docker image 2017-04-08 12:57:58 -04:00
shortcutme
880d536837
Disable geventwebsocket logging 2017-04-08 17:22:29 +02:00
shortcutme
1144f28982
Rev2027, Rollback PySocks as it does not works well with Tor/gevent 2017-04-08 17:22:00 +02:00
shortcutme
3384bd1e58
Rev2026, Change diferent openssl binary for better compatibility 2017-04-08 12:14:59 +02:00
Mathieu Tortuyaux
0cd795b157 fix(CI): add selenium to travis 2017-04-07 18:06:38 -04:00
shortcutme
03f3e9e4fd
Rev2025, Publish remotely outdated files on modification check 2017-04-07 21:17:25 +02:00
shortcutme
e1f7752aff
Rev2023 2017-04-07 18:18:41 +02:00
shortcutme
52afc9d0b2
Prefer ips starting with 192 on upnp port opening 2017-04-07 18:18:22 +02:00
shortcutme
8ea8e8c28a
Publish incoming files to more peers 2017-04-07 18:17:30 +02:00
shortcutme
c6792b7674
Ignore content if file not found on signing 2017-04-07 18:16:58 +02:00
shortcutme
de14c55311
Fix invalid referrers parsing 2017-04-07 18:13:09 +02:00
MuxZeroNet
2cb8cc9107 Update TestWeb.py 2017-04-06 23:14:46 +00:00
shortcutme
309308dac0
Rev2020 2017-04-07 00:12:56 +02:00
shortcutme
8650651567
Prefer OpenSSL 1.0 2017-04-07 00:12:50 +02:00
shortcutme
4bb7e04f2a
Update CoffeeScript to 1.12.4 2017-04-07 00:12:11 +02:00
shortcutme
7e53bed95f
Rev2018 2017-04-06 23:46:38 +02:00
shortcutme
e527dbdf88
Changed signature 2017-04-06 23:46:32 +02:00
shortcutme
8295f9cd6b
Attach tor_manager to request tor addresses 2017-04-06 23:43:27 +02:00
shortcutme
2f38f8d9f3
Update gevent websocket to 0.10.1 2017-04-06 23:26:19 +02:00
shortcutme
44afaf7a4b
Update openssl dlls to 1.0.2k 2017-04-06 23:25:25 +02:00
shortcutme
ccfcdbc6ca
Update pyelliptic 2017-04-06 23:24:38 +02:00
shortcutme
929432d469
Force SSLv23 2017-04-06 23:22:55 +02:00
shortcutme
e15cb8a43d
Rev2014 2017-04-06 19:22:05 +02:00
shortcutme
fbe96a0a6d
Update rsa to 3.4.2 2017-04-06 19:21:32 +02:00
shortcutme
fa65a6dc05
Update PySocks to 1.6.7 2017-04-06 19:20:27 +02:00
shortcutme
9921fc07dd
Update pybitcointools to 1.1.42 2017-04-06 19:19:47 +02:00
shortcutme
12a0c955bc
Update pyasn to 0.2.4 2017-04-06 19:18:33 +02:00
shortcutme
2be3ff02bd
Rev2009 2017-04-01 22:32:06 +02:00
shortcutme
c6c6af1268
Log loaded merger sites on rebuild 2017-04-01 22:32:06 +02:00
shortcutme
e3baf8944e
Dont save user file in parallel 2017-04-01 22:32:06 +02:00
shortcutme
233d5f31f2
Support ignore_class and queue to noparallel decorator 2017-04-01 22:32:06 +02:00
shortcutme
cfb2276ecd
Always try to find new peers for optional files if no workers 2017-04-01 22:32:06 +02:00
ZeroNet
16f7a6d3cb Merge pull request #868 from reezer/patch-1
Add missing markup in README.md
2017-03-18 13:17:51 +01:00
Christian Sturm
b8bb8cab25 Add missing markup in README.md
Whoops, missed code tags for service restart in the previous commit.
2017-03-18 12:41:18 +01:00
ZeroNet
f3c4e1dc19 Merge pull request #867 from reezer/patch-1
add FreeBSD installation instructions to README.md
2017-03-18 12:29:47 +01:00
Christian Sturm
5cbcb7e878 add FreeBSD installation instructions to README.md 2017-03-18 12:27:57 +01:00
ZeroNet
fed61d7109 Merge pull request #863 from xfq/patch-1
Update README-zh-cn.md
2017-03-18 12:17:04 +01:00
shortcutme
d7ba9f6924
Rev2004, Fix message utf8 error 2017-03-18 11:11:01 +01:00
Fuqiao Xue
cbf175ac96 Update README-zh-cn.md 2017-03-16 09:40:07 +08:00
shortcutme
afcd6dfa14
Rev2003, Fix dbQuery exception in verbose mode 2017-03-15 13:13:21 +01:00
shortcutme
f55c2659cd
Rev2002, Fix exception on startworkers 2017-03-12 22:14:24 +01:00
ZeroNet
7705cb1158 Merge pull request #857 from camponez/master
Review Brazilian Portuguese Translation
2017-03-12 17:58:35 +01:00
shortcutme
9755df6fa6
Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2017-03-12 17:57:23 +01:00
shortcutme
e564d730ce
Rev1999 2017-03-12 17:57:13 +01:00
shortcutme
e37938abe0
Rev1999 2017-03-12 17:56:53 +01:00
shortcutme
9b5f7928bf
Start workers for slow optional file tasks 2017-03-12 17:56:28 +01:00
shortcutme
d7496d6fd5
Boost js, css, dbschema and non-user json file priority 2017-03-12 17:55:47 +01:00
Eduardo Elias
2a131f7978 Review Brazilian Portuguese Translation 2017-03-12 16:22:54 +00:00
shortcutme
f46f9fa6ea
Test new content.json content 2017-03-12 13:13:47 +01:00
shortcutme
2473a09f7b
Load content.json content before signing 2017-03-12 13:13:30 +01:00
shortcutme
ec513f0b60
Remove archived files from bad files 2017-03-12 13:13:08 +01:00
ZeroNet
03bec6a36c Merge pull request #856 from brunogarciacosta/master
Add Brazilian Portuguese translation.
2017-03-11 12:26:26 +01:00
brunogarciacv
ad826dd846 Brazilian Portuguese Translation 2017-03-11 03:56:45 -03:00
brunogarciacv
fd8742ae3a Brazilian Portuguese translation 2017-03-11 03:43:39 -03:00
shortcutme
96e45bb517
Rev1995 2017-03-06 15:30:51 +01:00
shortcutme
909b9da9da
Unnecessary log and comment 2017-03-06 15:30:42 +01:00
shortcutme
50937990e5
Fix typos 2017-03-06 15:30:31 +01:00
shortcutme
4fbfb5838a
Fix parsing zeronet.conf 2017-03-06 15:28:37 +01:00
ZeroNet
e2a7d86446 Merge pull request #850 from sexybiggetje/master
Added Dutch translation file
2017-03-06 15:12:59 +01:00
Martijn de Boer
ef6c9325e0 Added Dutch translation file 2017-03-05 13:55:47 +01:00
ZeroNet
0e2f742b7e Merge pull request #842 from mishfit/refactorListAndWalk
Rename SiteStorage.list to SiteStorage.walk
2017-03-04 12:39:06 +01:00
ZeroNet
7d85a10e82 Merge pull request #848 from MuxZeroNet/patch-14
Log ZeroFrame errors to terminal
2017-03-03 14:37:39 +01:00
MuxZeroNet
dff261eb18 Log ZeroFrame errors to console 2017-03-03 02:42:20 +00:00
shortcutme
349ee5858f
Rev1993 2017-03-02 23:40:36 +01:00
shortcutme
461f0a274a
Only count ping time if no waiting requests 2017-03-02 23:40:30 +01:00
shortcutme
a2eef70030
Boost priority to first added file to queue 2017-03-02 23:40:08 +01:00
shortcutme
2efb6cf4f1
Connect first to best peers based on ping time 2017-03-02 23:39:52 +01:00
shortcutme
36db8a4dc9
Ratelimit progressbar update to save some cpu time 2017-03-02 23:39:31 +01:00
shortcutme
52ed170292
Create new file server for every test 2017-02-27 11:21:40 +01:00
shortcutme
871588aa9f
Move invalid path test upper level 2017-02-27 11:21:22 +01:00
shortcutme
a72c4eafff
Version 0.5.3, Rev1988 2017-02-27 00:14:19 +01:00
shortcutme
97cec2ba46
Benchmark helper for console 2017-02-27 00:13:41 +01:00
shortcutme
4e846774b4
Log formatting 2017-02-27 00:13:30 +01:00
shortcutme
a6be8ddc2d
Connectable peers ordered 2017-02-27 00:13:18 +01:00
shortcutme
b65670b9e4
Don't remove peers with atleast 5 sites 2017-02-27 00:12:55 +01:00
shortcutme
ea635d4630
Only totally connected peers counted to peer cleanup 2017-02-27 00:12:36 +01:00
shortcutme
2e9737c149
Faster and better getConnectedpeers 2017-02-27 00:11:57 +01:00
shortcutme
0f8de2b7c1
Use latest added peers and use reputation for listModifications and publishing 2017-02-27 00:11:45 +01:00
shortcutme
2188c5d9fa
Use getRecentPeers for publishing 2017-02-27 00:11:02 +01:00
shortcutme
b5d879c1cd
Start site update check on site re-connect 2017-02-27 00:10:27 +01:00
shortcutme
fd365a19f7
Use getRecentPeers for listModification 2017-02-27 00:09:59 +01:00
shortcutme
adbaadae81
Allow 100 sec timeout for listModification 2017-02-27 00:09:41 +01:00
shortcutme
09ad4133fb
20 sec timeout for listModified 2017-02-27 00:08:46 +01:00
shortcutme
da49981ecd
Allow 6 failed requests before closing peer 2017-02-27 00:07:51 +01:00
shortcutme
ebd00bfb9f
Separate site cleanup and announce thread 2017-02-27 00:07:29 +01:00
shortcutme
353ddd3105
Sync site checking for not so active sites 2017-02-27 00:06:40 +01:00
shortcutme
e80887d779
Add reputation for old peers 2017-02-27 00:06:13 +01:00
shortcutme
06ddf26d09
Increase command timeout 2017-02-27 00:05:27 +01:00
shortcutme
c5c41f2d3e
Fix argument parsing error 2017-02-27 00:05:08 +01:00
shortcutme
c5b47fe4a0
Increase connected limit to 8 from 6 2017-02-27 00:03:10 +01:00
shortcutme
fe7a53fb8a
Separate config argument for workers 2017-02-27 00:02:56 +01:00
shortcutme
bad2a79f05
Reason for connection closing 2017-02-27 00:02:24 +01:00
shortcutme
75100c335f
Small cosmetical changes on stats page 2017-02-27 00:00:27 +01:00
shortcutme
b31c928898
Only change cert on merged site if different 2017-02-26 23:59:54 +01:00
mishfit
656c818211 rename SiteStorage.list to SiteStorage.walk
also, add SiteStorage.list as non-recursive
directory listing (`os.listdir`)
2017-02-24 21:58:46 -07:00
shortcutme
c95637eee1
Rev1941, Use utf-8 encoding on text files 2017-02-24 14:39:20 +01:00
shortcutme
819f765bce
Rev1940, Fix utf8 archive names on Safari 2017-02-24 14:23:44 +01:00
shortcutme
f42ad03f91
Rev1936 2017-02-24 01:16:29 +01:00
shortcutme
26bad8d05b
Fix needConnections bug 2017-02-24 01:16:22 +01:00
shortcutme
117d577e82
Disable bz2 support due Win/Android incompatibility issues 2017-02-24 01:16:11 +01:00
MuxZeroNet
0aa6358938 Update TorManager.py 2017-02-23 23:39:45 +00:00
MuxZeroNet
048207f70b Update StemPortPlugin.py 2017-02-23 23:39:05 +00:00
MuxZeroNet
a724dd472f Update TorManager.py 2017-02-23 23:09:47 +00:00
MuxZeroNet
ad900479f6 Important Update - Don't override createSocket 2017-02-23 23:08:56 +00:00
MuxZeroNet
2e4767926c Update StemPortPlugin.py - check config.tor 2017-02-23 22:47:32 +00:00
shortcutme
4d3603136f
Rev1933 2017-02-22 11:29:35 +01:00
shortcutme
8a15bf059d
Support utf8 filenames in zip 2017-02-22 11:29:35 +01:00
shortcutme
b9a5c94923
Newsfeed plugin support date_added in ms 2017-02-22 11:29:35 +01:00
shortcutme
c08b83c299
Newsfeed plugin skip broken feed formats 2017-02-22 11:29:35 +01:00
shortcutme
4aff146812
Log giving up on a file 2017-02-22 11:29:35 +01:00
ZeroNet
76bebb1eed Merge pull request #839 from beigexperience/master
Make the cmd launcher "silent" and not stick around(fix for win10)
2017-02-22 01:04:29 +01:00
beigexperience
71ac8ff996 Make the cmd launcher "silent" and not stick around(fix for win10) 2017-02-21 22:14:45 +02:00
MuxZeroNet
92b9397ee2 Update StemPortPlugin.py - Patch conservatively 2017-02-21 01:45:19 +00:00
shortcutme
a59cf9b9aa
Rev1930, Change stack size argument for special hardwares 2017-02-19 13:20:49 +01:00
shortcutme
221aa16433
Rev1929, Fix file filed on not bad files 2017-02-19 12:32:41 +01:00
shortcutme
44507d8556
Rev1927 2017-02-19 12:23:40 +01:00
shortcutme
1897bce814
Send virtual file path done event to remove the loading screen 2017-02-19 12:23:21 +01:00
shortcutme
04492a3262
Let the gc close the file 2017-02-19 12:22:04 +01:00
shortcutme
f857330f47
Remove unnecessary imports, formatting 2017-02-19 12:21:55 +01:00
shortcutme
7fb8cd06bc
Rev1924 2017-02-19 00:53:43 +01:00
shortcutme
2854e202e1
Plugin for tar.gz, tar.bz2 and zipped files 2017-02-19 00:53:16 +01:00
shortcutme
63b609f725
Give up files after 30 tries 2017-02-19 00:52:31 +01:00
shortcutme
2eef0bded1
Only increment bad_file if internet connection is active 2017-02-19 00:52:20 +01:00
shortcutme
45e2b350a9
Raise exception on invalid path 2017-02-19 00:51:47 +01:00
MuxZeroNet
ccf2897a65 Update StemPortPlugin.py 2017-02-17 22:25:44 +00:00
shortcutme
22059e71a2
Rev1914, Fix command line sitePublish command 2017-02-17 12:17:44 +01:00
MuxZeroNet
8ba684e8c3 Create StemPortPlugin.py 2017-02-17 01:26:11 +00:00
MuxZeroNet
ce4a91b679 Create __init__.py 2017-02-17 01:23:05 +00:00
MuxZeroNet
ddc3f72afb Make TorManager accept plugins 2017-02-17 01:17:51 +00:00
shortcutme
d57d82f439
Rev1913, Support local address other than 127.0.0.1 2017-02-16 20:56:07 +01:00
shortcutme
39734dfadb
innerLoaded command alias as wrapperInnerLoaded 2017-02-16 19:04:00 +01:00
shortcutme
23dc8e063c
Rev1909, Rebuild content.db on error 2017-02-15 13:35:24 +01:00
shortcutme
f5fb6b83ff
Rev1905, Secure DB write db_mode option 2017-02-15 12:43:05 +01:00
shortcutme
3d55af2111
Rename feed_following to feed_follow_num 2017-02-14 19:04:25 +01:00
shortcutme
179ee2d2a4
Rev1899, Add followed feed number to site info 2017-02-14 19:03:17 +01:00
shortcutme
94485ed78c
Rev1896 2017-02-13 16:27:59 +01:00
shortcutme
9381015d80
Log mute actions 2017-02-13 16:27:42 +01:00
shortcutme
3ff2ec9104
Better calculation of deletable optional files 2017-02-13 16:25:12 +01:00
shortcutme
6a71bb256e
Always load json_row on deleting 2017-02-13 16:13:09 +01:00
shortcutme
cfad85b30e
Log file object on db load 2017-02-13 16:12:56 +01:00
shortcutme
276b65f0b9
Rev1893, In multiuser mode dont allow users to add or remove mute 2017-02-11 21:57:12 +01:00
shortcutme
a15d82a7ef
Rev1892 2017-02-11 18:26:37 +01:00
shortcutme
ccd2a9f171
Run os.random only 1000 times 2017-02-11 18:26:37 +01:00
shortcutme
9e550849f6
Add version info to Benchmark results 2017-02-11 18:26:37 +01:00
shortcutme
6149f5c6ee
Download everything on add 2017-02-11 18:26:37 +01:00
shortcutme
a390c19a20
Sidebar functions restricted in Multiuser plugin 2017-02-11 18:26:37 +01:00
shortcutme
bb57120872
In multiuser mode allow unrestricted access for users defined in users.json 2017-02-11 18:26:37 +01:00
shortcutme
edfe760227
Better way to restrict command in multiuser mode 2017-02-11 18:26:37 +01:00
shortcutme
27d31b3a1e
Option to disable new site adding in multiuser mode 2017-02-11 18:26:37 +01:00
shortcutme
0106a193e5
Store SiteManager to UiServer 2017-02-11 18:26:36 +01:00
shortcutme
f523925817
Add separate function to check if user has run the API command 2017-02-11 18:26:36 +01:00
ZeroNet
893e37cd74 Update README.md 2017-02-10 19:15:28 +01:00
ZeroNet
0490fe9f18 Merge pull request #826 from Th3B3st/patch-4
Add/Update Italian translation
2017-02-10 16:52:10 +01:00
ZeroNet
0d1c81353c Merge pull request #825 from Th3B3st/patch-3
Add/Update Italian translation
2017-02-10 16:51:55 +01:00
Th3B3st
90c90b3cc6 Add/Update Italian translation 2017-02-10 15:19:35 +01:00
Th3B3st
768ae23b09 Add/Update Italian translation
A little language correction.
2017-02-10 14:54:52 +01:00
ZeroNet
95229852fa Merge pull request #822 from cxgreat2014/master
update translate
2017-02-10 10:02:43 +01:00
cxgreat2014
2421e387b9 update translate 2017-02-10 09:19:40 +08:00
shortcutme
6b900ab0b1
Rev1884, Fix mute plugin startup error 2017-02-10 00:40:32 +01:00
ZeroNet
91cba2514a New bundle links 2017-02-09 21:01:25 +01:00
ZeroNet
db7cd746b1 Merge pull request #821 from Th3B3st/patch-2
Add/Update Italian translation for Tryicon plugin.
2017-02-09 20:06:03 +01:00
Th3B3st
fda4aaf10d Add/Update Italian translation for Tryicon plugin. 2017-02-09 15:21:10 +01:00
ZeroNet
381c4e4867 Merge pull request #819 from Th3B3st/patch-1
it.json
2017-02-09 13:48:05 +01:00
Th3B3st
0f0eed4317 Create it.json 2017-02-09 12:54:10 +01:00
ZeroNet
7f06abc359 Merge pull request #818 from cxgreat2014/master
translate mute plugin for zh zh-tw
2017-02-09 10:05:11 +01:00
cxgreat2014
fc3f102528 translate mute plugin for zh zh-tw 2017-02-09 14:12:36 +08:00
shortcutme
becb71ad28
Version 0.5.2, Rev1882 2017-02-09 01:58:26 +01:00
shortcutme
2cea157ecc
Mute plugin 2017-02-09 01:58:08 +01:00
shortcutme
4cb14243be
Fix stats plugin db benchmark 2017-02-09 01:57:59 +01:00
shortcutme
62c31e1fc3
Only set valid optional limit on startup 2017-02-09 01:57:44 +01:00
shortcutme
56efa02820
GetDbFiles return inner path 2017-02-09 01:57:12 +01:00
shortcutme
f3c71f3e6c
Move SiteStorage database updating to separate function 2017-02-09 01:56:20 +01:00
shortcutme
4ec0209dd7
Invalid request detect 2017-02-09 01:54:24 +01:00
shortcutme
277d16eabb
Bad action increment on invalid file update request 2017-02-09 01:54:04 +01:00
shortcutme
38d330da1a
Rename db.loadJson to db.updateJson 2017-02-09 01:53:31 +01:00
shortcutme
90c9adc8dc
Fix error reporting on asnyc websocket functions 2017-02-09 01:53:02 +01:00
shortcutme
eb30eb90d6
Use more worker on initial sync 2017-02-09 01:52:39 +01:00
cxgreat2014
6ec1776f57 Fix BUG in #813 (#816) 2017-02-08 09:13:33 +01:00
lmath
4f1fc06984 Disallow change optional limit on public proxy (#813) 2017-02-06 18:04:00 +01:00
shortcutme
d411d4d398
Rev1862, Skip optional file delete on invalid limit 2017-02-06 09:57:51 +01:00
ZeroNet
c9fa29c562 Merge pull request #798 from l5h5t7/master
Update Chinese translation
2017-02-05 23:19:13 +01:00
shortcutme
f74e9397db
Rev1861, Fix favicon for zero url access type 2017-02-05 22:55:24 +01:00
shortcutme
4988d31aff
Rev1859, Update more active sites first 2017-02-05 18:36:58 +01:00
ZeroNet
22eff13fe3 Merge pull request #810 from MuxZeroNet/patch-10
Fix typo in login.html
2017-02-05 13:36:32 +01:00
MuxZeroNet
f4bb6d24e5 Fix typo in login.html 2017-02-05 06:53:11 +00:00
ZeroNet
76013aa5fd Merge pull request #808 from ysc3839/fix-807
Fix #807.
2017-02-04 16:38:06 +01:00
ysc3839
fcd0ec5996 Fix #807. 2017-02-04 21:58:58 +08:00
shortcutme
a08114b1b0
Rev1855, Fix content type detection, Formatting 2017-02-02 12:51:41 +01:00
ZeroNet
57a0d4f8a6 Update test 2017-02-01 23:48:24 +01:00
shortcutme
aab6255783
Rev1851 2017-01-29 19:03:29 +01:00
shortcutme
66e2bfd76b
Reset bad_files on full update 2017-01-29 19:03:22 +01:00
shortcutme
db7dad6731
Don't delete content.json files from bad_files on update 2017-01-29 19:03:08 +01:00
shortcutme
b03f287d86
Dont log changed files 2017-01-29 19:02:40 +01:00
shortcutme
39e3f22d0b
Support limit and day limit parameter in feedQuery 2017-01-29 19:02:26 +01:00
shortcutme
2b389e4e85
Support since parameter for siteUpdate 2017-01-29 19:02:08 +01:00
lmath
f2700332ae Replace to Chinese slideshow 2017-01-28 06:33:09 +08:00
lmath
4559ee0d7f Update Chinese translation 2017-01-28 06:27:45 +08:00
lmath
a7f21f0680 Merge remote-tracking branch 'refs/remotes/HelloZeroNet/master' 2017-01-28 05:53:19 +08:00
shortcutme
1668659ff6
Rev1848 2017-01-27 14:02:03 +01:00
shortcutme
13f0ccf8c6
Fix optional files deleting 2017-01-27 14:01:55 +01:00
shortcutme
8a75f200ca
No logging phantomjs 2017-01-27 14:00:41 +01:00
shortcutme
8b2920c296
Add relative path to file info 2017-01-27 14:00:28 +01:00
shortcutme
b29634e906
Rev1844 2017-01-27 13:06:17 +01:00
shortcutme
32c63fb140
Don't reload source on changes in Test directory 2017-01-27 13:06:09 +01:00
shortcutme
d65c7d05a4
Remove /media access 2017-01-27 13:05:49 +01:00
shortcutme
72f91a2816
Fix selenium with gevent 1.2 2017-01-27 13:05:10 +01:00
shortcutme
c57d0283b3
Fix optional files test 2017-01-27 13:04:32 +01:00
shortcutme
8fcca9cb9c
Rev1841 2017-01-27 12:09:35 +01:00
shortcutme
c9ba59e895
Fix new version popup on first visit 2017-01-27 12:09:23 +01:00
shortcutme
697e177e13
Don't remove missing optional files 2017-01-27 12:02:14 +01:00
shortcutme
0f0cf18f92
Store data in Application Support if running from Library 2017-01-24 16:36:51 +01:00
shortcutme
6271fb9218
Update test 2017-01-23 17:23:31 +01:00
shortcutme
fd71a36da8
Rev1838 2017-01-23 12:55:11 +01:00
shortcutme
6c9f709290
Fix linux utf8 path free space query 2017-01-23 12:55:03 +01:00
shortcutme
802b6775d7
Wait a bit before browser open to let http server start 2017-01-23 12:54:47 +01:00
shortcutme
2113b03a42
Rev1845, Hide Tor console window 2017-01-23 00:31:52 +01:00
shortcutme
a0c3d7f8a6
Rev1833, Fix utf8 system paths 2017-01-22 21:22:53 +01:00
shortcutme
6a46181e8e
Rev1830 2017-01-22 11:09:58 +01:00
shortcutme
54c553d13b
Timeout and Base64 encoding support for fileGet 2017-01-22 11:09:45 +01:00
shortcutme
bf34d95bc1
Call fileGet and fileList in async 2017-01-22 11:09:26 +01:00
shortcutme
b6644887bd
Move admin_commands to class variable 2017-01-22 11:08:41 +01:00
shortcutme
50acc6b55f
Rev1825 2017-01-21 23:01:48 +01:00
shortcutme
8f3c596d46
macOS restart support 2017-01-21 23:01:29 +01:00
shortcutme
e7d8f6b807
Use source_update_dir to store updates if defined 2017-01-21 23:01:17 +01:00
shortcutme
7938689f95
Skip SQLite thread check for macOS compatibility 2017-01-21 23:00:37 +01:00
shortcutme
8258da2e46
macOS var data location 2017-01-21 23:00:13 +01:00
shortcutme
5c1ce5302a
Replace dead tacker 2017-01-21 22:59:10 +01:00
shortcutme
e92c861e1c
Skip invalid location on sidebar map 2017-01-21 22:58:44 +01:00
ZeroNet
778e010bb3 Merge pull request #782 from cxgreat2014/patch-2
Add openssl support for optware and entware router
2017-01-20 20:53:07 +01:00
ZeroNet
f529c7f2a2 Merge pull request #784 from fred-a-kemp/tor-control-spec-compliance
TorManager.send(): read until repsonse terminator.
2017-01-20 20:51:02 +01:00
anonym
6679baadbb TorManager.send(): read until repsonse terminator.
Tor command responses terminate with "250 OK\r\n" so we have to read
until that sequence is encountered.

The previous implementation is racy: after sending a command it would
accept whatever that is found on the socket as its response, no matter
if it is correctly terminated or not.

This commit fixes: https://github.com/HelloZeroNet/ZeroNet/issues/756
2017-01-20 10:53:31 +01:00
cxgreat2014
cdf3b3f011 Add openssl support for optware and entware 2017-01-20 15:29:17 +08:00
shortcutme
2dc981496b
Rev1821, Show progress bar on publishing 2017-01-16 13:41:57 +01:00
shortcutme
b68424f008
wrapperProgress API command 2017-01-16 13:41:11 +01:00
shortcutme
60d58a2d45
Ignore invalid content.json files on merger load 2017-01-16 13:39:59 +01:00
shortcutme
391b6e972f
Update email, new 4096 signature 2017-01-15 16:01:36 +01:00
shortcutme
8c9457d636
Rev1818, Set user-only permissions on directories instead of files 2017-01-15 13:19:34 +01:00
shortcutme
0a3a71f634
Rev1817, Fix windows crash on trayicon shutdown 2017-01-14 21:41:59 +01:00
shortcutme
d3fc1cf897
Rev1816, Fix exe distribution forbidden error 2017-01-14 12:43:05 +01:00
ZeroNet
d6ff1dfd8d Merge pull request #764 from MuxZeroNet/patch-7
Fix extension detection
2017-01-13 10:33:09 +01:00
MuxZeroNet
6b0ef500ed Fix extension detection 2017-01-12 05:22:26 +00:00
ZeroNet
c20efea1e9 Merge pull request #757 from sirMackk/unicode_fix
Decodes IGD response to utf-8; Makes function arguments immutable;
2017-01-11 19:59:28 +01:00
shortcutme
77e07dd5b5
Rev1815, Request tor version using GETINFO 2017-01-11 19:56:33 +01:00
sirMackk
1d8fe61920 Decodes IGD response to utf-8; Makes function arguments immutable; 2017-01-11 19:53:22 +01:00
shortcutme
2425f9f03e
Rev1814 2017-01-11 13:14:02 +01:00
shortcutme
60fc5fb4d3
Allow transaction errors 2017-01-11 13:14:02 +01:00
shortcutme
4e96ddfb9e
Allow .. in data_dir path 2017-01-11 13:14:02 +01:00
shortcutme
9fd30b8853
Log unhandled exceptions properly 2017-01-11 13:14:02 +01:00
ZeroNet
91c8526c88 Merge pull request #753 from MuxZeroNet/patch-6
Fix #752
2017-01-10 12:32:58 +01:00
MuxZeroNet
4a6dc7971e #752 2017-01-09 05:01:49 +00:00
shortcutme
901478475f
Rev1812, Put zeronet.conf, data, log to parent dir when running from .exe, First signed commit 2017-01-09 01:28:50 +01:00
shortcutme
1a5bfd973e Only download media if site is already added 2017-01-08 17:31:03 +01:00
shortcutme
6cb3bd9860 Rev1811 2017-01-08 17:28:45 +01:00
shortcutme
6c68f8dd6c Fix content type detection for options request 2017-01-08 17:27:57 +01:00
shortcutme
2447279191 Rename websocket detection 2017-01-08 17:26:59 +01:00
shortcutme
612d885ad2 Fix OpenSSL loading for compiled exe 2017-01-08 17:25:50 +01:00
shortcutme
60e9bfbf19 Update to latest OpenSSL 2017-01-08 17:25:17 +01:00
ZeroNet
5f567c357b Merge pull request #749 from MuxZeroNet/patch-3
WebSocket requests not allowed
2017-01-08 13:18:00 +01:00
MuxZeroNet
0a1eecee20 WebSocket requests not allowed 2017-01-08 06:56:42 +00:00
shortcutme
86bba4f0e4 Rev1806 2017-01-07 01:09:12 +01:00
shortcutme
bea212a8d1 Fix certAdd error 2017-01-07 01:09:05 +01:00
shortcutme
41ac8dc781 Add integer modification dates 2017-01-07 01:07:52 +01:00
shortcutme
3afca90c0e Fix content.json modified float decimals on Android 2017-01-07 01:07:52 +01:00
ZeroNet
8ef7e0a772 Merge pull request #743 from MuxZeroNet/patch-1
Add X-Frame-Options header
2017-01-06 13:29:00 +01:00
shortcutme
6f2445c417 Rev1801, Fix open file limit set on Linux 2017-01-06 10:31:47 +01:00
MuxZeroNet
da7821a3a9 X-Frame-Options 2017-01-06 01:44:22 +00:00
shortcutme
431415c052 Rev1800, Use -tmpnew and -tmpold postfix for atomic write 2017-01-05 03:03:17 +01:00
shortcutme
5c2b90c20f Rev1799, Force correct css content type 2017-01-05 02:33:33 +01:00
shortcutme
9d5bfa4be8 Rev1797 2017-01-05 02:27:14 +01:00
shortcutme
eee65da257 FileList API command 2017-01-05 02:26:58 +01:00
shortcutme
d9f8e83429 Safe disk write for content.json files 2017-01-05 02:26:44 +01:00
shortcutme
c94e73a029 Skip sites with broken content.json on startup 2017-01-05 02:26:05 +01:00
shortcutme
4514154364 Fix diff error 2017-01-05 02:25:49 +01:00
shortcutme
889c88c492 Close connection after 40 bad action 2017-01-05 02:25:16 +01:00
shortcutme
ee0176e730 Increase connection bad action on bad file location 2017-01-05 02:25:06 +01:00
shortcutme
5103879471 wrapperRequestFullscreen command 2016-12-30 19:32:36 +01:00
shortcutme
74a4a4b9da Update websocket on permission add and remove 2016-12-30 18:55:11 +01:00
shortcutme
819f9fad2c Sidebar total display fix 2016-12-30 18:53:24 +01:00
shortcutme
fdb12e8eaf Formatting 2016-12-30 18:53:14 +01:00
shortcutme
61ca9d6374 Only rebuild db on permissionadd if required 2016-12-30 18:53:06 +01:00
shortcutme
dfb5a00c77 Skip invalid onions bootstrap 2016-12-30 18:52:23 +01:00
ZeroNet
bc7042bee1 Merge pull request #721 from erqan/tor_password
tor_password argument...
2016-12-27 15:37:03 +01:00
erqan
a3f62f56f6 tor_password argument... 2016-12-27 17:15:02 +03:00
shortcutme
9a1735f37d Rev1791, Fix gevent 1.2 compatibility 2016-12-27 11:37:58 +01:00
shortcutme
86b0046f28 Don't allow load load wrapper frames as prefetch or as image 2016-12-27 11:37:35 +01:00
Derson5
9565335394 Polish translation (#708)
* Add files via upload

* Update and rename zeronet2.txt to pl.json

* Add files via upload

* Update and rename zeronet.txt to pl.json
2016-12-20 10:36:56 +01:00
ZeroNet
f00b5365f9 Merge pull request #705 from justinwiley/master
Update README.md to include work-around for LSOpenURLsWithRole() errors
2016-12-15 10:50:40 +01:00
Justin Tyler Wiley
690eff0e80 Update README.md 2016-12-14 21:10:13 -08:00
shortcutme
e37daabb53 Rev1786, Fix sidebar on FF 2016-12-14 10:28:41 +01:00
ZeroNet
5cf96dbada Merge pull request #700 from erqan/tr
updating tr...
2016-12-14 01:17:50 +01:00
shortcutme
987b7ffd0c Rev1785 2016-12-14 00:44:18 +01:00
shortcutme
bb99e5c4ac Only start dragging on left mouse click 2016-12-14 00:44:06 +01:00
shortcutme
9e97f0d318 Always display content.json changer in sidebar to avoid dom merger bug 2016-12-14 00:43:46 +01:00
shortcutme
f89f351b3c Dont copy content.json-default file 2016-12-14 00:43:08 +01:00
shortcutme
34ab2bad49 Clone inner path dest fix 2016-12-14 00:42:52 +01:00
shortcutme
62501d00b1 Use content.json-default if exists 2016-12-14 00:42:31 +01:00
shortcutme
c0d2e5efa6 Fix ZeroTalk scroll fixing 2016-12-14 00:25:47 +01:00
erqan
afffcd18dd updating tr... 2016-12-13 13:54:03 +03:00
shortcutme
34e52153a2 Remove BOM and duplicate key 2016-12-12 17:01:59 +01:00
Thibaut Broggi
6198137283 Add french translation for plugins (#699)
Plugins translated: MergerSite, Trayicon, OptionalManager
2016-12-12 16:44:18 +01:00
ZeroNet
d6e3db4ff7 Merge pull request #698 from Emeraude/es-translation
Add spanish translation
2016-12-12 16:44:03 +01:00
Thibaut Broggi
3cd04d03c8 Add spanish translation 2016-12-12 12:22:52 +00:00
shortcutme
a17ab1ce25 Rev1781, Only force / to end of site address 2016-12-09 01:00:53 +01:00
shortcutme
c4ae8ef711 Rev1780 2016-12-08 17:15:38 +01:00
shortcutme
c2de26f557 Sidebar saving ignore unfinished files 2016-12-08 17:15:21 +01:00
shortcutme
10772a704e Root path parameter for cloning 2016-12-08 17:14:55 +01:00
shortcutme
64321043b7 Fix permission error 2016-12-08 17:14:30 +01:00
lmath
61654edbf6 Add/Update Chinese translation (#692)
* Fix translation commented by ooser

* “Site Control" translation

* Add/Update Chinese (Simplified) translation

* Add/Update Chinese (Traditional) translation

* Correct "limit used" translation by P2P
2016-12-05 17:36:38 +01:00
lmath
83d8a44db7 Correct "limit used" translation by P2P 2016-12-05 19:53:05 +08:00
lmath
d62c8a0f16 Add/Update Chinese (Traditional) translation 2016-12-05 19:11:00 +08:00
lmath
a875ddcf54 Add/Update Chinese (Simplified) translation 2016-12-05 18:43:56 +08:00
lmath
61fee707ec Merge remote-tracking branch 'refs/remotes/HelloZeroNet/master' 2016-12-05 12:18:28 +08:00
shortcutme
350b417ccb Rev1766, Hungarian translation of new files 2016-12-05 02:30:18 +01:00
ZeroNet
383d8a5f33 Merge pull request #691 from ysc3839/master
Translations for more plugins.
2016-12-05 02:02:08 +01:00
shortcutme
f1f12ee8bd Rev1762, Fix binary files corruption with new updated 2016-12-04 21:36:52 +01:00
shortcutme
b66317fa7d Rev1761, Update ZeroNet from ZeroNet network 2016-12-04 18:57:08 +01:00
shortcutme
c69f70bdb0 Close lock before updating 2016-12-04 18:55:33 +01:00
shortcutme
58848068e6 Save sites.json before updating 2016-12-04 18:55:03 +01:00
shortcutme
20ed04af84 Also delete orphan sites from site_id cache 2016-12-04 18:54:43 +01:00
shortcutme
5e6b41945b Fix sidebar for empty sites 2016-12-04 18:54:22 +01:00
shortcutme
173a7fc409 Don't save is no peers found 2016-12-04 18:53:50 +01:00
ZeroNet
2a443a29c2 Merge pull request #690 from erqan/tr
fixing turkish translation..
2016-12-04 18:31:34 +01:00
ysc3839
d3f44e35ce OptionalManager translation. (unfinished) 2016-12-03 21:04:32 +08:00
ysc3839
a41078e2d3 MergerSite translation. (unfinished) 2016-12-03 21:03:39 +08:00
ysc3839
83f379a4d1 Trayicon Chinese translation. 2016-12-03 20:42:23 +08:00
ysc3839
4e0fea1d8b Use plugin_dir variable. 2016-12-03 20:20:26 +08:00
erqan
e5b5f5ba62 fixing turkish translation.. 2016-12-03 13:18:40 +03:00
ZeroNet
62ae824b36 Merge pull request #687 from rcmorano/master
get working dir from python script's real path
2016-12-01 16:27:16 +01:00
Roberto C. Morano
8b7bd2d572 get working dir from python script's real path
since, for example in the docker container, it was trying to grab the dirname from the 'zeronet.py' relative path which has no path
2016-12-01 13:41:29 +01:00
ZeroNet
47744c1a0c Update CHANGELOG.md 2016-12-01 02:04:04 +01:00
shortcutme
c1fd2be8cf Rev1758, Change working dir to zeronet.py dir 2016-12-01 00:34:11 +01:00
lmath
e919a9bd43 “Site Control" translation (#679)
* Fix translation commented by ooser

* “Site Control" translation
2016-11-27 10:51:16 +01:00
ZeroNet
e5ebf93bcb Merge pull request #677 from iShift/patch-4
Site control fix
2016-11-27 10:50:54 +01:00
ZeroNet
a21ac77ae3 Merge pull request #678 from erqan/tr
adding tr..
2016-11-27 10:50:46 +01:00
ZeroNet
7de2c1cb81 Merge pull request #680 from frerepoulet/master
Missing sidebar translation (french)
2016-11-27 10:50:17 +01:00
frerepoulet
3b74733b3b Missing sidebar translation (french) 2016-11-26 12:11:06 -05:00
lmath
cf52b505b2 “Site Control" translation 2016-11-26 22:22:50 +08:00
lmath
ae9d96f494 Merge remote-tracking branch 'refs/remotes/HelloZeroNet/master' 2016-11-26 22:10:00 +08:00
erqan
c6aba41ed1 adding tr.. 2016-11-26 15:08:53 +03:00
iShift
4f97444bd5 Site control fix 2016-11-26 14:22:19 +03:00
shortcutme
e2d73637f6 Missing sidebar translation 2016-11-25 17:12:27 +01:00
ZeroNet
e5d1d0a402 Merge pull request #673 from iShift/patch-3
Update ru.json
2016-11-25 17:08:31 +01:00
iShift
9b269dc594 Update ru.json 2016-11-25 11:39:54 +03:00
ZeroNet
5f6bdf7302 Merge pull request #671 from frerepoulet/master
Corrections to french translation
2016-11-24 23:21:57 +01:00
frerepoulet
df34abfcd9 Corrections to french translation 2016-11-24 15:50:48 -05:00
shortcutme
f083e26cf0 Rev1756, Sidebar button flud fix 2016-11-24 19:50:30 +01:00
ZeroNet
befaa0ff21 Merge pull request #670 from iShift/patch-2
Russian translation for main
2016-11-24 19:25:00 +01:00
ZeroNet
76686b40a8 Merge pull request #669 from iShift/patch-1
Russian translation for sidebar
2016-11-24 19:24:48 +01:00
iShift
3e06f21432 Russian translation for main 2016-11-24 15:05:29 +03:00
iShift
53e7d502c5 Russian translation for sidebar 2016-11-24 13:42:21 +03:00
lmath
77208475b0 Fix translation commented by ooser (#667) 2016-11-23 15:51:49 +01:00
lmath
a86cbb934b Fix translation commented by ooser 2016-11-23 21:57:28 +08:00
lmath
b9f5dda22b Merge remote-tracking branch 'refs/remotes/HelloZeroNet/master' 2016-11-23 21:46:00 +08:00
HostFat
45028fa2a3 Italian language (#665)
* Italian language

* Fix missing {
2016-11-22 22:33:58 +01:00
ZeroNet
53d032b29d Merge pull request #664 from HostFat/patch-1
Italian language
2016-11-22 13:49:01 +01:00
HostFat
be2e8ce34a Italian language 2016-11-22 07:06:56 +01:00
shortcutme
5adf4c31cb Rev1755, wrapperSetTitle command 2016-11-22 02:06:32 +01:00
ZeroNet
052b795fa5 Merge pull request #663 from frerepoulet/master
Initial french translation
2016-11-21 23:55:07 +01:00
frerepoulet
610938b120 Initial french translation 2016-11-21 17:36:50 -05:00
ZeroNet
1ed773bc02 Merge pull request #662 from navopw/master
Fixed typo in de.json
2016-11-21 19:23:01 +01:00
Navo
13a17c1a16 Fixed typo in de.json
widerhergestellt -> wiederhergestellt
2016-11-21 19:15:14 +01:00
ZeroNet
1ac1ace66c Merge pull request #660 from jaros1/master
danish texts for ZeroNet
2016-11-20 17:21:43 +01:00
jaros1
8102b0608a danish texts for ZeroNet 2016-11-20 15:23:06 +01:00
ZeroNet
1c7f2fd4b0 Merge pull request #659 from l5h5t7/master
Add Chinese (Traditional, Taiwan) Translation
2016-11-20 11:49:17 +01:00
lmath
033b16928c Add Chinese (Traditional, Taiwan) Translation 2016-11-20 13:05:38 +08:00
ZeroNet
3037d1bd4f Merge pull request #656 from mkg20001/de-sidebar
Translate Sidebar (German)
2016-11-19 20:48:17 +01:00
mkg20001
027388ce5a Translate Sidebar 2016-11-19 17:47:25 +01:00
ZeroNet
9e9885803f Merge pull request #652 from ysc3839/patch-2
Update zh.json
2016-11-19 14:38:26 +01:00
ZeroNet
0fa0f4c0d9 Merge pull request #651 from ysc3839/patch-1
Update zh.json
2016-11-19 14:38:15 +01:00
Maciej Krüger
4451e20573 Add German Translation (#653)
* Add German Translation

* Fix dot
2016-11-19 14:37:50 +01:00
Richard Yu
6f982c8bf9 Update zh.json 2016-11-19 19:53:03 +08:00
Richard Yu
d6c70a4259 Update zh.json 2016-11-19 19:50:58 +08:00
shortcutme
33a88c201e Chinese sidebar fix 2 2016-11-19 12:47:49 +01:00
shortcutme
1b53cbdc8f Chinese sidebar fix 2016-11-19 11:27:58 +01:00
shortcutme
bbbfffd1cb Rev1754, Don't reload domain database on very request 2016-11-19 10:56:19 +01:00
ZeroNet
a5290288c7 Merge pull request #647 from l5h5t7/master
Translate Sidebar to Chinese (Simplified)
2016-11-19 10:19:31 +01:00
l5h5t7
f0e16fc5ae fix some translation issues effected style 2016-11-19 16:49:37 +08:00
l5h5t7
6b13d00635 Translate Sidebar to Chinese (Simplified) 2016-11-19 09:58:22 +08:00
ZeroNet
cd669f0a14 Merge pull request #646 from l5h5t7/master
Add Chinese (Simplified) Translate
2016-11-19 01:25:41 +01:00
l5h5t7
a601d5e41c Add Chinese (Simplified) Translate 2016-11-19 08:14:33 +08:00
shortcutme
15061bafae Rev1751 2016-11-18 21:40:01 +01:00
shortcutme
23a7c3e49c Fallback to en language if failed to get system default locale 2016-11-18 21:39:53 +01:00
shortcutme
167a9bfd1a Support content.json without file node 2016-11-18 21:39:31 +01:00
shortcutme
5dfcebac16 Langauge file is top prority 2016-11-18 21:38:57 +01:00
shortcutme
d65d5eb45c Version 0.5.1, Rev1750 2016-11-18 20:15:51 +01:00
shortcutme
00e8d7af3b Sidebar hungarian translation 2016-11-18 20:15:38 +01:00
shortcutme
782e5194ad Merge sidebar js, css 2016-11-18 20:15:29 +01:00
shortcutme
ab1a7d7a17 Dynamic button widths 2016-11-18 20:15:18 +01:00
shortcutme
4707adb2f6 Fix tag null bug 2016-11-18 20:14:58 +01:00
shortcutme
7839cf4f90 Restrict db reload in Multiuser mode 2016-11-18 20:14:24 +01:00
shortcutme
84fb82a574 Make sidebar translatable 2016-11-18 20:13:54 +01:00
shortcutme
1ef3338f9e Translate Sidebar js file 2016-11-18 20:13:12 +01:00
shortcutme
c8acb74f0c TranslateSite plugin 2016-11-18 20:12:28 +01:00
shortcutme
4c8794a4d1 Support header_length in Zeroname plugin 2016-11-18 20:12:10 +01:00
shortcutme
430805adcc Add language to serverinfo 2016-11-18 20:11:11 +01:00
shortcutme
38ff33512f Use raise instead of assert for sql select filter 2016-11-18 20:11:03 +01:00
shortcutme
8ad6cd2e81 Allow to change language configuration parameter, reload translate files on change 2016-11-18 20:10:24 +01:00
shortcutme
0f31f1d34a Make UiWebsocket messages translatable 2016-11-18 20:09:51 +01:00
shortcutme
b25bf97cad Add language to UI js as paramter to avoid cache 2016-11-18 20:07:58 +01:00
shortcutme
9ff2bfc4bb Easier UI js translation 2016-11-18 20:07:26 +01:00
shortcutme
b276f01f2e Hungarian transition of Python messages 2016-11-18 20:06:59 +01:00
shortcutme
e4cfec3ba0 Test strict translator 2016-11-18 20:03:00 +01:00
shortcutme
da2e47cd5f Python, Html, JS translator class 2016-11-18 20:02:43 +01:00
shortcutme
d7ff49c4c7 Reload source on .json changes 2016-11-18 20:02:03 +01:00
shortcutme
4413f77ba9 Language parameter 2016-11-18 20:00:15 +01:00
shortcutme
bd49ecd585 Rev1714 2016-11-16 11:22:47 +01:00
shortcutme
0e83eba6df Don't retry failed peer on optional file search 2016-11-16 11:22:38 +01:00
shortcutme
b220f5de5c Noparallel ignore args add first parameter to make it per-class 2016-11-16 11:21:31 +01:00
shortcutme
6c74f6c527 Possible to disable length header on sitemeda 2016-11-16 11:19:35 +01:00
shortcutme
2e08d68d87 Remove content.json files from bad file list 2016-11-16 11:19:08 +01:00
shortcutme
d5210d27e2 Load all sites on commands to avoid errors 2016-11-16 11:18:44 +01:00
shortcutme
c38611dc15 Only display opened db number in log 2016-11-16 11:18:15 +01:00
shortcutme
eacd75108f Unified forbidden message 2016-11-16 11:17:50 +01:00
ZeroNet
16ccac11ae Create CHANGELOG.md 2016-11-12 02:23:34 +01:00
shortcutme
c82c61ef3d Rev1704, FIx siteSign error 2016-11-11 23:12:32 +01:00
shortcutme
43e9044ef7 Formatting, Indent to space 2016-11-11 23:12:10 +01:00
Richard Yu
4f3282099f Add tray icon again when explorer restarted (#639)
* Add zeronet.conf to .gitignore

* notificationicon.py - Remove unnecessary window size and 'ShowWindow' etc.

* notificationicon.py - Comment unnecessary iconinfo and NIM_SETVERSION.

* notificationicon.py - Add tray icon again when explorer restarted.
2016-11-11 22:49:40 +01:00
shortcutme
c076f605aa Rev1703, Allow custom favicon 2016-11-10 23:14:30 +01:00
shortcutme
70e78056e9 Sorted load of plugins 2016-11-10 23:10:28 +01:00
shortcutme
93866f9abf Rev1702 2016-11-08 15:02:50 +01:00
shortcutme
c2984ecd47 Update site size after archiving 2016-11-08 15:02:44 +01:00
shortcutme
57df94afee Close lock file on update 2016-11-08 15:02:28 +01:00
shortcutme
d21d0d5b9a Rev1701, Simpler index for better sqlite compatibility 2016-11-08 03:34:28 +01:00
shortcutme
14f2470477 Version 0.5.0, Rev1700 2016-11-07 23:49:02 +01:00
shortcutme
84c3957bf4 Use faster optional files stats 2016-11-07 23:48:48 +01:00
shortcutme
de5eb43da1 Warnings instead of errors 2016-11-07 23:48:34 +01:00
shortcutme
110885401c Use optionalDownloaded in workermanager 2016-11-07 23:48:11 +01:00
shortcutme
2b7e898781 WorkerManager onCompelte function 2016-11-07 23:47:53 +01:00
shortcutme
2cdde7dd46 Retry file deletion on error 2016-11-07 23:47:09 +01:00
shortcutme
9765afc286 Modify checkfiles to use optionalRemove, optionalDownloaded and isDownloadable functions 2016-11-07 23:46:54 +01:00
shortcutme
cb5b3884cd Change verification errors to warning 2016-11-07 23:44:58 +01:00
shortcutme
9178a3ad6a Handle missing content 2016-11-07 23:44:38 +01:00
shortcutme
cc504e93f6 Change contentdb calls to site object 2016-11-07 23:43:42 +01:00
shortcutme
4890c4cb2f Fix big site download 2016-11-07 23:43:08 +01:00
shortcutme
73b3c8db55 Use site object on delete from contentdb 2016-11-07 23:42:28 +01:00
shortcutme
713a2f88a9 Query and send more hashfield 2016-11-07 23:42:13 +01:00
shortcutme
30a2116abf Only announce if trackers 2016-11-07 23:42:00 +01:00
shortcutme
6acc81cb50 Retry bad files in separate thread 2016-11-07 23:41:25 +01:00
shortcutme
af571deb16 Peer cleanup ttl based on peer numbers 2016-11-07 23:40:04 +01:00
shortcutme
e6a82d4c64 Pooled file downloads to handle large ammount of files better 2016-11-07 23:39:45 +01:00
shortcutme
83b3dc8fbe Autodownload optional pattern check to separate function to allow plugins 2016-11-07 23:39:04 +01:00
shortcutme
d1ad7e0850 Stats for total optional files and downloaded optional files in a site 2016-11-07 23:36:04 +01:00
shortcutme
2048648b39 Reduce findoptional spam 2016-11-07 23:32:20 +01:00
shortcutme
a3d21f5377 Update if high priority and less than 10 peers for the file 2016-11-07 23:29:53 +01:00
shortcutme
62d092e5ac Update task ids during startFindOptional if new task added 2016-11-07 23:27:42 +01:00
shortcutme
d60785ee33 Ignore parameters for startFindOptional noparallel 2016-11-07 23:26:07 +01:00
shortcutme
fe19bd2fce Faster findOptionalTasks 2016-11-07 23:25:25 +01:00
shortcutme
7951763612 Faster findOptionalHashIds 2016-11-07 23:24:50 +01:00
shortcutme
5fafe7cf29 Change contentdb reference to site object in test 2016-11-07 23:20:52 +01:00
shortcutme
bd51c61eb6 Findhashfield optimization and limit 2016-11-07 23:20:08 +01:00
shortcutme
9fcd456205 Return file send stats 2016-11-07 23:19:33 +01:00
shortcutme
c727443ea3 Log connection cpu time usage for non io heavy commands 2016-11-07 23:19:17 +01:00
shortcutme
7ffd897653 Change contentdb after it modified in db 2016-11-07 23:17:41 +01:00
shortcutme
e7c9c2d192 Call ContentDb functions with site object 2016-11-07 23:16:22 +01:00
shortcutme
0b599a95e8 Only import supported cols 2016-11-07 23:15:09 +01:00
shortcutme
5893bbc199 Fix map command overwrite 2016-11-07 23:14:36 +01:00
shortcutme
7baeb8e10f Allow keyvalue table creation before json_id present 2016-11-07 23:14:09 +01:00
shortcutme
14f10d7d10 Open cursor if necessary 2016-11-07 23:13:05 +01:00
shortcutme
bdc8c7e5cc Formatting 2016-11-07 23:12:48 +01:00
shortcutme
f55a1f1bf3 Support delayed commands in Db 2016-11-07 23:11:14 +01:00
shortcutme
b7ede15b06 Print message before shutdown 2016-11-07 23:10:31 +01:00
shortcutme
d5d3f32bf8 Support traceback info formatting 2016-11-07 23:09:39 +01:00
shortcutme
0d9e3baebc Formatting 2016-11-07 23:09:06 +01:00
shortcutme
8955998d25 Support insertOrUpdate in database cursor 2016-11-07 23:08:57 +01:00
shortcutme
d595373f9f Use insertOrUpdate instead of replace on setcontent 2016-11-07 23:08:13 +01:00
shortcutme
12bf5bb152 Sote site in contentdb after files loaded 2016-11-07 23:02:37 +01:00
shortcutme
c35ffccf6c Change to schema based ContentDb to easier extension 2016-11-07 23:01:40 +01:00
shortcutme
0706748d10 Accept plugins to ContentDB 2016-11-07 23:00:59 +01:00
shortcutme
51c3ae15e8 Show connection cpu time on stats page 2016-11-07 23:00:17 +01:00
shortcutme
55417a1103 Reset bas files before site update when changing autodownload status in sidebar 2016-11-07 22:59:58 +01:00
shortcutme
f84c394e09 Move sidebar getfreespace function to helper 2016-11-07 22:58:11 +01:00
shortcutme
368efddb0d Save and restore peers to database between restarts 2016-11-07 22:57:21 +01:00
shortcutme
7d0852f7f3 Make OptionalManager functions merger site compatible 2016-11-07 22:56:57 +01:00
shortcutme
0a2617cd21 Test OptinalManager plugin 2016-11-07 22:56:24 +01:00
shortcutme
790dc4e3d4 Plugin to manage optional files 2016-11-07 22:56:04 +01:00
shortcutme
b3ba79a0fd Function to check if the user has permission to modife a site 2016-11-07 22:55:09 +01:00
shortcutme
81744c584e Merge wrapper js modifications 2016-11-07 22:53:07 +01:00
shortcutme
0774662689 Allow more connection backlog 2016-11-07 22:52:34 +01:00
shortcutme
6201612169 Store cpu time used by connection 2016-11-07 22:52:22 +01:00
shortcutme
fc239cfd0d Change tracker to more reliable one 2016-11-07 22:52:03 +01:00
shortcutme
7677b6859e Move config file modification to Config class 2016-11-07 22:51:43 +01:00
shortcutme
76af3a2e78 Gevent timer helper 2016-11-07 22:50:45 +01:00
shortcutme
38838b94a2 Formatting 2016-11-07 22:50:33 +01:00
shortcutme
5ff31e7cb4 Get free space on HDD function 2016-11-07 22:50:01 +01:00
shortcutme
ccb35f1353 Send content size header for normal files 2016-11-07 22:49:13 +01:00
shortcutme
a4a52e7ed4 Add websockets messages until its connected 2016-11-07 22:44:54 +01:00
shortcutme
0214741345 Hashfield test fix 2016-11-07 22:44:03 +01:00
shortcutme
d5b8722bb0 Kill greenlets between tests 2016-11-07 22:43:26 +01:00
shortcutme
c5851cd166 Better DB tests 2016-11-07 22:42:27 +01:00
shortcutme
0418a3e6de Only save sites.json if fully loaded to avoid data loss 2016-11-07 22:40:12 +01:00
shortcutme
8f3dfd7435 Fix site deletion errors on startup 2016-11-07 22:38:01 +01:00
shortcutme
efbd485f5f Update more hashfield on site check 2016-11-07 22:37:31 +01:00
shortcutme
3ba2ecedce Only try to close upnp opened port if necessary 2016-11-07 22:36:14 +01:00
shortcutme
cb214476e4 Keep plugin order after reload to allow plugins to extend other ones 2016-11-07 22:35:28 +01:00
shortcutme
91513f15ae Remove hash by id from hashfield 2016-11-07 22:35:05 +01:00
shortcutme
d39d6a2bd4 Mark if peer has hasfield 2016-11-07 22:34:46 +01:00
shortcutme
65d2b0d996 Still open browser if already running 2016-11-07 22:34:27 +01:00
shortcutme
484659fc3f Separate lock file instad of log file locking 2016-11-07 22:34:12 +01:00
rainlime
4ac933fa29 Update README-zh-cn.md (#618)
* Update README-zh-cn.md

* Update README-zh-cn.md

* Update README-zh-cn.md

* Update README-zh-cn.md

* Update README-zh-cn.md
2016-10-19 22:19:32 +02:00
ZeroNet
660f3e9149 Merge pull request #617 from rainlime/master
Translated README.md to Chinese(Simplified)
2016-10-18 11:22:06 +02:00
rainlime
c519cc21c6 Update README-zh-cn.md 2016-10-18 04:08:00 -04:00
rainlime
68c3d26aa1 Update and rename README-en.md to README.md 2016-10-18 04:06:58 -04:00
rainlime
286dd05e1e Update and rename README.md to README-zh-cn.md 2016-10-18 04:05:26 -04:00
rainlime
5032854aca Update and rename README.zh-cn.md to README.md 2016-10-18 03:53:33 -04:00
rainlime
7055bcd9ed Rename README.md to README-en.md 2016-10-18 03:52:46 -04:00
rainlime
811bd16768 Update README.zh-cn.md 2016-10-16 05:19:47 -04:00
rainlime
64cc162472 Create README.zh-cn.md 2016-10-16 05:12:42 -04:00
ZeroNet
5f3b01476a Merge pull request #607 from gyulaweber/docker_localhost
service should listen only at localhost by default (docker)
2016-10-11 21:19:44 +02:00
Gyula Weber
4cfaff8ebd service should listen only at localhost by default (docker) 2016-10-11 21:04:36 +02:00
ZeroNet
ae2e15a6fa Merge pull request #587 from aitorpazos/master
Update Dockerfile base image to ubuntu 16.04 LTS and add Tor support to it (disabled by default).
2016-10-07 16:27:22 +02:00
shortcutme
64179e7dc1 Rev1536, Start download optional files on help check 2016-10-04 16:24:33 +02:00
shortcutme
b003c8df01 Rev1535, Fix err not defined on content load 2016-10-04 11:36:33 +02:00
shortcutme
83158de1ce Rev1534 2016-10-03 19:26:51 +02:00
shortcutme
c9efcf7389 Catch socket errors on uPnP punch 2016-10-03 19:26:37 +02:00
shortcutme
3774630476 Close socket after uPnP request 2016-10-03 19:26:06 +02:00
shortcutme
1849547133 Rev1533, Add uPnP open protocols as parameter 2016-10-02 14:39:03 +02:00
shortcutme
8f6f6abb0e Rev1532 2016-10-02 14:27:37 +02:00
shortcutme
fbdc9e2b40 Comment typo 2016-10-02 14:24:48 +02:00
shortcutme
bca08970ba Always disable announce when testing 2016-10-02 14:23:30 +02:00
shortcutme
d6da0c421c Better json compressing 2016-10-02 14:23:05 +02:00
shortcutme
bb23bc7b3c Send diff to second batch of peers 2016-10-02 14:22:32 +02:00
shortcutme
31077eb346 Move uPnP port remove to fileserver 2016-10-02 14:22:01 +02:00
shortcutme
2ab04deded Move optional files hashfield adding to workermanager for better performance 2016-10-02 14:18:35 +02:00
ZeroNet
906f6c65d9 Merge pull request #577 from sirMackk/upnp_update
Closes #466 - Close ports on exit + minor refactoring w/ tests
2016-10-01 13:24:48 +02:00
sirMackk
ea47c47b5e Makes opening a port stop after first successful try. 2016-09-29 15:24:46 +02:00
shortcutme
d760a71b76 Rev1529, Fix json write bug with [] characters in value 2016-09-29 13:01:02 +02:00
ZeroNet
6a58083431 Merge pull request #588 from dldx/master
Update UiRequest.py
2016-09-28 20:42:44 +02:00
shortcutme
a5a56355dc Rev1527 2016-09-28 20:40:10 +02:00
shortcutme
3331e2305b Fix sitePublish cli command 2016-09-28 20:36:02 +02:00
shortcutme
117a82c059 Delete bad_files without size 2016-09-28 20:35:53 +02:00
Durand D'souza
13837971a7 Update UiRequest.py
Fixed a bug where a lack of a trailing slash in every url caused zeronet to fail to load the page, even if it existed.
2016-09-20 05:23:34 +01:00
Aitor Pazos
39dc00ad78 Make Tor optional in the Docker image and disable it by default as it's usage may be not allowed by hosting providers 2016-09-19 23:00:58 +01:00
Aitor Pazos
9e68a6f7e7 Update base image to ubuntu 16.04 LTS and add tor support to it.
In order to keep the Dockerfile simple, needed opotions have been appended to package provided torrc file and the /etc/init.d/tor script is used to start tor. If further customisation is desired, a wrapper script should be created to have further control on the startup. This would allow things like specifying external (tor) proxies and disable tor startup in those situations.
2016-09-18 19:06:51 +01:00
shortcutme
d608a0d847 Rev1525 2016-09-17 21:01:26 +02:00
shortcutme
67c9921ace Only add non-connected peers to publish if necessary 2016-09-17 21:01:16 +02:00
shortcutme
4690a111bf Push updates to newer clients first 2016-09-17 21:00:40 +02:00
shortcutme
65e5d05a9e Delete cleanup bad files without file info on update 2016-09-17 21:00:20 +02:00
shortcutme
fe59618eaf Rev1523, Real fix file write confirmation 2016-09-14 18:41:28 +02:00
shortcutme
60dd797d1a Rev1522, Fix file write confirmation dialog 2016-09-14 18:28:48 +02:00
shortcutme
e7762e03b4 Rev1521 2016-09-14 10:54:33 +02:00
shortcutme
a7de4aca91 Stop connection loop when closed 2016-09-14 10:54:08 +02:00
shortcutme
1c86a6c58a Close connection on crypt error 2016-09-14 10:53:47 +02:00
shortcutme
ca2a30f7ae Ignore not existent files on dbdict items 2016-09-14 10:53:24 +02:00
shortcutme
9fd19bf382 Fix content deletion 2016-09-14 10:52:41 +02:00
shortcutme
14544922bf Don't check files on siteUpdate 2016-09-14 10:51:10 +02:00
sirMackk
bd5ebdb2de Integrates updated upnppunch with project; Makes project close ports using UPnP on exit. 2016-09-09 12:37:22 +02:00
shortcutme
931426e4fc Rev1518 2016-09-09 12:24:27 +02:00
shortcutme
8241651a28 Add new tracker 2016-09-09 12:24:14 +02:00
shortcutme
e3de6da87e Ignore deleted files on contetndb iteritems 2016-09-09 12:24:00 +02:00
shortcutme
7d78623c92 Remove unnecessary logging 2016-09-09 12:23:26 +02:00
shortcutme
c8325589cc Rev1515 2016-09-07 17:43:18 +02:00
shortcutme
7ead5c701a Display loaded json file in stat page 2016-09-07 17:42:50 +02:00
shortcutme
a7aaa73b84 Display opened databases in stat page 2016-09-07 17:42:40 +02:00
shortcutme
212eabbc20 Remove broken torrent tracker 2016-09-07 17:42:06 +02:00
shortcutme
b2b91c9aff Remove save error message when no sites loaded yet 2016-09-07 17:41:55 +02:00
shortcutme
d5651f1df3 Lazy create peerhashfield objects 2016-09-07 17:41:33 +02:00
shortcutme
7572f8c98b Display Python and ZeroNet version for every command 2016-09-07 17:41:09 +02:00
shortcutme
75e74f1ff7 Always close db after 5 min idle time 2016-09-07 17:40:35 +02:00
shortcutme
a6c4a77e13 Rev1510, Fix site save without loaded SiteManager 2016-09-06 14:52:55 +02:00
shortcutme
d9bbb20743 Rev1509, Fix site delete 2016-09-06 10:16:09 +02:00
shortcutme
ac530b53f6 Rev1508 2016-09-05 13:58:37 +02:00
shortcutme
b8bf773c40 Make test compatible with new content.db 2016-09-05 13:58:10 +02:00
shortcutme
dae5cd3969 Fix startup with 1000+ sites 2016-09-05 13:57:12 +02:00
shortcutme
59205088d2 Move site deletion to dedicted function 2016-09-05 13:55:51 +02:00
shortcutme
cb20280530 Less verbose logging on filerequest 2016-09-05 13:54:17 +02:00
shortcutme
6806eed2ae Dont reload the whole site on content.json update 2016-09-05 13:54:03 +02:00
shortcutme
b7dfeb139b Support callstack formatting 2016-09-05 13:53:40 +02:00
shortcutme
25cb7d9ffa Only check optional files if content.json downloaded 2016-09-05 13:53:10 +02:00
shortcutme
bc875b396b Multiple content.db support 2016-09-05 13:52:52 +02:00
shortcutme
6ac4c8c9cb Version 0.4.1, Rev1501 2016-09-04 18:07:56 +02:00
shortcutme
4dbaab7dd4 List site content.json files without user files 2016-09-04 18:07:09 +02:00
shortcutme
7eab490089 Get optional files size from content.db 2016-09-04 18:06:18 +02:00
shortcutme
49efcd0c2d Execute garbage collection on site delete 2016-09-04 18:05:55 +02:00
shortcutme
69f0e972d3 Check site files on forced update 2016-09-04 18:05:42 +02:00
shortcutme
46a2ea9421 Log slow db queries on verbose mode 2016-09-04 18:05:31 +02:00
shortcutme
96043ba279 Try not to overwrite currently in sync files 2016-09-04 18:05:17 +02:00
shortcutme
d778f2a989 Try to find peers for optional files again if workers failed 2016-09-04 18:03:27 +02:00
shortcutme
5a36a002bf Use bad_files to display progress if that is larger 2016-09-04 18:01:48 +02:00
shortcutme
37a3b4678d Fix user file pre-content.json downloading 2016-09-04 18:01:09 +02:00
shortcutme
365f0cd646 Reset files on cloning 2016-09-04 18:00:51 +02:00
shortcutme
2a7f03af8a Try to reconnect to Tor on send error 2016-09-04 18:00:08 +02:00
shortcutme
f698ec2502 Also delete sites from content.db 2016-09-04 17:59:47 +02:00
shortcutme
a1f0c20afc Rename checkFiles to updateBadFiles 2016-09-04 17:59:29 +02:00
shortcutme
b0a85b0669 Dont check every file on update 2016-09-04 17:58:18 +02:00
shortcutme
9528d333bd Retry failed files on download end 2016-09-04 17:57:44 +02:00
shortcutme
4437a99330 Use pool to download large ammount of content.json files 2016-09-04 17:57:32 +02:00
shortcutme
8f158cbc8f Make listmodified query use content.db cache 2016-09-04 17:56:33 +02:00
shortcutme
135a9b8f5c Fix content.json retry 2016-09-04 17:54:57 +02:00
shortcutme
1dd488ef89 Remove deleted sites from content.db 2016-09-04 17:52:14 +02:00
shortcutme
a614545467 Faster site settings load 2016-09-04 17:51:55 +02:00
shortcutme
3724e0f376 Save sites.json on exit 2016-09-04 17:51:20 +02:00
shortcutme
a12c639bed Dont check files on startup 2016-09-04 17:51:00 +02:00
shortcutme
d6cc40cf3b List modified files using content.db 2016-09-04 17:50:29 +02:00
shortcutme
f4de16fde6 Close db after 5 min idle time 2016-09-04 17:49:56 +02:00
shortcutme
0ab2630519 Change db journal to memory for faster connection time 2016-09-04 17:49:47 +02:00
shortcutme
53c087f1ea Change sidebar to use content.db cache 2016-09-04 17:46:09 +02:00
shortcutme
682fa80a8a Fix site size calculation 2016-09-04 17:44:45 +02:00
shortcutme
1801df32a6 Change getTotalSize to use content.db cache 2016-09-04 17:44:30 +02:00
shortcutme
23e06a09cb Remove deleted files from hashfield 2016-09-04 17:43:57 +02:00
shortcutme
1bd6e2f493 Cache bad_files and optional hashfield in sites.json 2016-09-04 17:43:30 +02:00
shortcutme
ecb5885dba Cache file sizes and modification date in sqlite db 2016-09-04 17:41:04 +02:00
shortcutme
227751e455 Add sidebar content fadein animation 2016-09-04 17:35:22 +02:00
shortcutme
46a84a42dc Allow - in domains 2016-09-04 17:33:58 +02:00
shortcutme
2fcfa21761 Rev1429 2016-08-29 11:18:01 +02:00
shortcutme
4efaaaabc0 Stop when siteVerify find a bad file 2016-08-29 11:17:36 +02:00
shortcutme
709dc854e7 Add site to site manager if required 2016-08-29 11:17:19 +02:00
shortcutme
b52e8f74e2 Rev1428, Don't display websocket error when navigating away 2016-08-27 11:52:44 +02:00
shortcutme
887a07c3fb Rev1427, Skip invalid files on dbRebuild 2016-08-27 11:01:41 +02:00
shortcutme
3ce11a0dab Rev1426 2016-08-26 11:43:08 +02:00
shortcutme
6c6ce54a20 Run test in verbose mode 2016-08-26 11:42:44 +02:00
shortcutme
d76c1ca98e Also cleanup connections for smaller sites 2016-08-26 11:42:23 +02:00
shortcutme
1557d3c390 Always keep connections for the sites 2016-08-26 11:41:45 +02:00
shortcutme
4d4219409a Fix sidebar error when no cert selected for the site 2016-08-26 11:41:17 +02:00
shortcutme
7edb784305 Fix user file updating on owned sites 2016-08-26 11:40:22 +02:00
shortcutme
f44de281a8 Rev1425 2016-08-22 03:41:20 +02:00
shortcutme
5061e0051a Test missing cert verification 2016-08-22 03:41:12 +02:00
shortcutme
2c4f566687 Fix missing cert verification 2016-08-22 03:40:55 +02:00
shortcutme
21812ec064 Merge branch 'master' of https://github.com/HelloZeroNet/ZeroNet 2016-08-20 10:40:03 +02:00
shortcutme
173355bc02 Rev1424, Fix connected_limit and size_limit paramter parsing 2016-08-20 10:39:52 +02:00
shortcutme
0f51826d9d Support group by in newsfeed follows 2016-08-20 10:39:15 +02:00
ZeroNet
3c7a9f0f82 Merge pull request #537 from megfault/patch-1
Fix typos in log message
2016-08-17 11:32:25 +02:00
shortcutme
3049e489fb Rev1422 2016-08-16 19:58:27 +02:00
shortcutme
67da76427b Notify merger site on changes as the original site 2016-08-16 19:58:16 +02:00
shortcutme
d39b8570cc Only search in last 3 days feed items to speed up queries a little bit 2016-08-16 19:57:41 +02:00
shortcutme
3524198599 Don't log owned local file reload 2016-08-16 19:56:35 +02:00
shortcutme
274414a54b Give up user's content.json after 5 retrys 2016-08-16 19:56:18 +02:00
shortcutme
b40b3e2d85 Fix config size_limit parsing 2016-08-16 19:55:55 +02:00
Ana Barroso
c9660ed20e Fix typos in log message 2016-08-16 18:14:02 +02:00
shortcutme
8cd7a63490 Rev1416, Remove merger permission from merged sites 2016-08-15 23:05:05 +02:00
shortcutme
e9009c5c75 WorkerManager quickfix 2016-08-15 15:59:49 +02:00
shortcutme
686a2de570 Rev1411 2016-08-15 13:57:16 +02:00
shortcutme
cb4cf564be Log merger sites update time 2016-08-15 13:57:07 +02:00
shortcutme
0b1ef00077 Fix sidebar js errors after close 2016-08-15 13:56:43 +02:00
shortcutme
92e4dd64d1 Dont recalculate site size on update 2016-08-15 13:56:17 +02:00
shortcutme
3c5e4e64ca Fix site size calculation 2016-08-15 13:56:04 +02:00
shortcutme
16ed55a745 Dont recalculate site size on owned site update 2016-08-15 13:55:45 +02:00
shortcutme
64febc7f61 Publish incoming modifications only to 2 peers 2016-08-15 13:54:00 +02:00
shortcutme
4975ef82d7 Fix port open checking 2016-08-15 13:53:20 +02:00
shortcutme
954c6bcbc3 Worker number related to connection limit 2016-08-15 13:52:48 +02:00
ZeroNet
af4447e666 Version 0.4.0, Rev1400 2016-08-10 13:03:12 +02:00
ZeroNet
e6456f491a MergerSite plugin 2016-08-10 13:00:33 +02:00
ZeroNet
b7b238b890 Re-sign testdata 2016-08-10 13:00:14 +02:00
ZeroNet
96f368c7e2 Test user file archiving 2016-08-10 12:59:42 +02:00
ZeroNet
48d59e355c Allow content.json without modification date 2016-08-10 12:59:19 +02:00
ZeroNet
7bd76270ba Remove bad status from deleted files 2016-08-10 12:58:54 +02:00
ZeroNet
bed66cdcd2 ContentManager.py formatting 2016-08-10 12:58:19 +02:00
ZeroNet
f719b89a7a Always apply extended information to content.json if keys missing 2016-08-10 12:57:55 +02:00
ZeroNet
7291ac8c6b No exception on incomplete content.json signing 2016-08-10 12:57:24 +02:00
ZeroNet
ec759442ed Support and delete archived users files 2016-08-10 12:55:39 +02:00
ZeroNet
e4b718fb10 Merge sidebar js modifications 2016-08-10 12:53:45 +02:00
ZeroNet
b33499b7b5 Fix WebGL error after sidebar close 2016-08-10 12:53:31 +02:00
ZeroNet
131a51fbdc Update sidebar html on dbReload 2016-08-10 12:53:15 +02:00
ZeroNet
9a1e1e56b3 Handle dbRebuild action in sidebar 2016-08-10 12:52:48 +02:00
ZeroNet
538af99e8c Dbrebuild button to sidebar 2016-08-10 12:52:18 +02:00
ZeroNet
238cb25bb4 Small incoming connection optimization 2016-08-10 12:51:38 +02:00
ZeroNet
f21fdb23b6 Allow to store field in json table 2016-08-10 12:49:38 +02:00
ZeroNet
0ddc1e47ba Delete file's database entries if file paramter is False 2016-08-10 12:49:22 +02:00
ZeroNet
55cc496c2e Type 3 json table format 2016-08-10 12:47:29 +02:00
ZeroNet
721bed76a9 Type 3 dbschema version for merger sites 2016-08-10 12:46:27 +02:00
ZeroNet
a38b6c9fb2 It new js should be at least 1 second newer than previous file to merge again 2016-08-10 12:45:48 +02:00
ZeroNet
1f4609d1a3 Fix dbRebuild command line action 2016-08-10 12:44:17 +02:00
ZeroNet
07a6bd523c Accept only 30 peers on pex 2016-08-10 12:44:00 +02:00
ZeroNet
122ef02605 Hot-patch in memory plugin classes 2016-08-10 12:43:35 +02:00
ZeroNet
67f75c4bef Skip archived user files 2016-08-10 12:42:29 +02:00
ZeroNet
0275954fb7 Tracker log total peers 2016-08-10 12:42:13 +02:00
ZeroNet
44dc4c41c9 Wait for user's content.json on file request 2016-08-10 12:41:35 +02:00
ZeroNet
e5e76a4ef5 Do not reload the whole site on update command 2016-08-10 12:41:04 +02:00
ZeroNet
021a084796 Peers query optimize 2016-08-10 12:40:17 +02:00
ZeroNet
1ec00947ad Save site on content.json arrive 2016-08-10 12:36:20 +02:00
ZeroNet
f38f4c3758 Use SiteManager to save site 2016-08-10 12:35:40 +02:00
ZeroNet
2852bbc657 Remove unnecessary site savings 2016-08-10 12:35:17 +02:00
ZeroNet
0d565dc64d Better site settings saving 2016-08-10 12:34:28 +02:00
ZeroNet
1f3a4f0e2f Remove orphan sites from sites.json 2016-08-10 12:33:34 +02:00
ZeroNet
53249f4f07 Add own logger to SiteManager 2016-08-10 12:32:28 +02:00
ZeroNet
0569697d98 Update database on delete 2016-08-10 12:31:54 +02:00
ZeroNet
acf24aab6f Allow to pass file object on file updated 2016-08-10 12:31:30 +02:00
ZeroNet
3ff75c6602 Also trigger onUpdated on file delete 2016-08-10 12:30:35 +02:00
ZeroNet
0be6cb6602 Move database files listing to separate funcion 2016-08-10 12:30:04 +02:00
ZeroNet
9def3b58eb Allow plugins on SiteStorage 2016-08-10 12:28:57 +02:00
ZeroNet
447a37f228 Compiled wrapper.coffee 2016-08-10 12:28:05 +02:00
ZeroNet
70cf67498b Hide progress bar after 300ms 2016-08-10 12:27:37 +02:00
ZeroNet
10b46db524 Also display progress bar for other sites 2016-08-10 12:27:24 +02:00
ZeroNet
687208a785 Fix wrapperReload command 2016-08-10 12:26:00 +02:00
ZeroNet
2915eb7a83 Reply to setlocalstorage 2016-08-10 12:25:39 +02:00
ZeroNet
f82055fef7 Wrapper permissionadd confirm 2016-08-10 12:25:25 +02:00
ZeroNet
835381fbb1 Filter media referrer by original request address 2016-08-10 12:24:47 +02:00
ZeroNet
04bed98a97 Store original request address 2016-08-10 12:24:09 +02:00
ZeroNet
d542cc5b32 Log fileWrite permission errors 2016-08-10 12:23:01 +02:00
ZeroNet
c486e9fa1a Pass current site to publisher callback 2016-08-10 12:22:27 +02:00
ZeroNet
92dbe597ea Allow to store extra data in content.json 2016-08-10 12:21:34 +02:00
ZeroNet
c23c397764 Option to accept unknown certs 2016-08-10 12:18:22 +02:00
ZeroNet
d6fdf8af9c Fix fileRules exception without rules 2016-08-10 12:15:16 +02:00
ZeroNet
3d7ba7bdf8 Permission add and remove zeroframe api command 2016-08-10 12:12:47 +02:00
ZeroNet
523a7d4c16 Merge pull request #470 from Emeraude/fix-file-permissions
Fix file permissions
2016-05-27 12:47:11 +02:00
Thibaut Broggi
9e9832ad09 Set permission to 600 for some files
Files users.json and sites.json contains private key
    Only the owner of these files should have access to them
2016-05-26 16:00:14 +02:00
Thibaut Broggi
a10e80318f atomicWrite function now preserve file permissions 2016-05-26 15:59:40 +02:00
HelloZeroNet
81f196647b Rev1287, Display error for unsupported browsers 2016-05-17 01:17:53 +02:00
HelloZeroNet
9f5917325b Rev1286 2016-05-16 22:30:04 +02:00
HelloZeroNet
1a536369de Merged sidebar all.js, ignore globe if js not loaded yet 2016-05-16 22:29:55 +02:00
HelloZeroNet
5b35bea489 Log DB close time, formatting 2016-05-16 22:28:59 +02:00
HelloZeroNet
bba7318a5b Dont close DB when returning from wakeup 2016-05-16 22:28:30 +02:00
HelloZeroNet
3b8dc59ac5 rename wrapperPopstate to wrapperPopState 2016-05-16 22:27:17 +02:00
HelloZeroNet
fc9c604b66 Update signed file using the sidebar 2016-05-16 22:26:40 +02:00
HelloZeroNet
d2d2967f11 Skip invlid newfeed items 2016-05-16 22:24:30 +02:00
HelloZeroNet
c9e0d6d6ca Rev1284 2016-05-06 11:22:15 +02:00
HelloZeroNet
b66149bce8 Remove unnecessary test data 2016-05-06 11:18:37 +02:00
HelloZeroNet
8b545383e7 Gitlab and Gogs source for updates 2016-05-06 11:18:22 +02:00
HelloZeroNet
ba24ad31d8 Rev1283 2016-05-05 12:12:52 +02:00
HelloZeroNet
3d081f6a59 Log websocket bad protocol version 2016-05-05 12:12:33 +02:00
HelloZeroNet
eac475d13f Increment connections peer number on findConnection result 2016-05-05 12:12:18 +02:00
HelloZeroNet
36e969ed1f Fix siteSign without connection server 2016-05-05 12:11:35 +02:00
HelloZeroNet
35192531a6 Remove not used Http class 2016-05-05 12:11:18 +02:00
HelloZeroNet
aa9161a83a Check optional files findhash result every second 2016-05-05 12:11:07 +02:00
HelloZeroNet
eedce00d57 Rev1279, Sidebar open on mobile devices 2016-05-02 00:28:23 +02:00
HelloZeroNet
158059071b Rev1278 2016-04-29 02:58:11 +02:00
HelloZeroNet
639a834658 Keep minimum 5 connections per site 2016-04-29 02:58:00 +02:00
HelloZeroNet
95cbc544de Fix IE11 wrapper nonce errors 2016-04-29 02:56:58 +02:00
HelloZeroNet
3294f629b0 Rev1277, Fix sidebar site size display 2016-04-27 11:14:15 +02:00
HelloZeroNet
432aa037cb Rev1276, Skip last_content_json_update while pending file parsing 2016-04-27 09:45:32 +02:00
HelloZeroNet
93e598cc59 Rev1275, Fix dictionary changed size during iteration error 2016-04-26 10:46:53 +02:00
ZeroNet
4598b77687 typo 2016-04-25 11:51:44 +02:00
ZeroNet
af3fe99ebb New zerobundle linux link to terminal install method 2016-04-25 11:50:14 +02:00
HelloZeroNet
44ce10b14b Rev1274 2016-04-25 02:26:37 +02:00
HelloZeroNet
bf384922a6 Use iteritems to save memory 2016-04-25 02:26:29 +02:00
HelloZeroNet
038bf4f2c8 Dont add -old postfix for content.json files 2016-04-25 02:26:13 +02:00
HelloZeroNet
34ead0aec2 Allow whitespace prefix for sql queries 2016-04-25 02:25:54 +02:00
HelloZeroNet
23265861c9 Start connected worker first 2016-04-25 02:25:28 +02:00
HelloZeroNet
e53f56ed30 Cleanup connections with less sites first 2016-04-25 02:25:11 +02:00
HelloZeroNet
d71d8b4cf5 Only publish to 5 peers on sitePublish command line action 2016-04-25 02:24:30 +02:00
HelloZeroNet
e9af4a5f6b Cleanup not useful connections after 5 min 2016-04-25 02:24:05 +02:00
HelloZeroNet
dbdde65f52 Display used sites per connection 2016-04-25 02:23:19 +02:00
HelloZeroNet
75a5ab9441 Track used site per connection 2016-04-25 02:23:06 +02:00
HelloZeroNet
2a8355dba7 Formatting 2016-04-25 02:20:55 +02:00
HelloZeroNet
be49b6d35a Change target connection per site to 10 2016-04-25 02:17:57 +02:00
HelloZeroNet
f405e702ba Display possible content.jsons on sidebar 2016-04-25 02:17:28 +02:00
HelloZeroNet
11f84d7bac Rev1254 2016-04-20 23:42:58 +02:00
HelloZeroNet
59c5ad560b Fix size calculation 2016-04-20 23:41:01 +02:00
HelloZeroNet
3812aa6502 Support verify content.json directly from parsed dict 2016-04-20 23:40:26 +02:00
HelloZeroNet
21cfa653ca Mark files updates currently working on to avoid double update on slow systems 2016-04-20 23:38:22 +02:00
HelloZeroNet
c7b8ec5667 Allow only content.json update 2016-04-20 23:35:51 +02:00
HelloZeroNet
73c69d54bc Dont save settings on every announce 2016-04-20 23:32:43 +02:00
HelloZeroNet
23389dc31e Formatting 2016-04-20 23:30:25 +02:00
HelloZeroNet
38057c2e03 Log site config save time 2016-04-20 23:29:26 +02:00
HelloZeroNet
cd52a61c4c Save sites.json every 10 minute 2016-04-20 23:28:58 +02:00
HelloZeroNet
55d76c8c5c Faster SiteStorage.getSize 2016-04-20 23:28:21 +02:00
HelloZeroNet
38c78dcba1 IE10 compatible origin 2016-04-20 23:22:39 +02:00
HelloZeroNet
768dd98a22 Rev1235 2016-04-19 12:01:13 +02:00
HelloZeroNet
6f8c24e11d Fix searching with broken sites 2016-04-19 12:00:58 +02:00
HelloZeroNet
5f55d8a034 Rev1232, Db schema reload sidebar button 2016-04-18 02:24:14 +02:00
HelloZeroNet
e481a12647 Allow reload sidebar html tag more often 2016-04-18 02:23:28 +02:00
HelloZeroNet
30d16a8e05 Rev1231 2016-04-18 00:49:10 +02:00
HelloZeroNet
14db5c8469 Sql memory benchmark update 2016-04-18 00:48:14 +02:00
HelloZeroNet
3dd99626ff Test DbQuery 2016-04-18 00:47:42 +02:00
HelloZeroNet
d2b9555508 Fix data dir detection 2016-04-18 00:47:26 +02:00
HelloZeroNet
b5c3ac74c7 Allow search in all sites database 2016-04-18 00:47:09 +02:00
HelloZeroNet
7e55c551ce Newsfeed plugin formatting 2016-04-18 00:43:47 +02:00
HelloZeroNet
cd5cdd580a Re-publish modifications to less peers 2016-04-18 00:42:26 +02:00
HelloZeroNet
f69edf96d5 DbQuery: Parse and modify sql queries 2016-04-18 00:42:00 +02:00
HelloZeroNet
ab1393e5c1 GeoDB 20MB now 2016-04-18 00:37:47 +02:00
HelloZeroNet
9a09115626 Gratipay link 2016-04-18 00:37:23 +02:00
ZeroNet
3d157af915 Merge pull request #418 from TheNain38/patch-1
Exception handling when connecting first time
2016-04-14 17:40:08 +02:00
TheNain38
6c9da8aba6 Exception handling when connecting first time 2016-04-14 11:03:49 +02:00
ZeroNet
e3a4dbaab5 New ZeroBundle links served directly from github 2016-04-12 11:55:40 +02:00
HelloZeroNet
a40580501a Version 0.3.7, Rev1210 2016-04-10 23:12:50 +02:00
HelloZeroNet
3bdde14821 Log patch size 2016-04-10 23:12:34 +02:00
HelloZeroNet
3a089ac512 Dont add data dir path to merged css file 2016-04-10 13:25:41 +02:00
HelloZeroNet
bbf1bc163d Extra debug messages, cleanup unused lines 2016-04-10 13:25:11 +02:00
HelloZeroNet
b63254d15d Rev1209 2016-04-09 19:49:45 +02:00
HelloZeroNet
5720f74669 Typos and formatting 2016-04-09 19:49:23 +02:00
HelloZeroNet
9bb0a0d91b Display confirmation if zeroid already exists 2016-04-09 19:49:12 +02:00
HelloZeroNet
561bd80aa3 Fallback to simple file copy if rename failed 2016-04-09 19:43:44 +02:00
HelloZeroNet
1beb4fc2cb Less sensitive internet checker 2016-04-09 19:31:26 +02:00
ZeroNet
e94fdda567 Merge pull request #413 from TheNain38/patch-1
Update to latest bitcoinrpc
2016-04-09 14:52:54 +02:00
TheNain38
298191a6ef Update to latest bitcoinrpc 2016-04-08 11:47:39 +02:00
HelloZeroNet
faa2c3e6ce Dont reconnect on every block 2016-04-07 12:29:47 +02:00
HelloZeroNet
915dd92b5a Fix last block parsing confusion 2016-04-07 12:29:34 +02:00
HelloZeroNet
1f612fa1b0 Test block parsing at startup 2016-04-07 12:23:01 +02:00
HelloZeroNet
58f0b0d0a1 Rev1201 2016-04-07 10:37:05 +02:00
HelloZeroNet
6388973292 Retry file rename later if resource not ready yet 2016-04-07 10:36:50 +02:00
HelloZeroNet
57bf36f90a Only create old file if not exist 2016-04-07 10:35:02 +02:00
HelloZeroNet
6e65169a9d Calculate diff right befor publish 2016-04-07 10:34:30 +02:00
ZeroNet
a397253695 Merge pull request #411 from TheNain38/patch-1
Use HTTPS to download GeoLite2-City database
2016-04-07 10:00:06 +02:00
HelloZeroNet
b4859c7293 Rev1200 2016-04-06 15:58:41 +02:00
TheNain38
1229b19a1e Use HTTPS to download GeoLite2-City database 2016-04-06 14:51:08 +02:00
HelloZeroNet
083f86412b Test diff and site updating 2016-04-06 14:01:20 +02:00
HelloZeroNet
9c1ea71d2f Try to use diff before downloading the file 2016-04-06 14:01:03 +02:00
HelloZeroNet
7ee8eead23 Remove duplicate peers from publish queue 2016-04-06 14:00:40 +02:00
HelloZeroNet
82b960c641 Pass diffs to other users 2016-04-06 13:59:53 +02:00
HelloZeroNet
7c3e470ea7 Calculate and send diff on startup commands 2016-04-06 13:58:43 +02:00
HelloZeroNet
ab1aaea7f5 Calculate and send diffs on publish 2016-04-06 13:57:19 +02:00
HelloZeroNet
888ad2aeff Save files before writing with fileWrite to calculate diff on publish 2016-04-06 13:56:32 +02:00
HelloZeroNet
064341e1a8 Always skin -old and -new postfixed files from signing 2016-04-06 13:54:48 +02:00
HelloZeroNet
d527268cbe Calculate diffs from -old and -new postfixed files 2016-04-06 13:54:32 +02:00
HelloZeroNet
699d32187e Diff functions 2016-04-06 13:53:32 +02:00
HelloZeroNet
8604c9c0d6 Fix start.py when no default config action used 2016-04-06 13:53:18 +02:00
HelloZeroNet
644fe69fa8 Fix noparallel with dict kwargs 2016-04-06 13:50:50 +02:00
HelloZeroNet
84e78859dc SiteStorage.rename function 2016-04-06 13:50:20 +02:00
HelloZeroNet
8f39ed2467 Cloned site updating 2016-04-06 13:50:05 +02:00
HelloZeroNet
ec70c47aa0 Optimize path modifying functions 2016-04-06 13:48:13 +02:00
HelloZeroNet
f83a466919 Reduce cpu usage by calculating filename based priority boost only once 2016-04-06 13:47:00 +02:00
HelloZeroNet
5d0cc0b205 Fix older gevent compatibility 2016-04-06 13:45:47 +02:00
HelloZeroNet
8c09fd39db Start clean site directory for every test 2016-04-06 13:45:31 +02:00
HelloZeroNet
9a15cd80b6 Fix broken tests caused by removing signs from memory 2016-04-06 13:44:31 +02:00
HelloZeroNet
695d257be5 Save memory by removing cert_sign and signs from loaded json files 2016-04-06 13:42:15 +02:00
HelloZeroNet
a33cdba11c Add site address with donate button to sidebar 2016-04-06 13:40:45 +02:00
HelloZeroNet
5a34448ba1 Less verbose logging 2016-04-06 13:39:17 +02:00
HelloZeroNet
258822d74b Fix standalone update.py run by applying ssl patch 2016-04-06 13:34:51 +02:00
ZeroNet
a37c3231b0 Older OS X Install instructions 2016-04-04 11:17:07 +02:00
ZeroNet
293e5edf42 Merge pull request #406 from Fil/patch-1
typo: "time wrap" should be "time warp"
2016-04-04 11:08:27 +02:00
Fil
7a4472db4c typo: "time wrap" should be "time warp" 2016-04-03 10:32:13 +02:00
ZeroNet
16df4da7d2 Merge pull request #403 from TheNain38/patch-1
Fix some code that isn't valid in Zeroname-local
2016-04-01 01:21:27 +02:00
TheNain38
b0566da72d Fix some code that isn't valid 2016-03-31 11:08:24 +02:00
HelloZeroNet
bd737f6779 Rev1098 2016-03-30 23:20:25 +02:00
HelloZeroNet
17ddbd8b32 Only start onions in passive mode 2016-03-30 23:19:46 +02:00
HelloZeroNet
0e13fbf5dc Queue updates within 30 second to avoid network spam 2016-03-30 23:15:18 +02:00
HelloZeroNet
c8b949cef5 Save last received update time from peer to avoid send the same update on publish 2016-03-30 23:05:43 +02:00
HelloZeroNet
646eba930f Change update spam rate limit to 20 secs 2016-03-30 23:01:05 +02:00
HelloZeroNet
aa1ee33e92 Allow @ and = in filenames 2016-03-30 23:00:07 +02:00
HelloZeroNet
b895ab5778 Fix find more peers to optional files 2016-03-30 22:59:21 +02:00
HelloZeroNet
84f1718348 Fix tor windows install methods and change newline character 2016-03-30 22:58:26 +02:00
ZeroNet
05028d3e00 Merge pull request #393 from Nephos/master
Fix shebang
2016-03-30 16:09:17 +02:00
Arthur Poulet
89b4fca6a2 use python2.7 and not python2 (OSX compatibility) 2016-03-30 15:54:27 +02:00
Arthur Poulet
a4352814d1 fix shebang on start.py
python -> python2
2016-03-30 15:54:27 +02:00
Arthur Poulet
fc74c420d7 Fix shebang
python2 instead of python
2016-03-30 15:54:27 +02:00
ZeroNet
f0bb70951d Merge pull request #397 from TheNain38/patch-1
Publish all changes at once, and fix lastprocessed range in zeroname_updater
2016-03-30 12:17:17 +02:00
TheNain38
9d7efade61 Publish all changes at once, fix lastprocessed 2016-03-28 22:02:48 +02:00
ZeroNet
382091cb1c Merge pull request #394 from TheNain38/patch-1
Make zeroname_udpater work
2016-03-27 20:05:43 +02:00
TheNain38
bef4596afa Make zeroname_udpater work 2016-03-27 15:58:30 +02:00
ZeroNet
ba23dd5132 32bit linux download, more simple download section 2016-03-26 01:47:07 +01:00
HelloZeroNet
0d934bcbe5 Rev1089 2016-03-26 01:33:44 +01:00
HelloZeroNet
09197ef71e Dont publish twice 2016-03-26 01:33:37 +01:00
HelloZeroNet
f1c9eafd79 Fix streamfile error 2016-03-26 00:22:46 +01:00
HelloZeroNet
6d222b6ed7 Cleanup empty dirs 2016-03-26 00:22:27 +01:00
HelloZeroNet
045a57491a Allow same opener as current window 2016-03-26 00:20:53 +01:00
ZeroNet
5b0ae42d13 Merge pull request #389 from TheNain38/patch-1
Allow to use custom ZeroNet site to resolve .bit domains
2016-03-23 22:28:56 +01:00
HelloZeroNet
d222018bb6 Parse config plugins on test 2016-03-23 13:30:18 +01:00
HelloZeroNet
61c846c6ed Rev1070 2016-03-23 13:05:58 +01:00
HelloZeroNet
33430ee67b Force find more peer for optional task after 15sec 2016-03-23 13:05:48 +01:00
HelloZeroNet
2353eed64c Less sensitive offline checker 2016-03-23 13:05:13 +01:00
TheNain38
be6d77aceb Add arg to change resolving site 2016-03-22 17:36:01 +01:00
ZeroNet
e50333f3d8 Merge pull request #387 from Erkan-Yilmaz/master
typo: definied -> defined
2016-03-21 11:36:42 +01:00
Erkan Yilmaz
b5d74eec16 typo: definied -> defined 2016-03-21 09:43:53 +01:00
HelloZeroNet
6496a6125f Rev1069, Allow to specify window parameters 2016-03-20 21:33:13 +01:00
ZeroNet
34c5a7ccde Merge pull request #385 from TheNain38/patch-1
Support all custom namecoin.conf parameters
2016-03-20 19:53:36 +01:00
TheNain38
60fa986c47 Take all namecoin.conf parameters in consideration 2016-03-20 19:51:43 +01:00
ZeroNet
04ce9087ed Merge pull request #381 from OliverCole/master
Add tor and phantomjs dir to .gitignore
2016-03-20 00:34:13 +01:00
OliverCole
b04b973b93 Add tor and phantomjs dir to .gitignore 2016-03-19 23:25:50 +00:00
OliverCole
c0b7377076 Add tor and phantomjs dir to .gitignore 2016-03-19 23:25:07 +00:00
OliverCole
ee9ca96ab3 Add tor and phantomjs dir to .gitignore 2016-03-19 23:15:44 +00:00
ZeroNet
36371ffaaa Merge pull request #377 from TheNain38/BitCoinRPC
Add bitcoinrpc lib
2016-03-19 18:28:05 +01:00
HelloZeroNet
1364e3f316 Rev1062 2016-03-19 18:14:20 +01:00
HelloZeroNet
f3c8d5e541 Better internet outage detection based on last message from connections 2016-03-19 18:14:09 +01:00
HelloZeroNet
fcd4253a8d Log last command line action to log/cmd.log 2016-03-19 18:11:37 +01:00
HelloZeroNet
7cc408de4c siteDownload command line action 2016-03-19 18:11:12 +01:00
HelloZeroNet
54f9b49e90 Wait a bit for more tasks before consider site downloaded 2016-03-19 18:09:20 +01:00
HelloZeroNet
988f1435c5 Allow more workers if more task 2016-03-19 18:07:14 +01:00
HelloZeroNet
437a9b79a8 Less verbose site downloading 2016-03-19 18:06:07 +01:00
HelloZeroNet
ae092dc757 Disable DB updating command line argument 2016-03-19 18:05:49 +01:00
HelloZeroNet
99f0407ba2 wrapperOpenWindow command 2016-03-19 18:05:08 +01:00
TheNain38
d43d6068e8 Add bitcoinrpc lib 2016-03-19 17:51:35 +01:00
ZeroNet
3128b23b6f Merge pull request #376 from TheNain38/patch-1
Enhance Zeroname-local so it works with non-standard rpcport
2016-03-19 17:23:50 +01:00
TheNain38
c70d98d642 Add rpcport detection, use spaces instead of tabs 2016-03-19 17:12:19 +01:00
HelloZeroNet
ab19dba99d Rev1059 2016-03-19 12:24:05 +01:00
HelloZeroNet
231578b887 Internet outage detection to fixed 5 min 2016-03-19 12:23:52 +01:00
HelloZeroNet
09b3d6ffca More clean force port checking 2016-03-19 12:23:29 +01:00
HelloZeroNet
edfaba89f9 Rev1057 2016-03-19 01:36:09 +01:00
HelloZeroNet
bdd658dddb Internet outage detection 2016-03-19 01:36:01 +01:00
HelloZeroNet
ff681adfe9 Fix file merge order on Linux 2016-03-18 23:52:16 +01:00
HelloZeroNet
50708c16de Dont allow checkSites run in parallel 2016-03-18 20:03:38 +01:00
HelloZeroNet
f27e58395b Dont check site files on wakeup 2016-03-18 20:03:19 +01:00
HelloZeroNet
ef699b2f91 Typo 2016-03-18 20:01:23 +01:00
HelloZeroNet
af2e2c5011 Faster verify by, skip recaluclate the whole site size 2016-03-18 19:41:25 +01:00
HelloZeroNet
a3bba8c14c Wait globe to load world.jpg before display it 2016-03-18 19:20:49 +01:00
HelloZeroNet
5af32f21fd Keep databases open for 30 minute after last query 2016-03-18 19:20:20 +01:00
HelloZeroNet
f694c9c346 Do not display non-error exceptions 2016-03-18 19:19:59 +01:00
HelloZeroNet
dc5994e18f Meassure content verification speed 2016-03-18 19:19:34 +01:00
HelloZeroNet
a692640e46 Ability to skip check files on update 2016-03-18 19:19:16 +01:00
HelloZeroNet
2c4f582437 Mark site as failed updating if query modifications failed 2016-03-18 19:18:59 +01:00
HelloZeroNet
0ccc81f46b Try to fix non-english Tor error messages 2016-03-18 19:17:15 +01:00
HelloZeroNet
0ee1448e13 Faster signing by only reload the current content.json 2016-03-18 19:15:38 +01:00
ZeroNet
ba498fc1a6 Merge pull request #372 from mnlg/fix-cssvendor-regex
Fix issue parsing @keyframes in css files
2016-03-17 21:15:10 +01:00
mnlg_
7bc708e064 Fix issue parsing @keyframes in css files 2016-03-17 20:57:02 +01:00
ZeroNet
59791eab29 Merge pull request #371 from gyulaweber/master
apt-get commands should be in one line
2016-03-17 20:24:48 +01:00
Gyula Weber
fe0eafc262 apt-get commands should be in one line 2016-03-17 20:12:30 +01:00
ZeroNet
a18c8741a4 Merge pull request #369 from zebMcCorkle/ignore-logs
Ignore all log files, even in folders
2016-03-17 19:04:25 +01:00
Zeb McCorkle
a880e7c797 Ignore all log files, even in folders 2016-03-17 12:38:39 -05:00
HelloZeroNet
c1c60e0a04 Rev1038 2016-03-17 01:56:34 +01:00
HelloZeroNet
cd2aa033b4 Allow the site owner to modify banned users file 2016-03-17 01:56:25 +01:00
HelloZeroNet
f241a9aef3 Fix donationmessage plugin 2016-03-16 23:25:27 +01:00
HelloZeroNet
77ac1ae796 Keep connections opened regardless prot opened status 2016-03-16 23:24:57 +01:00
HelloZeroNet
9a57b5a01d Fix update download on some platforms with broken ssl 2016-03-16 22:07:42 +01:00
HelloZeroNet
69d919d3c4 Handle http redirects 2016-03-16 22:07:11 +01:00
HelloZeroNet
eea55f8f16 Fix restart exception 2016-03-16 21:27:00 +01:00
HelloZeroNet
3a8e20df7d Rev1033 2016-03-16 21:12:04 +01:00
HelloZeroNet
6187abe56f Remove active peers discrimination in peer cleanup 2016-03-16 21:11:34 +01:00
HelloZeroNet
6f4b896bce Always publish to 5 peers and remove discrimination of active peers 2016-03-16 21:11:04 +01:00
HelloZeroNet
16d01c961e Wait port opening before start running tests 2016-03-16 21:09:07 +01:00
HelloZeroNet
3e8bf598df Remove allow-popups-to-escape-sandbox as its not supported by every browser 2016-03-16 21:08:41 +01:00
HelloZeroNet
52044a50a1 Save CPU by avoid reloading all json file on publish 2016-03-16 21:08:19 +01:00
HelloZeroNet
9a58b6fbe6 Rev1026 2016-03-16 00:40:49 +01:00
HelloZeroNet
153de04659 Merged sidebar js 2016-03-16 00:40:37 +01:00
HelloZeroNet
f372fe371a Context switch for every 50 checked files 2016-03-16 00:40:19 +01:00
HelloZeroNet
1cf0e0eb21 Always prefer publishing to connected peers 2016-03-16 00:40:01 +01:00
HelloZeroNet
11e09adda7 Longer timeout for non connected peers publishing 2016-03-16 00:39:09 +01:00
HelloZeroNet
7707c42a02 On same version content.json update dont add peer to optional files 2016-03-16 00:38:26 +01:00
HelloZeroNet
fbfa0f3717 Dont display stats and benchmark when multiuser plugin active 2016-03-16 00:37:31 +01:00
HelloZeroNet
7e7dddde2e Only display 30 missing file in sidebar 2016-03-16 00:35:58 +01:00
HelloZeroNet
6f63303781 More reliable globe loading 2016-03-16 00:35:36 +01:00
HelloZeroNet
5a234745fc Wait more for port opening 2016-03-16 00:34:57 +01:00
HelloZeroNet
61b4d97832 Silent Tor terminate error 2016-03-16 00:33:56 +01:00
HelloZeroNet
145d4dbd69 Move path parsing to separate function 2016-03-16 00:33:05 +01:00
ZeroNet
28b96179a3 Merge pull request #359 from OliverCole/master
Add virtualenv dir to gitignore.
2016-03-14 03:02:47 +01:00
OliverCole
cb7fb88b11 Merge remote-tracking branch 'upstream/master' 2016-03-13 16:46:09 +00:00
OliverCole
d3fb6f515f Add virtualenv dir to gitignore. 2016-03-13 16:34:54 +00:00
HelloZeroNet
950638ea77 Rev1015 2016-03-12 23:11:37 +01:00
HelloZeroNet
067f95b1f6 Log debug open times 2016-03-12 23:11:25 +01:00
HelloZeroNet
dee250d3b8 Change to 2048 max_files_opened by default 2016-03-12 23:11:08 +01:00
HelloZeroNet
ba851a684c Debug gevent hangs 2016-03-12 23:10:31 +01:00
HelloZeroNet
78a7542b4d Proper exit on keyboard interrupt 2016-03-12 23:09:57 +01:00
HelloZeroNet
555c136143 Simple connection karma to avoid update flood 2016-03-12 23:09:26 +01:00
HelloZeroNet
f735862977 Switch back to 3 thread publishing on large sites 2016-03-12 23:07:41 +01:00
HelloZeroNet
6ff91cd2e8 Reduce hangs on file validation process 2016-03-12 23:07:06 +01:00
HelloZeroNet
b0ac9869ce Wrapper nonce security comments 2016-03-12 20:36:17 +01:00
HelloZeroNet
4d7ce1dc16 Allow popups without sandbox 2016-03-12 20:35:30 +01:00
HelloZeroNet
6519e846d8 Wait 1 second to close files between restarts 2016-03-12 20:34:37 +01:00
HelloZeroNet
56dbd88889 Fix domains parse starting with whitespace 2016-03-12 13:25:26 +01:00
HelloZeroNet
25752c927c Change required gevent version 2016-03-12 11:49:45 +01:00
HelloZeroNet
ed0e858e30 Rev989, Save users file on newsfeed follow, Local mode in Multiuser plugin to disable restrication and save users data to disk 2016-03-11 13:26:54 +01:00
HelloZeroNet
0897154584 Rev966, New Greenlet debug hook to support Gevent 1.1.0, Publish to 8 peers on external publish request, Dont try to download banned user files, Check user files even if its own site 2016-03-11 12:39:39 +01:00
HelloZeroNet
48db062b49 Rev966, Display user quota in sidebar, Fix non-root content.json publishing in sidebar, Publish to same ammount of passive peers as limit, Fix site address case bug 2016-03-09 15:30:04 +01:00
HelloZeroNet
e891a10e54 Rev957, Sidebar displays onion peers in graph, Sidebar display bad file retry number, Sidebar site Update/Pause/Delete, Ratelimit sidebar update, Encoded typo, Fix onion findHashId, More retry for bad files, Log file path errors, Testcase for self findhashIds, Testcase for Tor findHashId, Better Tor version parse, UiWebsocket callback on update/pause/resume/delete, Skip invalid postMessage messages 2016-03-09 00:48:57 +01:00
ZeroNet
ea3257dc09 Merge pull request #334 from sinkuu/fix_188
Fix #188 (can't zoom in Firefox)
2016-03-07 10:01:09 +01:00
sinkuu
82e7900359 Fix #188
Use standard `wheel` event which is supported by Gecko instead of `mousewheel` event.
2016-03-07 16:17:53 +09:00
HelloZeroNet
2901f1e1ba Rev949, Newsfeed allows items 2min from future, Switch sidebar content.json list to input for faster opening, Promise based sidebar rendering to make it more reliable on slow connections, RateLimit sidebar globe updating, Some PEP8 formatting 2016-03-06 19:28:22 +01:00
ZeroNet
bfdccb809c Merge pull request #327 from TheNain38/patch-1
Fix checking if Ajax request
2016-03-06 15:51:16 +01:00
TheNain38
d0919d8ab8 Fix checking if Ajax request 2016-03-06 15:44:55 +01:00
ZeroNet
178d4f20ca New ZeroBundle for Mac and Linux, fix Docker part 2016-03-06 02:34:24 +01:00
ZeroNet
119a408f78 Merge pull request #284 from ashleypt/master
README.md modifications
2016-03-06 02:33:26 +01:00
HelloZeroNet
2a06cec5c2 Rev948, Disable websocket logging, Change max files opened limit on startup 2016-03-06 02:17:58 +01:00
HelloZeroNet
dba42f5f5e Rev943, Less verbose logging by default, Load ZeroBundle SSL lib, Log loaded SSL lib 2016-03-06 00:55:50 +01:00
HelloZeroNet
1d6f56c676 Rev938, Disable publish on incoming older content update to avoid network spam 2016-03-05 09:57:30 +01:00
HelloZeroNet
08005499fb Rev936, Fix Bootstrapper test without tormanager, Bootstrapper return latest announced peers, Only create 3 threads for passive peers 2016-03-04 19:59:59 +01:00
ZeroNet
6cbb6adcfc Merge pull request #305 from barrabinfc/master
- Handle Exception for invalid dbschema.json files (siteSign)
2016-03-04 19:51:58 +01:00
Barrabin Fc. ⚑
58ce98e0fc Merge branch 'master' of github.com:HelloZeroNet/ZeroNet 2016-03-03 20:56:43 -03:00
Barrabin Fc. ⚑
99aecedd0b print syntax error when json dbschema.json failed 2016-03-03 20:47:26 -03:00
Barrabin Fc. ⚑
b2e1f61ff7 Merge branch 'master' of github.com:barrabinfc/ZeroNet 2016-03-03 20:41:06 -03:00
Barrabin Fc. ⚑
aee83605ab Added exception handling for invalid dbschema.json files 2016-03-03 20:40:26 -03:00
HelloZeroNet
3f6f273fb1 Rev932, Skip news event from future, Disable siteSetOwned and setAutodownloadoptional when multiuser plugin enabled, Fix sidebar double click handlers, Log peer sent commands, Send modification to less peer if have enought peers, Close peers if more than 10 per site 2016-03-03 21:12:16 +01:00
Ashley Perpetual
9316f75eae idk 2016-03-03 17:40:54 +08:00
Ashley Perpetual
7ea86a1e8a Changed '.' to 'source' in virtualenv section of README.md 2016-03-03 17:38:25 +08:00
ZeroNet
5b821c46e5 Merge pull request #292 from yowmamasita/master
Docker data volume
2016-03-02 23:35:54 +01:00
Ben Sarmiento
ea72ffad77 update docker run instruction 2016-03-03 04:12:08 +08:00
Ben Sarmiento
2834a2d987 add data folder as docker data volume 2016-03-03 04:11:56 +08:00
Ashley Perpetual
1c0be2e5ce Modified readme to fix typos, add some links, etc 2016-03-02 19:50:36 +08:00
Ashley Perpetual
00503b596a Edited Virtualenv section in README.md to use fixed-width characters for commands, added 'browse' instruction below it 2016-03-02 18:38:15 +08:00
Ashley Perpetual
f905f019a6 Added virtualenv section to README.md 2016-03-02 18:24:06 +08:00
HelloZeroNet
779075c4a5 Rev915, Fix Tor version detection, Better Tor connection error logging 2016-03-02 09:37:24 +01:00
HelloZeroNet
36d3268cf7 Rev914, Disable siteDelete in Multiuser mode 2016-03-02 01:11:32 +01:00
HelloZeroNet
5b59da2435 Rev912, Keep track site added time, UiRequest xss quickfix, Cleanup peerPing output 2016-03-01 23:16:31 +01:00
ZeroNet
9039896247 Merge pull request #278 from barrabinfc/patch-1
`Developer documentation` link
2016-02-28 21:38:29 +01:00
Barrabin Futebol Clube ⚑
f9b052963a Merge pull request #1 from barrabinfc/patch-1
`Developer documentation` link
2016-02-28 17:32:15 -03:00
Barrabin Fc. ⚑
89fb282be5 Chmod +x zeronet.py 2016-02-28 17:24:47 -03:00
Barrabin Futebol Clube ⚑
1f2d43a8ef Developer documentation link
+ `Developer documentation easily` acessible
2016-02-28 17:16:21 -03:00
HelloZeroNet
bbbd42eca3 Rev909, Inform inner frame on state change, wrapperGetState command to query current history state, Allow to pass null url to wrapperReplaceState and wrapperPushState 2016-02-27 21:39:36 +01:00
HelloZeroNet
58fa5f6e16 Rev908, Sidebar shorten long bad filenames, Only show opener error if site is using the API 2016-02-23 01:36:47 +01:00
HelloZeroNet
b2fb1fcd3c Rev907, Wait 200ms to opener close, Enable wrapper nonce security by default for new sites 2016-02-21 11:44:10 +01:00
ZeroNet
da58f5a89c Merge pull request #273 from TheNain38/patch-1
Make links https in the README and also update exemple to the New ZeroHello site
2016-02-20 17:08:24 +01:00
TheNain38
91f48d3d81 Make links https in the README 2016-02-20 14:26:07 +01:00
HelloZeroNet
ac0dc3bf11 Rev906, Escape file path, Only allow to modify tor in configuration 2016-02-20 11:19:28 +01:00
HelloZeroNet
2f25204be9 Rev905, Escape title and query string 2016-02-18 19:44:52 +01:00
ZeroNet
e389e22832 Merge pull request #271 from TheNain38/patch-1
Fix vulnerabilites and don't get errors when site isn't loaded
2016-02-18 19:22:58 +01:00
TheNain38
d1aee93b59 Fix vulnerabilites and don't get errors when site
isn't loaded
2016-02-18 19:21:22 +01:00
HelloZeroNet
1dbc33445f Rev903, FeedQuery command only available for ADMIN sites, Show bad files in sidebar, Log unknown messages, Add and check inner_path and site address on sign/verify, Better peer cleanup limit, Log site load times, Testcase for address and inner_path verification, Re-sign testsite with new fields, Fix unnecessary loading screen display when browsing sub-folder with index.html, Fix safari notification width 2016-02-18 11:22:21 +01:00
ZeroNet
4885d2be79 New ZeroHello screenshot 2016-02-11 23:21:57 +01:00
HelloZeroNet
61cfb8aa2f Rev900, Sidebar filestats bar width round fix, Sidebar WebGL not supported error, Sidebar optimalizations, Trayicon gray shadow, Trim end of line whitespace from json files, Fix testweb testcase, Implement experimental postMessage nonce security, Return None when testing external ip, Window opener security check and message, Increase timeout for large files 2016-02-10 02:30:04 +01:00
HelloZeroNet
018c6f7075 Rev889, ZeroID opener bug fix 2016-02-06 15:12:04 +01:00
HelloZeroNet
0faa6fbceb Rev886, Avoid browser redirect caching on start.py 2016-02-06 02:03:31 +01:00
HelloZeroNet
31f108a3ed Rev885, Sidebar optimalization 2016-02-05 00:34:58 +01:00
HelloZeroNet
4cea7ebcda Rev884, Improve security by stop accepting postMessage if opener present 2016-02-03 00:12:57 +01:00
HelloZeroNet
c11d4f2632 Rev881, Restrict serverShutdown to admin sites, Avoid redirect cache when clicking trayicon 2016-02-02 20:09:01 +01:00
HelloZeroNet
687a848292 Version 0.3.6, Rev879, Fix sidebar error on description missing, New trayicon, New favicon, Disable some functions on MultiUser proxies, New homepage, Replace only the last ? in SQL queries, Alwaays grant ADMIN permission to homepage site, Announce before publish if no peers, configSet, serverShutdown, ADMIN WebsocketAPI command, Stop Tor client before updating, Ignore peer ip packing error, Ignore db files from git, Fix safari ajax error when UiPassword enabled 2016-02-02 11:40:45 +01:00
438 changed files with 23377 additions and 34229 deletions

View file

@ -0,0 +1,40 @@
name: Build Docker Image on Commit
on:
push:
branches:
- main
tags:
- '!' # Exclude tags
jobs:
build-and-publish:
runs-on: docker-builder
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set REPO_VARS
id: repo-url
run: |
echo "REPO_HOST=$(echo "${{ github.server_url }}" | sed 's~http[s]*://~~g')" >> $GITHUB_ENV
echo "REPO_PATH=${{ github.repository }}" >> $GITHUB_ENV
- name: Login to OCI registry
run: |
echo "${{ secrets.OCI_TOKEN }}" | docker login $REPO_HOST -u "${{ secrets.OCI_USER }}" --password-stdin
- name: Build and push Docker images
run: |
# Build Docker image with commit SHA
docker build -t $REPO_HOST/$REPO_PATH:${{ github.sha }} .
docker push $REPO_HOST/$REPO_PATH:${{ github.sha }}
# Build Docker image with nightly tag
docker tag $REPO_HOST/$REPO_PATH:${{ github.sha }} $REPO_HOST/$REPO_PATH:nightly
docker push $REPO_HOST/$REPO_PATH:nightly
# Remove local images to save storage
docker rmi $REPO_HOST/$REPO_PATH:${{ github.sha }}
docker rmi $REPO_HOST/$REPO_PATH:nightly

View file

@ -0,0 +1,37 @@
name: Build and Publish Docker Image on Tag
on:
push:
tags:
- '*'
jobs:
build-and-publish:
runs-on: docker-builder
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set REPO_VARS
id: repo-url
run: |
echo "REPO_HOST=$(echo "${{ github.server_url }}" | sed 's~http[s]*://~~g')" >> $GITHUB_ENV
echo "REPO_PATH=${{ github.repository }}" >> $GITHUB_ENV
- name: Login to OCI registry
run: |
echo "${{ secrets.OCI_TOKEN }}" | docker login $REPO_HOST -u "${{ secrets.OCI_USER }}" --password-stdin
- name: Build and push Docker image
run: |
TAG=${{ github.ref_name }} # Get the tag name from the context
# Build and push multi-platform Docker images
docker build -t $REPO_HOST/$REPO_PATH:$TAG --push .
# Tag and push latest
docker tag $REPO_HOST/$REPO_PATH:$TAG $REPO_HOST/$REPO_PATH:latest
docker push $REPO_HOST/$REPO_PATH:latest
# Remove the local image to save storage
docker rmi $REPO_HOST/$REPO_PATH:$TAG
docker rmi $REPO_HOST/$REPO_PATH:latest

10
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,10 @@
github: canewsin
patreon: # Replace with a single Patreon username e.g., user1
open_collective: # Replace with a single Open Collective username e.g., user1
ko_fi: canewsin
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: canewsin
issuehunt: # Replace with a single IssueHunt username e.g., user1
otechie: # Replace with a single Otechie username e.g., user1
custom: ['https://paypal.me/PramUkesh', 'https://zerolink.ml/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/']

33
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View file

@ -0,0 +1,33 @@
---
name: Bug report
about: Create a report to help us improve ZeroNet
title: ''
labels: ''
assignees: ''
---
### Step 1: Please describe your environment
* ZeroNet version: _____
* Operating system: _____
* Web browser: _____
* Tor status: not available/always/disabled
* Opened port: yes/no
* Special configuration: ____
### Step 2: Describe the problem:
#### Steps to reproduce:
1. _____
2. _____
3. _____
#### Observed Results:
* 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.
#### Expected Results:
* What did you expect to happen?

View file

@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for ZeroNet
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

72
.github/workflows/codeql-analysis.yml vendored Normal file
View file

@ -0,0 +1,72 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ py3-latest ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ py3-latest ]
schedule:
- cron: '32 19 * * 2'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'javascript', 'python' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
# - run: |
# echo "Run, Build Application using script"
# ./location_of_script_within_repo/buildscript.sh
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2

51
.github/workflows/tests.yml vendored Normal file
View file

@ -0,0 +1,51 @@
name: tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-20.04
strategy:
max-parallel: 16
matrix:
python-version: ["3.7", "3.8", "3.9"]
steps:
- name: Checkout ZeroNet
uses: actions/checkout@v2
with:
submodules: "true"
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Prepare for installation
run: |
python3 -m pip install setuptools
python3 -m pip install --upgrade pip wheel
python3 -m pip install --upgrade codecov coveralls flake8 mock pytest==4.6.3 pytest-cov selenium
- name: Install
run: |
python3 -m pip install --upgrade -r requirements.txt
python3 -m pip list
- name: Prepare for tests
run: |
openssl version -a
echo 0 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6
- name: Test
run: |
catchsegv python3 -m pytest src/Test --cov=src --cov-config src/Test/coverage.ini
export ZERONET_LOG_DIR="log/CryptMessage"; catchsegv python3 -m pytest -x plugins/CryptMessage/Test
export ZERONET_LOG_DIR="log/Bigfile"; catchsegv python3 -m pytest -x plugins/Bigfile/Test
export ZERONET_LOG_DIR="log/AnnounceLocal"; catchsegv python3 -m pytest -x plugins/AnnounceLocal/Test
export ZERONET_LOG_DIR="log/OptionalManager"; catchsegv python3 -m pytest -x plugins/OptionalManager/Test
export ZERONET_LOG_DIR="log/Multiuser"; mv plugins/disabled-Multiuser plugins/Multiuser && catchsegv python -m pytest -x plugins/Multiuser/Test
export ZERONET_LOG_DIR="log/Bootstrapper"; mv plugins/disabled-Bootstrapper plugins/Bootstrapper && catchsegv python -m pytest -x plugins/Bootstrapper/Test
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]')"
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]')"
flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics --exclude=src/lib/pyaes/

23
.gitignore vendored
View file

@ -3,13 +3,34 @@ __pycache__/
*.py[cod]
# Log files
*.log
**/*.log
# Hidden files
.*
!/.forgejo
!/.github
!/.gitignore
!/.travis.yml
!/.gitlab-ci.yml
# Temporary files
*.bak
# Data dir
data/*
*.db
# Virtualenv
env/*
# Tor data
tools/tor/data
# PhantomJS, downloaded manually for unit tests
tools/phantomjs
# ZeroNet config file
zeronet.conf
# ZeroNet log files
log/*

48
.gitlab-ci.yml Normal file
View file

@ -0,0 +1,48 @@
stages:
- test
.test_template: &test_template
stage: test
before_script:
- pip install --upgrade pip wheel
# Selenium and requests can't be installed without a requests hint on Python 3.4
- pip install --upgrade requests>=2.22.0
- pip install --upgrade codecov coveralls flake8 mock pytest==4.6.3 pytest-cov selenium
- pip install --upgrade -r requirements.txt
script:
- pip list
- openssl version -a
- python -m pytest -x plugins/CryptMessage/Test --color=yes
- python -m pytest -x plugins/Bigfile/Test --color=yes
- python -m pytest -x plugins/AnnounceLocal/Test --color=yes
- python -m pytest -x plugins/OptionalManager/Test --color=yes
- python -m pytest src/Test --cov=src --cov-config src/Test/coverage.ini --color=yes
- mv plugins/disabled-Multiuser plugins/Multiuser
- python -m pytest -x plugins/Multiuser/Test --color=yes
- mv plugins/disabled-Bootstrapper plugins/Bootstrapper
- python -m pytest -x plugins/Bootstrapper/Test --color=yes
- flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics --exclude=src/lib/pyaes/
test:py3.4:
image: python:3.4.3
<<: *test_template
test:py3.5:
image: python:3.5.7
<<: *test_template
test:py3.6:
image: python:3.6.9
<<: *test_template
test:py3.7-openssl1.1.0:
image: python:3.7.0b5
<<: *test_template
test:py3.7-openssl1.1.1:
image: python:3.7.4
<<: *test_template
test:py3.8:
image: python:3.8.0b3
<<: *test_template

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "plugins"]
path = plugins
url = https://github.com/ZeroNetX/ZeroNet-Plugins.git

View file

@ -1,21 +1,47 @@
language: python
python:
- 2.7
- 3.4
- 3.5
- 3.6
- 3.7
- 3.8
services:
- docker
cache: pip
before_install:
- pip install --upgrade pip wheel
- pip install --upgrade codecov coveralls flake8 mock pytest==4.6.3 pytest-cov selenium
# - docker build -t zeronet .
# - docker run -d -v $PWD:/root/data -p 15441:15441 -p 127.0.0.1:43110:43110 zeronet
install:
- pip install -U pip wheel
- pip install -r requirements.txt
- pip install --upgrade -r requirements.txt
- pip list
before_script:
- openssl version -a
# Add an IPv6 config - see the corresponding Travis issue
# https://github.com/travis-ci/travis-ci/issues/8361
- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then
sudo sh -c 'echo 0 > /proc/sys/net/ipv6/conf/all/disable_ipv6';
fi
script:
- python -m pytest plugins/CryptMessage/Test
- python -m pytest src/Test --cov=src --cov-config src/Test/coverage.ini
before_install:
- pip install -U pytest mock pytest-cov
- pip install codecov
- pip install coveralls
- catchsegv python -m pytest src/Test --cov=src --cov-config src/Test/coverage.ini
- export ZERONET_LOG_DIR="log/CryptMessage"; catchsegv python -m pytest -x plugins/CryptMessage/Test
- export ZERONET_LOG_DIR="log/Bigfile"; catchsegv python -m pytest -x plugins/Bigfile/Test
- export ZERONET_LOG_DIR="log/AnnounceLocal"; catchsegv python -m pytest -x plugins/AnnounceLocal/Test
- export ZERONET_LOG_DIR="log/OptionalManager"; catchsegv python -m pytest -x plugins/OptionalManager/Test
- export ZERONET_LOG_DIR="log/Multiuser"; mv plugins/disabled-Multiuser plugins/Multiuser && catchsegv python -m pytest -x plugins/Multiuser/Test
- export ZERONET_LOG_DIR="log/Bootstrapper"; mv plugins/disabled-Bootstrapper plugins/Bootstrapper && catchsegv python -m pytest -x plugins/Bootstrapper/Test
- 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]')"
- 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]')"
- flake8 . --count --select=E9,F63,F72,F82 --show-source --statistics --exclude=src/lib/pyaes/
after_failure:
- zip -r log.zip log/
- curl --upload-file ./log.zip https://transfer.sh/log.zip
after_success:
- codecov
- coveralls --rcfile=src/Test/coverage.ini
cache:
directories:
- $HOME/.cache/pip
notifications:
email:
recipients:
hello@zeronet.io
on_success: change

649
CHANGELOG.md Normal file
View file

@ -0,0 +1,649 @@
### ZeroNet 0.9.0 (2023-07-12) Rev4630
- Fix RDos Issue in Plugins https://github.com/ZeroNetX/ZeroNet-Plugins/pull/9
- Add trackers to Config.py for failsafety incase missing trackers.txt
- Added Proxy links
- Fix pysha3 dep installation issue
- FileRequest -> Remove Unnecessary check, Fix error wording
- Fix Response when site is missing for `actionAs`
### ZeroNet 0.8.5 (2023-02-12) Rev4625
- Fix(https://github.com/ZeroNetX/ZeroNet/pull/202) for SSL cert gen failed on Windows.
- default theme-class for missing value in `users.json`.
- Fetch Stats Plugin changes.
### ZeroNet 0.8.4 (2022-12-12) Rev4620
- Increase Minimum Site size to 25MB.
### ZeroNet 0.8.3 (2022-12-11) Rev4611
- main.py -> Fix accessing unassigned varible
- ContentManager -> Support for multiSig
- SiteStrorage.py -> Fix accessing unassigned varible
- ContentManager.py Improve Logging of Valid Signers
### ZeroNet 0.8.2 (2022-11-01) Rev4610
- Fix Startup Error when plugins dir missing
- Move trackers to seperate file & Add more trackers
- Config:: Skip loading missing tracker files
- Added documentation for getRandomPort fn
### ZeroNet 0.8.1 (2022-10-01) Rev4600
- fix readdress loop (cherry-pick previously added commit from conservancy)
- Remove Patreon badge
- Update README-ru.md (#177)
- Include inner_path of failed request for signing in error msg and response
- Don't Fail Silently When Cert is Not Selected
- Console Log Updates, Specify min supported ZeroNet version for Rust version Protocol Compatibility
- Update FUNDING.yml
### ZeroNet 0.8.0 (2022-05-27) Rev4591
- Revert File Open to catch File Access Errors.
### ZeroNet 0.7.9-patch (2022-05-26) Rev4586
- Use xescape(s) from zeronet-conservancy
- actionUpdate response Optimisation
- Fetch Plugins Repo Updates
- Fix Unhandled File Access Errors
- Create codeql-analysis.yml
### ZeroNet 0.7.9 (2022-05-26) Rev4585
- Rust Version Compatibility for update Protocol msg
- Removed Non Working Trakers.
- Dynamically Load Trackers from Dashboard Site.
- Tracker Supply Improvements.
- Fix Repo Url for Bug Report
- First Party Tracker Update Service using Dashboard Site.
- remove old v2 onion service [#158](https://github.com/ZeroNetX/ZeroNet/pull/158)
### ZeroNet 0.7.8 (2022-03-02) Rev4580
- Update Plugins with some bug fixes and Improvements
### ZeroNet 0.7.6 (2022-01-12) Rev4565
- Sync Plugin Updates
- Clean up tor v3 patch [#115](https://github.com/ZeroNetX/ZeroNet/pull/115)
- Add More Default Plugins to Repo
- Doubled Site Publish Limits
- Update ZeroNet Repo Urls [#103](https://github.com/ZeroNetX/ZeroNet/pull/103)
- UI/UX: Increases Size of Notifications Close Button [#106](https://github.com/ZeroNetX/ZeroNet/pull/106)
- Moved Plugins to Seperate Repo
- Added `access_key` variable in Config, this used to access restrited plugins when multiuser plugin is enabled. When MultiUserPlugin is enabled we cannot access some pages like /Stats, this key will remove such restriction with access key.
- Added `last_connection_id_current_version` to ConnectionServer, helpful to estimate no of connection from current client version.
- Added current version: connections to /Stats page. see the previous point.
### ZeroNet 0.7.5 (2021-11-28) Rev4560
- Add more default trackers
- Change default homepage address to `1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d`
- Change default update site address to `1Update8crprmciJHwp2WXqkx2c4iYp18`
### ZeroNet 0.7.3 (2021-11-28) Rev4555
- Fix xrange is undefined error
- Fix Incorrect viewport on mobile while loading
- Tor-V3 Patch by anonymoose
### ZeroNet 0.7.1 (2019-07-01) Rev4206
### Added
- Built-in logging console in the web UI to see what's happening in the background. (pull down top-right 0 button to see it)
- Display database rebuild errors [Thanks to Lola]
- New plugin system that allows to install and manage builtin/third party extensions to the ZeroNet client using the web interface.
- Support multiple trackers_file
- Add OpenSSL 1.1 support to CryptMessage plugin based on Bitmessage modifications [Thanks to radfish]
- Display visual error message on startup errors
- Fix max opened files changing on Windows platform
- Display TLS1.3 compatibility on /Stats page
- Add fake SNI and ALPN to peer connections to make it more like standard https connections
- Hide and ignore tracker_proxy setting in Tor: Always mode as it's going to use Tor anyway.
- Deny websocket connections from unknown origins
- Restrict open_browser values to avoid RCE on sandbox escape
- Offer access web interface by IP address in case of unknown host
- Link to site's sidebar with "#ZeroNet:OpenSidebar" hash
### Changed
- Allow .. in file names [Thanks to imachug]
- Change unstable trackers
- More clean errors on sites.json/users.json load error
- Various tweaks for tracker rating on unstable connections
- Use OpenSSL 1.1 dlls from default Python Windows distribution if possible
- Re-factor domain resolving for easier domain plugins
- Disable UDP connections if --proxy is used
- New, decorator-based Websocket API permission system to avoid future typo mistakes
### Fixed
- Fix parsing config lines that have no value
- Fix start.py [Thanks to imachug]
- Allow multiple values of the same key in the config file [Thanks ssdifnskdjfnsdjk for reporting]
- Fix parsing config file lines that has % in the value [Thanks slrslr for reporting]
- Fix bootstrapper plugin hash reloads [Thanks geekless for reporting]
- Fix CryptMessage plugin OpenSSL dll loading on Windows (ZeroMail errors) [Thanks cxgreat2014 for reporting]
- Fix startup error when using OpenSSL 1.1 [Thanks to imachug]
- Fix a bug that did not loaded merged site data for 5 sec after the merged site got added
- Fix typo that allowed to add new plugins in public proxy mode. [Thanks styromaniac for reporting]
- Fix loading non-big files with "|all" postfix [Thanks to krzotr]
- Fix OpenSSL cert generation error crash by change Windows console encoding to utf8
#### Wrapper html injection vulnerability [Reported by ivanq]
In ZeroNet before rev4188 the wrapper template variables was rendered incorrectly.
Result: The opened site was able to gain WebSocket connection with unrestricted ADMIN/NOSANDBOX access, change configuration values and possible RCE on client's machine.
Fix: Fixed the template rendering code, disallowed WebSocket connections from unknown locations, restricted open_browser configuration values to avoid possible RCE in case of sandbox escape.
Note: The fix is also back ported to ZeroNet Py 2.x version (Rev3870)
### ZeroNet 0.7.0 (2019-06-12) Rev4106 (First release targeting Python 3.4+)
### Added
- 5-10x faster signature verification by using libsecp256k1 (Thanks to ZeroMux)
- Generated SSL certificate randomization to avoid protocol filters (Thanks to ValdikSS)
- Offline mode
- P2P source code update using ZeroNet protocol
- ecdsaSign/Verify commands to CryptMessage plugin (Thanks to imachug)
- Efficient file rename: change file names instead of re-downloading the file.
- Make redirect optional on site cloning (Thanks to Lola)
- EccPrivToPub / EccPubToPriv functions (Thanks to imachug)
- Detect and change dark/light theme based on OS setting (Thanks to filips123)
### Changed
- Re-factored code to Python3 runtime (compatible with Python 3.4-3.8)
- More safe database sync mode
- Removed bundled third-party libraries where it's possible
- Use lang=en instead of lang={lang} in urls to avoid url encode problems
- Remove environment details from error page
- Don't push content.json updates larger than 10kb to significantly reduce bw usage for site with many files
### Fixed
- Fix sending files with \0 characters
- Security fix: Escape error detail to avoid XSS (reported by krzotr)
- Fix signature verification using libsecp256k1 for compressed addresses (mostly certificates generated in the browser)
- Fix newsfeed if you have more than 1000 followed topic/post on one site.
- Fix site download as zip file
- Fix displaying sites with utf8 title
- Error message if dbRebuild fails (Thanks to Lola)
- Fix browser reopen if executing start.py again. (Thanks to imachug)
### ZeroNet 0.6.5 (2019-02-16) Rev3851 (Last release targeting Python 2.7.x)
### Added
- IPv6 support in peer exchange, bigfiles, optional file finding, tracker sharing, socket listening and connecting (based on tangdou1 modifications)
- New tracker database format with IPv6 support
- Display notification if there is an unpublished modification for your site
- Listen and shut down normally for SIGTERM (Thanks to blurHY)
- Support tilde `~` in filenames (by d14na)
- Support map for Namecoin subdomain names (Thanks to lola)
- Add log level to config page
- Support `{data}` for data dir variable in trackers_file value
- Quick check content.db on startup and rebuild if necessary
- Don't show meek proxy option if the tor client does not supports it
### Changed
- Refactored port open checking with IPv6 support
- Consider non-local IPs as external even is the open port check fails (for CJDNS and Yggdrasil support)
- Add IPv6 tracker and change unstable tracker
- Don't correct sent local time with the calculated time correction
- Disable CSP for Edge
- Only support CREATE commands in dbschema indexes node and SELECT from storage.query
### Fixed
- Check the length of master seed when executing cryptGetPrivatekey CLI command
- Only reload source code on file modification / creation
- Detection and issue warning for latest no-script plugin
- Fix atomic write of a non-existent file
- Fix sql queries with lots of variables and sites with lots of content.json
- Fix multi-line parsing of zeronet.conf
- Fix site deletion from users.json
- Fix site cloning before site downloaded (Reported by unsystemizer)
- Fix queryJson for non-list nodes (Reported by MingchenZhang)
## ZeroNet 0.6.4 (2018-10-20) Rev3660
### Added
- New plugin: UiConfig. A web interface that allows changing ZeroNet settings.
- New plugin: AnnounceShare. Share trackers between users, automatically announce client's ip as tracker if Bootstrapper plugin is enabled.
- Global tracker stats on ZeroHello: Include statistics from all served sites instead of displaying request statistics only for one site.
- Support custom proxy for trackers. (Configurable with /Config)
- Adding peers to sites manually using zeronet_peers get parameter
- Copy site address with peers link on the sidebar.
- Zip file listing and streaming support for Bigfiles.
- Tracker statistics on /Stats page
- Peer reputation save/restore to speed up sync time after startup.
- Full support fileGet, fileList, dirList calls on tar.gz/zip files.
- Archived_before support to user content rules to allow deletion of all user files before the specified date
- Show and manage "Connecting" sites on ZeroHello
- Add theme support to ZeroNet sites
- Dark theme for ZeroHello, ZeroBlog, ZeroTalk
### Changed
- Dynamic big file allocation: More efficient storage usage by don't pre-allocate the whole file at the beginning, but expand the size as the content downloads.
- Reduce the request frequency to unreliable trackers.
- Only allow 5 concurrent checkSites to run in parallel to reduce load under Tor/slow connection.
- Stop site downloading if it reached 95% of site limit to avoid download loop for sites out of limit
- The pinned optional files won't be removed from download queue after 30 retries and won't be deleted even if the site owner removes it.
- Don't remove incomplete (downloading) sites on startup
- Remove --pin_bigfile argument as big files are automatically excluded from optional files limit.
### Fixed
- Trayicon compatibility with latest gevent
- Request number counting for zero:// trackers
- Peer reputation boost for zero:// trackers.
- Blocklist of peers loaded from peerdb (Thanks tangdou1 for report)
- Sidebar map loading on foreign languages (Thx tangdou1 for report)
- FileGet on non-existent files (Thanks mcdev for reporting)
- Peer connecting bug for sites with low amount of peers
#### "The Vacation" Sandbox escape bug [Reported by GitCenter / Krixano / ZeroLSTN]
In ZeroNet 0.6.3 Rev3615 and earlier as a result of invalid file type detection, a malicious site could escape the iframe sandbox.
Result: Browser iframe sandbox escape
Applied fix: Replaced the previous, file extension based file type identification with a proper one.
Affected versions: All versions before ZeroNet Rev3616
## ZeroNet 0.6.3 (2018-06-26)
### Added
- New plugin: ContentFilter that allows to have shared site and user block list.
- Support Tor meek proxies to avoid tracker blocking of GFW
- Detect network level tracker blocking and easy setting meek proxy for tracker connections.
- Support downloading 2GB+ sites as .zip (Thx to Radtoo)
- Support ZeroNet as a transparent proxy (Thx to JeremyRand)
- Allow fileQuery as CORS command (Thx to imachug)
- Windows distribution includes Tor and meek client by default
- Download sites as zip link to sidebar
- File server port randomization
- Implicit SSL for all connection
- fileList API command for zip files
- Auto download bigfiles size limit on sidebar
- Local peer number to the sidebar
- Open site directory button in sidebar
### Changed
- Switched to Azure Tor meek proxy as Amazon one became unavailable
- Refactored/rewritten tracker connection manager
- Improved peer discovery for optional files without opened port
- Also delete Bigfile's piecemap on deletion
### Fixed
- Important security issue: Iframe sandbox escape [Reported by Ivanq / gitcenter]
- Local peer discovery when running multiple clients on the same machine
- Uploading small files with Bigfile plugin
- Ctrl-c shutdown when running CLI commands
- High CPU/IO usage when Multiuser plugin enabled
- Firefox back button
- Peer discovery on older Linux kernels
- Optional file handling when multiple files have the same hash_id (first 4 chars of the hash)
- Msgpack 0.5.5 and 0.5.6 compatibility
## ZeroNet 0.6.2 (2018-02-18)
### Added
- New plugin: AnnounceLocal to make ZeroNet work without an internet connection on the local network.
- Allow dbQuey and userGetSettings using the `as` API command on different sites with Cors permission
- New config option: `--log_level` to reduce log verbosity and IO load
- Prefer to connect to recent peers from trackers first
- Mark peers with port 1 is also unconnectable for future fix for trackers that do not support port 0 announce
### Changed
- Don't keep connection for sites that have not been modified in the last week
- Change unreliable trackers to new ones
- Send maximum 10 findhash request in one find optional files round (15sec)
- Change "Unique to site" to "No certificate" for default option in cert selection dialog.
- Dont print warnings if not in debug mode
- Generalized tracker logging format
- Only recover sites from sites.json if they had peers
- Message from local peers does not means internet connection
- Removed `--debug_gevent` and turned on Gevent block logging by default
### Fixed
- Limit connections to 512 to avoid reaching 1024 limit on windows
- Exception when logging foreign operating system socket errors
- Don't send private (local) IPs on pex
- Don't connect to private IPs in tor always mode
- Properly recover data from msgpack unpacker on file stream start
- Symlinked data directory deletion when deleting site using Windows
- De-duplicate peers before publishing
- Bigfile info for non-existing files
## ZeroNet 0.6.1 (2018-01-25)
### Added
- New plugin: Chart
- Collect and display charts about your contribution to ZeroNet network
- Allow list as argument replacement in sql queries. (Thanks to imachug)
- Newsfeed query time statistics (Click on "From XX sites in X.Xs on ZeroHello)
- New UiWebsocket API command: As to run commands as other site
- Ranged ajax queries for big files
- Filter feed by type and site address
- FileNeed, Bigfile upload command compatibility with merger sites
- Send event on port open / tor status change
- More description on permission request
### Changed
- Reduce memory usage of sidebar geoip database cache
- Change unreliable tracker to new one
- Don't display Cors permission ask if it already granted
- Avoid UI blocking when rebuilding a merger site
- Skip listing ignored directories on signing
- In Multiuser mode show the seed welcome message when adding new certificate instead of first visit
- Faster async port opening on multiple network interfaces
- Allow javascript modals
- Only zoom sidebar globe if mouse button is pressed down
### Fixed
- Open port checking error reporting (Thanks to imachug)
- Out-of-range big file requests
- Don't output errors happened on gevent greenlets twice
- Newsfeed skip sites with no database
- Newsfeed queries with multiple params
- Newsfeed queries with UNION and UNION ALL
- Fix site clone with sites larger that 10MB
- Unreliable Websocket connection when requesting files from different sites at the same time
## ZeroNet 0.6.0 (2017-10-17)
### Added
- New plugin: Big file support
- Automatic pinning on Big file download
- Enable TCP_NODELAY for supporting sockets
- actionOptionalFileList API command arguments to list non-downloaded files or only big files
- serverShowdirectory API command arguments to allow to display site's directory in OS file browser
- fileNeed API command to initialize optional file downloading
- wrapperGetAjaxKey API command to request nonce for AJAX request
- Json.gz support for database files
- P2P port checking (Thanks for grez911)
- `--download_optional auto` argument to enable automatic optional file downloading for newly added site
- Statistics for big files and protocol command requests on /Stats
- Allow to set user limitation based on auth_address
### Changed
- More aggressive and frequent connection timeout checking
- Use out of msgpack context file streaming for files larger than 512KB
- Allow optional files workers over the worker limit
- Automatic redirection to wrapper on nonce_error
- Send websocket event on optional file deletion
- Optimize sites.json saving
- Enable faster C-based msgpack packer by default
- Major optimization on Bootstrapper plugin SQL queries
- Don't reset bad file counter on restart, to allow easier give up on unreachable files
- Incoming connection limit changed from 1000 to 500 to avoid reaching socket limit on Windows
- Changed tracker boot.zeronet.io domain, because zeronet.io got banned in some countries
#### Fixed
- Sub-directories in user directories
## ZeroNet 0.5.7 (2017-07-19)
### Added
- New plugin: CORS to request read permission to other site's content
- New API command: userSetSettings/userGetSettings to store site's settings in users.json
- Avoid file download if the file size does not match with the requested one
- JavaScript and wrapper less file access using /raw/ prefix ([Example](http://127.0.0.1:43110/raw/1AsRLpuRxr3pb9p3TKoMXPSWHzh6i7fMGi/en.tar.gz/index.html))
- --silent command line option to disable logging to stdout
### Changed
- Better error reporting on sign/verification errors
- More test for sign and verification process
- Update to OpenSSL v1.0.2l
- Limit compressed files to 6MB to avoid zip/tar.gz bomb
- Allow space, [], () characters in filenames
- Disable cross-site resource loading to improve privacy. [Reported by Beardog108]
- Download directly accessed Pdf/Svg/Swf files instead of displaying them to avoid wrapper escape using in JS in SVG file. [Reported by Beardog108]
- Disallow potentially unsafe regular expressions to avoid ReDoS [Reported by MuxZeroNet]
### Fixed
- Detecting data directory when running Windows distribution exe [Reported by Plasmmer]
- OpenSSL loading under Android 6+
- Error on exiting when no connection server started
## ZeroNet 0.5.6 (2017-06-15)
### Added
- Callback for certSelect API command
- More compact list formatting in json
### Changed
- Remove obsolete auth_key_sha512 and signature format
- Improved Spanish translation (Thanks to Pupiloho)
### Fixed
- Opened port checking (Thanks l5h5t7 & saber28 for reporting)
- Standalone update.py argument parsing (Thanks Zalex for reporting)
- uPnP crash on startup (Thanks Vertux for reporting)
- CoffeeScript 1.12.6 compatibility (Thanks kavamaken & imachug)
- Multi value argument parsing
- Database error when running from directory that contains special characters (Thanks Pupiloho for reporting)
- Site lock violation logging
#### Proxy bypass during source upgrade [Reported by ZeroMux]
In ZeroNet before 0.5.6 during the client's built-in source code upgrade mechanism,
ZeroNet did not respect Tor and/or proxy settings.
Result: ZeroNet downloaded the update without using the Tor network and potentially leaked the connections.
Fix: Removed the problematic code line from the updater that removed the proxy settings from the socket library.
Affected versions: ZeroNet 0.5.5 and earlier, Fixed in: ZeroNet 0.5.6
#### XSS vulnerability using DNS rebinding. [Reported by Beardog108]
In ZeroNet before 0.5.6 the web interface did not validate the request's Host parameter.
Result: An attacker using a specially crafted DNS entry could have bypassed the browser's cross-site-scripting protection
and potentially gained access to user's private data stored on site.
Fix: By default ZeroNet only accept connections from 127.0.0.1 and localhost hosts.
If you bind the ui server to an external interface, then it also adds the first http request's host to the allowed host list
or you can define it manually using --ui_host.
Affected versions: ZeroNet 0.5.5 and earlier, Fixed in: ZeroNet 0.5.6
## ZeroNet 0.5.5 (2017-05-18)
### Added
- Outgoing socket binding by --bind parameter
- Database rebuilding progress bar
- Protect low traffic site's peers from cleanup closing
- Local site blacklisting
- Cloned site source code upgrade from parent
- Input placeholder support for displayPrompt
- Alternative interaction for wrapperConfirm
### Changed
- New file priorities for faster site display on first visit
- Don't add ? to url if push/replaceState url starts with #
### Fixed
- PermissionAdd/Remove admin command requirement
- Multi-line confirmation dialog
## ZeroNet 0.5.4 (2017-04-14)
### Added
- Major speed and CPU usage enhancements in Tor always mode
- Send skipped modifications to outdated clients
### Changed
- Upgrade libs to latest version
- Faster port opening and closing
- Deny site limit modification in MultiUser mode
### Fixed
- Filling database from optional files
- OpenSSL detection on systems with OpenSSL 1.1
- Users.json corruption on systems with slow hdd
- Fix leaking files in data directory by webui
## ZeroNet 0.5.3 (2017-02-27)
### Added
- Tar.gz/zip packed site support
- Utf8 filenames in archive files
- Experimental --db_mode secure database mode to prevent data loss on systems with unreliable power source.
- Admin user support in MultiUser mode
- Optional deny adding new sites in MultiUser mode
### Changed
- Faster update and publish times by new socket sharing algorithm
### Fixed
- Fix missing json_row errors when using Mute plugin
## ZeroNet 0.5.2 (2017-02-09)
### Added
- User muting
- Win/Mac signed exe/.app
- Signed commits
### Changed
- Faster site updates after startup
- New macOS package for 10.10 compatibility
### Fixed
- Fix "New version just released" popup on page first visit
- Fix disappearing optional files bug (Thanks l5h5t7 for reporting)
- Fix skipped updates on unreliable connections (Thanks P2P for reporting)
- Sandbox escape security fix (Thanks Firebox for reporting)
- Fix error reporting on async websocket functions
## ZeroNet 0.5.1 (2016-11-18)
### Added
- Multi language interface
- New plugin: Translation helper for site html and js files
- Per-site favicon
### Fixed
- Parallel optional file downloading
## ZeroNet 0.5.0 (2016-11-08)
### Added
- New Plugin: Allow list/delete/pin/manage files on ZeroHello
- New API commands to follow user's optional files, and query stats for optional files
- Set total size limit on optional files.
- New Plugin: Save peers to database and keep them between restarts to allow more faster optional file search and make it work without trackers
- Rewritten uPnP port opener + close port on exit (Thanks to sirMackk!)
- Lower memory usage by lazy PeerHashfield creation
- Loaded json files statistics and database info at /Stats page
### Changed
- Separate lock file for better Windows compatibility
- When executing start.py open browser even if ZeroNet is already running
- Keep plugin order after reload to allow plugins to extends an another plug-in
- Only save sites.json if fully loaded to avoid data loss
- Change aletorrenty tracker to a more reliable one
- Much lower findhashid CPU usage
- Pooled downloading of large amount of optional files
- Lots of other optional file changes to make it better
- If we have 1000 peers for a site make cleanup more aggressive
- Use warning instead of error on verification errors
- Push updates to newer clients first
- Bad file reset improvements
### Fixed
- Fix site deletion errors on startup
- Delay websocket messages until it's connected
- Fix database import if data file contains extra data
- Fix big site download
- Fix diff sending bug (been chasing it for a long time)
- Fix random publish errors when json file contained [] characters
- Fix site delete and siteCreate bug
- Fix file write confirmation dialog
## ZeroNet 0.4.1 (2016-09-05)
### Added
- Major core changes to allow fast startup and lower memory usage
- Try to reconnect to Tor on lost connection
- Sidebar fade-in
- Try to avoid incomplete data files overwrite
- Faster database open
- Display user file sizes in sidebar
- Concurrent worker number depends on --connection_limit
### Changed
- Close databases after 5 min idle time
- Better site size calculation
- Allow "-" character in domains
- Always try to keep connections for sites
- Remove merger permission from merged sites
- Newsfeed scans only last 3 days to speed up database queries
- Updated ZeroBundle-win to Python 2.7.12
### Fixed
- Fix for important security problem, which is allowed anyone to publish new content without valid certificate from ID provider. Thanks Kaffie for pointing it out!
- Fix sidebar error when no certificate provider selected
- Skip invalid files on database rebuilding
- Fix random websocket connection error popups
- Fix new siteCreate command
- Fix site size calculation
- Fix port open checking after computer wake up
- Fix --size_limit parsing from command line
## ZeroNet 0.4.0 (2016-08-11)
### Added
- Merger site plugin
- Live source code reloading: Faster core development by allowing me to make changes in ZeroNet source code without restarting it.
- New json table format for merger sites
- Database rebuild from sidebar.
- Allow to store custom data directly in json table: Much simpler and faster SQL queries.
- User file archiving: Allows the site owner to archive inactive user's content into single file. (Reducing initial sync time/cpu/memory usage)
- Also trigger onUpdated/update database on file delete.
- Permission request from ZeroFrame API.
- Allow to store extra data in content.json using fileWrite API command.
- Faster optional files downloading
- Use alternative sources (Gogs, Gitlab) to download updates
- Track provided sites/connection and prefer to keep the ones with more sites to reduce connection number
### Changed
- Keep at least 5 connection per site
- Changed target connection for sites to 10 from 15
- ZeroHello search function stability/speed improvements
- Improvements for clients with slower HDD
### Fixed
- Fix IE11 wrapper nonce errors
- Fix sidebar on mobile devices
- Fix site size calculation
- Fix IE10 compatibility
- Windows XP ZeroBundle compatibility (THX to people of China)
## ZeroNet 0.3.7 (2016-05-27)
### Changed
- Patch command to reduce bandwidth usage by transfer only the changed lines
- Other cpu/memory optimizations
## ZeroNet 0.3.6 (2016-05-27)
### Added
- New ZeroHello
- Newsfeed function
### Fixed
- Security fixes
## ZeroNet 0.3.5 (2016-02-02)
### Added
- Full Tor support with .onion hidden services
- Bootstrap using ZeroNet protocol
### Fixed
- Fix Gevent 1.0.2 compatibility
## ZeroNet 0.3.4 (2015-12-28)
### Added
- AES, ECIES API function support
- PushState and ReplaceState url manipulation support in API
- Multiuser localstorage

View file

@ -1,7 +1,7 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@ -645,7 +645,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
@ -664,11 +664,11 @@ might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View file

@ -1,28 +1,33 @@
FROM ubuntu:14.04
MAINTAINER Felix Imobersteg <felix@whatwedo.ch>
FROM alpine:3.15
#Base settings
ENV DEBIAN_FRONTEND noninteractive
ENV HOME /root
#Update package lists
RUN apt-get update -y
COPY requirements.txt /root/requirements.txt
#Install ZeroNet deps
RUN apt-get install msgpack-python python-gevent python-pip python-dev -y
RUN pip install msgpack-python --upgrade
#Install ZeroNet
RUN apk --update --no-cache --no-progress add python3 python3-dev py3-pip gcc g++ autoconf automake libtool libffi-dev musl-dev make tor openssl \
&& pip3 install -r /root/requirements.txt \
&& apk del python3-dev gcc g++ autoconf automake libtool libffi-dev musl-dev make \
&& echo "ControlPort 9051" >> /etc/tor/torrc \
&& echo "CookieAuthentication 1" >> /etc/tor/torrc
RUN python3 -V \
&& python3 -m pip list \
&& tor --version \
&& openssl version
#Add Zeronet source
ADD . /root
COPY . /root
VOLUME /root/data
#Slimming down Docker containers
RUN apt-get clean -y
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
#Control if Tor proxy is started
ENV ENABLE_TOR true
WORKDIR /root
#Set upstart command
CMD cd /root && python zeronet.py --ui_ip 0.0.0.0
CMD (! ${ENABLE_TOR} || tor&) && python3 zeronet.py --ui_ip 0.0.0.0 --fileserver_port 26117
#Expose ports
EXPOSE 43110
EXPOSE 15441
EXPOSE 43110 26117

34
Dockerfile.arm64v8 Normal file
View file

@ -0,0 +1,34 @@
FROM alpine:3.12
#Base settings
ENV HOME /root
COPY requirements.txt /root/requirements.txt
#Install ZeroNet
RUN apk --update --no-cache --no-progress add python3 python3-dev gcc libffi-dev musl-dev make tor openssl \
&& pip3 install -r /root/requirements.txt \
&& apk del python3-dev gcc libffi-dev musl-dev make \
&& echo "ControlPort 9051" >> /etc/tor/torrc \
&& echo "CookieAuthentication 1" >> /etc/tor/torrc
RUN python3 -V \
&& python3 -m pip list \
&& tor --version \
&& openssl version
#Add Zeronet source
COPY . /root
VOLUME /root/data
#Control if Tor proxy is started
ENV ENABLE_TOR false
WORKDIR /root
#Set upstart command
CMD (! ${ENABLE_TOR} || tor&) && python3 zeronet.py --ui_ip 0.0.0.0 --fileserver_port 26552
#Expose ports
EXPOSE 43110 26552

367
LICENSE
View file

@ -1,340 +1,27 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc., <http://fsf.org/>
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
{description}
Copyright (C) {year} {fullname}
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
{signature of Ty Coon}, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, version 3.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Additional Conditions :
Contributing to this repo
This repo is governed by GPLv3, same is located at the root of the ZeroNet git repo,
unless specified separately all code is governed by that license, contributions to this repo
are divided into two key types, key contributions and non-key contributions, key contributions
are which, directly affects the code performance, quality and features of software,
non key contributions include things like translation datasets, image, graphic or video
contributions that does not affect the main usability of software but improves the existing
usability of certain thing or feature, these also include tests written with code, since their
purpose is to check, whether something is working or not as intended. All the non-key contributions
are governed by [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/), unless specified
above, a contribution is ruled by the type of contribution if there is a conflict between two
contributing parties of repo in any case.

133
README-ru.md Normal file
View file

@ -0,0 +1,133 @@
# ZeroNet [![tests](https://github.com/ZeroNetX/ZeroNet/actions/workflows/tests.yml/badge.svg)](https://github.com/ZeroNetX/ZeroNet/actions/workflows/tests.yml) [![Documentation](https://img.shields.io/badge/docs-faq-brightgreen.svg)](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/faq/) [![Help](https://img.shields.io/badge/keep_this_project_alive-donate-yellow.svg)](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/) [![Docker Pulls](https://img.shields.io/docker/pulls/canewsin/zeronet)](https://hub.docker.com/r/canewsin/zeronet)
[简体中文](./README-zh-cn.md)
[English](./README.md)
Децентрализованные вебсайты, использующие криптографию Bitcoin и протокол BitTorrent — https://zeronet.dev ([Зеркало в ZeroNet](http://127.0.0.1:43110/1ZeroNetyV5mKY9JF1gsm82TuBXHpfdLX/)). В отличии от Bitcoin, ZeroNet'у не требуется блокчейн для работы, однако он использует ту же криптографию, чтобы обеспечить сохранность и проверку данных.
## Зачем?
- Мы верим в открытую, свободную, и неподдающуюся цензуре сеть и связь.
- Нет единой точки отказа: Сайт остаётся онлайн, пока его обслуживает хотя бы 1 пир.
- Нет затрат на хостинг: Сайты обслуживаются посетителями.
- Невозможно отключить: Он нигде, потому что он везде.
- Скорость и возможность работать без Интернета: Вы сможете получить доступ к сайту, потому что его копия хранится на вашем компьютере и у ваших пиров.
## Особенности
- Обновление сайтов в реальном времени
- Поддержка доменов `.bit` ([Namecoin](https://www.namecoin.org))
- Легкая установка: просто распакуйте и запустите
- Клонирование сайтов "в один клик"
- Беспарольная [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
авторизация: Ваша учетная запись защищена той же криптографией, что и ваш Bitcoin-кошелек
- Встроенный SQL-сервер с синхронизацией данных P2P: Позволяет упростить разработку сайта и ускорить загрузку страницы
- Анонимность: Полная поддержка сети Tor, используя скрытые службы `.onion` вместо адресов IPv4
- Зашифрованное TLS подключение
- Автоматическое открытие UPnPпорта
- Плагин для поддержки нескольких пользователей (openproxy)
- Работа с любыми браузерами и операционными системами
## Текущие ограничения
- Файловые транзакции не сжаты
- Нет приватных сайтов
## Как это работает?
- После запуска `zeronet.py` вы сможете посещать сайты в ZeroNet, используя адрес
`http://127.0.0.1:43110/{zeronet_адрес}`
(Например: `http://127.0.0.1:43110/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d`).
- Когда вы посещаете новый сайт в ZeroNet, он пытается найти пиров с помощью протокола BitTorrent,
чтобы скачать у них файлы сайта (HTML, CSS, JS и т.д.).
- После посещения сайта вы тоже становитесь его пиром.
- Каждый сайт содержит файл `content.json`, который содержит SHA512 хеши всех остальные файлы
и подпись, созданную с помощью закрытого ключа сайта.
- Если владелец сайта (тот, кто владеет закрытым ключом для адреса сайта) изменяет сайт, он
подписывает новый `content.json` и публикует его для пиров. После этого пиры проверяют целостность `content.json`
(используя подпись), скачвают изменённые файлы и распространяют новый контент для других пиров.
[Презентация о криптографии ZeroNet, обновлениях сайтов, многопользовательских сайтах »](https://docs.google.com/presentation/d/1_2qK1IuOKJ51pgBvllZ9Yu7Au2l551t3XBgyTSvilew/pub?start=false&loop=false&delayms=3000)
[Часто задаваемые вопросы »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/faq/)
[Документация разработчика ZeroNet »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/site_development/getting_started/)
## Скриншоты
![Screenshot](https://i.imgur.com/H60OAHY.png)
![ZeroTalk](https://zeronet.io/docs/img/zerotalk.png)
[Больше скриншотов в документации ZeroNet »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/using_zeronet/sample_sites/)
## Как присоединиться?
### Windows
- Скачайте и распакуйте архив [ZeroNet-win.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-win.zip) (26МБ)
- Запустите `ZeroNet.exe`
### macOS
- Скачайте и распакуйте архив [ZeroNet-mac.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-mac.zip) (14МБ)
- Запустите `ZeroNet.app`
### Linux (64 бит)
- Скачайте и распакуйте архив [ZeroNet-linux.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-linux.zip) (14МБ)
- Запустите `./ZeroNet.sh`
> **Note**
> Запустите таким образом: `./ZeroNet.sh --ui_ip '*' --ui_restrict ваш_ip_адрес`, чтобы разрешить удалённое подключение к веб–интерфейсу.
### Docker
Официальный образ находится здесь: https://hub.docker.com/r/canewsin/zeronet/
### Android (arm, arm64, x86)
- Для работы требуется Android как минимум версии 5.0 Lollipop
- [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play"
height="80">](https://play.google.com/store/apps/details?id=in.canews.zeronetmobile)
- Скачать APK: https://github.com/canewsin/zeronet_mobile/releases
### Android (arm, arm64, x86) Облегчённый клиент только для просмотра (1МБ)
- Для работы требуется Android как минимум версии 4.1 Jelly Bean
- [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play"
height="80">](https://play.google.com/store/apps/details?id=dev.zeronetx.app.lite)
### Установка из исходного кода
```sh
wget https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-src.zip
unzip ZeroNet-src.zip
cd ZeroNet
sudo apt-get update
sudo apt-get install python3-pip
sudo python3 -m pip install -r requirements.txt
```
- Запустите `python3 zeronet.py`
Откройте приветственную страницу ZeroHello в вашем браузере по ссылке http://127.0.0.1:43110/
## Как мне создать сайт в ZeroNet?
- Кликните на **⋮** > **"Create new, empty site"** в меню на сайте [ZeroHello](http://127.0.0.1:43110/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d).
- Вы будете **перенаправлены** на совершенно новый сайт, который может быть изменён только вами!
- Вы можете найти и изменить контент вашего сайта в каталоге **data/[адресашего_сайта]**
- После изменений откройте ваш сайт, переключите влево кнопку "0" в правом верхнем углу, затем нажмите кнопки **sign** и **publish** внизу
Следующие шаги: [Документация разработчика ZeroNet](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/site_development/getting_started/)
## Поддержите проект
- Bitcoin: 1ZeroNetyV5mKY9JF1gsm82TuBXHpfdLX (Рекомендуем)
- LiberaPay: https://liberapay.com/PramUkesh
- Paypal: https://paypal.me/PramUkesh
- Другие способы: [Donate](!https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/#help-to-keep-zeronet-development-alive)
#### Спасибо!
- Здесь вы можете получить больше информации, помощь, прочитать список изменений и исследовать ZeroNet сайты: https://www.reddit.com/r/zeronetx/
- Общение происходит на канале [#zeronet @ FreeNode](https://kiwiirc.com/client/irc.freenode.net/zeronet) или в [Gitter](https://gitter.im/canewsin/ZeroNet)
- Электронная почта: canews.in@gmail.com

132
README-zh-cn.md Normal file
View file

@ -0,0 +1,132 @@
# ZeroNet [![tests](https://github.com/ZeroNetX/ZeroNet/actions/workflows/tests.yml/badge.svg)](https://github.com/ZeroNetX/ZeroNet/actions/workflows/tests.yml) [![Documentation](https://img.shields.io/badge/docs-faq-brightgreen.svg)](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/faq/) [![Help](https://img.shields.io/badge/keep_this_project_alive-donate-yellow.svg)](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/) [![Docker Pulls](https://img.shields.io/docker/pulls/canewsin/zeronet)](https://hub.docker.com/r/canewsin/zeronet)
[English](./README.md)
使用 Bitcoin 加密和 BitTorrent 网络的去中心化网络 - https://zeronet.dev
## 为什么?
* 我们相信开放,自由,无审查的网络和通讯
* 不会受单点故障影响:只要有在线的节点,站点就会保持在线
* 无托管费用:站点由访问者托管
* 无法关闭:因为节点无处不在
* 快速并可离线运行:即使没有互联网连接也可以使用
## 功能
* 实时站点更新
* 支持 Namecoin 的 .bit 域名
* 安装方便:只需解压并运行
* 一键克隆存在的站点
* 无需密码、基于 [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
的认证:您的账户被与比特币钱包相同的加密方法保护
* 内建 SQL 服务器和 P2P 数据同步:让开发更简单并提升加载速度
* 匿名性:完整的 Tor 网络支持,支持通过 .onion 隐藏服务相互连接而不是通过 IPv4 地址连接
* TLS 加密连接
* 自动打开 uPnP 端口
* 多用户openproxy支持的插件
* 适用于任何浏览器 / 操作系统
## 原理
* 在运行 `zeronet.py` 后,您将可以通过
`http://127.0.0.1:43110/{zeronet_address}`(例如:
`http://127.0.0.1:43110/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d`)访问 zeronet 中的站点
* 在您浏览 zeronet 站点时,客户端会尝试通过 BitTorrent 网络来寻找可用的节点从而下载需要的文件htmlcssjs...
* 您将会储存每一个浏览过的站点
* 每个站点都包含一个名为 `content.json` 的文件,它储存了其他所有文件的 sha512 散列值以及一个通过站点私钥生成的签名
* 如果站点的所有者(拥有站点地址的私钥)修改了站点,并且他 / 她签名了新的 `content.json` 然后推送至其他节点,
那么这些节点将会在使用签名验证 `content.json` 的真实性后,下载修改后的文件并将新内容推送至另外的节点
#### [关于 ZeroNet 加密,站点更新,多用户站点的幻灯片 »](https://docs.google.com/presentation/d/1_2qK1IuOKJ51pgBvllZ9Yu7Au2l551t3XBgyTSvilew/pub?start=false&loop=false&delayms=3000)
#### [常见问题 »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/faq/)
#### [ZeroNet 开发者文档 »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/site_development/getting_started/)
## 屏幕截图
![Screenshot](https://i.imgur.com/H60OAHY.png)
![ZeroTalk](https://zeronet.io/docs/img/zerotalk.png)
#### [ZeroNet 文档中的更多屏幕截图 »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/using_zeronet/sample_sites/)
## 如何加入
### Windows
- 下载 [ZeroNet-win.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-win.zip) (26MB)
- 在任意位置解压缩
- 运行 `ZeroNet.exe`
### macOS
- 下载 [ZeroNet-mac.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-mac.zip) (14MB)
- 在任意位置解压缩
- 运行 `ZeroNet.app`
### Linux (x86-64bit)
- `wget https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-linux.zip`
- `unzip ZeroNet-linux.zip`
- `cd ZeroNet-linux`
- 使用以下命令启动 `./ZeroNet.sh`
- 在浏览器打开 http://127.0.0.1:43110/ 即可访问 ZeroHello 页面
__提示__ 若要允许在 Web 界面上的远程连接,使用以下命令启动 `./ZeroNet.sh --ui_ip '*' --ui_restrict your.ip.address`
### 从源代码安装
- `wget https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-src.zip`
- `unzip ZeroNet-src.zip`
- `cd ZeroNet`
- `sudo apt-get update`
- `sudo apt-get install python3-pip`
- `sudo python3 -m pip install -r requirements.txt`
- 使用以下命令启动 `python3 zeronet.py`
- 在浏览器打开 http://127.0.0.1:43110/ 即可访问 ZeroHello 页面
### Android (arm, arm64, x86)
- minimum Android version supported 21 (Android 5.0 Lollipop)
- [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play"
height="80">](https://play.google.com/store/apps/details?id=in.canews.zeronetmobile)
- APK download: https://github.com/canewsin/zeronet_mobile/releases
### Android (arm, arm64, x86) Thin Client for Preview Only (Size 1MB)
- minimum Android version supported 16 (JellyBean)
- [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play"
height="80">](https://play.google.com/store/apps/details?id=dev.zeronetx.app.lite)
## 现有限制
* 传输文件时没有压缩
* 不支持私有站点
## 如何创建一个 ZeroNet 站点?
* 点击 [ZeroHello](http://127.0.0.1:43110/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d) 站点的 **⋮** > **「新建空站点」** 菜单项
* 您将被**重定向**到一个全新的站点,该站点只能由您修改
* 您可以在 **data/[您的站点地址]** 目录中找到并修改网站的内容
* 修改后打开您的网站将右上角的「0」按钮拖到左侧然后点击底部的**签名**并**发布**按钮
接下来的步骤:[ZeroNet 开发者文档](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/site_development/getting_started/)
## 帮助这个项目
- Bitcoin: 1ZeroNetyV5mKY9JF1gsm82TuBXHpfdLX (Preferred)
- LiberaPay: https://liberapay.com/PramUkesh
- Paypal: https://paypal.me/PramUkesh
- Others: [Donate](!https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/#help-to-keep-zeronet-development-alive)
#### 感谢您!
* 更多信息,帮助,变更记录和 zeronet 站点https://www.reddit.com/r/zeronetx/
* 前往 [#zeronet @ FreeNode](https://kiwiirc.com/client/irc.freenode.net/zeronet) 或 [gitter](https://gitter.im/canewsin/ZeroNet) 和我们聊天
* [这里](https://gitter.im/canewsin/ZeroNet)是一个 gitter 上的中文聊天室
* Email: canews.in@gmail.com

198
README.md
View file

@ -1,16 +1,16 @@
# ZeroNet [![Build Status](https://travis-ci.org/HelloZeroNet/ZeroNet.svg?branch=master)](https://travis-ci.org/HelloZeroNet/ZeroNet) [![Documentation](https://img.shields.io/badge/docs-faq-brightgreen.svg)](https://zeronet.readthedocs.org/en/latest/faq/) [![Help](https://img.shields.io/badge/keep_this_project_alive-donate-yellow.svg)](https://zeronet.readthedocs.org/en/latest/help_zeronet/donate/)
Decentralized websites using Bitcoin crypto and the BitTorrent network - http://zeronet.io
# ZeroNet [![tests](https://github.com/ZeroNetX/ZeroNet/actions/workflows/tests.yml/badge.svg)](https://github.com/ZeroNetX/ZeroNet/actions/workflows/tests.yml) [![Documentation](https://img.shields.io/badge/docs-faq-brightgreen.svg)](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/faq/) [![Help](https://img.shields.io/badge/keep_this_project_alive-donate-yellow.svg)](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/) [![Docker Pulls](https://img.shields.io/docker/pulls/canewsin/zeronet)](https://hub.docker.com/r/canewsin/zeronet)
<!--TODO: Update Onion Site -->
Decentralized websites using Bitcoin crypto and the BitTorrent network - https://zeronet.dev / [ZeroNet Site](http://127.0.0.1:43110/1ZeroNetyV5mKY9JF1gsm82TuBXHpfdLX/), Unlike Bitcoin, ZeroNet Doesn't need a blockchain to run, But uses cryptography used by BTC, to ensure data integrity and validation.
## Why?
* We believe in open, free, and uncensored network and communication.
* No single point of failure: Site remains online so long as at least 1 peer
* No single point of failure: Site remains online so long as at least 1 peer is
serving it.
* No hosting costs: Sites are served by visitors.
* Impossible to shut down: It's nowhere because it's everywhere.
* Fast and works offline: You can access the site even if your internet is
* Fast and works offline: You can access the site even if Internet is
unavailable.
@ -20,11 +20,11 @@ Decentralized websites using Bitcoin crypto and the BitTorrent network - http://
* Easy to setup: unpack & run
* Clone websites in one click
* Password-less [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)
based authorization: Your account is protected by same cryptography as your Bitcoin wallet
based authorization: Your account is protected by the same cryptography as your Bitcoin wallet
* Built-in SQL server with P2P data synchronization: Allows easier site development and faster page load times
* Anonymity: Full Tor network support with .onion hidden services instead of ipv4 addresses
* Anonymity: Full Tor network support with .onion hidden services instead of IPv4 addresses
* TLS encrypted connections
* Automatic, uPnP port opening
* Automatic uPnP port opening
* Plugin for multiuser (openproxy) support
* Works with any browser/OS
@ -33,152 +33,124 @@ Decentralized websites using Bitcoin crypto and the BitTorrent network - http://
* After starting `zeronet.py` you will be able to visit zeronet sites using
`http://127.0.0.1:43110/{zeronet_address}` (eg.
`http://127.0.0.1:43110/1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr`).
`http://127.0.0.1:43110/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d`).
* When you visit a new zeronet site, it tries to find peers using the BitTorrent
network so it can download the site files (html, css, js...) from them.
* Each visited site becomes also served by you.
* Every site contains a `content.json` which holds all other files in a sha512 hash
and a signature generated using site's private key.
* Each visited site is also served by you.
* Every site contains a `content.json` file which holds all other files in a sha512 hash
and a signature generated using the site's private key.
* If the site owner (who has the private key for the site address) modifies the
site, then he/she signs the new `content.json` and publishes it to the peers.
After the peers have verified the `content.json` integrity (using the
site and signs the new `content.json` and publishes it to the peers.
Afterwards, the peers verify the `content.json` integrity (using the
signature), they download the modified files and publish the new content to
other peers.
#### [Slideshow about ZeroNet cryptography, site updates, multi-user sites »](https://docs.google.com/presentation/d/1_2qK1IuOKJ51pgBvllZ9Yu7Au2l551t3XBgyTSvilew/pub?start=false&loop=false&delayms=3000)
#### [Frequently asked questions »](http://zeronet.readthedocs.org/en/latest/faq/)
#### [Frequently asked questions »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/faq/)
#### [ZeroNet Developer Documentation »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/site_development/getting_started/)
## Screenshots
![Screenshot](http://zeronet.readthedocs.org/en/latest/img/zerohello.png)
![ZeroTalk](http://zeronet.readthedocs.org/en/latest/img/zerotalk.png)
![Screenshot](https://i.imgur.com/H60OAHY.png)
![ZeroTalk](https://zeronet.io/docs/img/zerotalk.png)
#### [More screenshots in ZeroNet docs »](http://zeronet.readthedocs.org/en/latest/using_zeronet/sample_sites/)
#### [More screenshots in ZeroNet docs »](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/using_zeronet/sample_sites/)
## How to join?
## How to join
### Windows
* [Download ZeroBundle package](https://github.com/HelloZeroNet/ZeroBundle/releases/download/0.1.1/ZeroBundle-v0.1.1.zip) that includes Python 2.7.9 and all required libraries
* Unpack to any directory
* Run `zeronet.cmd`
- Download [ZeroNet-win.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-win.zip) (26MB)
- Unpack anywhere
- Run `ZeroNet.exe`
### macOS
It downloads the latest version of ZeroNet then starts it automatically.
- Download [ZeroNet-mac.zip](https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-mac.zip) (14MB)
- Unpack anywhere
- Run `ZeroNet.app`
### Linux (x86-64bit)
- `wget https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-linux.zip`
- `unzip ZeroNet-linux.zip`
- `cd ZeroNet-linux`
- Start with: `./ZeroNet.sh`
- Open the ZeroHello landing page in your browser by navigating to: http://127.0.0.1:43110/
__Tip:__ Start with `./ZeroNet.sh --ui_ip '*' --ui_restrict your.ip.address` to allow remote connections on the web interface.
### Android (arm, arm64, x86)
- minimum Android version supported 21 (Android 5.0 Lollipop)
- [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play"
height="80">](https://play.google.com/store/apps/details?id=in.canews.zeronetmobile)
- APK download: https://github.com/canewsin/zeronet_mobile/releases
### Android (arm, arm64, x86) Thin Client for Preview Only (Size 1MB)
- minimum Android version supported 16 (JellyBean)
- [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Download from Google Play"
height="80">](https://play.google.com/store/apps/details?id=dev.zeronetx.app.lite)
#### Alternative method for Windows by installing Python
#### Docker
There is an official image, built from source at: https://hub.docker.com/r/canewsin/zeronet/
* [Install Python 2.7](https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi)
* [Install Python Greenlet](http://zeronet.io/files/windows/greenlet-0.4.5.win32-py2.7.exe)
* [Install Python Gevent](http://zeronet.io/files/windows/gevent-1.0.1.win32-py2.7.exe)
* [Install Python MsgPack](http://zeronet.io/files/windows/msgpack-python-0.4.2.win32-py2.7.exe)
* [Download and extract ZeroNet](https://codeload.github.com/HelloZeroNet/ZeroNet/zip/master) to any directory
* Run `start.py`
### Online Proxies
Proxies are like seed boxes for sites(i.e ZNX runs on a cloud vps), you can try zeronet experience from proxies. Add your proxy below if you have one.
### Linux
#### Official ZNX Proxy :
#### Debian
https://proxy.zeronet.dev/
* `sudo apt-get update`
* `sudo apt-get install msgpack-python python-gevent`
* `wget https://github.com/HelloZeroNet/ZeroNet/archive/master.tar.gz`
* `tar xvpfz master.tar.gz`
* `cd ZeroNet-master`
* Start with `python zeronet.py`
* Open http://127.0.0.1:43110/ in your browser and enjoy! :)
https://zeronet.dev/
#### Other Linux or without root access
* Check your python version using `python --version` if the returned version is not `Python 2.7.X` then try `python2` or `python2.7` command and use it from now
* `wget https://bootstrap.pypa.io/get-pip.py`
* `python get-pip.py --user gevent msgpack-python`
* Start with `python zeronet.py`
#### From Community
### Mac
https://0net-preview.com/
* Install [Homebrew](http://brew.sh/)
* `brew install python`
* `pip install gevent msgpack-python`
* [Download](https://github.com/HelloZeroNet/ZeroNet/archive/master.zip), Unpack, run `python zeronet.py`
https://portal.ngnoid.tv/
### Vagrant
https://zeronet.ipfsscan.io/
* `vagrant up`
* Access VM with `vagrant ssh`
* `cd /vagrant`
* Run `python zeronet.py --ui_ip 0.0.0.0`
* Open http://127.0.0.1:43110/ in your browser
### Docker
* `docker run -p 15441:15441 -p 43110:43110 nofish/zeronet`
* Open http://127.0.0.1:43110/ in your browser
### Install from source
- `wget https://github.com/ZeroNetX/ZeroNet/releases/latest/download/ZeroNet-src.zip`
- `unzip ZeroNet-src.zip`
- `cd ZeroNet`
- `sudo apt-get update`
- `sudo apt-get install python3-pip`
- `sudo python3 -m pip install -r requirements.txt`
- Start with: `python3 zeronet.py`
- Open the ZeroHello landing page in your browser by navigating to: http://127.0.0.1:43110/
## Current limitations
* No torrent-like, file splitting for big file support
* ~~No more anonymous than Bittorrent~~ (built-in full Tor support added)
* File transactions are not compressed ~~or encrypted yet~~ (TLS encryption added)
* File transactions are not compressed
* No private sites
## How can I create a ZeroNet site?
Shut down zeronet if you are running it already
* Click on **⋮** > **"Create new, empty site"** menu item on the site [ZeroHello](http://127.0.0.1:43110/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d).
* You will be **redirected** to a completely new site that is only modifiable by you!
* You can find and modify your site's content in **data/[yoursiteaddress]** directory
* After the modifications open your site, drag the topright "0" button to left, then press **sign** and **publish** buttons on the bottom
```bash
$ zeronet.py siteCreate
...
- Site private key: 23DKQpzxhbVBrAtvLEc2uvk7DZweh4qL3fn3jpM3LgHDczMK2TtYUq
- Site address: 13DNDkMUExRf9Xa9ogwPKqp7zyHFEqbhC2
...
- Site created!
$ zeronet.py
...
```
Next steps: [ZeroNet Developer Documentation](https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/site_development/getting_started/)
Congratulations, you're finished! Now anyone can access your site using
`http://localhost:43110/13DNDkMUExRf9Xa9ogwPKqp7zyHFEqbhC2`
Next steps: [ZeroNet Developer Documentation](http://zeronet.readthedocs.org/en/latest/site_development/getting_started/)
## How can I modify a ZeroNet site?
* Modify files located in data/13DNDkMUExRf9Xa9ogwPKqp7zyHFEqbhC2 directory.
After you're finished:
```bash
$ zeronet.py siteSign 13DNDkMUExRf9Xa9ogwPKqp7zyHFEqbhC2
- Signing site: 13DNDkMUExRf9Xa9ogwPKqp7zyHFEqbhC2...
Private key (input hidden):
```
* Enter the private key you got when you created the site, then:
```bash
$ zeronet.py sitePublish 13DNDkMUExRf9Xa9ogwPKqp7zyHFEqbhC2
...
Site:13DNDk..bhC2 Publishing to 3/10 peers...
Site:13DNDk..bhC2 Successfuly published to 3 peers
- Serving files....
```
* That's it! You've successfully signed and published your modifications.
## If you want to help keep this project alive
- Bitcoin: 1QDhxQ6PraUZa21ET5fYUCPgdrwBomnFgX
- Paypal: https://zeronet.readthedocs.org/en/latest/help_zeronet/donate/
### Sponsors
* Better OSX/Safari compatibility made possible by [BrowserStack.com](https://www.browserstack.com)
## Help keep this project alive
- Bitcoin: 1ZeroNetyV5mKY9JF1gsm82TuBXHpfdLX (Preferred)
- LiberaPay: https://liberapay.com/PramUkesh
- Paypal: https://paypal.me/PramUkesh
- Others: [Donate](!https://docs.zeronet.dev/1DeveLopDZL1cHfKi8UXHh2UBEhzH6HhMp/help_zeronet/donate/#help-to-keep-zeronet-development-alive)
#### Thank you!
* More info, help, changelog, zeronet sites: http://www.reddit.com/r/zeronet/
* Come, chat with us: [#zeronet @ FreeNode](https://kiwiirc.com/client/irc.freenode.net/zeronet) or on [gitter](https://gitter.im/HelloZeroNet/ZeroNet)
* Email: hello@noloop.me
* More info, help, changelog, zeronet sites: https://www.reddit.com/r/zeronetx/
* Come, chat with us: [#zeronet @ FreeNode](https://kiwiirc.com/client/irc.freenode.net/zeronet) or on [gitter](https://gitter.im/canewsin/ZeroNet)
* Email: canews.in@gmail.com

2
Vagrantfile vendored
View file

@ -40,6 +40,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.provision "shell",
inline: "sudo apt-get install msgpack-python python-gevent python-pip python-dev -y"
config.vm.provision "shell",
inline: "sudo pip install msgpack-python --upgrade"
inline: "sudo pip install msgpack --upgrade"
end

1
plugins Submodule

@ -0,0 +1 @@
Subproject commit 689d9309f73371f4681191b125ec3f2e14075eeb

View file

@ -1,118 +0,0 @@
import hashlib
import time
from Plugin import PluginManager
from Peer import Peer
from util import helper
from Crypt import CryptRsa
allow_reload = False # No source reload supported in this plugin
time_full_announced = {} # Tracker address: Last announced all site to tracker
connection_pool = {} # Tracker address: Peer object
# Process result got back from tracker
def processPeerRes(site, peers):
added = 0
# Ip4
found_ip4 = 0
for packed_address in peers["ip4"]:
found_ip4 += 1
peer_ip, peer_port = helper.unpackAddress(packed_address)
if site.addPeer(peer_ip, peer_port):
added += 1
# Onion
found_onion = 0
for packed_address in peers["onion"]:
found_onion += 1
peer_onion, peer_port = helper.unpackOnionAddress(packed_address)
if site.addPeer(peer_onion, peer_port):
added += 1
if added:
site.worker_manager.onPeers()
site.updateWebsocket(peers_added=added)
site.log.debug("Found %s ip4, %s onion peers, new: %s" % (found_ip4, found_onion, added))
@PluginManager.registerTo("Site")
class SitePlugin(object):
def announceTracker(self, tracker_protocol, tracker_address, fileserver_port=0, add_types=[], my_peer_id="", mode="start"):
if tracker_protocol != "zero":
return super(SitePlugin, self).announceTracker(
tracker_protocol, tracker_address, fileserver_port, add_types, my_peer_id, mode
)
s = time.time()
need_types = ["ip4"]
if self.connection_server and self.connection_server.tor_manager.enabled:
need_types.append("onion")
if mode == "start" or mode == "more": # Single: Announce only this site
sites = [self]
full_announce = False
else: # Multi: Announce all currently serving site
full_announce = True
if time.time() - time_full_announced.get(tracker_address, 0) < 60 * 5: # No reannounce all sites within 5 minute
return True
time_full_announced[tracker_address] = time.time()
from Site import SiteManager
sites = [site for site in SiteManager.site_manager.sites.values() if site.settings["serving"]]
# Create request
request = {
"hashes": [], "onions": [], "port": fileserver_port, "need_types": need_types, "need_num": 20, "add": add_types
}
for site in sites:
if "onion" in add_types:
onion = self.connection_server.tor_manager.getOnion(site.address)
request["onions"].append(onion)
request["hashes"].append(hashlib.sha256(site.address).digest())
# Tracker can remove sites that we don't announce
if full_announce:
request["delete"] = True
# Sent request to tracker
tracker = connection_pool.get(tracker_address) # Re-use tracker connection if possible
if not tracker:
tracker_ip, tracker_port = tracker_address.split(":")
tracker = Peer(tracker_ip, tracker_port, connection_server=self.connection_server)
connection_pool[tracker_address] = tracker
res = tracker.request("announce", request)
if not res or "peers" not in res:
self.log.debug("Announce to %s failed: %s" % (tracker_address, res))
if full_announce:
time_full_announced[tracker_address] = 0
return False
# Add peers from response to site
site_index = 0
for site_res in res["peers"]:
site = sites[site_index]
processPeerRes(site, site_res)
site_index += 1
# Check if we need to sign prove the onion addresses
if "onion_sign_this" in res:
self.log.debug("Signing %s for %s to add %s onions" % (res["onion_sign_this"], tracker_address, len(sites)))
request["onion_signs"] = {}
request["onion_sign_this"] = res["onion_sign_this"]
request["need_num"] = 0
for site in sites:
onion = self.connection_server.tor_manager.getOnion(site.address)
sign = CryptRsa.sign(res["onion_sign_this"], self.connection_server.tor_manager.getPrivatekey(onion))
request["onion_signs"][self.connection_server.tor_manager.getPublickey(onion)] = sign
res = tracker.request("announce", request)
if not res or "onion_sign_this" in res:
self.log.debug("Announce onion address to %s failed: %s" % (tracker_address, res))
if full_announce:
time_full_announced[tracker_address] = 0
return False
if full_announce:
tracker.remove() # Close connection, we don't need it in next 5 minute
return time.time() - s

View file

@ -1 +0,0 @@
import AnnounceZeroPlugin

View file

@ -1,53 +0,0 @@
from lib.pybitcointools import bitcoin as btctools
import hashlib
ecc_cache = {}
def encrypt(data, pubkey, ephemcurve=None, ciphername='aes-256-cbc'):
from lib import pyelliptic
curve, pubkey_x, pubkey_y, i = pyelliptic.ECC._decode_pubkey(pubkey)
if ephemcurve is None:
ephemcurve = curve
ephem = pyelliptic.ECC(curve=ephemcurve)
key = hashlib.sha512(ephem.raw_get_ecdh_key(pubkey_x, pubkey_y)).digest()
key_e, key_m = key[:32], key[32:]
pubkey = ephem.get_pubkey()
iv = pyelliptic.OpenSSL.rand(pyelliptic.OpenSSL.get_cipher(ciphername).get_blocksize())
ctx = pyelliptic.Cipher(key_e, iv, 1, ciphername)
ciphertext = iv + pubkey + ctx.ciphering(data)
mac = pyelliptic.hmac_sha256(key_m, ciphertext)
return key_e, ciphertext + mac
def split(encrypted):
iv = encrypted[0:16]
ciphertext = encrypted[16+70:-32]
return iv, ciphertext
def getEcc(privatekey=None):
from lib import pyelliptic
global eccs
if privatekey not in ecc_cache:
if privatekey:
publickey_bin = btctools.encode_pubkey(btctools.privtopub(privatekey), "bin")
publickey_openssl = toOpensslPublickey(publickey_bin)
privatekey_openssl = toOpensslPrivatekey(privatekey)
ecc_cache[privatekey] = pyelliptic.ECC(curve='secp256k1', privkey=privatekey_openssl, pubkey=publickey_openssl)
else:
ecc_cache[None] = pyelliptic.ECC()
return ecc_cache[privatekey]
def toOpensslPrivatekey(privatekey):
privatekey_bin = btctools.encode_privkey(privatekey, "bin")
return '\x02\xca\x00\x20' + privatekey_bin
def toOpensslPublickey(publickey):
publickey_bin = btctools.encode_pubkey(publickey, "bin")
publickey_bin = publickey_bin[1:]
publickey_openssl = '\x02\xca\x00 ' + publickey_bin[:32] + '\x00 ' + publickey_bin[32:]
return publickey_openssl

View file

@ -1,149 +0,0 @@
import base64
import os
from Plugin import PluginManager
from Crypt import CryptBitcoin
from lib.pybitcointools import bitcoin as btctools
import CryptMessage
@PluginManager.registerTo("UiWebsocket")
class UiWebsocketPlugin(object):
def encrypt(self, text, publickey):
encrypted = CryptMessage.encrypt(text, CryptMessage.toOpensslPublickey(publickey))
return encrypted
def decrypt(self, encrypted, privatekey):
back = CryptMessage.getEcc(privatekey).decrypt(encrypted)
return back.decode("utf8")
# - Actions -
# Returns user's public key unique to site
# Return: Public key
def actionUserPublickey(self, to, index=0):
publickey = self.user.getEncryptPublickey(self.site.address, index)
self.response(to, publickey)
# Encrypt a text using the publickey or user's sites unique publickey
# Return: Encrypted text using base64 encoding
def actionEciesEncrypt(self, to, text, publickey=0, return_aes_key=False):
if type(publickey) is int: # Encrypt using user's publickey
publickey = self.user.getEncryptPublickey(self.site.address, publickey)
aes_key, encrypted = self.encrypt(text.encode("utf8"), publickey.decode("base64"))
if return_aes_key:
self.response(to, [base64.b64encode(encrypted), base64.b64encode(aes_key)])
else:
self.response(to, base64.b64encode(encrypted))
# Decrypt a text using privatekey or the user's site unique private key
# Return: Decrypted text or list of decrypted texts
def actionEciesDecrypt(self, to, param, privatekey=0):
if type(privatekey) is int: # Decrypt using user's privatekey
privatekey = self.user.getEncryptPrivatekey(self.site.address, privatekey)
if type(param) == list:
encrypted_texts = param
else:
encrypted_texts = [param]
texts = [] # Decoded texts
for encrypted_text in encrypted_texts:
try:
text = self.decrypt(encrypted_text.decode("base64"), privatekey)
texts.append(text)
except Exception, err:
texts.append(None)
if type(param) == list:
self.response(to, texts)
else:
self.response(to, texts[0])
# Encrypt a text using AES
# Return: Iv, AES key, Encrypted text
def actionAesEncrypt(self, to, text, key=None, iv=None):
from lib import pyelliptic
if key:
key = key.decode("base64")
else:
key = os.urandom(32)
if iv: # Generate new AES key if not definied
iv = iv.decode("base64")
else:
iv = pyelliptic.Cipher.gen_IV('aes-256-cbc')
if text:
encrypted = pyelliptic.Cipher(key, iv, 1, ciphername='aes-256-cbc').ciphering(text.encode("utf8"))
else:
encrypted = ""
self.response(to, [base64.b64encode(key), base64.b64encode(iv), base64.b64encode(encrypted)])
# Decrypt a text using AES
# Return: Decrypted text
def actionAesDecrypt(self, to, *args):
from lib import pyelliptic
if len(args) == 3: # Single decrypt
encrypted_texts = [(args[0], args[1])]
keys = [args[2]]
else: # Batch decrypt
encrypted_texts, keys = args
texts = [] # Decoded texts
for iv, encrypted_text in encrypted_texts:
encrypted_text = encrypted_text.decode("base64")
iv = iv.decode("base64")
text = None
for key in keys:
ctx = pyelliptic.Cipher(key.decode("base64"), iv, 0, ciphername='aes-256-cbc')
try:
decrypted = ctx.ciphering(encrypted_text)
if decrypted and decrypted.decode("utf8"): # Valid text decoded
text = decrypted
except Exception, err:
pass
texts.append(text)
if len(args) == 3:
self.response(to, texts[0])
else:
self.response(to, texts)
@PluginManager.registerTo("User")
class UserPlugin(object):
def getEncryptPrivatekey(self, address, param_index=0):
assert param_index >= 0 and param_index <= 1000
site_data = self.getSiteData(address)
if site_data.get("cert"): # Different privatekey for different cert provider
index = param_index + self.getAddressAuthIndex(site_data["cert"])
else:
index = param_index
if "encrypt_privatekey_%s" % index not in site_data:
address_index = self.getAddressAuthIndex(address)
crypt_index = address_index + 1000 + index
site_data["encrypt_privatekey_%s" % index] = CryptBitcoin.hdPrivatekey(self.master_seed, crypt_index)
self.log.debug("New encrypt privatekey generated for %s:%s" % (address, index))
return site_data["encrypt_privatekey_%s" % index]
def getEncryptPublickey(self, address, param_index=0):
assert param_index >= 0 and param_index <= 1000
site_data = self.getSiteData(address)
if site_data.get("cert"): # Different privatekey for different cert provider
index = param_index + self.getAddressAuthIndex(site_data["cert"])
else:
index = param_index
if "encrypt_publickey_%s" % index not in site_data:
privatekey = self.getEncryptPrivatekey(address, param_index)
publickey = btctools.encode_pubkey(btctools.privtopub(privatekey), "bin_compressed")
site_data["encrypt_publickey_%s" % index] = base64.b64encode(publickey)
return site_data["encrypt_publickey_%s" % index]

View file

@ -1,106 +0,0 @@
import pytest
from CryptMessage import CryptMessage
@pytest.mark.usefixtures("resetSettings")
class TestCrypt:
def testPublickey(self, ui_websocket):
pub = ui_websocket.testAction("UserPublickey", 0)
assert len(pub) == 44 # Compressed, b64 encoded publickey
# Different pubkey for specificed index
assert ui_websocket.testAction("UserPublickey", 1) != ui_websocket.testAction("UserPublickey", 0)
# Same publickey for same index
assert ui_websocket.testAction("UserPublickey", 2) == ui_websocket.testAction("UserPublickey", 2)
# Different publickey for different cert
pub1 = ui_websocket.testAction("UserPublickey", 0)
site_data = ui_websocket.user.getSiteData(ui_websocket.site.address)
site_data["cert"] = "zeroid.bit"
pub2 = ui_websocket.testAction("UserPublickey", 0)
assert pub1 != pub2
def testEcies(self, ui_websocket):
ui_websocket.actionUserPublickey(0, 0)
pub = ui_websocket.ws.result
ui_websocket.actionEciesEncrypt(0, "hello", pub)
encrypted = ui_websocket.ws.result
assert len(encrypted) == 180
# Don't allow decrypt using other privatekey index
ui_websocket.actionEciesDecrypt(0, encrypted, 123)
decrypted = ui_websocket.ws.result
assert decrypted != "hello"
# Decrypt using correct privatekey
ui_websocket.actionEciesDecrypt(0, encrypted)
decrypted = ui_websocket.ws.result
assert decrypted == "hello"
# Decrypt batch
ui_websocket.actionEciesDecrypt(0, [encrypted, "baad", encrypted])
decrypted = ui_websocket.ws.result
assert decrypted == ["hello", None, "hello"]
def testEciesUtf8(self, ui_websocket):
# Utf8 test
utf8_text = u'\xc1rv\xedzt\xfbr\xf5t\xfck\xf6rf\xfar\xf3g\xe9p'
ui_websocket.actionEciesEncrypt(0, utf8_text)
encrypted = ui_websocket.ws.result
ui_websocket.actionEciesDecrypt(0, encrypted)
assert ui_websocket.ws.result == utf8_text
def testEciesAes(self, ui_websocket):
ui_websocket.actionEciesEncrypt(0, "hello", return_aes_key=True)
ecies_encrypted, aes_key = ui_websocket.ws.result
# Decrypt using Ecies
ui_websocket.actionEciesDecrypt(0, ecies_encrypted)
assert ui_websocket.ws.result == "hello"
# Decrypt using AES
aes_iv, aes_encrypted = CryptMessage.split(ecies_encrypted.decode("base64"))
ui_websocket.actionAesDecrypt(0, aes_iv.encode("base64"), aes_encrypted.encode("base64"), aes_key)
assert ui_websocket.ws.result == "hello"
def testAes(self, ui_websocket):
ui_websocket.actionAesEncrypt(0, "hello")
key, iv, encrypted = ui_websocket.ws.result
assert len(key) == 44
assert len(iv) == 24
assert len(encrypted) == 24
# Single decrypt
ui_websocket.actionAesDecrypt(0, iv, encrypted, key)
assert ui_websocket.ws.result == "hello"
# Batch decrypt
ui_websocket.actionAesEncrypt(0, "hello")
key2, iv2, encrypted2 = ui_websocket.ws.result
assert [key, iv, encrypted] != [key2, iv2, encrypted2]
# 2 correct key
ui_websocket.actionAesDecrypt(0, [[iv, encrypted], [iv, encrypted], [iv, "baad"], [iv2, encrypted2]], [key])
assert ui_websocket.ws.result == ["hello", "hello", None, None]
# 3 key
ui_websocket.actionAesDecrypt(0, [[iv, encrypted], [iv, encrypted], [iv, "baad"], [iv2, encrypted2]], [key, key2])
assert ui_websocket.ws.result == ["hello", "hello", None, "hello"]
def testAesUtf8(self, ui_websocket):
utf8_text = u'\xc1rv\xedzt\xfbr\xf5t\xfck\xf6rf\xfar\xf3g\xe9'
ui_websocket.actionAesEncrypt(0, utf8_text)
key, iv, encrypted = ui_websocket.ws.result
ui_websocket.actionAesDecrypt(0, iv, encrypted, key)
assert ui_websocket.ws.result == utf8_text

View file

@ -1 +0,0 @@
from src.Test.conftest import *

View file

@ -1,5 +0,0 @@
[pytest]
python_files = Test*.py
addopts = -rsxX -v --durations=6
markers =
webtest: mark a test as a webtest.

View file

@ -1 +0,0 @@
import CryptMessagePlugin

View file

@ -1,487 +0,0 @@
import re
import os
import cgi
import sys
import math
import time
try:
import cStringIO as StringIO
except:
import StringIO
from Config import config
from Plugin import PluginManager
from Debug import Debug
plugin_dir = "plugins/Sidebar"
media_dir = plugin_dir + "/media"
sys.path.append(plugin_dir) # To able to load geoip lib
loc_cache = {}
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
# Inject our resources to end of original file streams
def actionUiMedia(self, path):
if path == "/uimedia/all.js" or path == "/uimedia/all.css":
# First yield the original file and header
body_generator = super(UiRequestPlugin, self).actionUiMedia(path)
for part in body_generator:
yield part
# Append our media file to the end
ext = re.match(".*(js|css)$", path).group(1)
plugin_media_file = "%s/all.%s" % (media_dir, ext)
if config.debug:
# If debugging merge *.css to all.css and *.js to all.js
from Debug import DebugMedia
DebugMedia.merge(plugin_media_file)
for part in self.actionFile(plugin_media_file, send_header=False):
yield part
elif path.startswith("/uimedia/globe/"): # Serve WebGL globe files
file_name = re.match(".*/(.*)", path).group(1)
plugin_media_file = "%s-globe/%s" % (media_dir, file_name)
if config.debug and path.endswith("all.js"):
# If debugging merge *.css to all.css and *.js to all.js
from Debug import DebugMedia
DebugMedia.merge(plugin_media_file)
for part in self.actionFile(plugin_media_file):
yield part
else:
for part in super(UiRequestPlugin, self).actionUiMedia(path):
yield part
@PluginManager.registerTo("UiWebsocket")
class UiWebsocketPlugin(object):
def sidebarRenderPeerStats(self, body, site):
connected = len([peer for peer in site.peers.values() if peer.connection and peer.connection.connected])
connectable = len([peer_id for peer_id in site.peers.keys() if not peer_id.endswith(":0")])
onion = len([peer_id for peer_id in site.peers.keys() if ".onion" in peer_id])
peers_total = len(site.peers)
if peers_total:
percent_connected = float(connected) / peers_total
percent_connectable = float(connectable) / peers_total
else:
percent_connectable = percent_connected = 0
body.append("""
<li>
<label>Peers</label>
<ul class='graph'>
<li style='width: 100%' class='total back-black' title="Total peers"></li>
<li style='width: {percent_connectable:.0%}' class='connectable back-blue' title='Connectable peers'></li>
<li style='width: {percent_connected:.0%}' class='connected back-green' title='Connected peers'></li>
</ul>
<ul class='graph-legend'>
<li class='color-green'><span>connected:</span><b>{connected}</b></li>
<li class='color-blue'><span>Connectable:</span><b>{connectable}</b></li>
<li class='color-purple'><span>Onion:</span><b>{onion}</b></li>
<li class='color-black'><span>Total:</span><b>{peers_total}</b></li>
</ul>
</li>
""".format(**locals()))
def sidebarRenderTransferStats(self, body, site):
recv = float(site.settings.get("bytes_recv", 0)) / 1024 / 1024
sent = float(site.settings.get("bytes_sent", 0)) / 1024 / 1024
transfer_total = recv + sent
if transfer_total:
percent_recv = recv / transfer_total
percent_sent = sent / transfer_total
else:
percent_recv = 0.5
percent_sent = 0.5
body.append("""
<li>
<label>Data transfer</label>
<ul class='graph graph-stacked'>
<li style='width: {percent_recv:.0%}' class='received back-yellow' title="Received bytes"></li>
<li style='width: {percent_sent:.0%}' class='sent back-green' title="Sent bytes"></li>
</ul>
<ul class='graph-legend'>
<li class='color-yellow'><span>Received:</span><b>{recv:.2f}MB</b></li>
<li class='color-green'<span>Sent:</span><b>{sent:.2f}MB</b></li>
</ul>
</li>
""".format(**locals()))
def sidebarRenderFileStats(self, body, site):
body.append("<li><label>Files</label><ul class='graph graph-stacked'>")
extensions = (
("html", "yellow"),
("css", "orange"),
("js", "purple"),
("image", "green"),
("json", "blue"),
("other", "white"),
("total", "black")
)
# Collect stats
size_filetypes = {}
size_total = 0
for content in site.content_manager.contents.values():
if "files" not in content:
continue
for file_name, file_details in content["files"].items():
size_total += file_details["size"]
ext = file_name.split(".")[-1]
size_filetypes[ext] = size_filetypes.get(ext, 0) + file_details["size"]
size_other = size_total
# Bar
for extension, color in extensions:
if extension == "total":
continue
if extension == "other":
size = size_other
elif extension == "image":
size = size_filetypes.get("jpg", 0) + size_filetypes.get("png", 0) + size_filetypes.get("gif", 0)
size_other -= size
else:
size = size_filetypes.get(extension, 0)
size_other -= size
if size_total == 0:
percent = 0
else:
percent = 100 * (float(size) / size_total)
body.append(u"<li style='width: %.2f%%' class='%s back-%s' title='%s'></li>" % (percent, extension, color, extension))
# Legend
body.append("</ul><ul class='graph-legend'>")
for extension, color in extensions:
if extension == "other":
size = size_other
elif extension == "image":
size = size_filetypes.get("jpg", 0) + size_filetypes.get("png", 0) + size_filetypes.get("gif", 0)
elif extension == "total":
size = size_total
else:
size = size_filetypes.get(extension, 0)
if extension == "js":
title = "javascript"
else:
title = extension
if size > 1024 * 1024 * 10: # Format as mB is more than 10mB
size_formatted = "%.0fMB" % (size / 1024 / 1024)
else:
size_formatted = "%.0fkB" % (size / 1024)
body.append(u"<li class='color-%s'><span>%s:</span><b>%s</b></li>" % (color, title, size_formatted))
body.append("</ul></li>")
def getFreeSpace(self):
free_space = 0
if "statvfs" in dir(os): # Unix
statvfs = os.statvfs(config.data_dir)
free_space = statvfs.f_frsize * statvfs.f_bavail
else: # Windows
try:
import ctypes
free_space_pointer = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(
ctypes.c_wchar_p(config.data_dir), None, None, ctypes.pointer(free_space_pointer)
)
free_space = free_space_pointer.value
except Exception, err:
self.log.debug("GetFreeSpace error: %s" % err)
return free_space
def sidebarRenderSizeLimit(self, body, site):
free_space = self.getFreeSpace() / 1024 / 1024
size = float(site.settings["size"]) / 1024 / 1024
size_limit = site.getSizeLimit()
percent_used = size / size_limit
body.append("""
<li>
<label>Size limit <small>(limit used: {percent_used:.0%}, free space: {free_space:,d}MB)</small></label>
<input type='text' class='text text-num' value='{size_limit}' id='input-sitelimit'/><span class='text-post'>MB</span>
<a href='#Set' class='button' id='button-sitelimit'>Set</a>
</li>
""".format(**locals()))
def sidebarRenderOptionalFileStats(self, body, site):
size_total = 0.0
size_downloaded = 0.0
for content in site.content_manager.contents.values():
if "files_optional" not in content:
continue
for file_name, file_details in content["files_optional"].items():
size_total += file_details["size"]
if site.content_manager.hashfield.hasHash(file_details["sha512"]):
size_downloaded += file_details["size"]
if not size_total:
return False
percent_downloaded = size_downloaded / size_total
size_formatted_total = size_total / 1024 / 1024
size_formatted_downloaded = size_downloaded / 1024 / 1024
body.append("""
<li>
<label>Optional files</label>
<ul class='graph'>
<li style='width: 100%' class='total back-black' title="Total size"></li>
<li style='width: {percent_downloaded:.0%}' class='connected back-green' title='Downloaded files'></li>
</ul>
<ul class='graph-legend'>
<li class='color-green'><span>Downloaded:</span><b>{size_formatted_downloaded:.2f}MB</b></li>
<li class='color-black'><span>Total:</span><b>{size_formatted_total:.2f}MB</b></li>
</ul>
</li>
""".format(**locals()))
return True
def sidebarRenderOptionalFileSettings(self, body, site):
if self.site.settings.get("autodownloadoptional"):
checked = "checked='checked'"
else:
checked = ""
body.append("""
<li>
<label>Download and help distribute all files</label>
<input type="checkbox" class="checkbox" id="checkbox-autodownloadoptional" {checked}/><div class="checkbox-skin"></div>
</li>
""".format(**locals()))
def sidebarRenderDbOptions(self, body, site):
if not site.storage.db:
return False
inner_path = site.storage.getInnerPath(site.storage.db.db_path)
size = float(site.storage.getSize(inner_path)) / 1024
body.append(u"""
<li>
<label>Database <small>({size:.2f}kB)</small></label>
<input type='text' class='text disabled' value='{inner_path}' disabled='disabled'/>
<a href='#Reindex' class='button' style='display: none'>Reindex</a>
</li>
""".format(**locals()))
def sidebarRenderIdentity(self, body, site):
auth_address = self.user.getAuthAddress(self.site.address)
body.append("""
<li>
<label>Identity address</label>
<span class='input text disabled'>{auth_address}</span>
<a href='#Change' class='button' id='button-identity'>Change</a>
</li>
""".format(**locals()))
def sidebarRenderOwnedCheckbox(self, body, site):
if self.site.settings["own"]:
checked = "checked='checked'"
else:
checked = ""
body.append("""
<h2 class='owned-title'>This is my site</h2>
<input type="checkbox" class="checkbox" id="checkbox-owned" {checked}/><div class="checkbox-skin"></div>
""".format(**locals()))
def sidebarRenderOwnSettings(self, body, site):
title = cgi.escape(site.content_manager.contents["content.json"]["title"], True)
description = cgi.escape(site.content_manager.contents["content.json"]["description"], True)
privatekey = cgi.escape(self.user.getSiteData(site.address, create=False).get("privatekey", ""))
body.append(u"""
<li>
<label for='settings-title'>Site title</label>
<input type='text' class='text' value="{title}" id='settings-title'/>
</li>
<li>
<label for='settings-description'>Site description</label>
<input type='text' class='text' value="{description}" id='settings-description'/>
</li>
<li style='display: none'>
<label>Private key</label>
<input type='text' class='text long' value="{privatekey}" placeholder='[Ask on signing]'/>
</li>
<li>
<a href='#Save' class='button' id='button-settings'>Save site settings</a>
</li>
""".format(**locals()))
def sidebarRenderContents(self, body, site):
body.append("""
<li>
<label>Content publishing</label>
<select id='select-contents'>
""")
for inner_path in sorted(site.content_manager.contents.keys()):
body.append(u"<option>%s</option>" % cgi.escape(inner_path, True))
body.append("""
</select>
<span class='select-down'>&rsaquo;</span>
<a href='#Sign' class='button' id='button-sign'>Sign</a>
<a href='#Publish' class='button' id='button-publish'>Publish</a>
</li>
""")
def actionSidebarGetHtmlTag(self, to):
site = self.site
body = []
body.append("<div>")
body.append("<h1>%s</h1>" % site.content_manager.contents["content.json"]["title"])
body.append("<div class='globe loading'></div>")
body.append("<ul class='fields'>")
self.sidebarRenderPeerStats(body, site)
self.sidebarRenderTransferStats(body, site)
self.sidebarRenderFileStats(body, site)
self.sidebarRenderSizeLimit(body, site)
has_optional = self.sidebarRenderOptionalFileStats(body, site)
if has_optional:
self.sidebarRenderOptionalFileSettings(body, site)
self.sidebarRenderDbOptions(body, site)
self.sidebarRenderIdentity(body, site)
self.sidebarRenderOwnedCheckbox(body, site)
body.append("<div class='settings-owned'>")
self.sidebarRenderOwnSettings(body, site)
self.sidebarRenderContents(body, site)
body.append("</div>")
body.append("</ul>")
body.append("</div>")
self.response(to, "".join(body))
def downloadGeoLiteDb(self, db_path):
import urllib
import gzip
import shutil
from util import helper
self.log.info("Downloading GeoLite2 City database...")
self.cmd("notification", ["geolite-info", "Downloading GeoLite2 City database (one time only, ~15MB)...", 0])
db_urls = [
"http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz",
"https://raw.githubusercontent.com/texnikru/GeoLite2-Database/master/GeoLite2-City.mmdb.gz"
]
for db_url in db_urls:
try:
# Download
response = helper.httpRequest(db_url)
data = StringIO.StringIO()
while True:
buff = response.read(1024 * 512)
if not buff:
break
data.write(buff)
self.log.info("GeoLite2 City database downloaded (%s bytes), unpacking..." % data.tell())
data.seek(0)
# Unpack
with gzip.GzipFile(fileobj=data) as gzip_file:
shutil.copyfileobj(gzip_file, open(db_path, "wb"))
self.cmd("notification", ["geolite-done", "GeoLite2 City database downloaded!", 5000])
time.sleep(2) # Wait for notify animation
return True
except Exception, err:
self.log.error("Error downloading %s: %s" % (db_url, err))
pass
self.cmd("notification", [
"geolite-error",
"GeoLite2 City database download error: %s!<br>Please download and unpack to data dir:<br>%s" % (err, db_urls[0]),
0
])
def actionSidebarGetPeers(self, to):
permissions = self.getPermissions(to)
if "ADMIN" not in permissions:
return self.response(to, "You don't have permission to run this command")
try:
import maxminddb
db_path = config.data_dir + '/GeoLite2-City.mmdb'
if not os.path.isfile(db_path) or os.path.getsize(db_path) == 0:
if not self.downloadGeoLiteDb(db_path):
return False
geodb = maxminddb.open_database(db_path)
peers = self.site.peers.values()
# Find avg ping
ping_times = [
peer.connection.last_ping_delay
for peer in peers
if peer.connection and peer.connection.last_ping_delay and peer.connection.last_ping_delay
]
if ping_times:
ping_avg = sum(ping_times) / float(len(ping_times))
else:
ping_avg = 0
# Place bars
globe_data = []
placed = {} # Already placed bars here
for peer in peers:
# Height of bar
if peer.connection and peer.connection.last_ping_delay:
ping = min(0.20, math.log(1 + peer.connection.last_ping_delay / ping_avg, 300))
else:
ping = -0.03
# Query and cache location
if peer.ip in loc_cache:
loc = loc_cache[peer.ip]
else:
try:
loc = geodb.get(peer.ip)
except:
loc = None
loc_cache[peer.ip] = loc
if not loc or "location" not in loc:
continue
# Create position array
lat, lon = (loc["location"]["latitude"], loc["location"]["longitude"])
latlon = "%s,%s" % (lat, lon)
if latlon in placed: # Dont place more than 1 bar to same place, fake repos using ip address last two part
lat += float(128 - int(peer.ip.split(".")[-2])) / 50
lon += float(128 - int(peer.ip.split(".")[-1])) / 50
latlon = "%s,%s" % (lat, lon)
placed[latlon] = True
globe_data += (lat, lon, ping)
# Append myself
loc = geodb.get(config.ip_external)
if loc:
lat, lon = (loc["location"]["latitude"], loc["location"]["longitude"])
globe_data += (lat, lon, -0.135)
self.response(to, globe_data)
except Exception, err:
self.log.debug("sidebarGetPeers error: %s" % Debug.formatException(err))
self.response(to, {"error": err})
def actionSiteSetOwned(self, to, owned):
permissions = self.getPermissions(to)
if "ADMIN" not in permissions:
return self.response(to, "You don't have permission to run this command")
self.site.settings["own"] = bool(owned)
def actionSiteSetAutodownloadoptional(self, to, owned):
permissions = self.getPermissions(to)
if "ADMIN" not in permissions:
return self.response(to, "You don't have permission to run this command")
self.site.settings["autodownloadoptional"] = bool(owned)
self.site.update()
self.site.worker_manager.removeGoodFileTasks()

View file

@ -1 +0,0 @@
import SidebarPlugin

View file

@ -1,46 +0,0 @@
# pylint:disable=C0111
import os
import maxminddb.reader
try:
import maxminddb.extension
except ImportError:
maxminddb.extension = None
from maxminddb.const import (MODE_AUTO, MODE_MMAP, MODE_MMAP_EXT, MODE_FILE,
MODE_MEMORY)
from maxminddb.decoder import InvalidDatabaseError
def open_database(database, mode=MODE_AUTO):
"""Open a Maxmind DB database
Arguments:
database -- A path to a valid MaxMind DB file such as a GeoIP2
database file.
mode -- mode to open the database with. Valid mode are:
* MODE_MMAP_EXT - use the C extension with memory map.
* MODE_MMAP - read from memory map. Pure Python.
* MODE_FILE - read database as standard file. Pure Python.
* MODE_MEMORY - load database into memory. Pure Python.
* MODE_AUTO - tries MODE_MMAP_EXT, MODE_MMAP, MODE_FILE in that
order. Default mode.
"""
if (mode == MODE_AUTO and maxminddb.extension and
hasattr(maxminddb.extension, 'Reader')) or mode == MODE_MMAP_EXT:
return maxminddb.extension.Reader(database)
elif mode in (MODE_AUTO, MODE_MMAP, MODE_FILE, MODE_MEMORY):
return maxminddb.reader.Reader(database, mode)
raise ValueError('Unsupported open mode: {0}'.format(mode))
def Reader(database): # pylint: disable=invalid-name
"""This exists for backwards compatibility. Use open_database instead"""
return open_database(database)
__title__ = 'maxminddb'
__version__ = '1.2.0'
__author__ = 'Gregory Oschwald'
__license__ = 'Apache License, Version 2.0'
__copyright__ = 'Copyright 2014 Maxmind, Inc.'

View file

@ -1,28 +0,0 @@
import sys
# pylint: skip-file
if sys.version_info[0] == 2:
import ipaddr as ipaddress # pylint:disable=F0401
ipaddress.ip_address = ipaddress.IPAddress
int_from_byte = ord
FileNotFoundError = IOError
def int_from_bytes(b):
if b:
return int(b.encode("hex"), 16)
return 0
byte_from_int = chr
else:
import ipaddress # pylint:disable=F0401
int_from_byte = lambda x: x
FileNotFoundError = FileNotFoundError
int_from_bytes = lambda x: int.from_bytes(x, 'big')
byte_from_int = lambda x: bytes([x])

View file

@ -1,7 +0,0 @@
"""Constants used in the API"""
MODE_AUTO = 0
MODE_MMAP_EXT = 1
MODE_MMAP = 2
MODE_FILE = 4
MODE_MEMORY = 8

View file

@ -1,173 +0,0 @@
"""
maxminddb.decoder
~~~~~~~~~~~~~~~~~
This package contains code for decoding the MaxMind DB data section.
"""
from __future__ import unicode_literals
import struct
from maxminddb.compat import byte_from_int, int_from_bytes
from maxminddb.errors import InvalidDatabaseError
class Decoder(object): # pylint: disable=too-few-public-methods
"""Decoder for the data section of the MaxMind DB"""
def __init__(self, database_buffer, pointer_base=0, pointer_test=False):
"""Created a Decoder for a MaxMind DB
Arguments:
database_buffer -- an mmap'd MaxMind DB file.
pointer_base -- the base number to use when decoding a pointer
pointer_test -- used for internal unit testing of pointer code
"""
self._pointer_test = pointer_test
self._buffer = database_buffer
self._pointer_base = pointer_base
def _decode_array(self, size, offset):
array = []
for _ in range(size):
(value, offset) = self.decode(offset)
array.append(value)
return array, offset
def _decode_boolean(self, size, offset):
return size != 0, offset
def _decode_bytes(self, size, offset):
new_offset = offset + size
return self._buffer[offset:new_offset], new_offset
# pylint: disable=no-self-argument
# |-> I am open to better ways of doing this as long as it doesn't involve
# lots of code duplication.
def _decode_packed_type(type_code, type_size, pad=False):
# pylint: disable=protected-access, missing-docstring
def unpack_type(self, size, offset):
if not pad:
self._verify_size(size, type_size)
new_offset = offset + type_size
packed_bytes = self._buffer[offset:new_offset]
if pad:
packed_bytes = packed_bytes.rjust(type_size, b'\x00')
(value,) = struct.unpack(type_code, packed_bytes)
return value, new_offset
return unpack_type
def _decode_map(self, size, offset):
container = {}
for _ in range(size):
(key, offset) = self.decode(offset)
(value, offset) = self.decode(offset)
container[key] = value
return container, offset
_pointer_value_offset = {
1: 0,
2: 2048,
3: 526336,
4: 0,
}
def _decode_pointer(self, size, offset):
pointer_size = ((size >> 3) & 0x3) + 1
new_offset = offset + pointer_size
pointer_bytes = self._buffer[offset:new_offset]
packed = pointer_bytes if pointer_size == 4 else struct.pack(
b'!c', byte_from_int(size & 0x7)) + pointer_bytes
unpacked = int_from_bytes(packed)
pointer = unpacked + self._pointer_base + \
self._pointer_value_offset[pointer_size]
if self._pointer_test:
return pointer, new_offset
(value, _) = self.decode(pointer)
return value, new_offset
def _decode_uint(self, size, offset):
new_offset = offset + size
uint_bytes = self._buffer[offset:new_offset]
return int_from_bytes(uint_bytes), new_offset
def _decode_utf8_string(self, size, offset):
new_offset = offset + size
return self._buffer[offset:new_offset].decode('utf-8'), new_offset
_type_decoder = {
1: _decode_pointer,
2: _decode_utf8_string,
3: _decode_packed_type(b'!d', 8), # double,
4: _decode_bytes,
5: _decode_uint, # uint16
6: _decode_uint, # uint32
7: _decode_map,
8: _decode_packed_type(b'!i', 4, pad=True), # int32
9: _decode_uint, # uint64
10: _decode_uint, # uint128
11: _decode_array,
14: _decode_boolean,
15: _decode_packed_type(b'!f', 4), # float,
}
def decode(self, offset):
"""Decode a section of the data section starting at offset
Arguments:
offset -- the location of the data structure to decode
"""
new_offset = offset + 1
(ctrl_byte,) = struct.unpack(b'!B', self._buffer[offset:new_offset])
type_num = ctrl_byte >> 5
# Extended type
if not type_num:
(type_num, new_offset) = self._read_extended(new_offset)
if not type_num in self._type_decoder:
raise InvalidDatabaseError('Unexpected type number ({type}) '
'encountered'.format(type=type_num))
(size, new_offset) = self._size_from_ctrl_byte(
ctrl_byte, new_offset, type_num)
return self._type_decoder[type_num](self, size, new_offset)
def _read_extended(self, offset):
(next_byte,) = struct.unpack(b'!B', self._buffer[offset:offset + 1])
type_num = next_byte + 7
if type_num < 7:
raise InvalidDatabaseError(
'Something went horribly wrong in the decoder. An '
'extended type resolved to a type number < 8 '
'({type})'.format(type=type_num))
return type_num, offset + 1
def _verify_size(self, expected, actual):
if expected != actual:
raise InvalidDatabaseError(
'The MaxMind DB file\'s data section contains bad data '
'(unknown data type or corrupt data)'
)
def _size_from_ctrl_byte(self, ctrl_byte, offset, type_num):
size = ctrl_byte & 0x1f
if type_num == 1:
return size, offset
bytes_to_read = 0 if size < 29 else size - 28
new_offset = offset + bytes_to_read
size_bytes = self._buffer[offset:new_offset]
# Using unpack rather than int_from_bytes as it is about 200 lookups
# per second faster here.
if size == 29:
size = 29 + struct.unpack(b'!B', size_bytes)[0]
elif size == 30:
size = 285 + struct.unpack(b'!H', size_bytes)[0]
elif size > 30:
size = struct.unpack(
b'!I', size_bytes.rjust(4, b'\x00'))[0] + 65821
return size, new_offset

View file

@ -1,11 +0,0 @@
"""
maxminddb.errors
~~~~~~~~~~~~~~~~
This module contains custom errors for the MaxMind DB reader
"""
class InvalidDatabaseError(RuntimeError):
"""This error is thrown when unexpected data is found in the database."""

View file

@ -1,570 +0,0 @@
#include <Python.h>
#include <maxminddb.h>
#include "structmember.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
static PyTypeObject Reader_Type;
static PyTypeObject Metadata_Type;
static PyObject *MaxMindDB_error;
typedef struct {
PyObject_HEAD /* no semicolon */
MMDB_s *mmdb;
} Reader_obj;
typedef struct {
PyObject_HEAD /* no semicolon */
PyObject *binary_format_major_version;
PyObject *binary_format_minor_version;
PyObject *build_epoch;
PyObject *database_type;
PyObject *description;
PyObject *ip_version;
PyObject *languages;
PyObject *node_count;
PyObject *record_size;
} Metadata_obj;
static PyObject *from_entry_data_list(MMDB_entry_data_list_s **entry_data_list);
static PyObject *from_map(MMDB_entry_data_list_s **entry_data_list);
static PyObject *from_array(MMDB_entry_data_list_s **entry_data_list);
static PyObject *from_uint128(const MMDB_entry_data_list_s *entry_data_list);
#if PY_MAJOR_VERSION >= 3
#define MOD_INIT(name) PyMODINIT_FUNC PyInit_ ## name(void)
#define RETURN_MOD_INIT(m) return (m)
#define FILE_NOT_FOUND_ERROR PyExc_FileNotFoundError
#else
#define MOD_INIT(name) PyMODINIT_FUNC init ## name(void)
#define RETURN_MOD_INIT(m) return
#define PyInt_FromLong PyLong_FromLong
#define FILE_NOT_FOUND_ERROR PyExc_IOError
#endif
#ifdef __GNUC__
# define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
# define UNUSED(x) UNUSED_ ## x
#endif
static int Reader_init(PyObject *self, PyObject *args, PyObject *kwds)
{
char *filename;
int mode = 0;
static char *kwlist[] = {"database", "mode", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|i", kwlist, &filename, &mode)) {
return -1;
}
if (mode != 0 && mode != 1) {
PyErr_Format(PyExc_ValueError, "Unsupported open mode (%i). Only "
"MODE_AUTO and MODE_MMAP_EXT are supported by this extension.",
mode);
return -1;
}
if (0 != access(filename, R_OK)) {
PyErr_Format(FILE_NOT_FOUND_ERROR,
"No such file or directory: '%s'",
filename);
return -1;
}
MMDB_s *mmdb = (MMDB_s *)malloc(sizeof(MMDB_s));
if (NULL == mmdb) {
PyErr_NoMemory();
return -1;
}
Reader_obj *mmdb_obj = (Reader_obj *)self;
if (!mmdb_obj) {
free(mmdb);
PyErr_NoMemory();
return -1;
}
uint16_t status = MMDB_open(filename, MMDB_MODE_MMAP, mmdb);
if (MMDB_SUCCESS != status) {
free(mmdb);
PyErr_Format(
MaxMindDB_error,
"Error opening database file (%s). Is this a valid MaxMind DB file?",
filename
);
return -1;
}
mmdb_obj->mmdb = mmdb;
return 0;
}
static PyObject *Reader_get(PyObject *self, PyObject *args)
{
char *ip_address = NULL;
Reader_obj *mmdb_obj = (Reader_obj *)self;
if (!PyArg_ParseTuple(args, "s", &ip_address)) {
return NULL;
}
MMDB_s *mmdb = mmdb_obj->mmdb;
if (NULL == mmdb) {
PyErr_SetString(PyExc_ValueError,
"Attempt to read from a closed MaxMind DB.");
return NULL;
}
int gai_error = 0;
int mmdb_error = MMDB_SUCCESS;
MMDB_lookup_result_s result =
MMDB_lookup_string(mmdb, ip_address, &gai_error,
&mmdb_error);
if (0 != gai_error) {
PyErr_Format(PyExc_ValueError,
"'%s' does not appear to be an IPv4 or IPv6 address.",
ip_address);
return NULL;
}
if (MMDB_SUCCESS != mmdb_error) {
PyObject *exception;
if (MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR == mmdb_error) {
exception = PyExc_ValueError;
} else {
exception = MaxMindDB_error;
}
PyErr_Format(exception, "Error looking up %s. %s",
ip_address, MMDB_strerror(mmdb_error));
return NULL;
}
if (!result.found_entry) {
Py_RETURN_NONE;
}
MMDB_entry_data_list_s *entry_data_list = NULL;
int status = MMDB_get_entry_data_list(&result.entry, &entry_data_list);
if (MMDB_SUCCESS != status) {
PyErr_Format(MaxMindDB_error,
"Error while looking up data for %s. %s",
ip_address, MMDB_strerror(status));
MMDB_free_entry_data_list(entry_data_list);
return NULL;
}
MMDB_entry_data_list_s *original_entry_data_list = entry_data_list;
PyObject *py_obj = from_entry_data_list(&entry_data_list);
MMDB_free_entry_data_list(original_entry_data_list);
return py_obj;
}
static PyObject *Reader_metadata(PyObject *self, PyObject *UNUSED(args))
{
Reader_obj *mmdb_obj = (Reader_obj *)self;
if (NULL == mmdb_obj->mmdb) {
PyErr_SetString(PyExc_IOError,
"Attempt to read from a closed MaxMind DB.");
return NULL;
}
MMDB_entry_data_list_s *entry_data_list;
MMDB_get_metadata_as_entry_data_list(mmdb_obj->mmdb, &entry_data_list);
MMDB_entry_data_list_s *original_entry_data_list = entry_data_list;
PyObject *metadata_dict = from_entry_data_list(&entry_data_list);
MMDB_free_entry_data_list(original_entry_data_list);
if (NULL == metadata_dict || !PyDict_Check(metadata_dict)) {
PyErr_SetString(MaxMindDB_error,
"Error decoding metadata.");
return NULL;
}
PyObject *args = PyTuple_New(0);
if (NULL == args) {
Py_DECREF(metadata_dict);
return NULL;
}
PyObject *metadata = PyObject_Call((PyObject *)&Metadata_Type, args,
metadata_dict);
Py_DECREF(metadata_dict);
return metadata;
}
static PyObject *Reader_close(PyObject *self, PyObject *UNUSED(args))
{
Reader_obj *mmdb_obj = (Reader_obj *)self;
if (NULL != mmdb_obj->mmdb) {
MMDB_close(mmdb_obj->mmdb);
free(mmdb_obj->mmdb);
mmdb_obj->mmdb = NULL;
}
Py_RETURN_NONE;
}
static void Reader_dealloc(PyObject *self)
{
Reader_obj *obj = (Reader_obj *)self;
if (NULL != obj->mmdb) {
Reader_close(self, NULL);
}
PyObject_Del(self);
}
static int Metadata_init(PyObject *self, PyObject *args, PyObject *kwds)
{
PyObject
*binary_format_major_version,
*binary_format_minor_version,
*build_epoch,
*database_type,
*description,
*ip_version,
*languages,
*node_count,
*record_size;
static char *kwlist[] = {
"binary_format_major_version",
"binary_format_minor_version",
"build_epoch",
"database_type",
"description",
"ip_version",
"languages",
"node_count",
"record_size",
NULL
};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOOOOOOO", kwlist,
&binary_format_major_version,
&binary_format_minor_version,
&build_epoch,
&database_type,
&description,
&ip_version,
&languages,
&node_count,
&record_size)) {
return -1;
}
Metadata_obj *obj = (Metadata_obj *)self;
obj->binary_format_major_version = binary_format_major_version;
obj->binary_format_minor_version = binary_format_minor_version;
obj->build_epoch = build_epoch;
obj->database_type = database_type;
obj->description = description;
obj->ip_version = ip_version;
obj->languages = languages;
obj->node_count = node_count;
obj->record_size = record_size;
Py_INCREF(obj->binary_format_major_version);
Py_INCREF(obj->binary_format_minor_version);
Py_INCREF(obj->build_epoch);
Py_INCREF(obj->database_type);
Py_INCREF(obj->description);
Py_INCREF(obj->ip_version);
Py_INCREF(obj->languages);
Py_INCREF(obj->node_count);
Py_INCREF(obj->record_size);
return 0;
}
static void Metadata_dealloc(PyObject *self)
{
Metadata_obj *obj = (Metadata_obj *)self;
Py_DECREF(obj->binary_format_major_version);
Py_DECREF(obj->binary_format_minor_version);
Py_DECREF(obj->build_epoch);
Py_DECREF(obj->database_type);
Py_DECREF(obj->description);
Py_DECREF(obj->ip_version);
Py_DECREF(obj->languages);
Py_DECREF(obj->node_count);
Py_DECREF(obj->record_size);
PyObject_Del(self);
}
static PyObject *from_entry_data_list(MMDB_entry_data_list_s **entry_data_list)
{
if (NULL == entry_data_list || NULL == *entry_data_list) {
PyErr_SetString(
MaxMindDB_error,
"Error while looking up data. Your database may be corrupt or you have found a bug in libmaxminddb."
);
return NULL;
}
switch ((*entry_data_list)->entry_data.type) {
case MMDB_DATA_TYPE_MAP:
return from_map(entry_data_list);
case MMDB_DATA_TYPE_ARRAY:
return from_array(entry_data_list);
case MMDB_DATA_TYPE_UTF8_STRING:
return PyUnicode_FromStringAndSize(
(*entry_data_list)->entry_data.utf8_string,
(*entry_data_list)->entry_data.data_size
);
case MMDB_DATA_TYPE_BYTES:
return PyByteArray_FromStringAndSize(
(const char *)(*entry_data_list)->entry_data.bytes,
(Py_ssize_t)(*entry_data_list)->entry_data.data_size);
case MMDB_DATA_TYPE_DOUBLE:
return PyFloat_FromDouble((*entry_data_list)->entry_data.double_value);
case MMDB_DATA_TYPE_FLOAT:
return PyFloat_FromDouble((*entry_data_list)->entry_data.float_value);
case MMDB_DATA_TYPE_UINT16:
return PyLong_FromLong( (*entry_data_list)->entry_data.uint16);
case MMDB_DATA_TYPE_UINT32:
return PyLong_FromLong((*entry_data_list)->entry_data.uint32);
case MMDB_DATA_TYPE_BOOLEAN:
return PyBool_FromLong((*entry_data_list)->entry_data.boolean);
case MMDB_DATA_TYPE_UINT64:
return PyLong_FromUnsignedLongLong(
(*entry_data_list)->entry_data.uint64);
case MMDB_DATA_TYPE_UINT128:
return from_uint128(*entry_data_list);
case MMDB_DATA_TYPE_INT32:
return PyLong_FromLong((*entry_data_list)->entry_data.int32);
default:
PyErr_Format(MaxMindDB_error,
"Invalid data type arguments: %d",
(*entry_data_list)->entry_data.type);
return NULL;
}
return NULL;
}
static PyObject *from_map(MMDB_entry_data_list_s **entry_data_list)
{
PyObject *py_obj = PyDict_New();
if (NULL == py_obj) {
PyErr_NoMemory();
return NULL;
}
const uint32_t map_size = (*entry_data_list)->entry_data.data_size;
uint i;
// entry_data_list cannot start out NULL (see from_entry_data_list). We
// check it in the loop because it may become NULL.
// coverity[check_after_deref]
for (i = 0; i < map_size && entry_data_list; i++) {
*entry_data_list = (*entry_data_list)->next;
PyObject *key = PyUnicode_FromStringAndSize(
(char *)(*entry_data_list)->entry_data.utf8_string,
(*entry_data_list)->entry_data.data_size
);
*entry_data_list = (*entry_data_list)->next;
PyObject *value = from_entry_data_list(entry_data_list);
if (NULL == value) {
Py_DECREF(key);
Py_DECREF(py_obj);
return NULL;
}
PyDict_SetItem(py_obj, key, value);
Py_DECREF(value);
Py_DECREF(key);
}
return py_obj;
}
static PyObject *from_array(MMDB_entry_data_list_s **entry_data_list)
{
const uint32_t size = (*entry_data_list)->entry_data.data_size;
PyObject *py_obj = PyList_New(size);
if (NULL == py_obj) {
PyErr_NoMemory();
return NULL;
}
uint i;
// entry_data_list cannot start out NULL (see from_entry_data_list). We
// check it in the loop because it may become NULL.
// coverity[check_after_deref]
for (i = 0; i < size && entry_data_list; i++) {
*entry_data_list = (*entry_data_list)->next;
PyObject *value = from_entry_data_list(entry_data_list);
if (NULL == value) {
Py_DECREF(py_obj);
return NULL;
}
// PyList_SetItem 'steals' the reference
PyList_SetItem(py_obj, i, value);
}
return py_obj;
}
static PyObject *from_uint128(const MMDB_entry_data_list_s *entry_data_list)
{
uint64_t high = 0;
uint64_t low = 0;
#if MMDB_UINT128_IS_BYTE_ARRAY
int i;
for (i = 0; i < 8; i++) {
high = (high << 8) | entry_data_list->entry_data.uint128[i];
}
for (i = 8; i < 16; i++) {
low = (low << 8) | entry_data_list->entry_data.uint128[i];
}
#else
high = entry_data_list->entry_data.uint128 >> 64;
low = (uint64_t)entry_data_list->entry_data.uint128;
#endif
char *num_str = malloc(33);
if (NULL == num_str) {
PyErr_NoMemory();
return NULL;
}
snprintf(num_str, 33, "%016" PRIX64 "%016" PRIX64, high, low);
PyObject *py_obj = PyLong_FromString(num_str, NULL, 16);
free(num_str);
return py_obj;
}
static PyMethodDef Reader_methods[] = {
{ "get", Reader_get, METH_VARARGS,
"Get record for IP address" },
{ "metadata", Reader_metadata, METH_NOARGS,
"Returns metadata object for database" },
{ "close", Reader_close, METH_NOARGS, "Closes database"},
{ NULL, NULL, 0, NULL }
};
static PyTypeObject Reader_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_basicsize = sizeof(Reader_obj),
.tp_dealloc = Reader_dealloc,
.tp_doc = "Reader object",
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_methods = Reader_methods,
.tp_name = "Reader",
.tp_init = Reader_init,
};
static PyMethodDef Metadata_methods[] = {
{ NULL, NULL, 0, NULL }
};
/* *INDENT-OFF* */
static PyMemberDef Metadata_members[] = {
{ "binary_format_major_version", T_OBJECT, offsetof(
Metadata_obj, binary_format_major_version), READONLY, NULL },
{ "binary_format_minor_version", T_OBJECT, offsetof(
Metadata_obj, binary_format_minor_version), READONLY, NULL },
{ "build_epoch", T_OBJECT, offsetof(Metadata_obj, build_epoch),
READONLY, NULL },
{ "database_type", T_OBJECT, offsetof(Metadata_obj, database_type),
READONLY, NULL },
{ "description", T_OBJECT, offsetof(Metadata_obj, description),
READONLY, NULL },
{ "ip_version", T_OBJECT, offsetof(Metadata_obj, ip_version),
READONLY, NULL },
{ "languages", T_OBJECT, offsetof(Metadata_obj, languages), READONLY,
NULL },
{ "node_count", T_OBJECT, offsetof(Metadata_obj, node_count),
READONLY, NULL },
{ "record_size", T_OBJECT, offsetof(Metadata_obj, record_size),
READONLY, NULL },
{ NULL, 0, 0, 0, NULL }
};
/* *INDENT-ON* */
static PyTypeObject Metadata_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_basicsize = sizeof(Metadata_obj),
.tp_dealloc = Metadata_dealloc,
.tp_doc = "Metadata object",
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_members = Metadata_members,
.tp_methods = Metadata_methods,
.tp_name = "Metadata",
.tp_init = Metadata_init
};
static PyMethodDef MaxMindDB_methods[] = {
{ NULL, NULL, 0, NULL }
};
#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef MaxMindDB_module = {
PyModuleDef_HEAD_INIT,
.m_name = "extension",
.m_doc = "This is a C extension to read MaxMind DB file format",
.m_methods = MaxMindDB_methods,
};
#endif
MOD_INIT(extension){
PyObject *m;
#if PY_MAJOR_VERSION >= 3
m = PyModule_Create(&MaxMindDB_module);
#else
m = Py_InitModule("extension", MaxMindDB_methods);
#endif
if (!m) {
RETURN_MOD_INIT(NULL);
}
Reader_Type.tp_new = PyType_GenericNew;
if (PyType_Ready(&Reader_Type)) {
RETURN_MOD_INIT(NULL);
}
Py_INCREF(&Reader_Type);
PyModule_AddObject(m, "Reader", (PyObject *)&Reader_Type);
Metadata_Type.tp_new = PyType_GenericNew;
if (PyType_Ready(&Metadata_Type)) {
RETURN_MOD_INIT(NULL);
}
PyModule_AddObject(m, "extension", (PyObject *)&Metadata_Type);
PyObject* error_mod = PyImport_ImportModule("maxminddb.errors");
if (error_mod == NULL) {
RETURN_MOD_INIT(NULL);
}
MaxMindDB_error = PyObject_GetAttrString(error_mod, "InvalidDatabaseError");
Py_DECREF(error_mod);
if (MaxMindDB_error == NULL) {
RETURN_MOD_INIT(NULL);
}
Py_INCREF(MaxMindDB_error);
/* We primarily add it to the module for backwards compatibility */
PyModule_AddObject(m, "InvalidDatabaseError", MaxMindDB_error);
RETURN_MOD_INIT(m);
}

View file

@ -1,65 +0,0 @@
"""For internal use only. It provides a slice-like file reader."""
import os
try:
from multiprocessing import Lock
except ImportError:
from threading import Lock
class FileBuffer(object):
"""A slice-able file reader"""
def __init__(self, database):
self._handle = open(database, 'rb')
self._size = os.fstat(self._handle.fileno()).st_size
if not hasattr(os, 'pread'):
self._lock = Lock()
def __getitem__(self, key):
if isinstance(key, slice):
return self._read(key.stop - key.start, key.start)
elif isinstance(key, int):
return self._read(1, key)
else:
raise TypeError("Invalid argument type.")
def rfind(self, needle, start):
"""Reverse find needle from start"""
pos = self._read(self._size - start - 1, start).rfind(needle)
if pos == -1:
return pos
return start + pos
def size(self):
"""Size of file"""
return self._size
def close(self):
"""Close file"""
self._handle.close()
if hasattr(os, 'pread'):
def _read(self, buffersize, offset):
"""read that uses pread"""
# pylint: disable=no-member
return os.pread(self._handle.fileno(), buffersize, offset)
else:
def _read(self, buffersize, offset):
"""read with a lock
This lock is necessary as after a fork, the different processes
will share the same file table entry, even if we dup the fd, and
as such the same offsets. There does not appear to be a way to
duplicate the file table entry and we cannot re-open based on the
original path as that file may have replaced with another or
unlinked.
"""
with self._lock:
self._handle.seek(offset)
return self._handle.read(buffersize)

File diff suppressed because it is too large Load diff

View file

@ -1,221 +0,0 @@
"""
maxminddb.reader
~~~~~~~~~~~~~~~~
This module contains the pure Python database reader and related classes.
"""
from __future__ import unicode_literals
try:
import mmap
except ImportError:
# pylint: disable=invalid-name
mmap = None
import struct
from maxminddb.compat import byte_from_int, int_from_byte, ipaddress
from maxminddb.const import MODE_AUTO, MODE_MMAP, MODE_FILE, MODE_MEMORY
from maxminddb.decoder import Decoder
from maxminddb.errors import InvalidDatabaseError
from maxminddb.file import FileBuffer
class Reader(object):
"""
Instances of this class provide a reader for the MaxMind DB format. IP
addresses can be looked up using the ``get`` method.
"""
_DATA_SECTION_SEPARATOR_SIZE = 16
_METADATA_START_MARKER = b"\xAB\xCD\xEFMaxMind.com"
_ipv4_start = None
def __init__(self, database, mode=MODE_AUTO):
"""Reader for the MaxMind DB file format
Arguments:
database -- A path to a valid MaxMind DB file such as a GeoIP2
database file.
mode -- mode to open the database with. Valid mode are:
* MODE_MMAP - read from memory map.
* MODE_FILE - read database as standard file.
* MODE_MEMORY - load database into memory.
* MODE_AUTO - tries MODE_MMAP and then MODE_FILE. Default.
"""
if (mode == MODE_AUTO and mmap) or mode == MODE_MMAP:
with open(database, 'rb') as db_file:
self._buffer = mmap.mmap(
db_file.fileno(), 0, access=mmap.ACCESS_READ)
self._buffer_size = self._buffer.size()
elif mode in (MODE_AUTO, MODE_FILE):
self._buffer = FileBuffer(database)
self._buffer_size = self._buffer.size()
elif mode == MODE_MEMORY:
with open(database, 'rb') as db_file:
self._buffer = db_file.read()
self._buffer_size = len(self._buffer)
else:
raise ValueError('Unsupported open mode ({0}). Only MODE_AUTO, '
' MODE_FILE, and MODE_MEMORY are support by the pure Python '
'Reader'.format(mode))
metadata_start = self._buffer.rfind(self._METADATA_START_MARKER,
max(0, self._buffer_size
- 128 * 1024))
if metadata_start == -1:
self.close()
raise InvalidDatabaseError('Error opening database file ({0}). '
'Is this a valid MaxMind DB file?'
''.format(database))
metadata_start += len(self._METADATA_START_MARKER)
metadata_decoder = Decoder(self._buffer, metadata_start)
(metadata, _) = metadata_decoder.decode(metadata_start)
self._metadata = Metadata(
**metadata) # pylint: disable=bad-option-value
self._decoder = Decoder(self._buffer, self._metadata.search_tree_size
+ self._DATA_SECTION_SEPARATOR_SIZE)
def metadata(self):
"""Return the metadata associated with the MaxMind DB file"""
return self._metadata
def get(self, ip_address):
"""Return the record for the ip_address in the MaxMind DB
Arguments:
ip_address -- an IP address in the standard string notation
"""
address = ipaddress.ip_address(ip_address)
if address.version == 6 and self._metadata.ip_version == 4:
raise ValueError('Error looking up {0}. You attempted to look up '
'an IPv6 address in an IPv4-only database.'.format(
ip_address))
pointer = self._find_address_in_tree(address)
return self._resolve_data_pointer(pointer) if pointer else None
def _find_address_in_tree(self, ip_address):
packed = ip_address.packed
bit_count = len(packed) * 8
node = self._start_node(bit_count)
for i in range(bit_count):
if node >= self._metadata.node_count:
break
bit = 1 & (int_from_byte(packed[i >> 3]) >> 7 - (i % 8))
node = self._read_node(node, bit)
if node == self._metadata.node_count:
# Record is empty
return 0
elif node > self._metadata.node_count:
return node
raise InvalidDatabaseError('Invalid node in search tree')
def _start_node(self, length):
if self._metadata.ip_version != 6 or length == 128:
return 0
# We are looking up an IPv4 address in an IPv6 tree. Skip over the
# first 96 nodes.
if self._ipv4_start:
return self._ipv4_start
node = 0
for _ in range(96):
if node >= self._metadata.node_count:
break
node = self._read_node(node, 0)
self._ipv4_start = node
return node
def _read_node(self, node_number, index):
base_offset = node_number * self._metadata.node_byte_size
record_size = self._metadata.record_size
if record_size == 24:
offset = base_offset + index * 3
node_bytes = b'\x00' + self._buffer[offset:offset + 3]
elif record_size == 28:
(middle,) = struct.unpack(
b'!B', self._buffer[base_offset + 3:base_offset + 4])
if index:
middle &= 0x0F
else:
middle = (0xF0 & middle) >> 4
offset = base_offset + index * 4
node_bytes = byte_from_int(
middle) + self._buffer[offset:offset + 3]
elif record_size == 32:
offset = base_offset + index * 4
node_bytes = self._buffer[offset:offset + 4]
else:
raise InvalidDatabaseError(
'Unknown record size: {0}'.format(record_size))
return struct.unpack(b'!I', node_bytes)[0]
def _resolve_data_pointer(self, pointer):
resolved = pointer - self._metadata.node_count + \
self._metadata.search_tree_size
if resolved > self._buffer_size:
raise InvalidDatabaseError(
"The MaxMind DB file's search tree is corrupt")
(data, _) = self._decoder.decode(resolved)
return data
def close(self):
"""Closes the MaxMind DB file and returns the resources to the system"""
# pylint: disable=unidiomatic-typecheck
if type(self._buffer) not in (str, bytes):
self._buffer.close()
class Metadata(object):
"""Metadata for the MaxMind DB reader"""
# pylint: disable=too-many-instance-attributes
def __init__(self, **kwargs):
"""Creates new Metadata object. kwargs are key/value pairs from spec"""
# Although I could just update __dict__, that is less obvious and it
# doesn't work well with static analysis tools and some IDEs
self.node_count = kwargs['node_count']
self.record_size = kwargs['record_size']
self.ip_version = kwargs['ip_version']
self.database_type = kwargs['database_type']
self.languages = kwargs['languages']
self.binary_format_major_version = kwargs[
'binary_format_major_version']
self.binary_format_minor_version = kwargs[
'binary_format_minor_version']
self.build_epoch = kwargs['build_epoch']
self.description = kwargs['description']
@property
def node_byte_size(self):
"""The size of a node in bytes"""
return self.record_size // 4
@property
def search_tree_size(self):
"""The size of the search tree"""
return self.node_count * self.node_byte_size
def __repr__(self):
args = ', '.join('%s=%r' % x for x in self.__dict__.items())
return '{module}.{class_name}({data})'.format(
module=self.__module__,
class_name=self.__class__.__name__,
data=args)

View file

@ -1,60 +0,0 @@
/**
* @author alteredq / http://alteredqualia.com/
* @author mr.doob / http://mrdoob.com/
*/
Detector = {
canvas : !! window.CanvasRenderingContext2D,
webgl : ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(),
workers : !! window.Worker,
fileapi : window.File && window.FileReader && window.FileList && window.Blob,
getWebGLErrorMessage : function () {
var domElement = document.createElement( 'div' );
domElement.style.fontFamily = 'monospace';
domElement.style.fontSize = '13px';
domElement.style.textAlign = 'center';
domElement.style.background = '#eee';
domElement.style.color = '#000';
domElement.style.padding = '1em';
domElement.style.width = '475px';
domElement.style.margin = '5em auto 0';
if ( ! this.webgl ) {
domElement.innerHTML = window.WebGLRenderingContext ? [
'Sorry, your graphics card doesn\'t support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a>'
].join( '\n' ) : [
'Sorry, your browser doesn\'t support <a href="http://khronos.org/webgl/wiki/Getting_a_WebGL_Implementation">WebGL</a><br/>',
'Please try with',
'<a href="http://www.google.com/chrome">Chrome</a>, ',
'<a href="http://www.mozilla.com/en-US/firefox/new/">Firefox 4</a> or',
'<a href="http://nightly.webkit.org/">Webkit Nightly (Mac)</a>'
].join( '\n' );
}
return domElement;
},
addGetWebGLMessage : function ( parameters ) {
var parent, id, domElement;
parameters = parameters || {};
parent = parameters.parent !== undefined ? parameters.parent : document.body;
id = parameters.id !== undefined ? parameters.id : 'oldie';
domElement = Detector.getWebGLErrorMessage();
domElement.id = id;
parent.appendChild( domElement );
}
};

View file

@ -1,12 +0,0 @@
// Tween.js - http://github.com/sole/tween.js
var TWEEN=TWEEN||function(){var a,e,c,d,f=[];return{start:function(g){c=setInterval(this.update,1E3/(g||60))},stop:function(){clearInterval(c)},add:function(g){f.push(g)},remove:function(g){a=f.indexOf(g);a!==-1&&f.splice(a,1)},update:function(){a=0;e=f.length;for(d=(new Date).getTime();a<e;)if(f[a].update(d))a++;else{f.splice(a,1);e--}}}}();
TWEEN.Tween=function(a){var e={},c={},d={},f=1E3,g=0,j=null,n=TWEEN.Easing.Linear.EaseNone,k=null,l=null,m=null;this.to=function(b,h){if(h!==null)f=h;for(var i in b)if(a[i]!==null)d[i]=b[i];return this};this.start=function(){TWEEN.add(this);j=(new Date).getTime()+g;for(var b in d)if(a[b]!==null){e[b]=a[b];c[b]=d[b]-a[b]}return this};this.stop=function(){TWEEN.remove(this);return this};this.delay=function(b){g=b;return this};this.easing=function(b){n=b;return this};this.chain=function(b){k=b};this.onUpdate=
function(b){l=b;return this};this.onComplete=function(b){m=b;return this};this.update=function(b){var h,i;if(b<j)return true;b=(b-j)/f;b=b>1?1:b;i=n(b);for(h in c)a[h]=e[h]+c[h]*i;l!==null&&l.call(a,i);if(b==1){m!==null&&m.call(a);k!==null&&k.start();return false}return true}};TWEEN.Easing={Linear:{},Quadratic:{},Cubic:{},Quartic:{},Quintic:{},Sinusoidal:{},Exponential:{},Circular:{},Elastic:{},Back:{},Bounce:{}};TWEEN.Easing.Linear.EaseNone=function(a){return a};
TWEEN.Easing.Quadratic.EaseIn=function(a){return a*a};TWEEN.Easing.Quadratic.EaseOut=function(a){return-a*(a-2)};TWEEN.Easing.Quadratic.EaseInOut=function(a){if((a*=2)<1)return 0.5*a*a;return-0.5*(--a*(a-2)-1)};TWEEN.Easing.Cubic.EaseIn=function(a){return a*a*a};TWEEN.Easing.Cubic.EaseOut=function(a){return--a*a*a+1};TWEEN.Easing.Cubic.EaseInOut=function(a){if((a*=2)<1)return 0.5*a*a*a;return 0.5*((a-=2)*a*a+2)};TWEEN.Easing.Quartic.EaseIn=function(a){return a*a*a*a};
TWEEN.Easing.Quartic.EaseOut=function(a){return-(--a*a*a*a-1)};TWEEN.Easing.Quartic.EaseInOut=function(a){if((a*=2)<1)return 0.5*a*a*a*a;return-0.5*((a-=2)*a*a*a-2)};TWEEN.Easing.Quintic.EaseIn=function(a){return a*a*a*a*a};TWEEN.Easing.Quintic.EaseOut=function(a){return(a-=1)*a*a*a*a+1};TWEEN.Easing.Quintic.EaseInOut=function(a){if((a*=2)<1)return 0.5*a*a*a*a*a;return 0.5*((a-=2)*a*a*a*a+2)};TWEEN.Easing.Sinusoidal.EaseIn=function(a){return-Math.cos(a*Math.PI/2)+1};
TWEEN.Easing.Sinusoidal.EaseOut=function(a){return Math.sin(a*Math.PI/2)};TWEEN.Easing.Sinusoidal.EaseInOut=function(a){return-0.5*(Math.cos(Math.PI*a)-1)};TWEEN.Easing.Exponential.EaseIn=function(a){return a==0?0:Math.pow(2,10*(a-1))};TWEEN.Easing.Exponential.EaseOut=function(a){return a==1?1:-Math.pow(2,-10*a)+1};TWEEN.Easing.Exponential.EaseInOut=function(a){if(a==0)return 0;if(a==1)return 1;if((a*=2)<1)return 0.5*Math.pow(2,10*(a-1));return 0.5*(-Math.pow(2,-10*(a-1))+2)};
TWEEN.Easing.Circular.EaseIn=function(a){return-(Math.sqrt(1-a*a)-1)};TWEEN.Easing.Circular.EaseOut=function(a){return Math.sqrt(1- --a*a)};TWEEN.Easing.Circular.EaseInOut=function(a){if((a/=0.5)<1)return-0.5*(Math.sqrt(1-a*a)-1);return 0.5*(Math.sqrt(1-(a-=2)*a)+1)};TWEEN.Easing.Elastic.EaseIn=function(a){var e,c=0.1,d=0.4;if(a==0)return 0;if(a==1)return 1;d||(d=0.3);if(!c||c<1){c=1;e=d/4}else e=d/(2*Math.PI)*Math.asin(1/c);return-(c*Math.pow(2,10*(a-=1))*Math.sin((a-e)*2*Math.PI/d))};
TWEEN.Easing.Elastic.EaseOut=function(a){var e,c=0.1,d=0.4;if(a==0)return 0;if(a==1)return 1;d||(d=0.3);if(!c||c<1){c=1;e=d/4}else e=d/(2*Math.PI)*Math.asin(1/c);return c*Math.pow(2,-10*a)*Math.sin((a-e)*2*Math.PI/d)+1};
TWEEN.Easing.Elastic.EaseInOut=function(a){var e,c=0.1,d=0.4;if(a==0)return 0;if(a==1)return 1;d||(d=0.3);if(!c||c<1){c=1;e=d/4}else e=d/(2*Math.PI)*Math.asin(1/c);if((a*=2)<1)return-0.5*c*Math.pow(2,10*(a-=1))*Math.sin((a-e)*2*Math.PI/d);return c*Math.pow(2,-10*(a-=1))*Math.sin((a-e)*2*Math.PI/d)*0.5+1};TWEEN.Easing.Back.EaseIn=function(a){return a*a*(2.70158*a-1.70158)};TWEEN.Easing.Back.EaseOut=function(a){return(a-=1)*a*(2.70158*a+1.70158)+1};
TWEEN.Easing.Back.EaseInOut=function(a){if((a*=2)<1)return 0.5*a*a*(3.5949095*a-2.5949095);return 0.5*((a-=2)*a*(3.5949095*a+2.5949095)+2)};TWEEN.Easing.Bounce.EaseIn=function(a){return 1-TWEEN.Easing.Bounce.EaseOut(1-a)};TWEEN.Easing.Bounce.EaseOut=function(a){return(a/=1)<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+0.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375};
TWEEN.Easing.Bounce.EaseInOut=function(a){if(a<0.5)return TWEEN.Easing.Bounce.EaseIn(a*2)*0.5;return TWEEN.Easing.Bounce.EaseOut(a*2-1)*0.5+0.5};

File diff suppressed because one or more lines are too long

View file

@ -1,424 +0,0 @@
/**
* dat.globe Javascript WebGL Globe Toolkit
* http://dataarts.github.com/dat.globe
*
* Copyright 2011 Data Arts Team, Google Creative Lab
*
* Licensed under the Apache License, Version 2.0 (the 'License');
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*/
var DAT = DAT || {};
DAT.Globe = function(container, opts) {
opts = opts || {};
var colorFn = opts.colorFn || function(x) {
var c = new THREE.Color();
c.setHSL( ( 0.5 - (x * 2) ), Math.max(0.8, 1.0 - (x * 3)), 0.5 );
return c;
};
var imgDir = opts.imgDir || '/globe/';
var Shaders = {
'earth' : {
uniforms: {
'texture': { type: 't', value: null }
},
vertexShader: [
'varying vec3 vNormal;',
'varying vec2 vUv;',
'void main() {',
'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
'vNormal = normalize( normalMatrix * normal );',
'vUv = uv;',
'}'
].join('\n'),
fragmentShader: [
'uniform sampler2D texture;',
'varying vec3 vNormal;',
'varying vec2 vUv;',
'void main() {',
'vec3 diffuse = texture2D( texture, vUv ).xyz;',
'float intensity = 1.05 - dot( vNormal, vec3( 0.0, 0.0, 1.0 ) );',
'vec3 atmosphere = vec3( 1.0, 1.0, 1.0 ) * pow( intensity, 3.0 );',
'gl_FragColor = vec4( diffuse + atmosphere, 1.0 );',
'}'
].join('\n')
},
'atmosphere' : {
uniforms: {},
vertexShader: [
'varying vec3 vNormal;',
'void main() {',
'vNormal = normalize( normalMatrix * normal );',
'gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
'}'
].join('\n'),
fragmentShader: [
'varying vec3 vNormal;',
'void main() {',
'float intensity = pow( 0.8 - dot( vNormal, vec3( 0, 0, 1.0 ) ), 12.0 );',
'gl_FragColor = vec4( 1.0, 1.0, 1.0, 1.0 ) * intensity;',
'}'
].join('\n')
}
};
var camera, scene, renderer, w, h;
var mesh, atmosphere, point, running;
var overRenderer;
var running = true;
var curZoomSpeed = 0;
var zoomSpeed = 50;
var mouse = { x: 0, y: 0 }, mouseOnDown = { x: 0, y: 0 };
var rotation = { x: 0, y: 0 },
target = { x: Math.PI*3/2, y: Math.PI / 6.0 },
targetOnDown = { x: 0, y: 0 };
var distance = 100000, distanceTarget = 100000;
var padding = 10;
var PI_HALF = Math.PI / 2;
function init() {
container.style.color = '#fff';
container.style.font = '13px/20px Arial, sans-serif';
var shader, uniforms, material;
w = container.offsetWidth || window.innerWidth;
h = container.offsetHeight || window.innerHeight;
camera = new THREE.PerspectiveCamera(30, w / h, 1, 10000);
camera.position.z = distance;
scene = new THREE.Scene();
var geometry = new THREE.SphereGeometry(200, 40, 30);
shader = Shaders['earth'];
uniforms = THREE.UniformsUtils.clone(shader.uniforms);
uniforms['texture'].value = THREE.ImageUtils.loadTexture(imgDir+'world.jpg');
material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader
});
mesh = new THREE.Mesh(geometry, material);
mesh.rotation.y = Math.PI;
scene.add(mesh);
shader = Shaders['atmosphere'];
uniforms = THREE.UniformsUtils.clone(shader.uniforms);
material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader,
side: THREE.BackSide,
blending: THREE.AdditiveBlending,
transparent: true
});
mesh = new THREE.Mesh(geometry, material);
mesh.scale.set( 1.1, 1.1, 1.1 );
scene.add(mesh);
geometry = new THREE.BoxGeometry(2.75, 2.75, 1);
geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0,0,-0.5));
point = new THREE.Mesh(geometry);
renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(w, h);
renderer.setClearColor( 0x212121, 1 );
renderer.domElement.style.position = 'relative';
container.appendChild(renderer.domElement);
container.addEventListener('mousedown', onMouseDown, false);
container.addEventListener('mousewheel', onMouseWheel, false);
document.addEventListener('keydown', onDocumentKeyDown, false);
window.addEventListener('resize', onWindowResize, false);
container.addEventListener('mouseover', function() {
overRenderer = true;
}, false);
container.addEventListener('mouseout', function() {
overRenderer = false;
}, false);
}
function addData(data, opts) {
var lat, lng, size, color, i, step, colorFnWrapper;
opts.animated = opts.animated || false;
this.is_animated = opts.animated;
opts.format = opts.format || 'magnitude'; // other option is 'legend'
if (opts.format === 'magnitude') {
step = 3;
colorFnWrapper = function(data, i) { return colorFn(data[i+2]); }
} else if (opts.format === 'legend') {
step = 4;
colorFnWrapper = function(data, i) { return colorFn(data[i+3]); }
} else if (opts.format === 'peer') {
colorFnWrapper = function(data, i) { return colorFn(data[i+2]); }
} else {
throw('error: format not supported: '+opts.format);
}
if (opts.animated) {
if (this._baseGeometry === undefined) {
this._baseGeometry = new THREE.Geometry();
for (i = 0; i < data.length; i += step) {
lat = data[i];
lng = data[i + 1];
// size = data[i + 2];
color = colorFnWrapper(data,i);
size = 0;
addPoint(lat, lng, size, color, this._baseGeometry);
}
}
if(this._morphTargetId === undefined) {
this._morphTargetId = 0;
} else {
this._morphTargetId += 1;
}
opts.name = opts.name || 'morphTarget'+this._morphTargetId;
}
var subgeo = new THREE.Geometry();
for (i = 0; i < data.length; i += step) {
lat = data[i];
lng = data[i + 1];
color = colorFnWrapper(data,i);
size = data[i + 2];
size = size*200;
addPoint(lat, lng, size, color, subgeo);
}
if (opts.animated) {
this._baseGeometry.morphTargets.push({'name': opts.name, vertices: subgeo.vertices});
} else {
this._baseGeometry = subgeo;
}
};
function createPoints() {
if (this._baseGeometry !== undefined) {
if (this.is_animated === false) {
this.points = new THREE.Mesh(this._baseGeometry, new THREE.MeshBasicMaterial({
color: 0xffffff,
vertexColors: THREE.FaceColors,
morphTargets: false
}));
} else {
if (this._baseGeometry.morphTargets.length < 8) {
console.log('t l',this._baseGeometry.morphTargets.length);
var padding = 8-this._baseGeometry.morphTargets.length;
console.log('padding', padding);
for(var i=0; i<=padding; i++) {
console.log('padding',i);
this._baseGeometry.morphTargets.push({'name': 'morphPadding'+i, vertices: this._baseGeometry.vertices});
}
}
this.points = new THREE.Mesh(this._baseGeometry, new THREE.MeshBasicMaterial({
color: 0xffffff,
vertexColors: THREE.FaceColors,
morphTargets: true
}));
}
scene.add(this.points);
}
}
function addPoint(lat, lng, size, color, subgeo) {
var phi = (90 - lat) * Math.PI / 180;
var theta = (180 - lng) * Math.PI / 180;
point.position.x = 200 * Math.sin(phi) * Math.cos(theta);
point.position.y = 200 * Math.cos(phi);
point.position.z = 200 * Math.sin(phi) * Math.sin(theta);
point.lookAt(mesh.position);
point.scale.z = Math.max( size, 0.1 ); // avoid non-invertible matrix
point.updateMatrix();
for (var i = 0; i < point.geometry.faces.length; i++) {
point.geometry.faces[i].color = color;
}
if(point.matrixAutoUpdate){
point.updateMatrix();
}
subgeo.merge(point.geometry, point.matrix);
}
function onMouseDown(event) {
event.preventDefault();
container.addEventListener('mousemove', onMouseMove, false);
container.addEventListener('mouseup', onMouseUp, false);
container.addEventListener('mouseout', onMouseOut, false);
mouseOnDown.x = - event.clientX;
mouseOnDown.y = event.clientY;
targetOnDown.x = target.x;
targetOnDown.y = target.y;
container.style.cursor = 'move';
}
function onMouseMove(event) {
mouse.x = - event.clientX;
mouse.y = event.clientY;
var zoomDamp = distance/1000;
target.x = targetOnDown.x + (mouse.x - mouseOnDown.x) * 0.005 * zoomDamp;
target.y = targetOnDown.y + (mouse.y - mouseOnDown.y) * 0.005 * zoomDamp;
target.y = target.y > PI_HALF ? PI_HALF : target.y;
target.y = target.y < - PI_HALF ? - PI_HALF : target.y;
}
function onMouseUp(event) {
container.removeEventListener('mousemove', onMouseMove, false);
container.removeEventListener('mouseup', onMouseUp, false);
container.removeEventListener('mouseout', onMouseOut, false);
container.style.cursor = 'auto';
}
function onMouseOut(event) {
container.removeEventListener('mousemove', onMouseMove, false);
container.removeEventListener('mouseup', onMouseUp, false);
container.removeEventListener('mouseout', onMouseOut, false);
}
function onMouseWheel(event) {
event.preventDefault();
if (overRenderer) {
zoom(event.wheelDeltaY * 0.3);
}
return false;
}
function onDocumentKeyDown(event) {
switch (event.keyCode) {
case 38:
zoom(100);
event.preventDefault();
break;
case 40:
zoom(-100);
event.preventDefault();
break;
}
}
function onWindowResize( event ) {
camera.aspect = container.offsetWidth / container.offsetHeight;
camera.updateProjectionMatrix();
renderer.setSize( container.offsetWidth, container.offsetHeight );
}
function zoom(delta) {
distanceTarget -= delta;
distanceTarget = distanceTarget > 855 ? 855 : distanceTarget;
distanceTarget = distanceTarget < 350 ? 350 : distanceTarget;
}
function animate() {
if (!running) return
requestAnimationFrame(animate);
render();
}
function render() {
zoom(curZoomSpeed);
rotation.x += (target.x - rotation.x) * 0.1;
rotation.y += (target.y - rotation.y) * 0.1;
distance += (distanceTarget - distance) * 0.3;
camera.position.x = distance * Math.sin(rotation.x) * Math.cos(rotation.y);
camera.position.y = distance * Math.sin(rotation.y);
camera.position.z = distance * Math.cos(rotation.x) * Math.cos(rotation.y);
camera.lookAt(mesh.position);
renderer.render(scene, camera);
}
function unload() {
running = false
container.removeEventListener('mousedown', onMouseDown, false);
container.removeEventListener('mousewheel', onMouseWheel, false);
document.removeEventListener('keydown', onDocumentKeyDown, false);
window.removeEventListener('resize', onWindowResize, false);
}
init();
this.animate = animate;
this.unload = unload;
this.__defineGetter__('time', function() {
return this._time || 0;
});
this.__defineSetter__('time', function(t) {
var validMorphs = [];
var morphDict = this.points.morphTargetDictionary;
for(var k in morphDict) {
if(k.indexOf('morphPadding') < 0) {
validMorphs.push(morphDict[k]);
}
}
validMorphs.sort();
var l = validMorphs.length-1;
var scaledt = t*l+1;
var index = Math.floor(scaledt);
for (i=0;i<validMorphs.length;i++) {
this.points.morphTargetInfluences[validMorphs[i]] = 0;
}
var lastIndex = index - 1;
var leftover = scaledt - index;
if (lastIndex >= 0) {
this.points.morphTargetInfluences[lastIndex] = 1 - leftover;
}
this.points.morphTargetInfluences[index] = leftover;
this._time = t;
});
this.addData = addData;
this.createPoints = createPoints;
this.renderer = renderer;
this.scene = scene;
return this;
};

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

View file

@ -1,23 +0,0 @@
class Class
trace: true
log: (args...) ->
return unless @trace
return if typeof console is 'undefined'
args.unshift("[#{@.constructor.name}]")
console.log(args...)
@
logStart: (name, args...) ->
return unless @trace
@logtimers or= {}
@logtimers[name] = +(new Date)
@log "#{name}", args..., "(started)" if args.length > 0
@
logEnd: (name, args...) ->
ms = +(new Date)-@logtimers[name]
@log "#{name}", args..., "(Done in #{ms}ms)"
@
window.Class = Class

View file

@ -1,91 +0,0 @@
/* via http://jsfiddle.net/elGrecode/00dgurnn/ */
window.initScrollable = function () {
var scrollContainer = document.querySelector('.scrollable'),
scrollContentWrapper = document.querySelector('.scrollable .content-wrapper'),
scrollContent = document.querySelector('.scrollable .content'),
contentPosition = 0,
scrollerBeingDragged = false,
scroller,
topPosition,
scrollerHeight;
function calculateScrollerHeight() {
// *Calculation of how tall scroller should be
var visibleRatio = scrollContainer.offsetHeight / scrollContentWrapper.scrollHeight;
if (visibleRatio == 1)
scroller.style.display = "none";
else
scroller.style.display = "block";
return visibleRatio * scrollContainer.offsetHeight;
}
function moveScroller(evt) {
// Move Scroll bar to top offset
var scrollPercentage = evt.target.scrollTop / scrollContentWrapper.scrollHeight;
topPosition = scrollPercentage * (scrollContainer.offsetHeight - 5); // 5px arbitrary offset so scroll bar doesn't move too far beyond content wrapper bounding box
scroller.style.top = topPosition + 'px';
}
function startDrag(evt) {
normalizedPosition = evt.pageY;
contentPosition = scrollContentWrapper.scrollTop;
scrollerBeingDragged = true;
window.addEventListener('mousemove', scrollBarScroll);
return false;
}
function stopDrag(evt) {
scrollerBeingDragged = false;
window.removeEventListener('mousemove', scrollBarScroll);
}
function scrollBarScroll(evt) {
if (scrollerBeingDragged === true) {
evt.preventDefault();
var mouseDifferential = evt.pageY - normalizedPosition;
var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight / scrollContainer.offsetHeight);
scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent;
}
}
function updateHeight() {
scrollerHeight = calculateScrollerHeight() - 10;
scroller.style.height = scrollerHeight + 'px';
}
function createScroller() {
// *Creates scroller element and appends to '.scrollable' div
// create scroller element
scroller = document.createElement("div");
scroller.className = 'scroller';
// determine how big scroller should be based on content
scrollerHeight = calculateScrollerHeight() - 10;
if (scrollerHeight / scrollContainer.offsetHeight < 1) {
// *If there is a need to have scroll bar based on content size
scroller.style.height = scrollerHeight + 'px';
// append scroller to scrollContainer div
scrollContainer.appendChild(scroller);
// show scroll path divot
scrollContainer.className += ' showScroll';
// attach related draggable listeners
scroller.addEventListener('mousedown', startDrag);
window.addEventListener('mouseup', stopDrag);
}
}
createScroller();
// *** Listeners ***
scrollContentWrapper.addEventListener('scroll', moveScroller);
return updateHeight;
};

View file

@ -1,44 +0,0 @@
.scrollable {
overflow: hidden;
}
.scrollable.showScroll::after {
position: absolute;
content: '';
top: 5%;
right: 7px;
height: 90%;
width: 3px;
background: rgba(224, 224, 255, .3);
}
.scrollable .content-wrapper {
width: 100%;
height: 100%;
padding-right: 50%;
overflow-y: scroll;
}
.scroller {
margin-top: 5px;
z-index: 5;
cursor: pointer;
position: absolute;
width: 7px;
border-radius: 5px;
background: #151515;
top: 0px;
left: 395px;
-webkit-transition: top .08s;
-moz-transition: top .08s;
-ms-transition: top .08s;
-o-transition: top .08s;
transition: top .08s;
}
.scroller {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}

View file

@ -1,339 +0,0 @@
class Sidebar extends Class
constructor: ->
@tag = null
@container = null
@opened = false
@width = 410
@fixbutton = $(".fixbutton")
@fixbutton_addx = 0
@fixbutton_initx = 0
@fixbutton_targetx = 0
@page_width = $(window).width()
@frame = $("#inner-iframe")
@initFixbutton()
@dragStarted = 0
@globe = null
@original_set_site_info = wrapper.setSiteInfo # We going to override this, save the original
# Start in opened state for debugging
if false
@startDrag()
@moved()
@fixbutton_targetx = @fixbutton_initx - @width
@stopDrag()
initFixbutton: ->
# Detect dragging
@fixbutton.on "mousedown", (e) =>
e.preventDefault()
# Disable previous listeners
@fixbutton.off "click"
@fixbutton.off "mousemove"
# Make sure its not a click
@dragStarted = (+ new Date)
@fixbutton.one "mousemove", (e) =>
@fixbutton_addx = @fixbutton.offset().left-e.pageX
@startDrag()
@fixbutton.parent().on "click", (e) =>
@stopDrag()
@resized()
$(window).on "resize", @resized
resized: =>
@page_width = $(window).width()
@fixbutton_initx = @page_width - 75 # Initial x position
if @opened
@fixbutton.css
left: @fixbutton_initx - @width
else
@fixbutton.css
left: @fixbutton_initx
# Start dragging the fixbutton
startDrag: ->
@log "startDrag"
@fixbutton_targetx = @fixbutton_initx # Fallback x position
@fixbutton.addClass("dragging")
# Fullscreen drag bg to capture mouse events over iframe
$("<div class='drag-bg'></div>").appendTo(document.body)
# IE position wrap fix
if navigator.userAgent.indexOf('MSIE') != -1 or navigator.appVersion.indexOf('Trident/') > 0
@fixbutton.css("pointer-events", "none")
# Don't go to homepage
@fixbutton.one "click", (e) =>
@stopDrag()
@fixbutton.removeClass("dragging")
if Math.abs(@fixbutton.offset().left - @fixbutton_initx) > 5
# If moved more than some pixel the button then don't go to homepage
e.preventDefault()
# Animate drag
@fixbutton.parents().on "mousemove", @animDrag
@fixbutton.parents().on "mousemove" ,@waitMove
# Stop dragging listener
@fixbutton.parents().on "mouseup", (e) =>
e.preventDefault()
@stopDrag()
# Wait for moving the fixbutton
waitMove: (e) =>
if Math.abs(@fixbutton.offset().left - @fixbutton_targetx) > 10 and (+ new Date)-@dragStarted > 100
@moved()
@fixbutton.parents().off "mousemove" ,@waitMove
moved: ->
@log "Moved"
@createHtmltag()
$(document.body).css("perspective", "1000px").addClass("body-sidebar")
$(window).off "resize"
$(window).on "resize", =>
$(document.body).css "height", $(window).height()
@scrollable()
@resized()
$(window).trigger "resize"
# Override setsiteinfo to catch changes
wrapper.setSiteInfo = (site_info) =>
@setSiteInfo(site_info)
@original_set_site_info.apply(wrapper, arguments)
setSiteInfo: (site_info) ->
@updateHtmlTag()
@displayGlobe()
# Create the sidebar html tag
createHtmltag: ->
if not @container
@container = $("""
<div class="sidebar-container"><div class="sidebar scrollable"><div class="content-wrapper"><div class="content">
</div></div></div></div>
""")
@container.appendTo(document.body)
@tag = @container.find(".sidebar")
@updateHtmlTag()
@scrollable = window.initScrollable()
updateHtmlTag: ->
wrapper.ws.cmd "sidebarGetHtmlTag", {}, (res) =>
if @tag.find(".content").children().length == 0 # First update
@log "Creating content"
morphdom(@tag.find(".content")[0], '<div class="content">'+res+'</div>')
@scrollable()
else # Not first update, patch the html to keep unchanged dom elements
@log "Patching content"
morphdom @tag.find(".content")[0], '<div class="content">'+res+'</div>', {
onBeforeMorphEl: (from_el, to_el) -> # Ignore globe loaded state
if from_el.className == "globe"
return false
else
return true
}
animDrag: (e) =>
mousex = e.pageX
overdrag = @fixbutton_initx-@width-mousex
if overdrag > 0 # Overdragged
overdrag_percent = 1+overdrag/300
mousex = (e.pageX + (@fixbutton_initx-@width)*overdrag_percent)/(1+overdrag_percent)
targetx = @fixbutton_initx-mousex-@fixbutton_addx
@fixbutton.offset
left: mousex+@fixbutton_addx
if @tag
@tag.css("transform", "translateX(#{0-targetx}px)")
# Check if opened
if (not @opened and targetx > @width/3) or (@opened and targetx > @width*0.9)
@fixbutton_targetx = @fixbutton_initx - @width # Make it opened
else
@fixbutton_targetx = @fixbutton_initx
# Stop dragging the fixbutton
stopDrag: ->
@fixbutton.parents().off "mousemove"
@fixbutton.off "mousemove"
@fixbutton.css("pointer-events", "")
$(".drag-bg").remove()
if not @fixbutton.hasClass("dragging")
return
@fixbutton.removeClass("dragging")
# Move back to initial position
if @fixbutton_targetx != @fixbutton.offset().left
# Animate fixbutton
@fixbutton.stop().animate {"left": @fixbutton_targetx}, 500, "easeOutBack", =>
# Switch back to auto align
if @fixbutton_targetx == @fixbutton_initx # Closed
@fixbutton.css("left", "auto")
else # Opened
@fixbutton.css("left", @fixbutton_targetx)
$(".fixbutton-bg").trigger "mouseout" # Switch fixbutton back to normal status
# Animate sidebar and iframe
if @fixbutton_targetx == @fixbutton_initx
# Closed
targetx = 0
@opened = false
else
# Opened
targetx = @width
if not @opened
@onOpened()
@opened = true
# Revent sidebar transitions
@tag.css("transition", "0.4s ease-out")
@tag.css("transform", "translateX(-#{targetx}px)").one transitionEnd, =>
@tag.css("transition", "")
if not @opened
@container.remove()
@container = null
@tag.remove()
@tag = null
# Revert body transformations
@log "stopdrag", "opened:", @opened
if not @opened
@onClosed()
onOpened: ->
@log "Opened"
@scrollable()
# Re-calculate height when site admin opened or closed
@tag.find("#checkbox-owned").off("click").on "click", =>
setTimeout (=>
@scrollable()
), 300
# Site limit button
@tag.find("#button-sitelimit").on "click", =>
wrapper.ws.cmd "siteSetLimit", $("#input-sitelimit").val(), =>
wrapper.notifications.add "done-sitelimit", "done", "Site storage limit modified!", 5000
@updateHtmlTag()
return false
# Owned checkbox
@tag.find("#checkbox-owned").on "click", =>
wrapper.ws.cmd "siteSetOwned", [@tag.find("#checkbox-owned").is(":checked")]
# Owned checkbox
@tag.find("#checkbox-autodownloadoptional").on "click", =>
wrapper.ws.cmd "siteSetAutodownloadoptional", [@tag.find("#checkbox-autodownloadoptional").is(":checked")]
# Change identity button
@tag.find("#button-identity").on "click", =>
wrapper.ws.cmd "certSelect"
return false
# Owned checkbox
@tag.find("#checkbox-owned").on "click", =>
wrapper.ws.cmd "siteSetOwned", [@tag.find("#checkbox-owned").is(":checked")]
# Save settings
@tag.find("#button-settings").on "click", =>
wrapper.ws.cmd "fileGet", "content.json", (res) =>
data = JSON.parse(res)
data["title"] = $("#settings-title").val()
data["description"] = $("#settings-description").val()
json_raw = unescape(encodeURIComponent(JSON.stringify(data, undefined, '\t')))
wrapper.ws.cmd "fileWrite", ["content.json", btoa(json_raw)], (res) =>
if res != "ok" # fileWrite failed
wrapper.notifications.add "file-write", "error", "File write error: #{res}"
else
wrapper.notifications.add "file-write", "done", "Site settings saved!", 5000
@updateHtmlTag()
return false
# Sign content.json
@tag.find("#button-sign").on "click", =>
inner_path = @tag.find("#select-contents").val()
if wrapper.site_info.privatekey
# Privatekey stored in users.json
wrapper.ws.cmd "siteSign", ["stored", inner_path], (res) =>
wrapper.notifications.add "sign", "done", "#{inner_path} Signed!", 5000
else
# Ask the user for privatekey
wrapper.displayPrompt "Enter your private key:", "password", "Sign", (privatekey) => # Prompt the private key
wrapper.ws.cmd "siteSign", [privatekey, inner_path], (res) =>
if res == "ok"
wrapper.notifications.add "sign", "done", "#{inner_path} Signed!", 5000
return false
# Publish content.json
@tag.find("#button-publish").on "click", =>
inner_path = @tag.find("#select-contents").val()
@tag.find("#button-publish").addClass "loading"
wrapper.ws.cmd "sitePublish", {"inner_path": inner_path, "sign": false}, =>
@tag.find("#button-publish").removeClass "loading"
@loadGlobe()
onClosed: ->
$(window).off "resize"
$(window).on "resize", @resized
$(document.body).css("transition", "0.6s ease-in-out").removeClass("body-sidebar").on transitionEnd, (e) =>
if e.target == document.body
$(document.body).css("height", "auto").css("perspective", "").css("transition", "").off transitionEnd
@unloadGlobe()
# We dont need site info anymore
wrapper.setSiteInfo = @original_set_site_info
loadGlobe: =>
if @tag.find(".globe").hasClass("loading")
setTimeout (=>
if typeof(DAT) == "undefined" # Globe script not loaded, do it first
$.getScript("/uimedia/globe/all.js", @displayGlobe)
else
@displayGlobe()
), 600
displayGlobe: =>
wrapper.ws.cmd "sidebarGetPeers", [], (globe_data) =>
if @globe
@globe.scene.remove(@globe.points)
@globe.addData( globe_data, {format: 'magnitude', name: "hello", animated: false} )
@globe.createPoints()
else
@globe = new DAT.Globe( @tag.find(".globe")[0], {"imgDir": "/uimedia/globe/"} )
@globe.addData( globe_data, {format: 'magnitude', name: "hello"} )
@globe.createPoints()
@globe.animate()
@tag.find(".globe").removeClass("loading")
unloadGlobe: =>
if not @globe
return false
@globe.unload()
@globe = null
window.sidebar = new Sidebar()
window.transitionEnd = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend'

View file

@ -1,99 +0,0 @@
.drag-bg { width: 100%; height: 100%; position: absolute; }
.fixbutton.dragging { cursor: -webkit-grabbing; }
.fixbutton-bg:active { cursor: -webkit-grabbing; }
.body-sidebar { background-color: #666 !important; }
#inner-iframe { transition: 0.3s ease-in-out; transform-origin: left; backface-visibility: hidden; outline: 1px solid transparent }
.body-sidebar iframe { transform: rotateY(5deg); opacity: 0.8; pointer-events: none } /* translateX(-200px) scale(0.95)*/
/* SIDEBAR */
.sidebar-container { width: 100%; height: 100%; overflow: hidden; position: absolute; }
.sidebar { background-color: #212121; position: absolute; right: -1200px; height: 100%; width: 1200px; } /*box-shadow: inset 0px 0px 10px #000*/
.sidebar .content { margin: 30px; font-family: "Segoe UI Light", "Segoe UI", "Helvetica Neue"; color: white; width: 375px; height: 300px; font-weight: 200 }
.sidebar h1, .sidebar h2 { font-weight: lighter; }
.sidebar .button { margin: 0px; display: inline-block; }
/* FIELDS */
.sidebar .fields { padding: 0px; list-style-type: none; width: 355px; }
.sidebar .fields > li, .sidebar .fields .settings-owned > li { margin-bottom: 30px }
.sidebar .fields > li:after, .sidebar .fields .settings-owned > li:after { clear: both; content: ''; display: block }
.sidebar .fields label {
font-family: Consolas, monospace; text-transform: uppercase; font-size: 13px; color: #ACACAC; display: inline-block; margin-bottom: 10px;
vertical-align: text-bottom; margin-right: 10px;
}
.sidebar .fields label small { font-weight: normal; color: white; text-transform: none; }
.sidebar .fields .text { background-color: black; border: 0px; padding: 10px; color: white; border-radius: 3px; width: 250px; font-family: Consolas, monospace; }
.sidebar .fields .text.long { width: 330px; font-size: 72%; }
.sidebar .fields .disabled { color: #AAA; background-color: #3B3B3B; }
.sidebar .fields .text-num { width: 30px; text-align: right; padding-right: 30px; }
.sidebar .fields .text-post { color: white; font-family: Consolas, monospace; display: inline-block; font-size: 13px; margin-left: -25px; width: 25px; }
/* Select */
.sidebar .fields select {
width: 225px; background-color: #3B3B3B; color: white; font-family: Consolas, monospace; appearance: none;
padding: 5px; padding-right: 25px; border: 0px; border-radius: 3px; height: 35px; vertical-align: 1px; box-shadow: 0px 1px 2px rgba(0,0,0,0.5);
}
.sidebar .fields .select-down { margin-left: -39px; width: 34px; display: inline-block; transform: rotateZ(90deg); height: 35px; vertical-align: -8px; pointer-events: none; font-weight: bold }
/* Checkbox */
.sidebar .fields .checkbox { width: 50px; height: 24px; position: relative; z-index: 999; opacity: 0; }
.sidebar .fields .checkbox-skin { background-color: #CCC; width: 50px; height: 24px; border-radius: 15px; transition: all 0.3s ease-in-out; display: inline-block; margin-left: -59px; }
.sidebar .fields .checkbox-skin:before {
content: ""; position: relative; width: 20px; background-color: white; height: 20px; display: block; border-radius: 100%; margin-top: 2px; margin-left: 2px;
transition: all 0.5s cubic-bezier(0.785, 0.135, 0.15, 0.86);
}
.sidebar .fields .checkbox:checked ~ .checkbox-skin:before { margin-left: 27px; }
.sidebar .fields .checkbox:checked ~ .checkbox-skin { background-color: #2ECC71; }
/* Fake input */
.sidebar .input { font-size: 13px; width: 250px; display: inline-block; overflow: hidden; text-overflow: ellipsis; vertical-align: top }
/* GRAPH */
.graph { padding: 0px; list-style-type: none; width: 351px; background-color: black; height: 10px; border-radius: 8px; overflow: hidden; position: relative;}
.graph li { height: 100%; position: absolute; transition: all 0.3s; }
.graph-stacked li { position: static; float: left; }
.graph-legend { padding: 0px; list-style-type: none; margin-top: 13px; font-family: Consolas, "Andale Mono", monospace; font-size: 13px; text-transform: capitalize; }
.sidebar .graph-legend li { margin: 0px; margin-top: 5px; margin-left: 0px; width: 160px; float: left; position: relative; }
.sidebar .graph-legend li:nth-child(odd) { margin-right: 29px }
.graph-legend span { position: absolute; }
.graph-legend b { text-align: right; display: inline-block; width: 50px; float: right; font-weight: normal; }
.graph-legend li:before { content: '\2022'; font-size: 23px; line-height: 0px; vertical-align: -3px; margin-right: 5px; }
/* COLORS */
.back-green { background-color: #2ECC71 }
.color-green:before { color: #2ECC71 }
.back-blue { background-color: #3BAFDA }
.color-blue:before { color: #3BAFDA }
.back-darkblue { background-color: #2196F3 }
.color-darkblue:before { color: #2196F3 }
.back-purple { background-color: #B10DC9 }
.color-purple:before { color: #B10DC9 }
.back-yellow { background-color: #FFDC00 }
.color-yellow:before { color: #FFDC00 }
.back-orange { background-color: #FF9800 }
.color-orange:before { color: #FF9800 }
.back-gray { background-color: #ECF0F1 }
.color-gray:before { color: #ECF0F1 }
.back-black { background-color: #34495E }
.color-black:before { color: #34495E }
.back-white { background-color: #EEE }
.color-white:before { color: #EEE }
/* Settings owned */
.owned-title { float: left }
#checkbox-owned { margin-bottom: 25px; margin-top: 26px; margin-left: 11px; }
#checkbox-owned ~ .settings-owned { opacity: 0; max-height: 0px; transition: all 0.3s linear; overflow: hidden }
#checkbox-owned:checked ~ .settings-owned { opacity: 1; max-height: 400px }
/* Globe */
.globe { width: 360px; height: 360px }
.globe.loading { background: url(/uimedia/img/loading-circle.gif) center center no-repeat }

View file

@ -1,153 +0,0 @@
/* ---- plugins/Sidebar/media/Scrollbable.css ---- */
.scrollable {
overflow: hidden;
}
.scrollable.showScroll::after {
position: absolute;
content: '';
top: 5%;
right: 7px;
height: 90%;
width: 3px;
background: rgba(224, 224, 255, .3);
}
.scrollable .content-wrapper {
width: 100%;
height: 100%;
padding-right: 50%;
overflow-y: scroll;
}
.scroller {
margin-top: 5px;
z-index: 5;
cursor: pointer;
position: absolute;
width: 7px;
-webkit-border-radius: 5px; -moz-border-radius: 5px; -o-border-radius: 5px; -ms-border-radius: 5px; border-radius: 5px ;
background: #151515;
top: 0px;
left: 395px;
-webkit-transition: top .08s;
-moz-transition: top .08s;
-ms-transition: top .08s;
-o-transition: top .08s;
-webkit-transition: top .08s; -moz-transition: top .08s; -o-transition: top .08s; -ms-transition: top .08s; transition: top .08s ;
}
.scroller {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
/* ---- plugins/Sidebar/media/Sidebar.css ---- */
.drag-bg { width: 100%; height: 100%; position: absolute; }
.fixbutton.dragging { cursor: -webkit-grabbing; }
.fixbutton-bg:active { cursor: -webkit-grabbing; }
.body-sidebar { background-color: #666 !important; }
#inner-iframe { -webkit-transition: 0.3s ease-in-out; -moz-transition: 0.3s ease-in-out; -o-transition: 0.3s ease-in-out; -ms-transition: 0.3s ease-in-out; transition: 0.3s ease-in-out ; transform-origin: left; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; -o-backface-visibility: hidden; -ms-backface-visibility: hidden; backface-visibility: hidden ; outline: 1px solid transparent }
.body-sidebar iframe { -webkit-transform: rotateY(5deg); -moz-transform: rotateY(5deg); -o-transform: rotateY(5deg); -ms-transform: rotateY(5deg); transform: rotateY(5deg) ; opacity: 0.8; pointer-events: none } /* translateX(-200px) scale(0.95)*/
/* SIDEBAR */
.sidebar-container { width: 100%; height: 100%; overflow: hidden; position: absolute; }
.sidebar { background-color: #212121; position: absolute; right: -1200px; height: 100%; width: 1200px; } /*box-shadow: inset 0px 0px 10px #000*/
.sidebar .content { margin: 30px; font-family: "Segoe UI Light", "Segoe UI", "Helvetica Neue"; color: white; width: 375px; height: 300px; font-weight: 200 }
.sidebar h1, .sidebar h2 { font-weight: lighter; }
.sidebar .button { margin: 0px; display: inline-block; }
/* FIELDS */
.sidebar .fields { padding: 0px; list-style-type: none; width: 355px; }
.sidebar .fields > li, .sidebar .fields .settings-owned > li { margin-bottom: 30px }
.sidebar .fields > li:after, .sidebar .fields .settings-owned > li:after { clear: both; content: ''; display: block }
.sidebar .fields label {
font-family: Consolas, monospace; text-transform: uppercase; font-size: 13px; color: #ACACAC; display: inline-block; margin-bottom: 10px;
vertical-align: text-bottom; margin-right: 10px;
}
.sidebar .fields label small { font-weight: normal; color: white; text-transform: none; }
.sidebar .fields .text { background-color: black; border: 0px; padding: 10px; color: white; -webkit-border-radius: 3px; -moz-border-radius: 3px; -o-border-radius: 3px; -ms-border-radius: 3px; border-radius: 3px ; width: 250px; font-family: Consolas, monospace; }
.sidebar .fields .text.long { width: 330px; font-size: 72%; }
.sidebar .fields .disabled { color: #AAA; background-color: #3B3B3B; }
.sidebar .fields .text-num { width: 30px; text-align: right; padding-right: 30px; }
.sidebar .fields .text-post { color: white; font-family: Consolas, monospace; display: inline-block; font-size: 13px; margin-left: -25px; width: 25px; }
/* Select */
.sidebar .fields select {
width: 225px; background-color: #3B3B3B; color: white; font-family: Consolas, monospace; -webkit-appearance: none; -moz-appearance: none; -o-appearance: none; -ms-appearance: none; appearance: none ;
padding: 5px; padding-right: 25px; border: 0px; -webkit-border-radius: 3px; -moz-border-radius: 3px; -o-border-radius: 3px; -ms-border-radius: 3px; border-radius: 3px ; height: 35px; vertical-align: 1px; -webkit-box-shadow: 0px 1px 2px rgba(0,0,0,0.5); -moz-box-shadow: 0px 1px 2px rgba(0,0,0,0.5); -o-box-shadow: 0px 1px 2px rgba(0,0,0,0.5); -ms-box-shadow: 0px 1px 2px rgba(0,0,0,0.5); box-shadow: 0px 1px 2px rgba(0,0,0,0.5) ;
}
.sidebar .fields .select-down { margin-left: -39px; width: 34px; display: inline-block; -webkit-transform: rotateZ(90deg); -moz-transform: rotateZ(90deg); -o-transform: rotateZ(90deg); -ms-transform: rotateZ(90deg); transform: rotateZ(90deg) ; height: 35px; vertical-align: -8px; pointer-events: none; font-weight: bold }
/* Checkbox */
.sidebar .fields .checkbox { width: 50px; height: 24px; position: relative; z-index: 999; opacity: 0; }
.sidebar .fields .checkbox-skin { background-color: #CCC; width: 50px; height: 24px; -webkit-border-radius: 15px; -moz-border-radius: 15px; -o-border-radius: 15px; -ms-border-radius: 15px; border-radius: 15px ; -webkit-transition: all 0.3s ease-in-out; -moz-transition: all 0.3s ease-in-out; -o-transition: all 0.3s ease-in-out; -ms-transition: all 0.3s ease-in-out; transition: all 0.3s ease-in-out ; display: inline-block; margin-left: -59px; }
.sidebar .fields .checkbox-skin:before {
content: ""; position: relative; width: 20px; background-color: white; height: 20px; display: block; -webkit-border-radius: 100%; -moz-border-radius: 100%; -o-border-radius: 100%; -ms-border-radius: 100%; border-radius: 100% ; margin-top: 2px; margin-left: 2px;
-webkit-transition: all 0.5s cubic-bezier(0.785, 0.135, 0.15, 0.86); -moz-transition: all 0.5s cubic-bezier(0.785, 0.135, 0.15, 0.86); -o-transition: all 0.5s cubic-bezier(0.785, 0.135, 0.15, 0.86); -ms-transition: all 0.5s cubic-bezier(0.785, 0.135, 0.15, 0.86); transition: all 0.5s cubic-bezier(0.785, 0.135, 0.15, 0.86) ;
}
.sidebar .fields .checkbox:checked ~ .checkbox-skin:before { margin-left: 27px; }
.sidebar .fields .checkbox:checked ~ .checkbox-skin { background-color: #2ECC71; }
/* Fake input */
.sidebar .input { font-size: 13px; width: 250px; display: inline-block; overflow: hidden; text-overflow: ellipsis; vertical-align: top }
/* GRAPH */
.graph { padding: 0px; list-style-type: none; width: 351px; background-color: black; height: 10px; -webkit-border-radius: 8px; -moz-border-radius: 8px; -o-border-radius: 8px; -ms-border-radius: 8px; border-radius: 8px ; overflow: hidden; position: relative;}
.graph li { height: 100%; position: absolute; -webkit-transition: all 0.3s; -moz-transition: all 0.3s; -o-transition: all 0.3s; -ms-transition: all 0.3s; transition: all 0.3s ; }
.graph-stacked li { position: static; float: left; }
.graph-legend { padding: 0px; list-style-type: none; margin-top: 13px; font-family: Consolas, "Andale Mono", monospace; font-size: 13px; text-transform: capitalize; }
.sidebar .graph-legend li { margin: 0px; margin-top: 5px; margin-left: 0px; width: 160px; float: left; position: relative; }
.sidebar .graph-legend li:nth-child(odd) { margin-right: 29px }
.graph-legend span { position: absolute; }
.graph-legend b { text-align: right; display: inline-block; width: 50px; float: right; font-weight: normal; }
.graph-legend li:before { content: '\2022'; font-size: 23px; line-height: 0px; vertical-align: -3px; margin-right: 5px; }
/* COLORS */
.back-green { background-color: #2ECC71 }
.color-green:before { color: #2ECC71 }
.back-blue { background-color: #3BAFDA }
.color-blue:before { color: #3BAFDA }
.back-darkblue { background-color: #2196F3 }
.color-darkblue:before { color: #2196F3 }
.back-purple { background-color: #B10DC9 }
.color-purple:before { color: #B10DC9 }
.back-yellow { background-color: #FFDC00 }
.color-yellow:before { color: #FFDC00 }
.back-orange { background-color: #FF9800 }
.color-orange:before { color: #FF9800 }
.back-gray { background-color: #ECF0F1 }
.color-gray:before { color: #ECF0F1 }
.back-black { background-color: #34495E }
.color-black:before { color: #34495E }
.back-white { background-color: #EEE }
.color-white:before { color: #EEE }
/* Settings owned */
.owned-title { float: left }
#checkbox-owned { margin-bottom: 25px; margin-top: 26px; margin-left: 11px; }
#checkbox-owned ~ .settings-owned { opacity: 0; max-height: 0px; -webkit-transition: all 0.3s linear; -moz-transition: all 0.3s linear; -o-transition: all 0.3s linear; -ms-transition: all 0.3s linear; transition: all 0.3s linear ; overflow: hidden }
#checkbox-owned:checked ~ .settings-owned { opacity: 1; max-height: 400px }
/* Globe */
.globe { width: 360px; height: 360px }
.globe.loading { background: url(/uimedia/img/loading-circle.gif) center center no-repeat }

View file

@ -1,913 +0,0 @@
/* ---- plugins/Sidebar/media/Class.coffee ---- */
(function() {
var Class,
__slice = [].slice;
Class = (function() {
function Class() {}
Class.prototype.trace = true;
Class.prototype.log = function() {
var args;
args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
if (!this.trace) {
return;
}
if (typeof console === 'undefined') {
return;
}
args.unshift("[" + this.constructor.name + "]");
console.log.apply(console, args);
return this;
};
Class.prototype.logStart = function() {
var args, name;
name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
if (!this.trace) {
return;
}
this.logtimers || (this.logtimers = {});
this.logtimers[name] = +(new Date);
if (args.length > 0) {
this.log.apply(this, ["" + name].concat(__slice.call(args), ["(started)"]));
}
return this;
};
Class.prototype.logEnd = function() {
var args, ms, name;
name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
ms = +(new Date) - this.logtimers[name];
this.log.apply(this, ["" + name].concat(__slice.call(args), ["(Done in " + ms + "ms)"]));
return this;
};
return Class;
})();
window.Class = Class;
}).call(this);
/* ---- plugins/Sidebar/media/Scrollable.js ---- */
/* via http://jsfiddle.net/elGrecode/00dgurnn/ */
window.initScrollable = function () {
var scrollContainer = document.querySelector('.scrollable'),
scrollContentWrapper = document.querySelector('.scrollable .content-wrapper'),
scrollContent = document.querySelector('.scrollable .content'),
contentPosition = 0,
scrollerBeingDragged = false,
scroller,
topPosition,
scrollerHeight;
function calculateScrollerHeight() {
// *Calculation of how tall scroller should be
var visibleRatio = scrollContainer.offsetHeight / scrollContentWrapper.scrollHeight;
if (visibleRatio == 1)
scroller.style.display = "none";
else
scroller.style.display = "block";
return visibleRatio * scrollContainer.offsetHeight;
}
function moveScroller(evt) {
// Move Scroll bar to top offset
var scrollPercentage = evt.target.scrollTop / scrollContentWrapper.scrollHeight;
topPosition = scrollPercentage * (scrollContainer.offsetHeight - 5); // 5px arbitrary offset so scroll bar doesn't move too far beyond content wrapper bounding box
scroller.style.top = topPosition + 'px';
}
function startDrag(evt) {
normalizedPosition = evt.pageY;
contentPosition = scrollContentWrapper.scrollTop;
scrollerBeingDragged = true;
window.addEventListener('mousemove', scrollBarScroll);
return false;
}
function stopDrag(evt) {
scrollerBeingDragged = false;
window.removeEventListener('mousemove', scrollBarScroll);
}
function scrollBarScroll(evt) {
if (scrollerBeingDragged === true) {
evt.preventDefault();
var mouseDifferential = evt.pageY - normalizedPosition;
var scrollEquivalent = mouseDifferential * (scrollContentWrapper.scrollHeight / scrollContainer.offsetHeight);
scrollContentWrapper.scrollTop = contentPosition + scrollEquivalent;
}
}
function updateHeight() {
scrollerHeight = calculateScrollerHeight() - 10;
scroller.style.height = scrollerHeight + 'px';
}
function createScroller() {
// *Creates scroller element and appends to '.scrollable' div
// create scroller element
scroller = document.createElement("div");
scroller.className = 'scroller';
// determine how big scroller should be based on content
scrollerHeight = calculateScrollerHeight() - 10;
if (scrollerHeight / scrollContainer.offsetHeight < 1) {
// *If there is a need to have scroll bar based on content size
scroller.style.height = scrollerHeight + 'px';
// append scroller to scrollContainer div
scrollContainer.appendChild(scroller);
// show scroll path divot
scrollContainer.className += ' showScroll';
// attach related draggable listeners
scroller.addEventListener('mousedown', startDrag);
window.addEventListener('mouseup', stopDrag);
}
}
createScroller();
// *** Listeners ***
scrollContentWrapper.addEventListener('scroll', moveScroller);
return updateHeight;
};
/* ---- plugins/Sidebar/media/Sidebar.coffee ---- */
(function() {
var Sidebar,
__bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
__hasProp = {}.hasOwnProperty;
Sidebar = (function(_super) {
__extends(Sidebar, _super);
function Sidebar() {
this.unloadGlobe = __bind(this.unloadGlobe, this);
this.displayGlobe = __bind(this.displayGlobe, this);
this.loadGlobe = __bind(this.loadGlobe, this);
this.animDrag = __bind(this.animDrag, this);
this.waitMove = __bind(this.waitMove, this);
this.resized = __bind(this.resized, this);
this.tag = null;
this.container = null;
this.opened = false;
this.width = 410;
this.fixbutton = $(".fixbutton");
this.fixbutton_addx = 0;
this.fixbutton_initx = 0;
this.fixbutton_targetx = 0;
this.page_width = $(window).width();
this.frame = $("#inner-iframe");
this.initFixbutton();
this.dragStarted = 0;
this.globe = null;
this.original_set_site_info = wrapper.setSiteInfo;
if (false) {
this.startDrag();
this.moved();
this.fixbutton_targetx = this.fixbutton_initx - this.width;
this.stopDrag();
}
}
Sidebar.prototype.initFixbutton = function() {
this.fixbutton.on("mousedown", (function(_this) {
return function(e) {
e.preventDefault();
_this.fixbutton.off("click");
_this.fixbutton.off("mousemove");
_this.dragStarted = +(new Date);
return _this.fixbutton.one("mousemove", function(e) {
_this.fixbutton_addx = _this.fixbutton.offset().left - e.pageX;
return _this.startDrag();
});
};
})(this));
this.fixbutton.parent().on("click", (function(_this) {
return function(e) {
return _this.stopDrag();
};
})(this));
this.resized();
return $(window).on("resize", this.resized);
};
Sidebar.prototype.resized = function() {
this.page_width = $(window).width();
this.fixbutton_initx = this.page_width - 75;
if (this.opened) {
return this.fixbutton.css({
left: this.fixbutton_initx - this.width
});
} else {
return this.fixbutton.css({
left: this.fixbutton_initx
});
}
};
Sidebar.prototype.startDrag = function() {
this.log("startDrag");
this.fixbutton_targetx = this.fixbutton_initx;
this.fixbutton.addClass("dragging");
$("<div class='drag-bg'></div>").appendTo(document.body);
if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) {
this.fixbutton.css("pointer-events", "none");
}
this.fixbutton.one("click", (function(_this) {
return function(e) {
_this.stopDrag();
_this.fixbutton.removeClass("dragging");
if (Math.abs(_this.fixbutton.offset().left - _this.fixbutton_initx) > 5) {
return e.preventDefault();
}
};
})(this));
this.fixbutton.parents().on("mousemove", this.animDrag);
this.fixbutton.parents().on("mousemove", this.waitMove);
return this.fixbutton.parents().on("mouseup", (function(_this) {
return function(e) {
e.preventDefault();
return _this.stopDrag();
};
})(this));
};
Sidebar.prototype.waitMove = function(e) {
if (Math.abs(this.fixbutton.offset().left - this.fixbutton_targetx) > 10 && (+(new Date)) - this.dragStarted > 100) {
this.moved();
return this.fixbutton.parents().off("mousemove", this.waitMove);
}
};
Sidebar.prototype.moved = function() {
this.log("Moved");
this.createHtmltag();
$(document.body).css("perspective", "1000px").addClass("body-sidebar");
$(window).off("resize");
$(window).on("resize", (function(_this) {
return function() {
$(document.body).css("height", $(window).height());
_this.scrollable();
return _this.resized();
};
})(this));
$(window).trigger("resize");
return wrapper.setSiteInfo = (function(_this) {
return function(site_info) {
_this.setSiteInfo(site_info);
return _this.original_set_site_info.apply(wrapper, arguments);
};
})(this);
};
Sidebar.prototype.setSiteInfo = function(site_info) {
this.updateHtmlTag();
return this.displayGlobe();
};
Sidebar.prototype.createHtmltag = function() {
if (!this.container) {
this.container = $("<div class=\"sidebar-container\"><div class=\"sidebar scrollable\"><div class=\"content-wrapper\"><div class=\"content\">\n</div></div></div></div>");
this.container.appendTo(document.body);
this.tag = this.container.find(".sidebar");
this.updateHtmlTag();
return this.scrollable = window.initScrollable();
}
};
Sidebar.prototype.updateHtmlTag = function() {
return wrapper.ws.cmd("sidebarGetHtmlTag", {}, (function(_this) {
return function(res) {
if (_this.tag.find(".content").children().length === 0) {
_this.log("Creating content");
morphdom(_this.tag.find(".content")[0], '<div class="content">' + res + '</div>');
return _this.scrollable();
} else {
_this.log("Patching content");
return morphdom(_this.tag.find(".content")[0], '<div class="content">' + res + '</div>', {
onBeforeMorphEl: function(from_el, to_el) {
if (from_el.className === "globe") {
return false;
} else {
return true;
}
}
});
}
};
})(this));
};
Sidebar.prototype.animDrag = function(e) {
var mousex, overdrag, overdrag_percent, targetx;
mousex = e.pageX;
overdrag = this.fixbutton_initx - this.width - mousex;
if (overdrag > 0) {
overdrag_percent = 1 + overdrag / 300;
mousex = (e.pageX + (this.fixbutton_initx - this.width) * overdrag_percent) / (1 + overdrag_percent);
}
targetx = this.fixbutton_initx - mousex - this.fixbutton_addx;
this.fixbutton.offset({
left: mousex + this.fixbutton_addx
});
if (this.tag) {
this.tag.css("transform", "translateX(" + (0 - targetx) + "px)");
}
if ((!this.opened && targetx > this.width / 3) || (this.opened && targetx > this.width * 0.9)) {
return this.fixbutton_targetx = this.fixbutton_initx - this.width;
} else {
return this.fixbutton_targetx = this.fixbutton_initx;
}
};
Sidebar.prototype.stopDrag = function() {
var targetx;
this.fixbutton.parents().off("mousemove");
this.fixbutton.off("mousemove");
this.fixbutton.css("pointer-events", "");
$(".drag-bg").remove();
if (!this.fixbutton.hasClass("dragging")) {
return;
}
this.fixbutton.removeClass("dragging");
if (this.fixbutton_targetx !== this.fixbutton.offset().left) {
this.fixbutton.stop().animate({
"left": this.fixbutton_targetx
}, 500, "easeOutBack", (function(_this) {
return function() {
if (_this.fixbutton_targetx === _this.fixbutton_initx) {
_this.fixbutton.css("left", "auto");
} else {
_this.fixbutton.css("left", _this.fixbutton_targetx);
}
return $(".fixbutton-bg").trigger("mouseout");
};
})(this));
if (this.fixbutton_targetx === this.fixbutton_initx) {
targetx = 0;
this.opened = false;
} else {
targetx = this.width;
if (!this.opened) {
this.onOpened();
}
this.opened = true;
}
this.tag.css("transition", "0.4s ease-out");
this.tag.css("transform", "translateX(-" + targetx + "px)").one(transitionEnd, (function(_this) {
return function() {
_this.tag.css("transition", "");
if (!_this.opened) {
_this.container.remove();
_this.container = null;
_this.tag.remove();
return _this.tag = null;
}
};
})(this));
this.log("stopdrag", "opened:", this.opened);
if (!this.opened) {
return this.onClosed();
}
}
};
Sidebar.prototype.onOpened = function() {
this.log("Opened");
this.scrollable();
this.tag.find("#checkbox-owned").off("click").on("click", (function(_this) {
return function() {
return setTimeout((function() {
return _this.scrollable();
}), 300);
};
})(this));
this.tag.find("#button-sitelimit").on("click", (function(_this) {
return function() {
wrapper.ws.cmd("siteSetLimit", $("#input-sitelimit").val(), function() {
wrapper.notifications.add("done-sitelimit", "done", "Site storage limit modified!", 5000);
return _this.updateHtmlTag();
});
return false;
};
})(this));
this.tag.find("#checkbox-owned").on("click", (function(_this) {
return function() {
return wrapper.ws.cmd("siteSetOwned", [_this.tag.find("#checkbox-owned").is(":checked")]);
};
})(this));
this.tag.find("#checkbox-autodownloadoptional").on("click", (function(_this) {
return function() {
return wrapper.ws.cmd("siteSetAutodownloadoptional", [_this.tag.find("#checkbox-autodownloadoptional").is(":checked")]);
};
})(this));
this.tag.find("#button-identity").on("click", (function(_this) {
return function() {
wrapper.ws.cmd("certSelect");
return false;
};
})(this));
this.tag.find("#checkbox-owned").on("click", (function(_this) {
return function() {
return wrapper.ws.cmd("siteSetOwned", [_this.tag.find("#checkbox-owned").is(":checked")]);
};
})(this));
this.tag.find("#button-settings").on("click", (function(_this) {
return function() {
wrapper.ws.cmd("fileGet", "content.json", function(res) {
var data, json_raw;
data = JSON.parse(res);
data["title"] = $("#settings-title").val();
data["description"] = $("#settings-description").val();
json_raw = unescape(encodeURIComponent(JSON.stringify(data, void 0, '\t')));
return wrapper.ws.cmd("fileWrite", ["content.json", btoa(json_raw)], function(res) {
if (res !== "ok") {
return wrapper.notifications.add("file-write", "error", "File write error: " + res);
} else {
wrapper.notifications.add("file-write", "done", "Site settings saved!", 5000);
return _this.updateHtmlTag();
}
});
});
return false;
};
})(this));
this.tag.find("#button-sign").on("click", (function(_this) {
return function() {
var inner_path;
inner_path = _this.tag.find("#select-contents").val();
if (wrapper.site_info.privatekey) {
wrapper.ws.cmd("siteSign", ["stored", inner_path], function(res) {
return wrapper.notifications.add("sign", "done", inner_path + " Signed!", 5000);
});
} else {
wrapper.displayPrompt("Enter your private key:", "password", "Sign", function(privatekey) {
return wrapper.ws.cmd("siteSign", [privatekey, inner_path], function(res) {
if (res === "ok") {
return wrapper.notifications.add("sign", "done", inner_path + " Signed!", 5000);
}
});
});
}
return false;
};
})(this));
this.tag.find("#button-publish").on("click", (function(_this) {
return function() {
var inner_path;
inner_path = _this.tag.find("#select-contents").val();
_this.tag.find("#button-publish").addClass("loading");
return wrapper.ws.cmd("sitePublish", {
"inner_path": inner_path,
"sign": false
}, function() {
return _this.tag.find("#button-publish").removeClass("loading");
});
};
})(this));
return this.loadGlobe();
};
Sidebar.prototype.onClosed = function() {
$(window).off("resize");
$(window).on("resize", this.resized);
$(document.body).css("transition", "0.6s ease-in-out").removeClass("body-sidebar").on(transitionEnd, (function(_this) {
return function(e) {
if (e.target === document.body) {
$(document.body).css("height", "auto").css("perspective", "").css("transition", "").off(transitionEnd);
return _this.unloadGlobe();
}
};
})(this));
return wrapper.setSiteInfo = this.original_set_site_info;
};
Sidebar.prototype.loadGlobe = function() {
if (this.tag.find(".globe").hasClass("loading")) {
return setTimeout(((function(_this) {
return function() {
if (typeof DAT === "undefined") {
return $.getScript("/uimedia/globe/all.js", _this.displayGlobe);
} else {
return _this.displayGlobe();
}
};
})(this)), 600);
}
};
Sidebar.prototype.displayGlobe = function() {
return wrapper.ws.cmd("sidebarGetPeers", [], (function(_this) {
return function(globe_data) {
if (_this.globe) {
_this.globe.scene.remove(_this.globe.points);
_this.globe.addData(globe_data, {
format: 'magnitude',
name: "hello",
animated: false
});
_this.globe.createPoints();
} else {
_this.globe = new DAT.Globe(_this.tag.find(".globe")[0], {
"imgDir": "/uimedia/globe/"
});
_this.globe.addData(globe_data, {
format: 'magnitude',
name: "hello"
});
_this.globe.createPoints();
_this.globe.animate();
}
return _this.tag.find(".globe").removeClass("loading");
};
})(this));
};
Sidebar.prototype.unloadGlobe = function() {
if (!this.globe) {
return false;
}
this.globe.unload();
return this.globe = null;
};
return Sidebar;
})(Class);
window.sidebar = new Sidebar();
window.transitionEnd = 'transitionend webkitTransitionEnd oTransitionEnd otransitionend';
}).call(this);
/* ---- plugins/Sidebar/media/morphdom.js ---- */
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.morphdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var specialElHandlers = {
/**
* Needed for IE. Apparently IE doesn't think
* that "selected" is an attribute when reading
* over the attributes using selectEl.attributes
*/
OPTION: function(fromEl, toEl) {
if ((fromEl.selected = toEl.selected)) {
fromEl.setAttribute('selected', '');
} else {
fromEl.removeAttribute('selected', '');
}
},
/**
* The "value" attribute is special for the <input> element
* since it sets the initial value. Changing the "value"
* attribute without changing the "value" property will have
* no effect since it is only used to the set the initial value.
* Similar for the "checked" attribute.
*/
/*INPUT: function(fromEl, toEl) {
fromEl.checked = toEl.checked;
fromEl.value = toEl.value;
if (!toEl.hasAttribute('checked')) {
fromEl.removeAttribute('checked');
}
if (!toEl.hasAttribute('value')) {
fromEl.removeAttribute('value');
}
}*/
};
function noop() {}
/**
* Loop over all of the attributes on the target node and make sure the
* original DOM node has the same attributes. If an attribute
* found on the original node is not on the new node then remove it from
* the original node
* @param {HTMLElement} fromNode
* @param {HTMLElement} toNode
*/
function morphAttrs(fromNode, toNode) {
var attrs = toNode.attributes;
var i;
var attr;
var attrName;
var attrValue;
var foundAttrs = {};
for (i=attrs.length-1; i>=0; i--) {
attr = attrs[i];
if (attr.specified !== false) {
attrName = attr.name;
attrValue = attr.value;
foundAttrs[attrName] = true;
if (fromNode.getAttribute(attrName) !== attrValue) {
fromNode.setAttribute(attrName, attrValue);
}
}
}
// Delete any extra attributes found on the original DOM element that weren't
// found on the target element.
attrs = fromNode.attributes;
for (i=attrs.length-1; i>=0; i--) {
attr = attrs[i];
if (attr.specified !== false) {
attrName = attr.name;
if (!foundAttrs.hasOwnProperty(attrName)) {
fromNode.removeAttribute(attrName);
}
}
}
}
/**
* Copies the children of one DOM element to another DOM element
*/
function moveChildren(from, to) {
var curChild = from.firstChild;
while(curChild) {
var nextChild = curChild.nextSibling;
to.appendChild(curChild);
curChild = nextChild;
}
return to;
}
function morphdom(fromNode, toNode, options) {
if (!options) {
options = {};
}
if (typeof toNode === 'string') {
var newBodyEl = document.createElement('body');
newBodyEl.innerHTML = toNode;
toNode = newBodyEl.childNodes[0];
}
var savedEls = {}; // Used to save off DOM elements with IDs
var unmatchedEls = {};
var onNodeDiscarded = options.onNodeDiscarded || noop;
var onBeforeMorphEl = options.onBeforeMorphEl || noop;
var onBeforeMorphElChildren = options.onBeforeMorphElChildren || noop;
function removeNodeHelper(node, nestedInSavedEl) {
var id = node.id;
// If the node has an ID then save it off since we will want
// to reuse it in case the target DOM tree has a DOM element
// with the same ID
if (id) {
savedEls[id] = node;
} else if (!nestedInSavedEl) {
// If we are not nested in a saved element then we know that this node has been
// completely discarded and will not exist in the final DOM.
onNodeDiscarded(node);
}
if (node.nodeType === 1) {
var curChild = node.firstChild;
while(curChild) {
removeNodeHelper(curChild, nestedInSavedEl || id);
curChild = curChild.nextSibling;
}
}
}
function walkDiscardedChildNodes(node) {
if (node.nodeType === 1) {
var curChild = node.firstChild;
while(curChild) {
if (!curChild.id) {
// We only want to handle nodes that don't have an ID to avoid double
// walking the same saved element.
onNodeDiscarded(curChild);
// Walk recursively
walkDiscardedChildNodes(curChild);
}
curChild = curChild.nextSibling;
}
}
}
function removeNode(node, parentNode, alreadyVisited) {
parentNode.removeChild(node);
if (alreadyVisited) {
if (!node.id) {
onNodeDiscarded(node);
walkDiscardedChildNodes(node);
}
} else {
removeNodeHelper(node);
}
}
function morphEl(fromNode, toNode, alreadyVisited) {
if (toNode.id) {
// If an element with an ID is being morphed then it is will be in the final
// DOM so clear it out of the saved elements collection
delete savedEls[toNode.id];
}
if (onBeforeMorphEl(fromNode, toNode) === false) {
return;
}
morphAttrs(fromNode, toNode);
if (onBeforeMorphElChildren(fromNode, toNode) === false) {
return;
}
var curToNodeChild = toNode.firstChild;
var curFromNodeChild = fromNode.firstChild;
var curToNodeId;
var fromNextSibling;
var toNextSibling;
var savedEl;
var unmatchedEl;
outer: while(curToNodeChild) {
toNextSibling = curToNodeChild.nextSibling;
curToNodeId = curToNodeChild.id;
while(curFromNodeChild) {
var curFromNodeId = curFromNodeChild.id;
fromNextSibling = curFromNodeChild.nextSibling;
if (!alreadyVisited) {
if (curFromNodeId && (unmatchedEl = unmatchedEls[curFromNodeId])) {
unmatchedEl.parentNode.replaceChild(curFromNodeChild, unmatchedEl);
morphEl(curFromNodeChild, unmatchedEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
continue;
}
}
var curFromNodeType = curFromNodeChild.nodeType;
if (curFromNodeType === curToNodeChild.nodeType) {
var isCompatible = false;
if (curFromNodeType === 1) { // Both nodes being compared are Element nodes
if (curFromNodeChild.tagName === curToNodeChild.tagName) {
// We have compatible DOM elements
if (curFromNodeId || curToNodeId) {
// If either DOM element has an ID then we handle
// those differently since we want to match up
// by ID
if (curToNodeId === curFromNodeId) {
isCompatible = true;
}
} else {
isCompatible = true;
}
}
if (isCompatible) {
// We found compatible DOM elements so add a
// task to morph the compatible DOM elements
morphEl(curFromNodeChild, curToNodeChild, alreadyVisited);
}
} else if (curFromNodeType === 3) { // Both nodes being compared are Text nodes
isCompatible = true;
curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
}
if (isCompatible) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
}
// No compatible match so remove the old node from the DOM
removeNode(curFromNodeChild, fromNode, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
if (curToNodeId) {
if ((savedEl = savedEls[curToNodeId])) {
morphEl(savedEl, curToNodeChild, true);
curToNodeChild = savedEl; // We want to append the saved element instead
} else {
// The current DOM element in the target tree has an ID
// but we did not find a match in any of the corresponding
// siblings. We just put the target element in the old DOM tree
// but if we later find an element in the old DOM tree that has
// a matching ID then we will replace the target element
// with the corresponding old element and morph the old element
unmatchedEls[curToNodeId] = curToNodeChild;
}
}
// If we got this far then we did not find a candidate match for our "to node"
// and we exhausted all of the children "from" nodes. Therefore, we will just
// append the current "to node" to the end
fromNode.appendChild(curToNodeChild);
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
}
// We have processed all of the "to nodes". If curFromNodeChild is non-null then
// we still have some from nodes left over that need to be removed
while(curFromNodeChild) {
fromNextSibling = curFromNodeChild.nextSibling;
removeNode(curFromNodeChild, fromNode, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
var specialElHandler = specialElHandlers[fromNode.tagName];
if (specialElHandler) {
specialElHandler(fromNode, toNode);
}
}
var morphedNode = fromNode;
var morphedNodeType = morphedNode.nodeType;
var toNodeType = toNode.nodeType;
// Handle the case where we are given two DOM nodes that are not
// compatible (e.g. <div> --> <span> or <div> --> TEXT)
if (morphedNodeType === 1) {
if (toNodeType === 1) {
if (morphedNode.tagName !== toNode.tagName) {
onNodeDiscarded(fromNode);
morphedNode = moveChildren(morphedNode, document.createElement(toNode.tagName));
}
} else {
// Going from an element node to a text node
return toNode;
}
} else if (morphedNodeType === 3) { // Text node
if (toNodeType === 3) {
morphedNode.nodeValue = toNode.nodeValue;
return morphedNode;
} else {
onNodeDiscarded(fromNode);
// Text node to something else
return toNode;
}
}
morphEl(morphedNode, toNode, false);
// Fire the "onNodeDiscarded" event for any saved elements
// that never found a new home in the morphed DOM
for (var savedElId in savedEls) {
if (savedEls.hasOwnProperty(savedElId)) {
var savedEl = savedEls[savedElId];
onNodeDiscarded(savedEl);
walkDiscardedChildNodes(savedEl);
}
}
if (morphedNode !== fromNode && fromNode.parentNode) {
fromNode.parentNode.replaceChild(morphedNode, fromNode);
}
return morphedNode;
}
module.exports = morphdom;
},{}]},{},[1])(1)
});

View file

@ -1,340 +0,0 @@
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.morphdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
var specialElHandlers = {
/**
* Needed for IE. Apparently IE doesn't think
* that "selected" is an attribute when reading
* over the attributes using selectEl.attributes
*/
OPTION: function(fromEl, toEl) {
if ((fromEl.selected = toEl.selected)) {
fromEl.setAttribute('selected', '');
} else {
fromEl.removeAttribute('selected', '');
}
},
/**
* The "value" attribute is special for the <input> element
* since it sets the initial value. Changing the "value"
* attribute without changing the "value" property will have
* no effect since it is only used to the set the initial value.
* Similar for the "checked" attribute.
*/
/*INPUT: function(fromEl, toEl) {
fromEl.checked = toEl.checked;
fromEl.value = toEl.value;
if (!toEl.hasAttribute('checked')) {
fromEl.removeAttribute('checked');
}
if (!toEl.hasAttribute('value')) {
fromEl.removeAttribute('value');
}
}*/
};
function noop() {}
/**
* Loop over all of the attributes on the target node and make sure the
* original DOM node has the same attributes. If an attribute
* found on the original node is not on the new node then remove it from
* the original node
* @param {HTMLElement} fromNode
* @param {HTMLElement} toNode
*/
function morphAttrs(fromNode, toNode) {
var attrs = toNode.attributes;
var i;
var attr;
var attrName;
var attrValue;
var foundAttrs = {};
for (i=attrs.length-1; i>=0; i--) {
attr = attrs[i];
if (attr.specified !== false) {
attrName = attr.name;
attrValue = attr.value;
foundAttrs[attrName] = true;
if (fromNode.getAttribute(attrName) !== attrValue) {
fromNode.setAttribute(attrName, attrValue);
}
}
}
// Delete any extra attributes found on the original DOM element that weren't
// found on the target element.
attrs = fromNode.attributes;
for (i=attrs.length-1; i>=0; i--) {
attr = attrs[i];
if (attr.specified !== false) {
attrName = attr.name;
if (!foundAttrs.hasOwnProperty(attrName)) {
fromNode.removeAttribute(attrName);
}
}
}
}
/**
* Copies the children of one DOM element to another DOM element
*/
function moveChildren(from, to) {
var curChild = from.firstChild;
while(curChild) {
var nextChild = curChild.nextSibling;
to.appendChild(curChild);
curChild = nextChild;
}
return to;
}
function morphdom(fromNode, toNode, options) {
if (!options) {
options = {};
}
if (typeof toNode === 'string') {
var newBodyEl = document.createElement('body');
newBodyEl.innerHTML = toNode;
toNode = newBodyEl.childNodes[0];
}
var savedEls = {}; // Used to save off DOM elements with IDs
var unmatchedEls = {};
var onNodeDiscarded = options.onNodeDiscarded || noop;
var onBeforeMorphEl = options.onBeforeMorphEl || noop;
var onBeforeMorphElChildren = options.onBeforeMorphElChildren || noop;
function removeNodeHelper(node, nestedInSavedEl) {
var id = node.id;
// If the node has an ID then save it off since we will want
// to reuse it in case the target DOM tree has a DOM element
// with the same ID
if (id) {
savedEls[id] = node;
} else if (!nestedInSavedEl) {
// If we are not nested in a saved element then we know that this node has been
// completely discarded and will not exist in the final DOM.
onNodeDiscarded(node);
}
if (node.nodeType === 1) {
var curChild = node.firstChild;
while(curChild) {
removeNodeHelper(curChild, nestedInSavedEl || id);
curChild = curChild.nextSibling;
}
}
}
function walkDiscardedChildNodes(node) {
if (node.nodeType === 1) {
var curChild = node.firstChild;
while(curChild) {
if (!curChild.id) {
// We only want to handle nodes that don't have an ID to avoid double
// walking the same saved element.
onNodeDiscarded(curChild);
// Walk recursively
walkDiscardedChildNodes(curChild);
}
curChild = curChild.nextSibling;
}
}
}
function removeNode(node, parentNode, alreadyVisited) {
parentNode.removeChild(node);
if (alreadyVisited) {
if (!node.id) {
onNodeDiscarded(node);
walkDiscardedChildNodes(node);
}
} else {
removeNodeHelper(node);
}
}
function morphEl(fromNode, toNode, alreadyVisited) {
if (toNode.id) {
// If an element with an ID is being morphed then it is will be in the final
// DOM so clear it out of the saved elements collection
delete savedEls[toNode.id];
}
if (onBeforeMorphEl(fromNode, toNode) === false) {
return;
}
morphAttrs(fromNode, toNode);
if (onBeforeMorphElChildren(fromNode, toNode) === false) {
return;
}
var curToNodeChild = toNode.firstChild;
var curFromNodeChild = fromNode.firstChild;
var curToNodeId;
var fromNextSibling;
var toNextSibling;
var savedEl;
var unmatchedEl;
outer: while(curToNodeChild) {
toNextSibling = curToNodeChild.nextSibling;
curToNodeId = curToNodeChild.id;
while(curFromNodeChild) {
var curFromNodeId = curFromNodeChild.id;
fromNextSibling = curFromNodeChild.nextSibling;
if (!alreadyVisited) {
if (curFromNodeId && (unmatchedEl = unmatchedEls[curFromNodeId])) {
unmatchedEl.parentNode.replaceChild(curFromNodeChild, unmatchedEl);
morphEl(curFromNodeChild, unmatchedEl, alreadyVisited);
curFromNodeChild = fromNextSibling;
continue;
}
}
var curFromNodeType = curFromNodeChild.nodeType;
if (curFromNodeType === curToNodeChild.nodeType) {
var isCompatible = false;
if (curFromNodeType === 1) { // Both nodes being compared are Element nodes
if (curFromNodeChild.tagName === curToNodeChild.tagName) {
// We have compatible DOM elements
if (curFromNodeId || curToNodeId) {
// If either DOM element has an ID then we handle
// those differently since we want to match up
// by ID
if (curToNodeId === curFromNodeId) {
isCompatible = true;
}
} else {
isCompatible = true;
}
}
if (isCompatible) {
// We found compatible DOM elements so add a
// task to morph the compatible DOM elements
morphEl(curFromNodeChild, curToNodeChild, alreadyVisited);
}
} else if (curFromNodeType === 3) { // Both nodes being compared are Text nodes
isCompatible = true;
curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
}
if (isCompatible) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
}
// No compatible match so remove the old node from the DOM
removeNode(curFromNodeChild, fromNode, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
if (curToNodeId) {
if ((savedEl = savedEls[curToNodeId])) {
morphEl(savedEl, curToNodeChild, true);
curToNodeChild = savedEl; // We want to append the saved element instead
} else {
// The current DOM element in the target tree has an ID
// but we did not find a match in any of the corresponding
// siblings. We just put the target element in the old DOM tree
// but if we later find an element in the old DOM tree that has
// a matching ID then we will replace the target element
// with the corresponding old element and morph the old element
unmatchedEls[curToNodeId] = curToNodeChild;
}
}
// If we got this far then we did not find a candidate match for our "to node"
// and we exhausted all of the children "from" nodes. Therefore, we will just
// append the current "to node" to the end
fromNode.appendChild(curToNodeChild);
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
}
// We have processed all of the "to nodes". If curFromNodeChild is non-null then
// we still have some from nodes left over that need to be removed
while(curFromNodeChild) {
fromNextSibling = curFromNodeChild.nextSibling;
removeNode(curFromNodeChild, fromNode, alreadyVisited);
curFromNodeChild = fromNextSibling;
}
var specialElHandler = specialElHandlers[fromNode.tagName];
if (specialElHandler) {
specialElHandler(fromNode, toNode);
}
}
var morphedNode = fromNode;
var morphedNodeType = morphedNode.nodeType;
var toNodeType = toNode.nodeType;
// Handle the case where we are given two DOM nodes that are not
// compatible (e.g. <div> --> <span> or <div> --> TEXT)
if (morphedNodeType === 1) {
if (toNodeType === 1) {
if (morphedNode.tagName !== toNode.tagName) {
onNodeDiscarded(fromNode);
morphedNode = moveChildren(morphedNode, document.createElement(toNode.tagName));
}
} else {
// Going from an element node to a text node
return toNode;
}
} else if (morphedNodeType === 3) { // Text node
if (toNodeType === 3) {
morphedNode.nodeValue = toNode.nodeValue;
return morphedNode;
} else {
onNodeDiscarded(fromNode);
// Text node to something else
return toNode;
}
}
morphEl(morphedNode, toNode, false);
// Fire the "onNodeDiscarded" event for any saved elements
// that never found a new home in the morphed DOM
for (var savedElId in savedEls) {
if (savedEls.hasOwnProperty(savedElId)) {
var savedEl = savedEls[savedElId];
onNodeDiscarded(savedEl);
walkDiscardedChildNodes(savedEl);
}
}
if (morphedNode !== fromNode && fromNode.parentNode) {
fromNode.parentNode.replaceChild(morphedNode, fromNode);
}
return morphedNode;
}
module.exports = morphdom;
},{}]},{},[1])(1)
});

File diff suppressed because one or more lines are too long

View file

@ -1 +0,0 @@
import StatsPlugin

View file

@ -1,138 +0,0 @@
import time
import os
import sys
import atexit
from Plugin import PluginManager
from Config import config
allow_reload = False # No source reload supported in this plugin
@PluginManager.registerTo("Actions")
class ActionsPlugin(object):
def main(self):
global notificationicon, winfolders
from lib import notificationicon, winfolders
import gevent.threadpool
self.main = sys.modules["main"]
fs_encoding = sys.getfilesystemencoding()
icon = notificationicon.NotificationIcon(
os.path.join(os.path.dirname(os.path.abspath(__file__).decode(fs_encoding)), 'trayicon.ico'),
"ZeroNet %s" % config.version
)
self.icon = icon
if not config.debug: # Hide console if not in debug mode
notificationicon.hideConsole()
self.console = False
else:
self.console = True
@atexit.register
def hideIcon():
icon.die()
ui_ip = config.ui_ip if config.ui_ip != "*" else "127.0.0.1"
icon.items = (
(self.titleIp, False),
(self.titleConnections, False),
(self.titleTransfer, False),
(self.titleConsole, self.toggleConsole),
(self.titleAutorun, self.toggleAutorun),
"--",
("ZeroNet Twitter", lambda: self.opensite("https://twitter.com/HelloZeroNet")),
("ZeroNet Reddit", lambda: self.opensite("http://www.reddit.com/r/zeronet/")),
("ZeroNet Github", lambda: self.opensite("https://github.com/HelloZeroNet/ZeroNet")),
("Report bug/request feature", lambda: self.opensite("https://github.com/HelloZeroNet/ZeroNet/issues")),
"--",
("!Open ZeroNet", lambda: self.opensite("http://%s:%s" % (ui_ip, config.ui_port))),
"--",
("Quit", self.quit),
)
icon.clicked = lambda: self.opensite("http://%s:%s" % (ui_ip, config.ui_port))
gevent.threadpool.start_new_thread(icon._run, ()) # Start in real thread (not gevent compatible)
super(ActionsPlugin, self).main()
icon._die = True
def quit(self):
self.icon.die()
time.sleep(0.1)
sys.exit()
# self.main.ui_server.stop()
# self.main.file_server.stop()
def opensite(self, url):
import webbrowser
webbrowser.open(url, new=0)
def titleIp(self):
title = "!IP: %s" % config.ip_external
if self.main.file_server.port_opened:
title += " (active)"
else:
title += " (passive)"
return title
def titleConnections(self):
title = "Connections: %s" % len(self.main.file_server.connections)
return title
def titleTransfer(self):
title = "Received: %.2f MB | Sent: %.2f MB" % (
float(self.main.file_server.bytes_recv) / 1024 / 1024,
float(self.main.file_server.bytes_sent) / 1024 / 1024
)
return title
def titleConsole(self):
if self.console:
return "+Show console window"
else:
return "Show console window"
def toggleConsole(self):
if self.console:
notificationicon.hideConsole()
self.console = False
else:
notificationicon.showConsole()
self.console = True
def getAutorunPath(self):
return "%s\\zeronet.cmd" % winfolders.get(winfolders.STARTUP)
def formatAutorun(self):
args = sys.argv[:]
args.insert(0, sys.executable)
if sys.platform == 'win32':
args = ['"%s"' % arg for arg in args]
cmd = " ".join(args)
# Dont open browser on autorun
cmd = cmd.replace("start.py", "zeronet.py").replace('"--open_browser"', "").replace('"default_browser"', "").strip()
return "@echo off\ncd /D %s\n%s" % (os.getcwd(), cmd)
def isAutorunEnabled(self):
path = self.getAutorunPath()
return os.path.isfile(path) and open(path).read() == self.formatAutorun()
def titleAutorun(self):
if self.isAutorunEnabled():
return "+Start ZeroNet when Windows starts"
else:
return "Start ZeroNet when Windows starts"
def toggleAutorun(self):
if self.isAutorunEnabled():
os.unlink(self.getAutorunPath())
else:
open(self.getAutorunPath(), "w").write(self.formatAutorun())

View file

@ -1,4 +0,0 @@
import sys
if sys.platform == 'win32':
import TrayiconPlugin

View file

@ -1,806 +0,0 @@
# Pure ctypes windows taskbar notification icon
# via https://gist.github.com/jasonbot/5759510
# Modified for ZeroNet
import ctypes
import ctypes.wintypes
import os
#import threading
#import Queue
import uuid
import time
import gevent
__all__ = ['NotificationIcon']
# Create popup menu
CreatePopupMenu = ctypes.windll.user32.CreatePopupMenu
CreatePopupMenu.restype = ctypes.wintypes.HMENU
CreatePopupMenu.argtypes = []
MF_BYCOMMAND = 0x0
MF_BYPOSITION = 0x400
MF_BITMAP = 0x4
MF_CHECKED = 0x8
MF_DISABLED = 0x2
MF_ENABLED = 0x0
MF_GRAYED = 0x1
MF_MENUBARBREAK = 0x20
MF_MENUBREAK = 0x40
MF_OWNERDRAW = 0x100
MF_POPUP = 0x10
MF_SEPARATOR = 0x800
MF_STRING = 0x0
MF_UNCHECKED = 0x0
InsertMenu = ctypes.windll.user32.InsertMenuW
InsertMenu.restype = ctypes.wintypes.BOOL
InsertMenu.argtypes = [ctypes.wintypes.HMENU, ctypes.wintypes.UINT, ctypes.wintypes.UINT, ctypes.wintypes.UINT, ctypes.wintypes.LPCWSTR]
AppendMenu = ctypes.windll.user32.AppendMenuW
AppendMenu.restype = ctypes.wintypes.BOOL
AppendMenu.argtypes = [ctypes.wintypes.HMENU, ctypes.wintypes.UINT, ctypes.wintypes.UINT, ctypes.wintypes.LPCWSTR]
SetMenuDefaultItem = ctypes.windll.user32.SetMenuDefaultItem
SetMenuDefaultItem.restype = ctypes.wintypes.BOOL
SetMenuDefaultItem.argtypes = [ctypes.wintypes.HMENU, ctypes.wintypes.UINT, ctypes.wintypes.UINT]
#class MENUITEMINFO(ctypes.Structure):
# UINT cbSize;
# UINT fMask;
# UINT fType;
# UINT fState;
# UINT wID;
# HMENU hSubMenu;
# HBITMAP hbmpChecked;
# HBITMAP hbmpUnchecked;
# ULONG_PTR dwItemData;
# LPTSTR dwTypeData;
# UINT cch;
# HBITMAP hbmpItem;
#
#BOOL WINAPI InsertMenuItem(
# __in HMENU hMenu,
# __in UINT uItem,
# __in BOOL fByPosition,
# __in LPCMENUITEMINFO lpmii
#);
#
class POINT(ctypes.Structure):
_fields_ = [ ('x', ctypes.wintypes.LONG),
('y', ctypes.wintypes.LONG)]
GetCursorPos = ctypes.windll.user32.GetCursorPos
GetCursorPos.argtypes = [ctypes.POINTER(POINT)]
SetForegroundWindow = ctypes.windll.user32.SetForegroundWindow
SetForegroundWindow.argtypes = [ctypes.wintypes.HWND]
TPM_LEFTALIGN = 0x0
TPM_CENTERALIGN = 0x4
TPM_RIGHTALIGN = 0x8
TPM_TOPALIGN = 0x0
TPM_VCENTERALIGN = 0x10
TPM_BOTTOMALIGN = 0x20
TPM_NONOTIFY = 0x80
TPM_RETURNCMD = 0x100
TPM_LEFTBUTTON = 0x0
TPM_RIGHTBUTTON = 0x2
TPM_HORNEGANIMATION = 0x800
TPM_HORPOSANIMATION = 0x400
TPM_NOANIMATION = 0x4000
TPM_VERNEGANIMATION = 0x2000
TPM_VERPOSANIMATION = 0x1000
TrackPopupMenu = ctypes.windll.user32.TrackPopupMenu
TrackPopupMenu.restype = ctypes.wintypes.BOOL
TrackPopupMenu.argtypes = [ctypes.wintypes.HMENU, ctypes.wintypes.UINT, ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.wintypes.HWND, ctypes.c_void_p]
PostMessage = ctypes.windll.user32.PostMessageW
PostMessage.restype = ctypes.wintypes.BOOL
PostMessage.argtypes = [ctypes.wintypes.HWND, ctypes.wintypes.UINT, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM]
DestroyMenu = ctypes.windll.user32.DestroyMenu
DestroyMenu.restype = ctypes.wintypes.BOOL
DestroyMenu.argtypes = [ctypes.wintypes.HMENU]
# Create notification icon
GUID = ctypes.c_ubyte * 16
class TimeoutVersionUnion(ctypes.Union):
_fields_ = [('uTimeout', ctypes.wintypes.UINT),
('uVersion', ctypes.wintypes.UINT),]
NIS_HIDDEN = 0x1
NIS_SHAREDICON = 0x2
class NOTIFYICONDATA(ctypes.Structure):
def __init__(self, *args, **kwargs):
super(NOTIFYICONDATA, self).__init__(*args, **kwargs)
self.cbSize = ctypes.sizeof(self)
_fields_ = [
('cbSize', ctypes.wintypes.DWORD),
('hWnd', ctypes.wintypes.HWND),
('uID', ctypes.wintypes.UINT),
('uFlags', ctypes.wintypes.UINT),
('uCallbackMessage', ctypes.wintypes.UINT),
('hIcon', ctypes.wintypes.HICON),
('szTip', ctypes.wintypes.WCHAR * 64),
('dwState', ctypes.wintypes.DWORD),
('dwStateMask', ctypes.wintypes.DWORD),
('szInfo', ctypes.wintypes.WCHAR * 256),
('union', TimeoutVersionUnion),
('szInfoTitle', ctypes.wintypes.WCHAR * 64),
('dwInfoFlags', ctypes.wintypes.DWORD),
('guidItem', GUID),
('hBalloonIcon', ctypes.wintypes.HICON),
]
NIM_ADD = 0
NIM_MODIFY = 1
NIM_DELETE = 2
NIM_SETFOCUS = 3
NIM_SETVERSION = 4
NIF_MESSAGE = 1
NIF_ICON = 2
NIF_TIP = 4
NIF_STATE = 8
NIF_INFO = 16
NIF_GUID = 32
NIF_REALTIME = 64
NIF_SHOWTIP = 128
NIIF_NONE = 0
NIIF_INFO = 1
NIIF_WARNING = 2
NIIF_ERROR = 3
NIIF_USER = 4
NOTIFYICON_VERSION = 3
NOTIFYICON_VERSION_4 = 4
Shell_NotifyIcon = ctypes.windll.shell32.Shell_NotifyIconW
Shell_NotifyIcon.restype = ctypes.wintypes.BOOL
Shell_NotifyIcon.argtypes = [ctypes.wintypes.DWORD, ctypes.POINTER(NOTIFYICONDATA)]
# Load icon/image
IMAGE_BITMAP = 0
IMAGE_ICON = 1
IMAGE_CURSOR = 2
LR_CREATEDIBSECTION = 0x00002000
LR_DEFAULTCOLOR = 0x00000000
LR_DEFAULTSIZE = 0x00000040
LR_LOADFROMFILE = 0x00000010
LR_LOADMAP3DCOLORS = 0x00001000
LR_LOADTRANSPARENT = 0x00000020
LR_MONOCHROME = 0x00000001
LR_SHARED = 0x00008000
LR_VGACOLOR = 0x00000080
OIC_SAMPLE = 32512
OIC_HAND = 32513
OIC_QUES = 32514
OIC_BANG = 32515
OIC_NOTE = 32516
OIC_WINLOGO = 32517
OIC_WARNING = OIC_BANG
OIC_ERROR = OIC_HAND
OIC_INFORMATION = OIC_NOTE
LoadImage = ctypes.windll.user32.LoadImageW
LoadImage.restype = ctypes.wintypes.HANDLE
LoadImage.argtypes = [ctypes.wintypes.HINSTANCE, ctypes.wintypes.LPCWSTR, ctypes.wintypes.UINT, ctypes.c_int, ctypes.c_int, ctypes.wintypes.UINT]
# CreateWindow call
WNDPROC = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.wintypes.HWND, ctypes.c_uint, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM)
DefWindowProc = ctypes.windll.user32.DefWindowProcW
DefWindowProc.restype = ctypes.c_int
DefWindowProc.argtypes = [ctypes.wintypes.HWND, ctypes.c_uint, ctypes.wintypes.WPARAM, ctypes.wintypes.LPARAM]
WS_OVERLAPPED = 0x00000000L
WS_POPUP = 0x80000000L
WS_CHILD = 0x40000000L
WS_MINIMIZE = 0x20000000L
WS_VISIBLE = 0x10000000L
WS_DISABLED = 0x08000000L
WS_CLIPSIBLINGS = 0x04000000L
WS_CLIPCHILDREN = 0x02000000L
WS_MAXIMIZE = 0x01000000L
WS_CAPTION = 0x00C00000L
WS_BORDER = 0x00800000L
WS_DLGFRAME = 0x00400000L
WS_VSCROLL = 0x00200000L
WS_HSCROLL = 0x00100000L
WS_SYSMENU = 0x00080000L
WS_THICKFRAME = 0x00040000L
WS_GROUP = 0x00020000L
WS_TABSTOP = 0x00010000L
WS_MINIMIZEBOX = 0x00020000L
WS_MAXIMIZEBOX = 0x00010000L
WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED |
WS_CAPTION |
WS_SYSMENU |
WS_THICKFRAME |
WS_MINIMIZEBOX |
WS_MAXIMIZEBOX)
SM_XVIRTUALSCREEN = 76
SM_YVIRTUALSCREEN = 77
SM_CXVIRTUALSCREEN = 78
SM_CYVIRTUALSCREEN = 79
SM_CMONITORS = 80
SM_SAMEDISPLAYFORMAT = 81
WM_NULL = 0x0000
WM_CREATE = 0x0001
WM_DESTROY = 0x0002
WM_MOVE = 0x0003
WM_SIZE = 0x0005
WM_ACTIVATE = 0x0006
WM_SETFOCUS = 0x0007
WM_KILLFOCUS = 0x0008
WM_ENABLE = 0x000A
WM_SETREDRAW = 0x000B
WM_SETTEXT = 0x000C
WM_GETTEXT = 0x000D
WM_GETTEXTLENGTH = 0x000E
WM_PAINT = 0x000F
WM_CLOSE = 0x0010
WM_QUERYENDSESSION = 0x0011
WM_QUIT = 0x0012
WM_QUERYOPEN = 0x0013
WM_ERASEBKGND = 0x0014
WM_SYSCOLORCHANGE = 0x0015
WM_ENDSESSION = 0x0016
WM_SHOWWINDOW = 0x0018
WM_CTLCOLOR = 0x0019
WM_WININICHANGE = 0x001A
WM_SETTINGCHANGE = 0x001A
WM_DEVMODECHANGE = 0x001B
WM_ACTIVATEAPP = 0x001C
WM_FONTCHANGE = 0x001D
WM_TIMECHANGE = 0x001E
WM_CANCELMODE = 0x001F
WM_SETCURSOR = 0x0020
WM_MOUSEACTIVATE = 0x0021
WM_CHILDACTIVATE = 0x0022
WM_QUEUESYNC = 0x0023
WM_GETMINMAXINFO = 0x0024
WM_PAINTICON = 0x0026
WM_ICONERASEBKGND = 0x0027
WM_NEXTDLGCTL = 0x0028
WM_SPOOLERSTATUS = 0x002A
WM_DRAWITEM = 0x002B
WM_MEASUREITEM = 0x002C
WM_DELETEITEM = 0x002D
WM_VKEYTOITEM = 0x002E
WM_CHARTOITEM = 0x002F
WM_SETFONT = 0x0030
WM_GETFONT = 0x0031
WM_SETHOTKEY = 0x0032
WM_GETHOTKEY = 0x0033
WM_QUERYDRAGICON = 0x0037
WM_COMPAREITEM = 0x0039
WM_GETOBJECT = 0x003D
WM_COMPACTING = 0x0041
WM_COMMNOTIFY = 0x0044
WM_WINDOWPOSCHANGING = 0x0046
WM_WINDOWPOSCHANGED = 0x0047
WM_POWER = 0x0048
WM_COPYDATA = 0x004A
WM_CANCELJOURNAL = 0x004B
WM_NOTIFY = 0x004E
WM_INPUTLANGCHANGEREQUEST = 0x0050
WM_INPUTLANGCHANGE = 0x0051
WM_TCARD = 0x0052
WM_HELP = 0x0053
WM_USERCHANGED = 0x0054
WM_NOTIFYFORMAT = 0x0055
WM_CONTEXTMENU = 0x007B
WM_STYLECHANGING = 0x007C
WM_STYLECHANGED = 0x007D
WM_DISPLAYCHANGE = 0x007E
WM_GETICON = 0x007F
WM_SETICON = 0x0080
WM_NCCREATE = 0x0081
WM_NCDESTROY = 0x0082
WM_NCCALCSIZE = 0x0083
WM_NCHITTEST = 0x0084
WM_NCPAINT = 0x0085
WM_NCACTIVATE = 0x0086
WM_GETDLGCODE = 0x0087
WM_SYNCPAINT = 0x0088
WM_NCMOUSEMOVE = 0x00A0
WM_NCLBUTTONDOWN = 0x00A1
WM_NCLBUTTONUP = 0x00A2
WM_NCLBUTTONDBLCLK = 0x00A3
WM_NCRBUTTONDOWN = 0x00A4
WM_NCRBUTTONUP = 0x00A5
WM_NCRBUTTONDBLCLK = 0x00A6
WM_NCMBUTTONDOWN = 0x00A7
WM_NCMBUTTONUP = 0x00A8
WM_NCMBUTTONDBLCLK = 0x00A9
WM_KEYDOWN = 0x0100
WM_KEYUP = 0x0101
WM_CHAR = 0x0102
WM_DEADCHAR = 0x0103
WM_SYSKEYDOWN = 0x0104
WM_SYSKEYUP = 0x0105
WM_SYSCHAR = 0x0106
WM_SYSDEADCHAR = 0x0107
WM_KEYLAST = 0x0108
WM_IME_STARTCOMPOSITION = 0x010D
WM_IME_ENDCOMPOSITION = 0x010E
WM_IME_COMPOSITION = 0x010F
WM_IME_KEYLAST = 0x010F
WM_INITDIALOG = 0x0110
WM_COMMAND = 0x0111
WM_SYSCOMMAND = 0x0112
WM_TIMER = 0x0113
WM_HSCROLL = 0x0114
WM_VSCROLL = 0x0115
WM_INITMENU = 0x0116
WM_INITMENUPOPUP = 0x0117
WM_MENUSELECT = 0x011F
WM_MENUCHAR = 0x0120
WM_ENTERIDLE = 0x0121
WM_MENURBUTTONUP = 0x0122
WM_MENUDRAG = 0x0123
WM_MENUGETOBJECT = 0x0124
WM_UNINITMENUPOPUP = 0x0125
WM_MENUCOMMAND = 0x0126
WM_CTLCOLORMSGBOX = 0x0132
WM_CTLCOLOREDIT = 0x0133
WM_CTLCOLORLISTBOX = 0x0134
WM_CTLCOLORBTN = 0x0135
WM_CTLCOLORDLG = 0x0136
WM_CTLCOLORSCROLLBAR = 0x0137
WM_CTLCOLORSTATIC = 0x0138
WM_MOUSEMOVE = 0x0200
WM_LBUTTONDOWN = 0x0201
WM_LBUTTONUP = 0x0202
WM_LBUTTONDBLCLK = 0x0203
WM_RBUTTONDOWN = 0x0204
WM_RBUTTONUP = 0x0205
WM_RBUTTONDBLCLK = 0x0206
WM_MBUTTONDOWN = 0x0207
WM_MBUTTONUP = 0x0208
WM_MBUTTONDBLCLK = 0x0209
WM_MOUSEWHEEL = 0x020A
WM_PARENTNOTIFY = 0x0210
WM_ENTERMENULOOP = 0x0211
WM_EXITMENULOOP = 0x0212
WM_NEXTMENU = 0x0213
WM_SIZING = 0x0214
WM_CAPTURECHANGED = 0x0215
WM_MOVING = 0x0216
WM_DEVICECHANGE = 0x0219
WM_MDICREATE = 0x0220
WM_MDIDESTROY = 0x0221
WM_MDIACTIVATE = 0x0222
WM_MDIRESTORE = 0x0223
WM_MDINEXT = 0x0224
WM_MDIMAXIMIZE = 0x0225
WM_MDITILE = 0x0226
WM_MDICASCADE = 0x0227
WM_MDIICONARRANGE = 0x0228
WM_MDIGETACTIVE = 0x0229
WM_MDISETMENU = 0x0230
WM_ENTERSIZEMOVE = 0x0231
WM_EXITSIZEMOVE = 0x0232
WM_DROPFILES = 0x0233
WM_MDIREFRESHMENU = 0x0234
WM_IME_SETCONTEXT = 0x0281
WM_IME_NOTIFY = 0x0282
WM_IME_CONTROL = 0x0283
WM_IME_COMPOSITIONFULL = 0x0284
WM_IME_SELECT = 0x0285
WM_IME_CHAR = 0x0286
WM_IME_REQUEST = 0x0288
WM_IME_KEYDOWN = 0x0290
WM_IME_KEYUP = 0x0291
WM_MOUSEHOVER = 0x02A1
WM_MOUSELEAVE = 0x02A3
WM_CUT = 0x0300
WM_COPY = 0x0301
WM_PASTE = 0x0302
WM_CLEAR = 0x0303
WM_UNDO = 0x0304
WM_RENDERFORMAT = 0x0305
WM_RENDERALLFORMATS = 0x0306
WM_DESTROYCLIPBOARD = 0x0307
WM_DRAWCLIPBOARD = 0x0308
WM_PAINTCLIPBOARD = 0x0309
WM_VSCROLLCLIPBOARD = 0x030A
WM_SIZECLIPBOARD = 0x030B
WM_ASKCBFORMATNAME = 0x030C
WM_CHANGECBCHAIN = 0x030D
WM_HSCROLLCLIPBOARD = 0x030E
WM_QUERYNEWPALETTE = 0x030F
WM_PALETTEISCHANGING = 0x0310
WM_PALETTECHANGED = 0x0311
WM_HOTKEY = 0x0312
WM_PRINT = 0x0317
WM_PRINTCLIENT = 0x0318
WM_HANDHELDFIRST = 0x0358
WM_HANDHELDLAST = 0x035F
WM_AFXFIRST = 0x0360
WM_AFXLAST = 0x037F
WM_PENWINFIRST = 0x0380
WM_PENWINLAST = 0x038F
WM_APP = 0x8000
WM_USER = 0x0400
WM_REFLECT = WM_USER + 0x1c00
class WNDCLASSEX(ctypes.Structure):
def __init__(self, *args, **kwargs):
super(WNDCLASSEX, self).__init__(*args, **kwargs)
self.cbSize = ctypes.sizeof(self)
_fields_ = [("cbSize", ctypes.c_uint),
("style", ctypes.c_uint),
("lpfnWndProc", WNDPROC),
("cbClsExtra", ctypes.c_int),
("cbWndExtra", ctypes.c_int),
("hInstance", ctypes.wintypes.HANDLE),
("hIcon", ctypes.wintypes.HANDLE),
("hCursor", ctypes.wintypes.HANDLE),
("hBrush", ctypes.wintypes.HANDLE),
("lpszMenuName", ctypes.wintypes.LPCWSTR),
("lpszClassName", ctypes.wintypes.LPCWSTR),
("hIconSm", ctypes.wintypes.HANDLE)]
UpdateWindow = ctypes.windll.user32.UpdateWindow
UpdateWindow.argtypes = [ctypes.wintypes.HWND]
SW_HIDE = 0
SW_SHOWNORMAL = 1
SW_SHOW = 5
ShowWindow = ctypes.windll.user32.ShowWindow
ShowWindow.argtypes = [ctypes.wintypes.HWND, ctypes.c_int]
CS_VREDRAW = 0x0001
CS_HREDRAW = 0x0002
CS_KEYCVTWINDOW = 0x0004
CS_DBLCLKS = 0x0008
CS_OWNDC = 0x0020
CS_CLASSDC = 0x0040
CS_PARENTDC = 0x0080
CS_NOKEYCVT = 0x0100
CS_NOCLOSE = 0x0200
CS_SAVEBITS = 0x0800
CS_BYTEALIGNCLIENT = 0x1000
CS_BYTEALIGNWINDOW = 0x2000
CS_GLOBALCLASS = 0x4000
COLOR_SCROLLBAR = 0
COLOR_BACKGROUND = 1
COLOR_ACTIVECAPTION = 2
COLOR_INACTIVECAPTION = 3
COLOR_MENU = 4
COLOR_WINDOW = 5
COLOR_WINDOWFRAME = 6
COLOR_MENUTEXT = 7
COLOR_WINDOWTEXT = 8
COLOR_CAPTIONTEXT = 9
COLOR_ACTIVEBORDER = 10
COLOR_INACTIVEBORDER = 11
COLOR_APPWORKSPACE = 12
COLOR_HIGHLIGHT = 13
COLOR_HIGHLIGHTTEXT = 14
COLOR_BTNFACE = 15
COLOR_BTNSHADOW = 16
COLOR_GRAYTEXT = 17
COLOR_BTNTEXT = 18
COLOR_INACTIVECAPTIONTEXT = 19
COLOR_BTNHIGHLIGHT = 20
LoadCursor = ctypes.windll.user32.LoadCursorW
def GenerateDummyWindow(callback, uid):
newclass = WNDCLASSEX()
newclass.lpfnWndProc = callback
newclass.style = CS_VREDRAW | CS_HREDRAW
newclass.lpszClassName = uid.replace("-", "")
newclass.hBrush = COLOR_BACKGROUND
newclass.hCursor = LoadCursor(0, 32512)
ATOM = ctypes.windll.user32.RegisterClassExW(ctypes.byref(newclass))
#print "ATOM", ATOM
#print "CLASS", newclass.lpszClassName
hwnd = ctypes.windll.user32.CreateWindowExW(0,
newclass.lpszClassName,
u"Dummy Window",
WS_OVERLAPPEDWINDOW | WS_SYSMENU,
ctypes.windll.user32.GetSystemMetrics(SM_CXVIRTUALSCREEN),
ctypes.windll.user32.GetSystemMetrics(SM_CYVIRTUALSCREEN),
800, 600, 0, 0, 0, 0)
ShowWindow(hwnd, SW_SHOW)
UpdateWindow(hwnd)
ShowWindow(hwnd, SW_HIDE)
return hwnd
# Message loop calls
TIMERCALLBACK = ctypes.WINFUNCTYPE(None,
ctypes.wintypes.HWND,
ctypes.wintypes.UINT,
ctypes.POINTER(ctypes.wintypes.UINT),
ctypes.wintypes.DWORD)
SetTimer = ctypes.windll.user32.SetTimer
SetTimer.restype = ctypes.POINTER(ctypes.wintypes.UINT)
SetTimer.argtypes = [ctypes.wintypes.HWND,
ctypes.POINTER(ctypes.wintypes.UINT),
ctypes.wintypes.UINT,
TIMERCALLBACK]
KillTimer = ctypes.windll.user32.KillTimer
KillTimer.restype = ctypes.wintypes.BOOL
KillTimer.argtypes = [ctypes.wintypes.HWND,
ctypes.POINTER(ctypes.wintypes.UINT)]
class MSG(ctypes.Structure):
_fields_ = [ ('HWND', ctypes.wintypes.HWND),
('message', ctypes.wintypes.UINT),
('wParam', ctypes.wintypes.WPARAM),
('lParam', ctypes.wintypes.LPARAM),
('time', ctypes.wintypes.DWORD),
('pt', POINT)]
GetMessage = ctypes.windll.user32.GetMessageW
GetMessage.restype = ctypes.wintypes.BOOL
GetMessage.argtypes = [ctypes.POINTER(MSG), ctypes.wintypes.HWND, ctypes.wintypes.UINT, ctypes.wintypes.UINT]
TranslateMessage = ctypes.windll.user32.TranslateMessage
TranslateMessage.restype = ctypes.wintypes.ULONG
TranslateMessage.argtypes = [ctypes.POINTER(MSG)]
DispatchMessage = ctypes.windll.user32.DispatchMessageW
DispatchMessage.restype = ctypes.wintypes.ULONG
DispatchMessage.argtypes = [ctypes.POINTER(MSG)]
def LoadIcon(iconfilename, small=False):
return LoadImage(0,
unicode(iconfilename),
IMAGE_ICON,
16 if small else 0,
16 if small else 0,
LR_LOADFROMFILE)
class NotificationIcon(object):
def __init__(self, iconfilename, tooltip=None):
assert os.path.isfile(unicode(iconfilename)), "{} doesn't exist".format(iconfilename)
self._iconfile = unicode(iconfilename)
self._hicon = LoadIcon(self._iconfile, True)
assert self._hicon, "Failed to load {}".format(iconfilename)
#self._pumpqueue = Queue.Queue()
self._die = False
self._timerid = None
self._uid = uuid.uuid4()
self._tooltip = unicode(tooltip) if tooltip else u''
#self._thread = threading.Thread(target=self._run)
#self._thread.start()
self._info_bubble = None
self.items = []
def _bubble(self, iconinfo):
if self._info_bubble:
info_bubble = self._info_bubble
self._info_bubble = None
message = unicode(self._info_bubble)
iconinfo.uFlags |= NIF_INFO
iconinfo.szInfo = message
iconinfo.szInfoTitle = message
iconinfo.dwInfoFlags = NIIF_INFO
iconinfo.union.uTimeout = 10000
Shell_NotifyIcon(NIM_MODIFY, ctypes.pointer(iconinfo))
def _run(self):
self._windowproc = WNDPROC(self._callback)
self._hwnd = GenerateDummyWindow(self._windowproc, str(self._uid))
iconinfo = NOTIFYICONDATA()
iconinfo.hWnd = self._hwnd
iconinfo.uID = 100
iconinfo.uFlags = NIF_ICON | NIF_SHOWTIP | NIF_MESSAGE | (NIF_TIP if self._tooltip else 0)
iconinfo.uCallbackMessage = WM_MENUCOMMAND
iconinfo.hIcon = self._hicon
iconinfo.szTip = self._tooltip
iconinfo.dwState = NIS_SHAREDICON
iconinfo.dwInfoFlags = NIIF_INFO
# iconinfo.dwStateMask = NIS_SHAREDICON
iconinfo.szInfo = "Application Title"
iconinfo.union.uTimeout = 5000
Shell_NotifyIcon(NIM_ADD, ctypes.pointer(iconinfo))
iconinfo.union.uVersion = NOTIFYICON_VERSION
Shell_NotifyIcon(NIM_SETVERSION, ctypes.pointer(iconinfo))
self.iconinfo = iconinfo
PostMessage(self._hwnd, WM_NULL, 0, 0)
#self._timerid = SetTimer(self._hwnd, self._timerid, 25, TIMERCALLBACK())
message = MSG()
last_time = -1
ret = None
while not self._die:
try:
ret = GetMessage(ctypes.pointer(message), 0, 0, 0)
TranslateMessage(ctypes.pointer(message))
DispatchMessage(ctypes.pointer(message))
except Exception, err:
# print "NotificationIcon error", err, message
message = MSG()
time.sleep(0.125)
print "Icon thread stopped, removing icon..."
#KillTimer(self._hwnd, self._timerid)
Shell_NotifyIcon(NIM_DELETE, ctypes.cast(ctypes.pointer(iconinfo), ctypes.POINTER(NOTIFYICONDATA)))
ctypes.windll.user32.DestroyWindow(self._hwnd)
ctypes.windll.user32.DestroyIcon(self._hicon)
def _menu(self):
if not hasattr(self, 'items'):
return
menu = CreatePopupMenu()
func = None
try:
iidx = 1000
defaultitem = -1
item_map = {}
for fs in self.items:
iidx += 1
if isinstance(fs, basestring):
if fs and not fs.strip('-_='):
AppendMenu(menu, MF_SEPARATOR, iidx, fs)
else:
AppendMenu(menu, MF_STRING | MF_GRAYED, iidx, fs)
elif isinstance(fs, tuple):
if callable(fs[0]):
itemstring = fs[0]()
else:
itemstring = unicode(fs[0])
flags = MF_STRING
if itemstring.startswith("!"):
itemstring = itemstring[1:]
defaultitem = iidx
if itemstring.startswith("+"):
itemstring = itemstring[1:]
flags = flags | MF_CHECKED
itemcallable = fs[1]
item_map[iidx] = itemcallable
if itemcallable is False:
flags = flags | MF_DISABLED
elif not callable(itemcallable):
flags = flags | MF_GRAYED
AppendMenu(menu, flags, iidx, itemstring)
if defaultitem != -1:
SetMenuDefaultItem(menu, defaultitem, 0)
pos = POINT()
GetCursorPos(ctypes.pointer(pos))
PostMessage(self._hwnd, WM_NULL, 0, 0)
SetForegroundWindow(self._hwnd)
ti = TrackPopupMenu(menu, TPM_RIGHTBUTTON | TPM_RETURNCMD | TPM_NONOTIFY, pos.x, pos.y, 0, self._hwnd, None)
if ti in item_map:
func = item_map[ti]
PostMessage(self._hwnd, WM_NULL, 0, 0)
finally:
DestroyMenu(menu)
if func: func()
def clicked(self):
self._menu()
def _callback(self, hWnd, msg, wParam, lParam):
# Check if the main thread is still alive
if msg == WM_TIMER:
if not any(thread.getName() == 'MainThread' and thread.isAlive()
for thread in threading.enumerate()):
self._die = True
elif msg == WM_MENUCOMMAND and lParam == WM_LBUTTONUP:
self.clicked()
elif msg == WM_MENUCOMMAND and lParam == WM_RBUTTONUP:
self._menu()
else:
return DefWindowProc(hWnd, msg, wParam, lParam)
return 1
def die(self):
self._die = True
PostMessage(self._hwnd, WM_NULL, 0, 0)
time.sleep(0.2)
try:
Shell_NotifyIcon(NIM_DELETE, self.iconinfo)
except Exception, err:
print "Icon remove error", err
ctypes.windll.user32.DestroyWindow(self._hwnd)
ctypes.windll.user32.DestroyIcon(self._hicon)
def pump(self):
try:
while not self._pumpqueue.empty():
callable = self._pumpqueue.get(False)
callable()
except Queue.Empty:
pass
def announce(self, text):
self._info_bubble = text
def hideConsole():
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0)
def showConsole():
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 1)
if __name__ == "__main__":
import time
def greet():
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0)
print "Hello"
def quit():
ni._die = True
#sys.exit()
def announce():
ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 1)
ni.announce("Hello there")
def clicked():
ni.announce("Hello")
def dynamicTitle():
return "!The time is: %s" % time.time()
ni = NotificationIcon(os.path.join(os.path.dirname(os.path.abspath(__file__)), '../trayicon.ico'), "ZeroNet 0.2.9")
ni.items = [
(dynamicTitle, False),
('Hello', greet),
('Title', False),
('!Default', greet),
('+Popup bubble', announce),
'Nothing',
'--',
('Quit', quit)
]
ni.clicked = clicked
import atexit
@atexit.register
def goodbye():
print "You are now leaving the Python sector."
ni._run()

View file

@ -1,53 +0,0 @@
''' Get windows special folders without pythonwin
Example:
import specialfolders
start_programs = specialfolders.get(specialfolders.PROGRAMS)
Code is public domain, do with it what you will.
Luke Pinner - Environment.gov.au, 2010 February 10
'''
#Imports use _syntax to mask them from autocomplete IDE's
import ctypes as _ctypes
from ctypes.wintypes import HWND as _HWND, HANDLE as _HANDLE,DWORD as _DWORD,LPCWSTR as _LPCWSTR,MAX_PATH as _MAX_PATH, create_unicode_buffer as _cub
_SHGetFolderPath = _ctypes.windll.shell32.SHGetFolderPathW
#public special folder constants
DESKTOP= 0
PROGRAMS= 2
MYDOCUMENTS= 5
FAVORITES= 6
STARTUP= 7
RECENT= 8
SENDTO= 9
STARTMENU= 11
MYMUSIC= 13
MYVIDEOS= 14
NETHOOD= 19
FONTS= 20
TEMPLATES= 21
ALLUSERSSTARTMENU= 22
ALLUSERSPROGRAMS= 23
ALLUSERSSTARTUP= 24
ALLUSERSDESKTOP= 25
APPLICATIONDATA= 26
PRINTHOOD= 27
LOCALSETTINGSAPPLICATIONDATA= 28
ALLUSERSFAVORITES= 31
LOCALSETTINGSTEMPORARYINTERNETFILES=32
COOKIES= 33
LOCALSETTINGSHISTORY= 34
ALLUSERSAPPLICATIONDATA= 35
def get(intFolder):
_SHGetFolderPath.argtypes = [_HWND, _ctypes.c_int, _HANDLE, _DWORD, _LPCWSTR]
auPathBuffer = _cub(_MAX_PATH)
exit_code=_SHGetFolderPath(0, intFolder, 0, 0, auPathBuffer)
return auPathBuffer.value
if __name__ == "__main__":
import os
print get(STARTUP)
open(get(STARTUP)+"\\zeronet.cmd", "w").write("cd /D %s\r\nzeronet.py" % os.getcwd())

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,71 +0,0 @@
import logging
import re
from Plugin import PluginManager
allow_reload = False # No reload supported
log = logging.getLogger("ZeronamePlugin")
@PluginManager.registerTo("SiteManager")
class SiteManagerPlugin(object):
zeroname_address = "1Name2NXVi1RDPDgf5617UoW7xA6YrhM9F"
site_zeroname = None
def load(self):
super(SiteManagerPlugin, self).load()
if not self.get(self.zeroname_address):
self.need(self.zeroname_address) # Need ZeroName site
# Checks if its a valid address
def isAddress(self, address):
if self.isDomain(address):
return True
else:
return super(SiteManagerPlugin, self).isAddress(address)
# Return: True if the address is domain
def isDomain(self, address):
return re.match("(.*?)([A-Za-z0-9_-]+\.[A-Za-z0-9]+)$", address)
# Resolve domain
# Return: The address or None
def resolveDomain(self, domain):
domain = domain.lower()
if not self.site_zeroname:
self.site_zeroname = self.need(self.zeroname_address)
self.site_zeroname.needFile("data/names.json", priority=10)
db = self.site_zeroname.storage.loadJson("data/names.json")
return db.get(domain)
# Return or create site and start download site files
# Return: Site or None if dns resolve failed
def need(self, address, all_file=True):
if self.isDomain(address): # Its looks like a domain
address_resolved = self.resolveDomain(address)
if address_resolved:
address = address_resolved
else:
return None
return super(SiteManagerPlugin, self).need(address, all_file)
# Return: Site object or None if not found
def get(self, address):
if self.sites is None: # Not loaded yet
self.load()
if self.isDomain(address): # Its looks like a domain
address_resolved = self.resolveDomain(address)
if address_resolved: # Domain found
site = self.sites.get(address_resolved)
if site:
site_domain = site.settings.get("domain")
if site_domain != address:
site.settings["domain"] = address
else: # Domain not found
site = self.sites.get(address)
else: # Access by site address
site = self.sites.get(address)
return site

View file

@ -1,42 +0,0 @@
import re
from Plugin import PluginManager
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def __init__(self, *args, **kwargs):
from Site import SiteManager
self.site_manager = SiteManager.site_manager
super(UiRequestPlugin, self).__init__(*args, **kwargs)
# Media request
def actionSiteMedia(self, path):
match = re.match("/media/(?P<address>[A-Za-z0-9]+\.[A-Za-z0-9\.]+)(?P<inner_path>/.*|$)", path)
if match: # Its a valid domain, resolve first
domain = match.group("address")
address = self.site_manager.resolveDomain(domain)
if address:
path = "/media/" + address + match.group("inner_path")
return super(UiRequestPlugin, self).actionSiteMedia(path) # Get the wrapper frame output
# Is mediarequest allowed from that referer
def isMediaRequestAllowed(self, site_address, referer):
referer_path = re.sub("http[s]{0,1}://.*?/", "/", referer).replace("/media", "") # Remove site address
referer_path = re.sub("\?.*", "", referer_path) # Remove http params
if not re.sub("^http[s]{0,1}://", "", referer).startswith(self.env["HTTP_HOST"]): # Different origin
return False
if self.isProxyRequest(): # Match to site domain
referer = re.sub("^http://zero[/]+", "http://", referer) # Allow /zero access
referer_site_address = re.match("http[s]{0,1}://(.*?)(/|$)", referer).group(1)
else: # Match to request path
referer_site_address = re.match("/(?P<address>[A-Za-z0-9\.]+)(?P<inner_path>/.*|$)", referer_path).group("address")
if referer_site_address == site_address: # Referer site address as simple address
return True
elif self.site_manager.resolveDomain(referer_site_address) == site_address: # Referer site address as dns
return True
else: # Invalid referer
return False

View file

@ -1,2 +0,0 @@
import UiRequestPlugin
import SiteManagerPlugin

View file

@ -1,159 +0,0 @@
import time
import json
import os
import sys
import re
import socket
from bitcoinrpc.authproxy import AuthServiceProxy
def publish():
print "* Signing..."
os.system("python zeronet.py siteSign %s %s" % (config["site"], config["privatekey"]))
print "* Publishing..."
os.system("python zeronet.py sitePublish %s" % config["site"])
def processNameOp(domain, value):
if not value.startswith("{"):
return False
try:
data = json.loads(value)
except Exception, err:
print "Json load error: %s" % err
return False
if "zeronet" not in data:
print "No zeronet in ", data.keys()
return False
if not isinstance(data["zeronet"], dict):
print "Not dict: ", data["zeronet"]
return False
if not re.match("^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$", domain):
print "Invalid domain: ", domain
return False
if "slave" in sys.argv:
print "Waiting for master update arrive"
time.sleep(30) # Wait 30 sec to allow master updater
# Note: Requires the file data/names.json to exist and contain "{}" to work
names_raw = open(names_path, "rb").read()
names = json.loads(names_raw)
for subdomain, address in data["zeronet"].items():
subdomain = subdomain.lower()
address = re.sub("[^A-Za-z0-9]", "", address)
print subdomain, domain, "->", address
if subdomain:
if re.match("^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$", subdomain):
names["%s.%s.bit" % (subdomain, domain)] = address
else:
print "Invalid subdomain:", domain, subdomain
else:
names["%s.bit" % domain] = address
new_names_raw = json.dumps(names, indent=2, sort_keys=True)
if new_names_raw != names_raw:
open(names_path, "wb").write(new_names_raw)
return True
else:
print "names not changed"
return False
def processBlock(block_id):
print "Processing block #%s..." % block_id
s = time.time()
block_hash = rpc.getblockhash(block_id)
block = rpc.getblock(block_hash)
print "Checking %s tx" % len(block["tx"])
updated = 0
for tx in block["tx"]:
try:
transaction = rpc.getrawtransaction(tx, 1)
for vout in transaction.get("vout", []):
if "scriptPubKey" in vout and "nameOp" in vout["scriptPubKey"] and "name" in vout["scriptPubKey"]["nameOp"]:
name_op = vout["scriptPubKey"]["nameOp"]
updated += processNameOp(name_op["name"].replace("d/", ""), name_op["value"])
except Exception, err:
print "Error processing tx #%s %s" % (tx, err)
print "Done in %.3fs (updated %s)." % (time.time() - s, updated)
if updated:
publish()
# Loading config...
# Check whether platform is on windows or linux
# On linux namecoin is installed under ~/.namecoin, while on on windows it is in %appdata%/Namecoin
if sys.platform == "win32":
namecoin_location = os.getenv('APPDATA') + "/Namecoin/"
else:
namecoin_location = os.path.expanduser("~/.namecoin/")
config_path = namecoin_location + 'zeroname_config.json'
if not os.path.isfile(config_path): # Create sample config
open(config_path, "w").write(
json.dumps({'site': 'site', 'zeronet_path': '/home/zeronet/', 'privatekey': '', 'lastprocessed': 223911}, indent=2)
)
print "Example config written to %s" % config_path
sys.exit(0)
config = json.load(open(config_path))
names_path = "%s/data/%s/data/names.json" % (config["zeronet_path"], config["site"])
os.chdir(config["zeronet_path"]) # Change working dir - tells script where Zeronet install is.
# Getting rpc connect details
namecoin_conf = open(namecoin_location + "namecoin.conf").read()
# Connecting to RPC
rpc_user = re.search("rpcuser=(.*)$", namecoin_conf, re.M).group(1)
rpc_pass = re.search("rpcpassword=(.*)$", namecoin_conf, re.M).group(1)
rpc_url = "http://%s:%s@127.0.0.1:8336" % (rpc_user, rpc_pass)
rpc = AuthServiceProxy(rpc_url, timeout=60 * 5)
last_block = int(rpc.getinfo()["blocks"])
if not config["lastprocessed"]: # Start processing from last block
config["lastprocessed"] = last_block
# Processing skipped blocks
print "Processing block from #%s to #%s..." % (config["lastprocessed"], last_block)
for block_id in range(config["lastprocessed"], last_block + 1):
processBlock(block_id)
# processBlock(223911) # Testing zeronetwork.bit
# processBlock(227052) # Testing brainwallets.bit
# processBlock(236824) # Utf8 domain name (invalid should skip)
# processBlock(236752) # Uppercase domain (invalid should skip)
# processBlock(236870) # Encoded domain (should pass)
# sys.exit(0)
while 1:
print "Waiting for new block",
sys.stdout.flush()
while 1:
try:
rpc = AuthServiceProxy(rpc_url, timeout=60 * 5)
if (int(rpc.getinfo()["blocks"]) > last_block):
break
time.sleep(1)
rpc.waitforblock()
print "Found"
break # Block found
except socket.timeout: # Timeout
print ".",
sys.stdout.flush()
except Exception, err:
print "Exception", err.__class__, err
time.sleep(5)
last_block = int(rpc.getinfo()["blocks"])
for block_id in range(config["lastprocessed"] + 1, last_block + 1):
processBlock(block_id)
config["lastprocessed"] = last_block
open(config_path, "w").write(json.dumps(config, indent=1))

View file

@ -1,157 +0,0 @@
import time
import re
import gevent
from Config import config
from Db import Db
from util import helper
class BootstrapperDb(Db):
def __init__(self):
self.version = 6
self.hash_ids = {} # hash -> id cache
super(BootstrapperDb, self).__init__({"db_name": "Bootstrapper"}, "%s/bootstrapper.db" % config.data_dir)
self.foreign_keys = True
self.checkTables()
self.updateHashCache()
gevent.spawn(self.cleanup)
def cleanup(self):
while 1:
self.execute("DELETE FROM peer WHERE date_announced < DATETIME('now', '-40 minute')")
time.sleep(4*60)
def updateHashCache(self):
res = self.execute("SELECT * FROM hash")
self.hash_ids = {str(row["hash"]): row["hash_id"] for row in res}
self.log.debug("Loaded %s hash_ids" % len(self.hash_ids))
def checkTables(self):
version = int(self.execute("PRAGMA user_version").fetchone()[0])
self.log.debug("Db version: %s, needed: %s" % (version, self.version))
if version < self.version:
self.createTables()
else:
self.execute("VACUUM")
def createTables(self):
# Delete all tables
self.execute("PRAGMA writable_schema = 1")
self.execute("DELETE FROM sqlite_master WHERE type IN ('table', 'index', 'trigger')")
self.execute("PRAGMA writable_schema = 0")
self.execute("VACUUM")
self.execute("PRAGMA INTEGRITY_CHECK")
# Create new tables
self.execute("""
CREATE TABLE peer (
peer_id INTEGER PRIMARY KEY ASC AUTOINCREMENT NOT NULL UNIQUE,
port INTEGER NOT NULL,
ip4 TEXT,
onion TEXT,
date_added DATETIME DEFAULT (CURRENT_TIMESTAMP),
date_announced DATETIME DEFAULT (CURRENT_TIMESTAMP)
);
""")
self.execute("""
CREATE TABLE peer_to_hash (
peer_to_hash_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
peer_id INTEGER REFERENCES peer (peer_id) ON DELETE CASCADE,
hash_id INTEGER REFERENCES hash (hash_id)
);
""")
self.execute("CREATE INDEX peer_id ON peer_to_hash (peer_id);")
self.execute("CREATE INDEX hash_id ON peer_to_hash (hash_id);")
self.execute("""
CREATE TABLE hash (
hash_id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
hash BLOB UNIQUE NOT NULL,
date_added DATETIME DEFAULT (CURRENT_TIMESTAMP)
);
""")
self.execute("PRAGMA user_version = %s" % self.version)
def getHashId(self, hash):
if hash not in self.hash_ids:
self.log.debug("New hash: %s" % repr(hash))
self.execute("INSERT OR IGNORE INTO hash ?", {"hash": buffer(hash)})
self.hash_ids[hash] = self.cur.cursor.lastrowid
return self.hash_ids[hash]
def peerAnnounce(self, ip4=None, onion=None, port=None, hashes=[], onion_signed=False, delete_missing_hashes=False):
hashes_ids_announced = []
for hash in hashes:
hashes_ids_announced.append(self.getHashId(hash))
if not ip4 and not onion:
return 0
# Check user
if onion:
res = self.execute("SELECT * FROM peer WHERE ? LIMIT 1", {"onion": onion})
else:
res = self.execute("SELECT * FROM peer WHERE ? LIMIT 1", {"ip4": ip4, "port": port})
user_row = res.fetchone()
if user_row:
peer_id = user_row["peer_id"]
self.execute("UPDATE peer SET date_announced = DATETIME('now') WHERE ?", {"peer_id": peer_id})
else:
self.log.debug("New peer: %s %s signed: %s" % (ip4, onion, onion_signed))
if onion and not onion_signed:
return len(hashes)
self.execute("INSERT INTO peer ?", {"ip4": ip4, "onion": onion, "port": port})
peer_id = self.cur.cursor.lastrowid
# Check user's hashes
res = self.execute("SELECT * FROM peer_to_hash WHERE ?", {"peer_id": peer_id})
hash_ids_db = [row["hash_id"] for row in res]
if hash_ids_db != hashes_ids_announced:
hash_ids_added = set(hashes_ids_announced) - set(hash_ids_db)
hash_ids_removed = set(hash_ids_db) - set(hashes_ids_announced)
if not onion or onion_signed:
for hash_id in hash_ids_added:
self.execute("INSERT INTO peer_to_hash ?", {"peer_id": peer_id, "hash_id": hash_id})
if hash_ids_removed and delete_missing_hashes:
self.execute("DELETE FROM peer_to_hash WHERE ?", {"peer_id": peer_id, "hash_id": list(hash_ids_removed)})
return len(hash_ids_added) + len(hash_ids_removed)
else:
return 0
def peerList(self, hash, ip4=None, onions=[], port=None, limit=30, need_types=["ip4", "onion"]):
hash_peers = {"ip4": [], "onion": []}
if limit == 0:
return hash_peers
hashid = self.getHashId(hash)
where = "hash_id = :hashid"
if onions:
onions_escaped = ["'%s'" % re.sub("[^a-z0-9,]", "", onion) for onion in onions]
where += " AND (onion NOT IN (%s) OR onion IS NULL)" % ",".join(onions_escaped)
elif ip4:
where += " AND (NOT (ip4 = :ip4 AND port = :port) OR ip4 IS NULL)"
query = """
SELECT ip4, port, onion
FROM peer_to_hash
LEFT JOIN peer USING (peer_id)
WHERE %s
LIMIT :limit
""" % where
res = self.execute(query, {"hashid": hashid, "ip4": ip4, "onions": onions, "port": port, "limit": limit})
for row in res:
if row["ip4"] and "ip4" in need_types:
hash_peers["ip4"].append(
helper.packAddress(row["ip4"], row["port"])
)
if row["onion"] and "onion" in need_types:
hash_peers["onion"].append(
helper.packOnionAddress(row["onion"], row["port"])
)
return hash_peers

View file

@ -1,105 +0,0 @@
import time
from Plugin import PluginManager
from BootstrapperDb import BootstrapperDb
from Crypt import CryptRsa
if "db" not in locals().keys(): # Share durin reloads
db = BootstrapperDb()
@PluginManager.registerTo("FileRequest")
class FileRequestPlugin(object):
def actionAnnounce(self, params):
hashes = params["hashes"]
if "onion_signs" in params and len(params["onion_signs"]) == len(hashes):
# Check if all sign is correct
if time.time() - float(params["onion_sign_this"]) < 3*60: # Peer has 3 minute to sign the message
onions_signed = []
# Check onion signs
for onion_publickey, onion_sign in params["onion_signs"].items():
if CryptRsa.verify(params["onion_sign_this"], onion_publickey, onion_sign):
onions_signed.append(CryptRsa.publickeyToOnion(onion_publickey))
else:
break
# Check if the same onion addresses signed as the announced onces
if sorted(onions_signed) == sorted(params["onions"]):
all_onions_signed = True
else:
all_onions_signed = False
else:
# Onion sign this out of 3 minute
all_onions_signed = False
else:
# Incorrect signs number
all_onions_signed = False
if "ip4" in params["add"] and self.connection.ip != "127.0.0.1" and not self.connection.ip.endswith(".onion"):
ip4 = self.connection.ip
else:
ip4 = None
# Separatley add onions to sites or at once if no onions present
hashes_changed = 0
i = 0
for onion in params.get("onions", []):
hashes_changed += db.peerAnnounce(
onion=onion,
port=params["port"],
hashes=[hashes[i]],
onion_signed=all_onions_signed
)
i += 1
# Announce all sites if ip4 defined
if ip4:
hashes_changed += db.peerAnnounce(
ip4=ip4,
port=params["port"],
hashes=hashes,
delete_missing_hashes=params.get("delete")
)
# Query sites
back = {}
peers = []
if params.get("onions") and not all_onions_signed and hashes_changed:
back["onion_sign_this"] = "%.0f" % time.time() # Send back nonce for signing
for hash in hashes:
hash_peers = db.peerList(
hash,
ip4=self.connection.ip, onions=params.get("onions"), port=params["port"],
limit=min(30, params["need_num"]), need_types=params["need_types"]
)
peers.append(hash_peers)
back["peers"] = peers
self.response(back)
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def actionStatsBootstrapper(self):
self.sendHeader()
# Style
yield """
<style>
* { font-family: monospace; white-space: pre }
table td, table th { text-align: right; padding: 0px 10px }
</style>
"""
hash_rows = db.execute("SELECT * FROM hash").fetchall()
for hash_row in hash_rows:
peer_rows = db.execute(
"SELECT * FROM peer LEFT JOIN peer_to_hash USING (peer_id) WHERE hash_id = :hash_id",
{"hash_id": hash_row["hash_id"]}
).fetchall()
yield "<br>%s (added: %s, peers: %s)<br>" % (
str(hash_row["hash"]).encode("hex"), hash_row["date_added"], len(peer_rows)
)
for peer_row in peer_rows:
yield " - {ip4: <30} {onion: <30} added: {date_added}, announced: {date_announced}<br>".format(**dict(peer_row))

View file

@ -1,179 +0,0 @@
import hashlib
import os
import pytest
from Bootstrapper import BootstrapperPlugin
from Bootstrapper.BootstrapperDb import BootstrapperDb
from Peer import Peer
from Crypt import CryptRsa
from util import helper
@pytest.fixture()
def bootstrapper_db(request):
BootstrapperPlugin.db.close()
BootstrapperPlugin.db = BootstrapperDb()
BootstrapperPlugin.db.createTables() # Reset db
BootstrapperPlugin.db.cur.logging = True
def cleanup():
BootstrapperPlugin.db.close()
os.unlink(BootstrapperPlugin.db.db_path)
request.addfinalizer(cleanup)
return BootstrapperPlugin.db
@pytest.mark.usefixtures("resetSettings")
class TestBootstrapper:
def testIp4(self, file_server, bootstrapper_db):
peer = Peer("127.0.0.1", 1544, connection_server=file_server)
hash1 = hashlib.sha256("site1").digest()
hash2 = hashlib.sha256("site2").digest()
hash3 = hashlib.sha256("site3").digest()
# Verify empty result
res = peer.request("announce", {
"hashes": [hash1, hash2],
"port": 15441, "need_types": ["ip4"], "need_num": 10, "add": ["ip4"]
})
assert len(res["peers"][0]["ip4"]) == 0 # Empty result
# Verify added peer on previous request
bootstrapper_db.peerAnnounce(ip4="1.2.3.4", port=15441, hashes=[hash1, hash2], delete_missing_hashes=True)
res = peer.request("announce", {
"hashes": [hash1, hash2],
"port": 15441, "need_types": ["ip4"], "need_num": 10, "add": ["ip4"]
})
assert len(res["peers"][0]["ip4"]) == 1
assert len(res["peers"][1]["ip4"]) == 1
# hash2 deleted from 1.2.3.4
bootstrapper_db.peerAnnounce(ip4="1.2.3.4", port=15441, hashes=[hash1], delete_missing_hashes=True)
res = peer.request("announce", {
"hashes": [hash1, hash2],
"port": 15441, "need_types": ["ip4"], "need_num": 10, "add": ["ip4"]
})
assert len(res["peers"][0]["ip4"]) == 1
assert len(res["peers"][1]["ip4"]) == 0
# Announce 3 hash again
bootstrapper_db.peerAnnounce(ip4="1.2.3.4", port=15441, hashes=[hash1, hash2, hash3], delete_missing_hashes=True)
res = peer.request("announce", {
"hashes": [hash1, hash2, hash3],
"port": 15441, "need_types": ["ip4"], "need_num": 10, "add": ["ip4"]
})
assert len(res["peers"][0]["ip4"]) == 1
assert len(res["peers"][1]["ip4"]) == 1
assert len(res["peers"][2]["ip4"]) == 1
# Single hash announce
res = peer.request("announce", {
"hashes": [hash1], "port": 15441, "need_types": ["ip4"], "need_num": 10, "add": ["ip4"]
})
assert len(res["peers"][0]["ip4"]) == 1
# Test DB cleanup
assert bootstrapper_db.execute("SELECT COUNT(*) AS num FROM peer").fetchone()["num"] == 1 # 127.0.0.1 never get added to db
# Delete peers
bootstrapper_db.execute("DELETE FROM peer WHERE ip4 = '1.2.3.4'")
assert bootstrapper_db.execute("SELECT COUNT(*) AS num FROM peer_to_hash").fetchone()["num"] == 0
assert bootstrapper_db.execute("SELECT COUNT(*) AS num FROM hash").fetchone()["num"] == 3 # 3 sites
assert bootstrapper_db.execute("SELECT COUNT(*) AS num FROM peer").fetchone()["num"] == 0 # 0 peer
def testPassive(self, file_server, bootstrapper_db):
peer = Peer("127.0.0.1", 1544, connection_server=file_server)
hash1 = hashlib.sha256("hash1").digest()
bootstrapper_db.peerAnnounce(ip4=None, port=15441, hashes=[hash1])
res = peer.request("announce", {
"hashes": [hash1], "port": 15441, "need_types": ["ip4"], "need_num": 10, "add": []
})
assert len(res["peers"][0]["ip4"]) == 0 # Empty result
def testAddOnion(self, file_server, site, bootstrapper_db, tor_manager):
onion1 = tor_manager.addOnion()
onion2 = tor_manager.addOnion()
peer = Peer("127.0.0.1", 1544, connection_server=file_server)
hash1 = hashlib.sha256("site1").digest()
hash2 = hashlib.sha256("site2").digest()
bootstrapper_db.peerAnnounce(ip4="1.2.3.4", port=1234, hashes=[hash1, hash2])
res = peer.request("announce", {
"onions": [onion1, onion2],
"hashes": [hash1, hash2], "port": 15441, "need_types": ["ip4", "onion"], "need_num": 10, "add": ["onion"]
})
assert len(res["peers"][0]["ip4"]) == 1
assert "onion_sign_this" in res
# Onion address not added yet
site_peers = bootstrapper_db.peerList(ip4="1.2.3.4", port=1234, hash=hash1)
assert len(site_peers["onion"]) == 0
assert "onion_sign_this" in res
# Sign the nonces
sign1 = CryptRsa.sign(res["onion_sign_this"], tor_manager.getPrivatekey(onion1))
sign2 = CryptRsa.sign(res["onion_sign_this"], tor_manager.getPrivatekey(onion2))
# Bad sign (different address)
res = peer.request("announce", {
"onions": [onion1], "onion_sign_this": res["onion_sign_this"],
"onion_signs": {tor_manager.getPublickey(onion2): sign2},
"hashes": [hash1], "port": 15441, "need_types": ["ip4", "onion"], "need_num": 10, "add": ["onion"]
})
assert "onion_sign_this" in res
site_peers1 = bootstrapper_db.peerList(ip4="1.2.3.4", port=1234, hash=hash1)
assert len(site_peers1["onion"]) == 0 # Not added
# Bad sign (missing one)
res = peer.request("announce", {
"onions": [onion1, onion2], "onion_sign_this": res["onion_sign_this"],
"onion_signs": {tor_manager.getPublickey(onion1): sign1},
"hashes": [hash1, hash2], "port": 15441, "need_types": ["ip4", "onion"], "need_num": 10, "add": ["onion"]
})
assert "onion_sign_this" in res
site_peers1 = bootstrapper_db.peerList(ip4="1.2.3.4", port=1234, hash=hash1)
assert len(site_peers1["onion"]) == 0 # Not added
# Good sign
res = peer.request("announce", {
"onions": [onion1, onion2], "onion_sign_this": res["onion_sign_this"],
"onion_signs": {tor_manager.getPublickey(onion1): sign1, tor_manager.getPublickey(onion2): sign2},
"hashes": [hash1, hash2], "port": 15441, "need_types": ["ip4", "onion"], "need_num": 10, "add": ["onion"]
})
assert "onion_sign_this" not in res
# Onion addresses added
site_peers1 = bootstrapper_db.peerList(ip4="1.2.3.4", port=1234, hash=hash1)
assert len(site_peers1["onion"]) == 1
site_peers2 = bootstrapper_db.peerList(ip4="1.2.3.4", port=1234, hash=hash2)
assert len(site_peers2["onion"]) == 1
assert site_peers1["onion"][0] != site_peers2["onion"][0]
assert helper.unpackOnionAddress(site_peers1["onion"][0])[0] == onion1+".onion"
assert helper.unpackOnionAddress(site_peers2["onion"][0])[0] == onion2+".onion"
tor_manager.delOnion(onion1)
tor_manager.delOnion(onion2)
def testRequestPeers(self, file_server, site, bootstrapper_db, tor_manager):
site.connection_server = file_server
hash = hashlib.sha256(site.address).digest()
# Request peers from tracker
assert len(site.peers) == 0
bootstrapper_db.peerAnnounce(ip4="1.2.3.4", port=1234, hashes=[hash])
site.announceTracker("zero", "127.0.0.1:1544")
assert len(site.peers) == 1
# Test onion address store
bootstrapper_db.peerAnnounce(onion="bka4ht2bzxchy44r", port=1234, hashes=[hash], onion_signed=True)
site.announceTracker("zero", "127.0.0.1:1544")
assert len(site.peers) == 2
assert "bka4ht2bzxchy44r.onion:1234" in site.peers

View file

@ -1 +0,0 @@
from src.Test.conftest import *

View file

@ -1,5 +0,0 @@
[pytest]
python_files = Test*.py
addopts = -rsxX -v --durations=6
markers =
webtest: mark a test as a webtest.

View file

@ -1 +0,0 @@
import BootstrapperPlugin

View file

@ -1,153 +0,0 @@
import logging, json, os, re, sys, time
import gevent
from Plugin import PluginManager
from Config import config
from util import Http
from Debug import Debug
allow_reload = False # No reload supported
log = logging.getLogger("DnschainPlugin")
@PluginManager.registerTo("SiteManager")
class SiteManagerPlugin(object):
dns_cache_path = "%s/dns_cache.json" % config.data_dir
dns_cache = None
# Checks if its a valid address
def isAddress(self, address):
if self.isDomain(address):
return True
else:
return super(SiteManagerPlugin, self).isAddress(address)
# Return: True if the address is domain
def isDomain(self, address):
return re.match("(.*?)([A-Za-z0-9_-]+\.[A-Za-z0-9]+)$", address)
# Load dns entries from data/dns_cache.json
def loadDnsCache(self):
if os.path.isfile(self.dns_cache_path):
self.dns_cache = json.load(open(self.dns_cache_path))
else:
self.dns_cache = {}
log.debug("Loaded dns cache, entries: %s" % len(self.dns_cache))
# Save dns entries to data/dns_cache.json
def saveDnsCache(self):
json.dump(self.dns_cache, open(self.dns_cache_path, "wb"), indent=2)
# Resolve domain using dnschain.net
# Return: The address or None
def resolveDomainDnschainNet(self, domain):
try:
match = self.isDomain(domain)
sub_domain = match.group(1).strip(".")
top_domain = match.group(2)
if not sub_domain: sub_domain = "@"
address = None
with gevent.Timeout(5, Exception("Timeout: 5s")):
res = Http.get("https://api.dnschain.net/v1/namecoin/key/%s" % top_domain).read()
data = json.loads(res)["data"]["value"]
if "zeronet" in data:
for key, val in data["zeronet"].iteritems():
self.dns_cache[key+"."+top_domain] = [val, time.time()+60*60*5] # Cache for 5 hours
self.saveDnsCache()
return data["zeronet"].get(sub_domain)
# Not found
return address
except Exception, err:
log.debug("Dnschain.net %s resolve error: %s" % (domain, Debug.formatException(err)))
# Resolve domain using dnschain.info
# Return: The address or None
def resolveDomainDnschainInfo(self, domain):
try:
match = self.isDomain(domain)
sub_domain = match.group(1).strip(".")
top_domain = match.group(2)
if not sub_domain: sub_domain = "@"
address = None
with gevent.Timeout(5, Exception("Timeout: 5s")):
res = Http.get("https://dnschain.info/bit/d/%s" % re.sub("\.bit$", "", top_domain)).read()
data = json.loads(res)["value"]
for key, val in data["zeronet"].iteritems():
self.dns_cache[key+"."+top_domain] = [val, time.time()+60*60*5] # Cache for 5 hours
self.saveDnsCache()
return data["zeronet"].get(sub_domain)
# Not found
return address
except Exception, err:
log.debug("Dnschain.info %s resolve error: %s" % (domain, Debug.formatException(err)))
# Resolve domain
# Return: The address or None
def resolveDomain(self, domain):
domain = domain.lower()
if self.dns_cache == None:
self.loadDnsCache()
if domain.count(".") < 2: # Its a topleved request, prepend @. to it
domain = "@."+domain
domain_details = self.dns_cache.get(domain)
if domain_details and time.time() < domain_details[1]: # Found in cache and its not expired
return domain_details[0]
else:
# Resovle dns using dnschain
thread_dnschain_info = gevent.spawn(self.resolveDomainDnschainInfo, domain)
thread_dnschain_net = gevent.spawn(self.resolveDomainDnschainNet, domain)
gevent.joinall([thread_dnschain_net, thread_dnschain_info]) # Wait for finish
if thread_dnschain_info.value and thread_dnschain_net.value: # Booth successfull
if thread_dnschain_info.value == thread_dnschain_net.value: # Same returned value
return thread_dnschain_info.value
else:
log.error("Dns %s missmatch: %s != %s" % (domain, thread_dnschain_info.value, thread_dnschain_net.value))
# Problem during resolve
if domain_details: # Resolve failed, but we have it in the cache
domain_details[1] = time.time()+60*60 # Dont try again for 1 hour
return domain_details[0]
else: # Not found in cache
self.dns_cache[domain] = [None, time.time()+60] # Don't check again for 1 min
return None
# Return or create site and start download site files
# Return: Site or None if dns resolve failed
def need(self, address, all_file=True):
if self.isDomain(address): # Its looks like a domain
address_resolved = self.resolveDomain(address)
if address_resolved:
address = address_resolved
else:
return None
return super(SiteManagerPlugin, self).need(address, all_file)
# Return: Site object or None if not found
def get(self, address):
if self.sites == None: # Not loaded yet
self.load()
if self.isDomain(address): # Its looks like a domain
address_resolved = self.resolveDomain(address)
if address_resolved: # Domain found
site = self.sites.get(address_resolved)
if site:
site_domain = site.settings.get("domain")
if site_domain != address:
site.settings["domain"] = address
else: # Domain not found
site = self.sites.get(address)
else: # Access by site address
site = self.sites.get(address)
return site

View file

@ -1,34 +0,0 @@
import re
from Plugin import PluginManager
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def __init__(self, server = None):
from Site import SiteManager
self.site_manager = SiteManager.site_manager
super(UiRequestPlugin, self).__init__(server)
# Media request
def actionSiteMedia(self, path):
match = re.match("/media/(?P<address>[A-Za-z0-9]+\.[A-Za-z0-9\.]+)(?P<inner_path>/.*|$)", path)
if match: # Its a valid domain, resolve first
domain = match.group("address")
address = self.site_manager.resolveDomain(domain)
if address:
path = "/media/"+address+match.group("inner_path")
return super(UiRequestPlugin, self).actionSiteMedia(path) # Get the wrapper frame output
# Is mediarequest allowed from that referer
def isMediaRequestAllowed(self, site_address, referer):
referer_path = re.sub("http[s]{0,1}://.*?/", "/", referer).replace("/media", "") # Remove site address
referer_site_address = re.match("/(?P<address>[A-Za-z0-9\.]+)(?P<inner_path>/.*|$)", referer_path).group("address")
if referer_site_address == site_address: # Referer site address as simple address
return True
elif self.site_manager.resolveDomain(referer_site_address) == site_address: # Referer site address as dns
return True
else: # Invalid referer
return False

View file

@ -1,3 +0,0 @@
# This plugin is experimental, if you really want to enable uncomment the following lines:
# import DnschainPlugin
# import SiteManagerPlugin

View file

@ -1,24 +0,0 @@
import re
from Plugin import PluginManager
# Warning: If you modify the donation address then renmae the plugin's directory to "MyDonationMessage" to prevent the update script overwrite
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
# Inject a donation message to every page top right corner
def actionWrapper(self, path):
back = super(UiRequestPlugin, self).actionWrapper(path)
if not back or not hasattr(back, "endswith"): return back # Wrapper error or not string returned, injection not possible
back = re.sub("</body>\s*</html>\s*$",
"""
<style>
#donation_message { position: absolute; bottom: 0px; right: 20px; padding: 7px; font-family: Arial; font-size: 11px }
</style>
<a id='donation_message' href='https://blockchain.info/address/1QDhxQ6PraUZa21ET5fYUCPgdrwBomnFgX' target='_blank'>Please donate to help to keep this ZeroProxy alive</a>
</body>
</html>
""", back)
return back

View file

@ -1 +0,0 @@
import DonationMessagePlugin

View file

@ -1,171 +0,0 @@
import re
import sys
from Plugin import PluginManager
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def __init__(self, *args, **kwargs):
self.user_manager = sys.modules["User.UserManager"].user_manager
super(UiRequestPlugin, self).__init__(*args, **kwargs)
# Create new user and inject user welcome message if necessary
# Return: Html body also containing the injection
def actionWrapper(self, path, extra_headers=None):
match = re.match("/(?P<address>[A-Za-z0-9\._-]+)(?P<inner_path>/.*|$)", path)
if not match:
return False
inner_path = match.group("inner_path").lstrip("/")
html_request = "." not in inner_path or inner_path.endswith(".html") # Only inject html to html requests
user_created = False
if html_request:
user = self.getCurrentUser() # Get user from cookie
if not user: # No user found by cookie
user = self.user_manager.create()
user_created = True
if user_created:
if not extra_headers:
extra_headers = []
extra_headers.append(('Set-Cookie', "master_address=%s;path=/;max-age=2592000;" % user.master_address)) # = 30 days
loggedin = self.get.get("login") == "done"
back_generator = super(UiRequestPlugin, self).actionWrapper(path, extra_headers) # Get the wrapper frame output
if not back_generator: # Wrapper error or not string returned, injection not possible
return False
if user_created:
back = back_generator.next()
master_seed = user.master_seed
# Inject the welcome message
inject_html = """
<!-- Multiser plugin -->
<style>
.masterseed { font-size: 95%; background-color: #FFF0AD; padding: 5px 8px; margin: 9px 0px }
</style>
<script>
hello_message = "<b>Hello, welcome to ZeroProxy!</b><div style='margin-top: 8px'>A new, unique account created for you:</div>"
hello_message+= "<div class='masterseed'>{master_seed}</div> <div>This is your private key, <b>save it</b>, so you can login next time.</div><br>"
hello_message+= "<a href='#' class='button' style='margin-left: 0px'>Ok, Saved it!</a> or <a href='#Login' onclick='wrapper.ws.cmd(\\"userLoginForm\\", []); return false'>Login</a><br><br>"
hello_message+= "<small>This site allows you to browse ZeroNet content, but if you want to secure your account <br>"
hello_message+= "and help to make a better network, then please run your own <a href='https://github.com/HelloZeroNet/ZeroNet' target='_blank'>ZeroNet client</a>.</small>"
setTimeout(function() {
wrapper.notifications.add("hello", "info", hello_message)
delete(hello_message)
}, 1000)
</script>
</body>
</html>
""".replace("\t", "")
inject_html = inject_html.replace("{master_seed}", master_seed) # Set the master seed in the message
return iter([re.sub("</body>\s*</html>\s*$", inject_html, back)]) # Replace the </body></html> tags with the injection
elif loggedin:
back = back_generator.next()
inject_html = """
<!-- Multiser plugin -->
<script>
setTimeout(function() {
wrapper.notifications.add("login", "done", "Hello again!<br><small>You have been logged in successfully</small>", 5000)
}, 1000)
</script>
</body>
</html>
""".replace("\t", "")
return iter([re.sub("</body>\s*</html>\s*$", inject_html, back)]) # Replace the </body></html> tags with the injection
else: # No injection necessary
return back_generator
# Get the current user based on request's cookies
# Return: User object or None if no match
def getCurrentUser(self):
cookies = self.getCookies()
user = None
if "master_address" in cookies:
users = self.user_manager.list()
user = users.get(cookies["master_address"])
return user
@PluginManager.registerTo("UserManager")
class UserManagerPlugin(object):
# In multiuser mode do not load the users
def load(self):
if not self.users:
self.users = {}
return self.users
# Find user by master address
# Return: User or None
def get(self, master_address=None):
users = self.list()
if master_address in users:
user = users[master_address]
else:
user = None
return user
@PluginManager.registerTo("User")
class UserPlugin(object):
# In multiuser mode users data only exits in memory, dont write to data/user.json
def save(self):
return False
@PluginManager.registerTo("UiWebsocket")
class UiWebsocketPlugin(object):
# Let the page know we running in multiuser mode
def formatServerInfo(self):
server_info = super(UiWebsocketPlugin, self).formatServerInfo()
server_info["multiuser"] = True
if "ADMIN" in self.site.settings["permissions"]:
server_info["master_address"] = self.user.master_address
return server_info
# Show current user's master seed
def actionUserShowMasterSeed(self, to):
if "ADMIN" not in self.site.settings["permissions"]:
return self.response(to, "Show master seed not allowed")
message = "<b style='padding-top: 5px; display: inline-block'>Your unique private key:</b>"
message += "<div style='font-size: 84%%; background-color: #FFF0AD; padding: 5px 8px; margin: 9px 0px'>%s</div>" % self.user.master_seed
message += "<small>(Save it, you can access your account using this information)</small>"
self.cmd("notification", ["info", message])
# Logout user
def actionUserLogout(self, to):
if "ADMIN" not in self.site.settings["permissions"]:
return self.response(to, "Logout not allowed")
message = "<b>You have been logged out.</b> <a href='#Login' class='button' onclick='wrapper.ws.cmd(\"userLoginForm\", []); return false'>Login to another account</a>"
message += "<script>document.cookie = 'master_address=; expires=Thu, 01 Jan 1970 00:00:00 UTC'</script>"
self.cmd("notification", ["done", message, 1000000]) # 1000000 = Show ~forever :)
# Delete from user_manager
user_manager = sys.modules["User.UserManager"].user_manager
if self.user.master_address in user_manager.users:
del user_manager.users[self.user.master_address]
self.response(to, "Successful logout")
else:
self.response(to, "User not found")
# Show login form
def actionUserLoginForm(self, to):
self.cmd("prompt", ["<b>Login</b><br>Your private key:", "password", "Login"], self.responseUserLogin)
# Login form submit
def responseUserLogin(self, master_seed):
user_manager = sys.modules["User.UserManager"].user_manager
user = user_manager.create(master_seed=master_seed)
if user.master_address:
message = "Successfull login, reloading page..."
message += "<script>document.cookie = 'master_address=%s;path=/;max-age=2592000;'</script>" % user.master_address
message += "<script>wrapper.reload('login=done')</script>"
self.cmd("notification", ["done", message])
else:
self.cmd("notification", ["error", "Error: Invalid master seed"])
self.actionUserLoginForm(0)

View file

@ -1 +0,0 @@
import MultiuserPlugin

View file

@ -1,118 +0,0 @@
import string
import random
import time
import json
import re
from Config import config
from Plugin import PluginManager
if "sessions" not in locals().keys(): # To keep sessions between module reloads
sessions = {}
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
sessions = sessions
last_cleanup = time.time()
def route(self, path):
if path.endswith("favicon.ico"):
return self.actionFile("src/Ui/media/img/favicon.ico")
else:
if config.ui_password:
if time.time() - self.last_cleanup > 60 * 60: # Cleanup expired sessions every hour
self.cleanup()
# Validate session
session_id = self.getCookies().get("session_id")
if session_id not in self.sessions: # Invalid session id, display login
return self.actionLogin()
return super(UiRequestPlugin, self).route(path)
# Action: Login
def actionLogin(self):
template = open("plugins/UiPassword/login.html").read()
self.sendHeader()
posted = self.getPosted()
if posted: # Validate http posted data
if self.checkPassword(posted.get("password")):
# Valid password, create session
session_id = self.randomString(26)
self.sessions[session_id] = {
"added": time.time(),
"keep": posted.get("keep")
}
# Redirect to homepage or referer
url = self.env.get("HTTP_REFERER", "")
if not url or re.sub("\?.*", "", url).endswith("/Login"):
url = "/" + config.homepage
cookie_header = ('Set-Cookie', "session_id=%s;path=/;max-age=2592000;" % session_id) # Max age = 30 days
self.start_response('301 Redirect', [('Location', url), cookie_header])
yield "Redirecting..."
else:
# Invalid password, show login form again
template = template.replace("{result}", "bad_password")
yield template
def checkPassword(self, password):
if password == config.ui_password:
return True
else:
return False
def randomString(self, chars):
return ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(chars))
@classmethod
def cleanup(cls):
cls.last_cleanup = time.time()
for session_id, session in cls.sessions.items():
if session["keep"] and time.time() - session["added"] > 60 * 60 * 24 * 60: # Max 60days for keep sessions
del(cls.sessions[session_id])
elif not session["keep"] and time.time() - session["added"] > 60 * 60 * 24: # Max 24h for non-keep sessions
del(cls.sessions[session_id])
# Action: Display sessions
def actionSessions(self):
self.sendHeader()
yield "<pre>"
yield json.dumps(self.sessions, indent=4)
# Action: Logout
def actionLogout(self):
# Session id has to passed as get parameter or called without referer to avoid remote logout
session_id = self.getCookies().get("session_id")
if not self.env.get("HTTP_REFERER") or session_id == self.get.get("session_id"):
if session_id in self.sessions:
del self.sessions[session_id]
self.start_response('301 Redirect', [
('Location', "/"),
('Set-Cookie', "session_id=deleted; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT")
])
yield "Redirecting..."
else:
self.sendHeader()
yield "Error: Invalid session id"
@PluginManager.registerTo("ConfigPlugin")
class ConfigPlugin(object):
def createArguments(self):
group = self.parser.add_argument_group("UiPassword plugin")
group.add_argument('--ui_password', help='Password to access UiServer', default=None, metavar="password")
return super(ConfigPlugin, self).createArguments()
@PluginManager.registerTo("UiWebsocket")
class UiWebsocketPlugin(object):
def actionUiLogout(self, to):
permissions = self.getPermissions(to)
if "ADMIN" not in permissions:
return self.response(to, "You don't have permission to run this command")
session_id = self.request.getCookies().get("session_id", "")
message = "<script>document.location.href = '/Logout?session_id=%s'</script>" % session_id
self.cmd("notification", ["done", message])

View file

@ -1 +0,0 @@
import UiPasswordPlugin

View file

@ -1,116 +0,0 @@
<html>
<head>
<title>Log In</title>
<meta name="viewport" id="viewport" content="width=device-width, initial-scale=1.0">
</head>
<style>
body {
background-color: #323C4D; font-family: "Segoe UI", Helvetica, Arial; font-weight: lighter;
font-size: 22px; color: #333; letter-spacing: 1px; color: white; overflow: hidden;
}
.login { left: 50%; position: absolute; top: 50%; transform: translateX(-50%) translateY(-50%); -webkit-transform: translateX(-50%) translateY(-50%); width: 100%; max-width: 370px; text-align: center; }
*:focus { outline: 0; }
input[type=text], input[type=password] {
padding: 10px 0px; border: 0px; display: block; margin: 15px 0px; width: 100%; border-radius: 30px; transition: 0.3s ease-out; background-color: #DDD;
text-align: center; font-family: "Segoe UI", Helvetica, Arial; font-weight: lighter; font-size: 28px; border: 2px solid #323C4D;
}
input[type=text]:focus, input[type=password]:focus {
border: 2px solid #FFF; background-color: #FFF;
}
input[type=checkbox] { opacity: 0; }
input[type=checkbox]:checked + label { color: white; }
input[type=checkbox]:focus + label::before { background-color: #435065; }
input[type=checkbox]:checked + label::before { box-shadow: inset 0px 0px 0px 5px white; background-color: #4DCC6E; }
input.error { border: 2px solid #F44336 !important; animation: shake 1s }
label::before {
content: ""; width: 20px; height: 20px; background-color: #323C4D;
display: inline-block; margin-left: -20px; border-radius: 15px; box-shadow: inset 0px 0px 0px 2px #9EA5B3;
transition: all 0.1s; margin-right: 7px; position: relative; top: 2px;
}
label { vertical-align: -1px; color: #9EA5B3; transition: all 0.3s; }
.button {
padding: 13px; display: inline-block; margin: 15px 0px; width: 100%; border-radius: 30px; text-align: center; white-space: nowrap;
font-size: 28px; color: #333; background: linear-gradient(45deg, #6B14D3 0, #7A26E2 25%, #4962DD 90%);
box-sizing: border-box; margin-top: 50px; color: white; text-decoration: none; transition: 0.3s ease-out;
}
.button:hover, .button:focus { box-shadow: 0px 5px 30px rgba(0,0,0,0.3); }
.button:active { transform: translateY(1px); box-shadow: 0px 0px 20px rgba(0,0,0,0.5); transition: none; }
#login_form_submit { display: none; }
.login-anim { animation: login 1s cubic-bezier(0.785, 0.135, 0.15, 0.86) forwards; }
@keyframes login {
0% { width: 100%; }
60% { width: 63px; transform: scale(1); color: rgba(255,255,255,0); }
70% { width: 63px; transform: scale(1); color: rgba(255,255,255,0); }
100% { transform: scale(80); width: 63px; color: rgba(255,255,255,0); }
}
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); }
20%, 40%, 60%, 80% { transform: translateX(10px); }
}
</style>
<body>
<div class="login">
<form action="" method="post" id="login_form" onkeypress="return onFormKeypress(event)">
<!--<input type="text" name="username" placeholder="Username" required/>-->
<input type="password" name="password" placeholder="Password" required/>
<input type="checkbox" name="keep" id="keep"><label for="keep">Keep me logged in</label>
<div style="clear: both"></div>
<a href="#" class="button" onclick="return submit()" id="login_button"><span>Log In</span></a>
<input type="submit" id="login_form_submit"/>
</form>
</div>
<script>
function onFormKeypress(e) {
if (event.keyCode == 13) {
submit()
return false
}
}
function submit() {
var form = document.getElementById("login_form")
if (form.checkValidity()) {
document.getElementById("login_button").className = "button login-anim"
setTimeout(function() {
form.submit()
}, 1000)
} else {
form.submit()
}
return false
}
function badPassword() {
var elem = document.getElementsByName("password")[0]
elem.className = "error"
elem.placeholder = "Wrong Password"
elem.focus()
elem.addEventListener('input', function() {
elem.className = ""
elem.placeholder = "Password"
})
}
result = "{result}"
if (result == "bad_password")
badPassword()
</script>
</body>
</html>

View file

@ -1,68 +0,0 @@
import logging, json, os, re, sys, time
import gevent
from Plugin import PluginManager
from Config import config
from Debug import Debug
from domainLookup import lookupDomain
allow_reload = False # No reload supported
log = logging.getLogger("Zeroname-localPlugin")
@PluginManager.registerTo("SiteManager")
class SiteManagerPlugin(object):
def load(self):
super(SiteManagerPlugin, self).load()
# Checks if its a valid address
def isAddress(self, address):
if self.isDomain(address):
return True
else:
return super(SiteManagerPlugin, self).isAddress(address)
# Return: True if the address is domain
def isDomain(self, address):
return re.match("(.*?)([A-Za-z0-9_-]+\.[A-Za-z0-9]+)$", address)
# Resolve domain
# Return: The address or None
def resolveDomain(self, domain):
return lookupDomain(domain)
# Return or create site and start download site files
# Return: Site or None if dns resolve failed
def need(self, address, all_file=True):
if self.isDomain(address): # Its looks like a domain
address_resolved = self.resolveDomain(address)
if address_resolved:
address = address_resolved
else:
return None
return super(SiteManagerPlugin, self).need(address, all_file)
# Return: Site object or None if not found
def get(self, address):
if self.sites == None: # Not loaded yet
self.load()
if self.isDomain(address): # Its looks like a domain
address_resolved = self.resolveDomain(address)
if address_resolved: # Domain found
site = self.sites.get(address_resolved)
if site:
site_domain = site.settings.get("domain")
if site_domain != address:
site.settings["domain"] = address
else: # Domain not found
site = self.sites.get(address)
else: # Access by site address
site = self.sites.get(address)
return site

View file

@ -1,40 +0,0 @@
import re
from Plugin import PluginManager
@PluginManager.registerTo("UiRequest")
class UiRequestPlugin(object):
def __init__(self, *args, **kwargs):
from Site import SiteManager
self.site_manager = SiteManager.site_manager
super(UiRequestPlugin, self).__init__(*args, **kwargs)
# Media request
def actionSiteMedia(self, path):
match = re.match("/media/(?P<address>[A-Za-z0-9]+\.[A-Za-z0-9\.]+)(?P<inner_path>/.*|$)", path)
if match: # Its a valid domain, resolve first
domain = match.group("address")
address = self.site_manager.resolveDomain(domain)
if address:
path = "/media/"+address+match.group("inner_path")
return super(UiRequestPlugin, self).actionSiteMedia(path) # Get the wrapper frame output
# Is mediarequest allowed from that referer
def isMediaRequestAllowed(self, site_address, referer):
referer_path = re.sub("http[s]{0,1}://.*?/", "/", referer).replace("/media", "") # Remove site address
referer_path = re.sub("\?.*", "", referer_path) # Remove http params
if self.isProxyRequest(): # Match to site domain
referer = re.sub("^http://zero[/]+", "http://", referer) # Allow /zero access
referer_site_address = re.match("http[s]{0,1}://(.*?)(/|$)", referer).group(1)
else: # Match to request path
referer_site_address = re.match("/(?P<address>[A-Za-z0-9\.]+)(?P<inner_path>/.*|$)", referer_path).group("address")
if referer_site_address == site_address: # Referer site address as simple address
return True
elif self.site_manager.resolveDomain(referer_site_address) == site_address: # Referer site address as dns
return True
else: # Invalid referer
return False

View file

@ -1,2 +0,0 @@
import UiRequestPlugin
import SiteManagerPlugin

View file

@ -1,54 +0,0 @@
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
import time, json, os, sys, re, socket, json
# Either returns domain's address or none if it doesn't exist
# Supports subdomains and .bit on the end
def lookupDomain(domain):
domain = domain.lower()
#remove .bit on end
if domain[-4:] == ".bit":
domain = domain[0:-4]
#check for subdomain
if domain.find(".") != -1:
subdomain = domain[0:domain.find(".")]
domain = domain[domain.find(".")+1:]
else:
subdomain = ""
try:
domain_object = rpc.name_show("d/"+domain)
except:
#domain doesn't exist
return None
domain_json = json.loads(domain_object['value'])
try:
domain_address = domain_json["zeronet"][subdomain]
except:
#domain exists but doesn't have any zeronet value
return None
return domain_address
# Loading config...
# Check whether platform is on windows or linux
# On linux namecoin is installed under ~/.namecoin, while on on windows it is in %appdata%/Namecoin
if sys.platform == "win32":
namecoin_location = os.getenv('APPDATA') + "/Namecoin/"
else:
namecoin_location = os.path.expanduser("~/.namecoin/")
# Getting rpc connect details
namecoin_conf = open(namecoin_location + "namecoin.conf").read()
# Connecting to RPC
rpc_user = re.search("rpcuser=(.*)$", namecoin_conf, re.M).group(1)
rpc_pass = re.search("rpcpassword=(.*)$", namecoin_conf, re.M).group(1)
rpc_url = "http://%s:%s@127.0.0.1:8336" % (rpc_user, rpc_pass)
rpc = AuthServiceProxy(rpc_url, timeout=60*5)

View file

@ -1,2 +1,13 @@
gevent==1.0.1
msgpack-python>=0.4.4
gevent==1.4.0; python_version <= "3.6"
greenlet==0.4.16; python_version <= "3.6"
gevent>=20.9.0; python_version >= "3.7"
msgpack>=0.4.4
base58
merkletools @ git+https://github.com/ZeroNetX/pymerkletools.git@dev
rsa
PySocks>=1.6.8
pyasn1
websocket_client
gevent-ws
coincurve
maxminddb

View file

@ -1,16 +1,42 @@
import argparse
import sys
import os
import ConfigParser
import locale
import re
import configparser
import logging
import logging.handlers
import stat
import time
class Config(object):
def __init__(self, argv):
self.version = "0.3.5"
self.rev = 860
self.version = "0.9.0"
self.rev = 4630
self.argv = argv
self.action = None
self.test_parser = None
self.pending_changes = {}
self.need_restart = False
self.keys_api_change_allowed = set([
"tor", "fileserver_port", "language", "tor_use_bridges", "trackers_proxy", "trackers",
"trackers_file", "open_browser", "log_level", "fileserver_ip_type", "ip_external", "offline",
"threads_fs_read", "threads_fs_write", "threads_crypt", "threads_db"
])
self.keys_restart_need = set([
"tor", "fileserver_port", "fileserver_ip_type", "threads_fs_read", "threads_fs_write", "threads_crypt", "threads_db"
])
self.start_dir = self.getStartDir()
self.config_file = self.start_dir + "/zeronet.conf"
self.data_dir = self.start_dir + "/data"
self.log_dir = self.start_dir + "/log"
self.openssl_lib_file = None
self.openssl_bin_file = None
self.trackers_file = False
self.createParser()
self.createArguments()
@ -27,17 +53,41 @@ class Config(object):
def strToBool(self, v):
return v.lower() in ("yes", "true", "t", "1")
def getStartDir(self):
this_file = os.path.abspath(__file__).replace("\\", "/").rstrip("cd")
if "--start_dir" in self.argv:
start_dir = self.argv[self.argv.index("--start_dir") + 1]
elif this_file.endswith("/Contents/Resources/core/src/Config.py"):
# Running as ZeroNet.app
if this_file.startswith("/Application") or this_file.startswith("/private") or this_file.startswith(os.path.expanduser("~/Library")):
# Runnig from non-writeable directory, put data to Application Support
start_dir = os.path.expanduser("~/Library/Application Support/ZeroNet")
else:
# Running from writeable directory put data next to .app
start_dir = re.sub("/[^/]+/Contents/Resources/core/src/Config.py", "", this_file)
elif this_file.endswith("/core/src/Config.py"):
# Running as exe or source is at Application Support directory, put var files to outside of core dir
start_dir = this_file.replace("/core/src/Config.py", "")
elif this_file.endswith("usr/share/zeronet/src/Config.py"):
# Running from non-writeable location, e.g., AppImage
start_dir = os.path.expanduser("~/ZeroNet")
else:
start_dir = "."
return start_dir
# Create command line arguments
def createArguments(self):
from Crypt import CryptHash
access_key_default = CryptHash.random(24, "base64") # Used to allow restrited plugins when multiuser plugin is enabled
trackers = [
"zero://boot3rdez4rzn36x.onion:15441",
"zero://boot.zeronet.io#f36ca555bee6ba216b14d10f38c16f7769ff064e0e37d887603548cc2e64191d:15441",
"udp://tracker.coppersurfer.tk:6969",
"udp://tracker.leechers-paradise.org:6969",
"udp://9.rarbg.com:2710",
"http://tracker.aletorrenty.pl:2710/announce",
"http://explodie.org:6969/announce",
"http://torrent.gresille.org/announce"
"http://open.acgnxtracker.com:80/announce", # DE
"http://tracker.bt4g.com:2095/announce", # Cloudflare
"http://tracker.files.fm:6969/announce",
"http://t.publictracker.xyz:6969/announce",
"https://tracker.lilithraws.cf:443/announce",
"https://tracker.babico.name.tr:443/announce",
]
# Platform specific
if sys.platform.startswith("win"):
@ -45,25 +95,51 @@ class Config(object):
else:
coffeescript = None
try:
language, enc = locale.getdefaultlocale()
language = language.lower().replace("_", "-")
if language not in ["pt-br", "zh-tw"]:
language = language.split("-")[0]
except Exception:
language = "en"
use_openssl = True
if repr(1483108852.565) != "1483108852.565": # Fix for weird Android issue
fix_float_decimals = True
else:
fix_float_decimals = False
config_file = self.start_dir + "/zeronet.conf"
data_dir = self.start_dir + "/data"
log_dir = self.start_dir + "/log"
ip_local = ["127.0.0.1", "::1"]
# Main
action = self.subparsers.add_parser("main", help='Start UiServer and FileServer (default)')
# SiteCreate
action = self.subparsers.add_parser("siteCreate", help='Create a new site')
action.register('type', 'bool', self.strToBool)
action.add_argument('--use_master_seed', help="Allow created site's private key to be recovered using the master seed in users.json (default: True)", type="bool", choices=[True, False], default=True)
# SiteNeedFile
action = self.subparsers.add_parser("siteNeedFile", help='Get a file from site')
action.add_argument('address', help='Site address')
action.add_argument('inner_path', help='File inner path')
# SiteDownload
action = self.subparsers.add_parser("siteDownload", help='Download a new site')
action.add_argument('address', help='Site address')
# SiteSign
action = self.subparsers.add_parser("siteSign", help='Update and sign content.json: address [privatekey]')
action.add_argument('address', help='Site to sign')
action.add_argument('privatekey', help='Private key (default: ask on execute)', nargs='?')
action.add_argument('--inner_path', help='File you want to sign (default: content.json)',
default="content.json", metavar="inner_path")
action.add_argument('--remove_missing_optional', help='Remove optional files that is not present in the directory', action='store_true')
action.add_argument('--publish', help='Publish site after the signing', action='store_true')
# SitePublish
@ -80,6 +156,12 @@ class Config(object):
action = self.subparsers.add_parser("siteVerify", help='Verify site files using sha512: address')
action.add_argument('address', help='Site to verify')
# SiteCmd
action = self.subparsers.add_parser("siteCmd", help='Execute a ZeroFrame API command on a site')
action.add_argument('address', help='Site address')
action.add_argument('cmd', help='API command name')
action.add_argument('parameters', help='Parameters of the command', nargs='?')
# dbRebuild
action = self.subparsers.add_parser("dbRebuild", help='Rebuild site database cache')
action.add_argument('address', help='Site to rebuild')
@ -114,44 +196,110 @@ class Config(object):
action.add_argument('message', help='Message to sign')
action.add_argument('privatekey', help='Private key')
# Crypt Verify
action = self.subparsers.add_parser("cryptVerify", help='Verify message using Bitcoin public address')
action.add_argument('message', help='Message to verify')
action.add_argument('sign', help='Signiture for message')
action.add_argument('address', help='Signer\'s address')
# Crypt GetPrivatekey
action = self.subparsers.add_parser("cryptGetPrivatekey", help='Generate a privatekey from master seed')
action.add_argument('master_seed', help='Source master seed')
action.add_argument('site_address_index', help='Site address index', type=int)
action = self.subparsers.add_parser("getConfig", help='Return json-encoded info')
action = self.subparsers.add_parser("testConnection", help='Testing')
action = self.subparsers.add_parser("testAnnounce", help='Testing')
self.test_parser = self.subparsers.add_parser("test", help='Run a test')
self.test_parser.add_argument('test_name', help='Test name', nargs="?")
# self.test_parser.add_argument('--benchmark', help='Run the tests multiple times to measure the performance', action='store_true')
# Config parameters
self.parser.add_argument('--verbose', help='More detailed logging', action='store_true')
self.parser.add_argument('--debug', help='Debug mode', action='store_true')
self.parser.add_argument('--silent', help='Only log errors to terminal output', action='store_true')
self.parser.add_argument('--debug_socket', help='Debug socket connections', action='store_true')
self.parser.add_argument('--merge_media', help='Merge all.js and all.css', action='store_true')
self.parser.add_argument('--batch', help="Batch mode (No interactive input for commands)", action='store_true')
self.parser.add_argument('--config_file', help='Path of config file', default="zeronet.conf", metavar="path")
self.parser.add_argument('--data_dir', help='Path of data directory', default="data", metavar="path")
self.parser.add_argument('--log_dir', help='Path of logging directory', default="log", metavar="path")
self.parser.add_argument('--start_dir', help='Path of working dir for variable content (data, log, .conf)', default=self.start_dir, metavar="path")
self.parser.add_argument('--config_file', help='Path of config file', default=config_file, metavar="path")
self.parser.add_argument('--data_dir', help='Path of data directory', default=data_dir, metavar="path")
self.parser.add_argument('--console_log_level', help='Level of logging to console', default="default", choices=["default", "DEBUG", "INFO", "ERROR", "off"])
self.parser.add_argument('--log_dir', help='Path of logging directory', default=log_dir, metavar="path")
self.parser.add_argument('--log_level', help='Level of logging to file', default="DEBUG", choices=["DEBUG", "INFO", "ERROR", "off"])
self.parser.add_argument('--log_rotate', help='Log rotate interval', default="daily", choices=["hourly", "daily", "weekly", "off"])
self.parser.add_argument('--log_rotate_backup_count', help='Log rotate backup count', default=5, type=int)
self.parser.add_argument('--language', help='Web interface language', default=language, metavar='language')
self.parser.add_argument('--ui_ip', help='Web interface bind address', default="127.0.0.1", metavar='ip')
self.parser.add_argument('--ui_port', help='Web interface bind port', default=43110, type=int, metavar='port')
self.parser.add_argument('--ui_restrict', help='Restrict web access', default=False, metavar='ip', nargs='*')
self.parser.add_argument('--ui_host', help='Allow access using this hosts', metavar='host', nargs='*')
self.parser.add_argument('--ui_trans_proxy', help='Allow access using a transparent proxy', action='store_true')
self.parser.add_argument('--open_browser', help='Open homepage in web browser automatically',
nargs='?', const="default_browser", metavar='browser_name')
self.parser.add_argument('--homepage', help='Web interface Homepage', default='1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr',
self.parser.add_argument('--homepage', help='Web interface Homepage', default='1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d',
metavar='address')
self.parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, metavar='size')
self.parser.add_argument('--updatesite', help='Source code update site', default='1Update8crprmciJHwp2WXqkx2c4iYp18',
metavar='address')
self.parser.add_argument('--access_key', help='Plugin access key default: Random key generated at startup', default=access_key_default, metavar='key')
self.parser.add_argument('--dist_type', help='Type of installed distribution', default='source')
self.parser.add_argument('--size_limit', help='Default site size limit in MB', default=25, type=int, metavar='limit')
self.parser.add_argument('--file_size_limit', help='Maximum per file size limit in MB', default=10, type=int, metavar='limit')
self.parser.add_argument('--connected_limit', help='Max connected peer per site', default=8, type=int, metavar='connected_limit')
self.parser.add_argument('--global_connected_limit', help='Max connections', default=512, type=int, metavar='global_connected_limit')
self.parser.add_argument('--workers', help='Download workers per site', default=5, type=int, metavar='workers')
self.parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip')
self.parser.add_argument('--fileserver_port', help='FileServer bind port', default=15441, type=int, metavar='port')
self.parser.add_argument('--fileserver_port', help='FileServer bind port (0: randomize)', default=0, type=int, metavar='port')
self.parser.add_argument('--fileserver_port_range', help='FileServer randomization range', default="10000-40000", metavar='port')
self.parser.add_argument('--fileserver_ip_type', help='FileServer ip type', default="dual", choices=["ipv4", "ipv6", "dual"])
self.parser.add_argument('--ip_local', help='My local ips', default=ip_local, type=int, metavar='ip', nargs='*')
self.parser.add_argument('--ip_external', help='Set reported external ip (tested on start if None)', metavar='ip', nargs='*')
self.parser.add_argument('--offline', help='Disable network communication', action='store_true')
self.parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true')
self.parser.add_argument('--proxy', help='Socks proxy address', metavar='ip:port')
self.parser.add_argument('--ip_external', help='Set reported external ip (tested on start if None)', metavar='ip')
self.parser.add_argument('--bind', help='Bind outgoing sockets to this address', metavar='ip')
self.parser.add_argument('--trackers', help='Bootstraping torrent trackers', default=trackers, metavar='protocol://address', nargs='*')
self.parser.add_argument('--trackers_file', help='Load torrent trackers dynamically from a file', default=False, metavar='path')
self.parser.add_argument('--use_openssl', help='Use OpenSSL liblary for speedup',
type='bool', choices=[True, False], default=use_openssl)
self.parser.add_argument('--trackers_file', help='Load torrent trackers dynamically from a file', metavar='path', nargs='*')
self.parser.add_argument('--trackers_proxy', help='Force use proxy to connect to trackers (disable, tor, ip:port)', default="disable")
self.parser.add_argument('--use_libsecp256k1', help='Use Libsecp256k1 liblary for speedup', type='bool', choices=[True, False], default=True)
self.parser.add_argument('--use_openssl', help='Use OpenSSL liblary for speedup', type='bool', choices=[True, False], default=True)
self.parser.add_argument('--openssl_lib_file', help='Path for OpenSSL library file (default: detect)', default=argparse.SUPPRESS, metavar="path")
self.parser.add_argument('--openssl_bin_file', help='Path for OpenSSL binary file (default: detect)', default=argparse.SUPPRESS, metavar="path")
self.parser.add_argument('--disable_db', help='Disable database updating', action='store_true')
self.parser.add_argument('--disable_encryption', help='Disable connection encryption', action='store_true')
self.parser.add_argument('--force_encryption', help="Enforce encryption to all peer connections", action='store_true')
self.parser.add_argument('--disable_sslcompression', help='Disable SSL compression to save memory',
type='bool', choices=[True, False], default=True)
self.parser.add_argument('--keep_ssl_cert', help='Disable new SSL cert generation on startup', action='store_true')
self.parser.add_argument('--max_files_opened', help='Change maximum opened files allowed by OS to this value on startup',
default=2048, type=int, metavar='limit')
self.parser.add_argument('--stack_size', help='Change thread stack size', default=None, type=int, metavar='thread_stack_size')
self.parser.add_argument('--use_tempfiles', help='Use temporary files when downloading (experimental)',
type='bool', choices=[True, False], default=False)
self.parser.add_argument('--stream_downloads', help='Stream download directly to files (experimental)',
type='bool', choices=[True, False], default=False)
self.parser.add_argument("--msgpack_purepython", help='Use less memory, but a bit more CPU power',
type='bool', choices=[True, False], default=True)
type='bool', choices=[True, False], default=False)
self.parser.add_argument("--fix_float_decimals", help='Fix content.json modification date float precision on verification',
type='bool', choices=[True, False], default=fix_float_decimals)
self.parser.add_argument("--db_mode", choices=["speed", "security"], default="speed")
self.parser.add_argument('--threads_fs_read', help='Number of threads for file read operations', default=1, type=int)
self.parser.add_argument('--threads_fs_write', help='Number of threads for file write operations', default=1, type=int)
self.parser.add_argument('--threads_crypt', help='Number of threads for cryptographic operations', default=2, type=int)
self.parser.add_argument('--threads_db', help='Number of threads for database operations', default=1, type=int)
self.parser.add_argument("--download_optional", choices=["manual", "auto"], default="manual")
self.parser.add_argument('--coffeescript_compiler', help='Coffeescript compiler for developing', default=coffeescript,
metavar='executable_path')
@ -159,16 +307,39 @@ class Config(object):
self.parser.add_argument('--tor', help='enable: Use only for Tor peers, always: Use Tor for every connection', choices=["disable", "enable", "always"], default='enable')
self.parser.add_argument('--tor_controller', help='Tor controller address', metavar='ip:port', default='127.0.0.1:9051')
self.parser.add_argument('--tor_proxy', help='Tor proxy address', metavar='ip:port', default='127.0.0.1:9050')
self.parser.add_argument('--tor_password', help='Tor controller password', metavar='password')
self.parser.add_argument('--tor_use_bridges', help='Use obfuscated bridge relays to avoid Tor block', action='store_true')
self.parser.add_argument('--tor_hs_limit', help='Maximum number of hidden services in Tor always mode', metavar='limit', type=int, default=10)
self.parser.add_argument('--tor_hs_port', help='Hidden service port in Tor always mode', metavar='limit', type=int, default=15441)
self.parser.add_argument('--version', action='version', version='ZeroNet %s r%s' % (self.version, self.rev))
self.parser.add_argument('--end', help='Stop multi value argument parsing', action='store_true')
return self.parser
def loadTrackersFile(self):
self.trackers = []
for tracker in open(self.trackers_file):
if "://" in tracker:
self.trackers.append(tracker.strip())
if not self.trackers_file:
self.trackers_file = ["trackers.txt", "{data_dir}/1HELLoE3sFD9569CLCbHEAVqvqV7U2Ri9d/trackers.txt"]
self.trackers = self.arguments.trackers[:]
for trackers_file in self.trackers_file:
try:
if trackers_file.startswith("/"): # Absolute
trackers_file_path = trackers_file
elif trackers_file.startswith("{data_dir}"): # Relative to data_dir
trackers_file_path = trackers_file.replace("{data_dir}", self.data_dir)
else: # Relative to zeronet.py
trackers_file_path = self.start_dir + "/" + trackers_file
if not os.path.exists(trackers_file_path):
continue
for line in open(trackers_file_path):
tracker = line.strip()
if "://" in tracker and tracker not in self.trackers:
self.trackers.append(tracker)
except Exception as err:
print("Error loading trackers file: %s" % err)
# Find arguments specified for current action
def getActionArguments(self):
@ -180,7 +351,7 @@ class Config(object):
# Try to find action from argv
def getAction(self, argv):
actions = [action.choices.keys() for action in self.parser._actions if action.dest == "action"][0] # Valid actions
actions = [list(action.choices.keys()) for action in self.parser._actions if action.dest == "action"][0] # Valid actions
found_action = False
for action in actions: # See if any in argv
if action in argv:
@ -209,8 +380,17 @@ class Config(object):
valid_parameters.append(arg)
return valid_parameters + plugin_parameters
def getParser(self, argv):
action = self.getAction(argv)
if not action:
return self.parser
else:
return self.subparsers.choices[action]
# Parse arguments from config file and command line
def parse(self, silent=False, parse_config=True):
argv = self.argv[:] # Copy command line arguments
current_parser = self.getParser(argv)
if silent: # Don't display messages or quit on unknown parameter
original_print_message = self.parser._print_message
original_exit = self.parser.exit
@ -218,27 +398,36 @@ class Config(object):
def silencer(parser, function_name):
parser.exited = True
return None
self.parser.exited = False
self.parser._print_message = lambda *args, **kwargs: silencer(self.parser, "_print_message")
self.parser.exit = lambda *args, **kwargs: silencer(self.parser, "exit")
current_parser.exited = False
current_parser._print_message = lambda *args, **kwargs: silencer(current_parser, "_print_message")
current_parser.exit = lambda *args, **kwargs: silencer(current_parser, "exit")
argv = self.argv[:] # Copy command line arguments
self.parseCommandline(argv, silent) # Parse argv
self.setAttributes()
if parse_config:
argv = self.parseConfig(argv) # Add arguments from config file
self.parseCommandline(argv, silent) # Parse argv
self.setAttributes()
if not silent:
if self.fileserver_ip != "*" and self.fileserver_ip not in self.ip_local:
self.ip_local.append(self.fileserver_ip)
if silent: # Restore original functions
if self.parser.exited and self.action == "main": # Argument parsing halted, don't start ZeroNet with main action
if current_parser.exited and self.action == "main": # Argument parsing halted, don't start ZeroNet with main action
self.action = None
self.parser._print_message = original_print_message
self.parser.exit = original_exit
current_parser._print_message = original_print_message
current_parser.exit = original_exit
self.loadTrackersFile()
# Parse command line arguments
def parseCommandline(self, argv, silent=False):
# Find out if action is specificed on start
action = self.getAction(argv)
if not action:
argv.append("--end")
argv.append("main")
action = "main"
argv = self.moveUnknownToEnd(argv, action)
@ -254,29 +443,55 @@ class Config(object):
# Parse config file
def parseConfig(self, argv):
# Find config file path from parameters
config_file = "zeronet.conf"
if "--config_file" in argv:
config_file = argv[argv.index("--config_file") + 1]
self.config_file = argv[argv.index("--config_file") + 1]
# Load config file
if os.path.isfile(config_file):
config = ConfigParser.ConfigParser(allow_no_value=True)
config.read(config_file)
if os.path.isfile(self.config_file):
config = configparser.RawConfigParser(allow_no_value=True, strict=False)
config.read(self.config_file)
for section in config.sections():
for key, val in config.items(section):
if val == "True":
val = None
if section != "global": # If not global prefix key with section
key = section + "_" + key
if key == "open_browser": # Prefer config file value over cli argument
while "--%s" % key in argv:
pos = argv.index("--open_browser")
del argv[pos:pos + 2]
argv_extend = ["--%s" % key]
if val:
for line in val.strip().split("\n"): # Allow multi-line values
argv.insert(1, line)
argv.insert(1, "--%s" % key)
argv_extend.append(line)
if "\n" in val:
argv_extend.append("--end")
argv = argv[:1] + argv_extend + argv[1:]
return argv
# Return command line value of given argument
def getCmdlineValue(self, key):
if key not in self.argv:
return None
argv_index = self.argv.index(key)
if argv_index == len(self.argv) - 1: # last arg, test not specified
return None
return self.argv[argv_index + 1]
# Expose arguments as class attributes
def setAttributes(self):
# Set attributes from arguments
if self.arguments:
args = vars(self.arguments)
for key, val in args.items():
if type(val) is list:
val = val[:]
if key in ("data_dir", "log_dir", "start_dir", "openssl_bin_file", "openssl_lib_file"):
if val:
val = val.replace("\\", "/")
setattr(self, key, val)
def loadPlugins(self):
@ -285,7 +500,11 @@ class Config(object):
@PluginManager.acceptPlugins
class ConfigPlugin(object):
def __init__(self, config):
self.argv = config.argv
self.parser = config.parser
self.subparsers = config.subparsers
self.test_parser = config.test_parser
self.getCmdlineValue = config.getCmdlineValue
self.createArguments()
def createArguments(self):
@ -293,5 +512,164 @@ class Config(object):
ConfigPlugin(self)
def saveValue(self, key, value):
if not os.path.isfile(self.config_file):
content = ""
else:
content = open(self.config_file).read()
lines = content.splitlines()
global_line_i = None
key_line_i = None
i = 0
for line in lines:
if line.strip() == "[global]":
global_line_i = i
if line.startswith(key + " =") or line == key:
key_line_i = i
i += 1
if key_line_i and len(lines) > key_line_i + 1:
while True: # Delete previous multiline values
is_value_line = lines[key_line_i + 1].startswith(" ") or lines[key_line_i + 1].startswith("\t")
if not is_value_line:
break
del lines[key_line_i + 1]
if value is None: # Delete line
if key_line_i:
del lines[key_line_i]
else: # Add / update
if type(value) is list:
value_lines = [""] + [str(line).replace("\n", "").replace("\r", "") for line in value]
else:
value_lines = [str(value).replace("\n", "").replace("\r", "")]
new_line = "%s = %s" % (key, "\n ".join(value_lines))
if key_line_i: # Already in the config, change the line
lines[key_line_i] = new_line
elif global_line_i is None: # No global section yet, append to end of file
lines.append("[global]")
lines.append(new_line)
else: # Has global section, append the line after it
lines.insert(global_line_i + 1, new_line)
open(self.config_file, "w").write("\n".join(lines))
def getServerInfo(self):
from Plugin import PluginManager
import main
info = {
"platform": sys.platform,
"fileserver_ip": self.fileserver_ip,
"fileserver_port": self.fileserver_port,
"ui_ip": self.ui_ip,
"ui_port": self.ui_port,
"version": self.version,
"rev": self.rev,
"language": self.language,
"debug": self.debug,
"plugins": PluginManager.plugin_manager.plugin_names,
"log_dir": os.path.abspath(self.log_dir),
"data_dir": os.path.abspath(self.data_dir),
"src_dir": os.path.dirname(os.path.abspath(__file__))
}
try:
info["ip_external"] = main.file_server.port_opened
info["tor_enabled"] = main.file_server.tor_manager.enabled
info["tor_status"] = main.file_server.tor_manager.status
except Exception:
pass
return info
def initConsoleLogger(self):
if self.action == "main":
format = '[%(asctime)s] %(name)s %(message)s'
else:
format = '%(name)s %(message)s'
if self.console_log_level == "default":
if self.silent:
level = logging.ERROR
elif self.debug:
level = logging.DEBUG
else:
level = logging.INFO
else:
level = logging.getLevelName(self.console_log_level)
console_logger = logging.StreamHandler()
console_logger.setFormatter(logging.Formatter(format, "%H:%M:%S"))
console_logger.setLevel(level)
logging.getLogger('').addHandler(console_logger)
def initFileLogger(self):
if self.action == "main":
log_file_path = "%s/debug.log" % self.log_dir
else:
log_file_path = "%s/cmd.log" % self.log_dir
if self.log_rotate == "off":
file_logger = logging.FileHandler(log_file_path, "w", "utf-8")
else:
when_names = {"weekly": "w", "daily": "d", "hourly": "h"}
file_logger = logging.handlers.TimedRotatingFileHandler(
log_file_path, when=when_names[self.log_rotate], interval=1, backupCount=self.log_rotate_backup_count,
encoding="utf8"
)
if os.path.isfile(log_file_path):
file_logger.doRollover() # Always start with empty log file
file_logger.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)-8s %(name)s %(message)s'))
file_logger.setLevel(logging.getLevelName(self.log_level))
logging.getLogger('').setLevel(logging.getLevelName(self.log_level))
logging.getLogger('').addHandler(file_logger)
def initLogging(self, console_logging=None, file_logging=None):
if console_logging == None:
console_logging = self.console_log_level != "off"
if file_logging == None:
file_logging = self.log_level != "off"
# Create necessary files and dirs
if not os.path.isdir(self.log_dir):
os.mkdir(self.log_dir)
try:
os.chmod(self.log_dir, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)
except Exception as err:
print("Can't change permission of %s: %s" % (self.log_dir, err))
# Make warning hidden from console
logging.WARNING = 15 # Don't display warnings if not in debug mode
logging.addLevelName(15, "WARNING")
logging.getLogger('').name = "-" # Remove root prefix
self.error_logger = ErrorLogHandler()
self.error_logger.setLevel(logging.getLevelName("ERROR"))
logging.getLogger('').addHandler(self.error_logger)
if console_logging:
self.initConsoleLogger()
if file_logging:
self.initFileLogger()
class ErrorLogHandler(logging.StreamHandler):
def __init__(self):
self.lines = []
return super().__init__()
def emit(self, record):
self.lines.append([time.time(), record.levelname, self.format(record)])
def onNewRecord(self, record):
pass
config = Config(sys.argv)

View file

@ -1,40 +1,50 @@
import socket
import time
import hashlib
import gevent
import msgpack
try:
from gevent.coros import RLock
except:
from gevent.lock import RLock
from Config import config
from Debug import Debug
from util import StreamingMsgpack
from util import Msgpack
from Crypt import CryptConnection
from Site import SiteManager
from util import helper
class Connection(object):
__slots__ = (
"sock", "sock_wrapped", "ip", "port", "cert_pin", "site_lock", "id", "protocol", "type", "server", "unpacker", "req_id",
"handshake", "crypt", "connected", "event_connected", "closed", "start_time", "last_recv_time",
"last_message_time", "last_send_time", "last_sent_time", "incomplete_buff_recv", "bytes_recv", "bytes_sent",
"last_ping_delay", "last_req_time", "last_cmd", "name", "updateName", "waiting_requests", "waiting_streams"
"sock", "sock_wrapped", "ip", "port", "cert_pin", "target_onion", "id", "protocol", "type", "server", "unpacker", "unpacker_bytes", "req_id", "ip_type",
"handshake", "crypt", "connected", "event_connected", "closed", "start_time", "handshake_time", "last_recv_time", "is_private_ip", "is_tracker_connection",
"last_message_time", "last_send_time", "last_sent_time", "incomplete_buff_recv", "bytes_recv", "bytes_sent", "cpu_time", "send_lock",
"last_ping_delay", "last_req_time", "last_cmd_sent", "last_cmd_recv", "bad_actions", "sites", "name", "waiting_requests", "waiting_streams"
)
def __init__(self, server, ip, port, sock=None, site_lock=None):
def __init__(self, server, ip, port, sock=None, target_onion=None, is_tracker_connection=False):
self.sock = sock
self.ip = ip
self.port = port
self.cert_pin = None
if "#" in ip:
self.ip, self.cert_pin = ip.split("#")
self.site_lock = site_lock # Only this site requests allowed (for Tor)
ip, self.cert_pin = ip.split("#")
self.target_onion = target_onion # Requested onion adress
self.id = server.last_connection_id
server.last_connection_id += 1
self.protocol = "?"
self.type = "?"
self.ip_type = "?"
self.port = int(port)
self.setIp(ip)
if helper.isPrivateIp(self.ip) and self.ip not in config.ip_local:
self.is_private_ip = True
else:
self.is_private_ip = False
self.is_tracker_connection = is_tracker_connection
self.server = server
self.unpacker = None # Stream incoming socket messages here
self.unpacker_bytes = 0 # How many bytes the unpacker received
self.req_id = 0 # Last request id
self.handshake = {} # Handshake info got from peer
self.crypt = None # Connection encryption method
@ -46,6 +56,7 @@ class Connection(object):
# Stats
self.start_time = time.time()
self.handshake_time = 0
self.last_recv_time = 0
self.last_message_time = 0
self.last_send_time = 0
@ -55,7 +66,12 @@ class Connection(object):
self.bytes_sent = 0
self.last_ping_delay = None
self.last_req_time = 0
self.last_cmd = None
self.last_cmd_sent = None
self.last_cmd_recv = None
self.bad_actions = 0
self.sites = 0
self.cpu_time = 0.0
self.send_lock = RLock()
self.name = None
self.updateName()
@ -63,6 +79,18 @@ class Connection(object):
self.waiting_requests = {} # Waiting sent requests
self.waiting_streams = {} # Waiting response file streams
def setIp(self, ip):
self.ip = ip
self.ip_type = helper.getIpType(ip)
self.updateName()
def createSocket(self):
if helper.getIpType(self.ip) == "ipv6" and not hasattr(socket, "socket_noproxy"):
# Create IPv6 connection as IPv4 when using proxy
return socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
else:
return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def updateName(self):
self.name = "Conn#%2s %-12s [%s]" % (self.id, self.ip, self.protocol)
@ -75,46 +103,108 @@ class Connection(object):
def log(self, text):
self.server.log.debug("%s > %s" % (self.name, text))
def getValidSites(self):
return [key for key, val in self.server.tor_manager.site_onions.items() if val == self.target_onion]
def badAction(self, weight=1):
self.bad_actions += weight
if self.bad_actions > 40:
self.close("Too many bad actions")
elif self.bad_actions > 20:
time.sleep(5)
def goodAction(self):
self.bad_actions = 0
# Open connection to peer and wait for handshake
def connect(self):
self.log("Connecting...")
self.type = "out"
if self.ip.endswith(".onion"):
if self.ip_type == "onion":
if not self.server.tor_manager or not self.server.tor_manager.enabled:
raise Exception("Can't connect to onion addresses, no Tor controller present")
self.sock = self.server.tor_manager.createSocket(self.ip, self.port)
elif config.tor == "always" and helper.isPrivateIp(self.ip) and self.ip not in config.ip_local:
raise Exception("Can't connect to local IPs in Tor: always mode")
elif config.trackers_proxy != "disable" and config.tor != "always" and self.is_tracker_connection:
if config.trackers_proxy == "tor":
self.sock = self.server.tor_manager.createSocket(self.ip, self.port)
else:
import socks
self.sock = socks.socksocket()
proxy_ip, proxy_port = config.trackers_proxy.split(":")
self.sock.set_proxy(socks.PROXY_TYPE_SOCKS5, proxy_ip, int(proxy_port))
else:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((self.ip, int(self.port)))
self.sock = self.createSocket()
if "TCP_NODELAY" in dir(socket):
self.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
timeout_before = self.sock.gettimeout()
self.sock.settimeout(30)
if self.ip_type == "ipv6" and not hasattr(self.sock, "proxy"):
sock_address = (self.ip, self.port, 1, 1)
else:
sock_address = (self.ip, self.port)
self.sock.connect(sock_address)
# Implicit SSL
should_encrypt = not self.ip_type == "onion" and self.ip not in self.server.broken_ssl_ips and self.ip not in config.ip_local
if self.cert_pin:
self.sock = CryptConnection.manager.wrapSocket(self.sock, "tls-rsa", cert_pin=self.cert_pin)
self.sock.do_handshake()
self.crypt = "tls-rsa"
self.sock_wrapped = True
elif should_encrypt and "tls-rsa" in CryptConnection.manager.crypt_supported:
try:
self.sock = CryptConnection.manager.wrapSocket(self.sock, "tls-rsa")
self.sock.do_handshake()
self.crypt = "tls-rsa"
self.sock_wrapped = True
except Exception as err:
if not config.force_encryption:
self.log("Crypt connection error, adding %s:%s as broken ssl. %s" % (self.ip, self.port, Debug.formatException(err)))
self.server.broken_ssl_ips[self.ip] = True
self.sock.close()
self.crypt = None
self.sock = self.createSocket()
self.sock.settimeout(30)
self.sock.connect(sock_address)
# Detect protocol
self.send({"cmd": "handshake", "req_id": 0, "params": self.getHandshakeInfo()})
event_connected = self.event_connected
gevent.spawn(self.messageLoop)
return event_connected.get() # Wait for handshake
connect_res = event_connected.get() # Wait for handshake
self.sock.settimeout(timeout_before)
return connect_res
# Handle incoming connection
def handleIncomingConnection(self, sock):
self.log("Incoming connection...")
if "TCP_NODELAY" in dir(socket):
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
self.type = "in"
if self.ip != "127.0.0.1": # Clearnet: Check implicit SSL
if self.ip not in config.ip_local: # Clearnet: Check implicit SSL
try:
if sock.recv(1, gevent.socket.MSG_PEEK) == "\x16":
first_byte = sock.recv(1, gevent.socket.MSG_PEEK)
if first_byte == b"\x16":
self.log("Crypt in connection using implicit SSL")
self.sock = CryptConnection.manager.wrapSocket(self.sock, "tls-rsa", True)
self.sock_wrapped = True
self.crypt = "tls-rsa"
except Exception, err:
except Exception as err:
self.log("Socket peek error: %s" % Debug.formatException(err))
self.messageLoop()
def getMsgpackUnpacker(self):
if self.handshake and self.handshake.get("use_bin_type"):
return Msgpack.getUnpacker(fallback=True, decode=False)
else: # Backward compatibility for <0.7.0
return Msgpack.getUnpacker(fallback=True, decode=True)
# Message loop for connection
def messageLoop(self):
if not self.sock:
@ -123,90 +213,210 @@ class Connection(object):
self.protocol = "v2"
self.updateName()
self.connected = True
buff_len = 0
req_len = 0
self.unpacker_bytes = 0
self.unpacker = msgpack.Unpacker()
try:
while True:
buff = self.sock.recv(16 * 1024)
while not self.closed:
buff = self.sock.recv(64 * 1024)
if not buff:
break # Connection closed
buff_len = len(buff)
# Statistics
self.last_recv_time = time.time()
self.incomplete_buff_recv += 1
self.bytes_recv += len(buff)
self.server.bytes_recv += len(buff)
self.bytes_recv += buff_len
self.server.bytes_recv += buff_len
req_len += buff_len
if not self.unpacker:
self.unpacker = msgpack.Unpacker()
self.unpacker = self.getMsgpackUnpacker()
self.unpacker_bytes = 0
self.unpacker.feed(buff)
buff = None
for message in self.unpacker:
self.unpacker_bytes += buff_len
while True:
try:
message = next(self.unpacker)
except StopIteration:
break
if not type(message) is dict:
if config.debug_socket:
self.log("Invalid message type: %s, content: %r, buffer: %r" % (type(message), message, buff[0:16]))
raise Exception("Invalid message type: %s" % type(message))
# Stats
self.incomplete_buff_recv = 0
stat_key = message.get("cmd", "unknown")
if stat_key == "response" and "to" in message:
cmd_sent = self.waiting_requests.get(message["to"], {"cmd": "unknown"})["cmd"]
stat_key = "response: %s" % cmd_sent
if stat_key == "update":
stat_key = "update: %s" % message["params"]["site"]
self.server.stat_recv[stat_key]["bytes"] += req_len
self.server.stat_recv[stat_key]["num"] += 1
if "stream_bytes" in message:
self.handleStream(message)
self.server.stat_recv[stat_key]["bytes"] += message["stream_bytes"]
req_len = 0
# Handle message
if "stream_bytes" in message:
buff_left = self.handleStream(message, buff)
self.unpacker = self.getMsgpackUnpacker()
self.unpacker.feed(buff_left)
self.unpacker_bytes = len(buff_left)
if config.debug_socket:
self.log("Start new unpacker with buff_left: %r" % buff_left)
else:
self.handleMessage(message)
message = None
except Exception, err:
except Exception as err:
if not self.closed:
self.log("Socket error: %s" % Debug.formatException(err))
self.close() # MessageLoop ended, close connection
self.server.stat_recv["error: %s" % err]["bytes"] += req_len
self.server.stat_recv["error: %s" % err]["num"] += 1
self.close("MessageLoop ended (closed: %s)" % self.closed) # MessageLoop ended, close connection
def getUnpackerUnprocessedBytesNum(self):
if "tell" in dir(self.unpacker):
bytes_num = self.unpacker_bytes - self.unpacker.tell()
else:
bytes_num = self.unpacker._fb_buf_n - self.unpacker._fb_buf_o
return bytes_num
# Stream socket directly to a file
def handleStream(self, message, buff):
stream_bytes_left = message["stream_bytes"]
file = self.waiting_streams[message["to"]]
unprocessed_bytes_num = self.getUnpackerUnprocessedBytesNum()
if unprocessed_bytes_num: # Found stream bytes in unpacker
unpacker_stream_bytes = min(unprocessed_bytes_num, stream_bytes_left)
buff_stream_start = len(buff) - unprocessed_bytes_num
file.write(buff[buff_stream_start:buff_stream_start + unpacker_stream_bytes])
stream_bytes_left -= unpacker_stream_bytes
else:
unpacker_stream_bytes = 0
if config.debug_socket:
self.log(
"Starting stream %s: %s bytes (%s from unpacker, buff size: %s, unprocessed: %s)" %
(message["to"], message["stream_bytes"], unpacker_stream_bytes, len(buff), unprocessed_bytes_num)
)
try:
while 1:
if stream_bytes_left <= 0:
break
stream_buff = self.sock.recv(min(64 * 1024, stream_bytes_left))
if not stream_buff:
break
buff_len = len(stream_buff)
stream_bytes_left -= buff_len
file.write(stream_buff)
# Statistics
self.last_recv_time = time.time()
self.incomplete_buff_recv += 1
self.bytes_recv += buff_len
self.server.bytes_recv += buff_len
except Exception as err:
self.log("Stream read error: %s" % Debug.formatException(err))
if config.debug_socket:
self.log("End stream %s, file pos: %s" % (message["to"], file.tell()))
self.incomplete_buff_recv = 0
self.waiting_requests[message["to"]]["evt"].set(message) # Set the response to event
del self.waiting_streams[message["to"]]
del self.waiting_requests[message["to"]]
if unpacker_stream_bytes:
return buff[buff_stream_start + unpacker_stream_bytes:]
else:
return b""
# My handshake info
def getHandshakeInfo(self):
# No TLS for onion connections
if self.ip.endswith(".onion"):
if self.ip_type == "onion":
crypt_supported = []
elif self.ip in self.server.broken_ssl_ips:
crypt_supported = []
else:
crypt_supported = CryptConnection.manager.crypt_supported
# No peer id for onion connections
if self.ip.endswith(".onion") or self.ip == "127.0.0.1":
if self.ip_type == "onion" or self.ip in config.ip_local:
peer_id = ""
else:
peer_id = self.server.peer_id
# Setup peer lock from requested onion address
if self.handshake and self.handshake.get("target_ip", "").endswith(".onion"):
target_onion = self.handshake.get("target_ip").replace(".onion", "") # My onion address
onion_sites = {v: k for k, v in self.server.tor_manager.site_onions.items()} # Inverse, Onion: Site address
self.site_lock = onion_sites.get(target_onion)
if not self.site_lock:
self.server.log.error("Unknown target onion address: %s" % target_onion)
self.site_lock = "unknown"
if self.handshake and self.handshake.get("target_ip", "").endswith(".onion") and self.server.tor_manager.start_onions:
self.target_onion = self.handshake.get("target_ip").replace(".onion", "") # My onion address
if not self.server.tor_manager.site_onions.values():
self.server.log.warning("Unknown target onion address: %s" % self.target_onion)
handshake = {
"version": config.version,
"protocol": "v2",
"use_bin_type": True,
"peer_id": peer_id,
"fileserver_port": self.server.port,
"port_opened": self.server.port_opened,
"port_opened": self.server.port_opened.get(self.ip_type, None),
"target_ip": self.ip,
"rev": config.rev,
"crypt_supported": crypt_supported,
"crypt": self.crypt
"crypt": self.crypt,
"time": int(time.time())
}
if self.site_lock:
handshake["onion"] = self.server.tor_manager.getOnion(self.site_lock)
elif self.ip.endswith(".onion"):
if self.target_onion:
handshake["onion"] = self.target_onion
elif self.ip_type == "onion":
handshake["onion"] = self.server.tor_manager.getOnion("global")
if self.is_tracker_connection:
handshake["tracker_connection"] = True
if config.debug_socket:
self.log("My Handshake: %s" % handshake)
return handshake
def setHandshake(self, handshake):
if config.debug_socket:
self.log("Remote Handshake: %s" % handshake)
if handshake.get("peer_id") == self.server.peer_id and not handshake.get("tracker_connection") and not self.is_tracker_connection:
self.close("Same peer id, can't connect to myself")
self.server.peer_blacklist.append((handshake["target_ip"], handshake["fileserver_port"]))
return False
self.handshake = handshake
if handshake.get("port_opened", None) is False and not "onion" in handshake: # Not connectable
if handshake.get("port_opened", None) is False and "onion" not in handshake and not self.is_private_ip: # Not connectable
self.port = 0
else:
self.port = handshake["fileserver_port"] # Set peer fileserver port
self.port = int(handshake["fileserver_port"]) # Set peer fileserver port
if handshake.get("onion") and not self.ip.endswith(".onion"): # Set incoming connection's onion address
self.ip = handshake["onion"] + ".onion"
self.updateName()
if handshake.get("use_bin_type") and self.unpacker:
unprocessed_bytes_num = self.getUnpackerUnprocessedBytesNum()
self.log("Changing unpacker to bin type (unprocessed bytes: %s)" % unprocessed_bytes_num)
unprocessed_bytes = self.unpacker.read_bytes(unprocessed_bytes_num)
self.unpacker = self.getMsgpackUnpacker() # Create new unpacker for different msgpack type
self.unpacker_bytes = 0
if unprocessed_bytes:
self.unpacker.feed(unprocessed_bytes)
# Check if we can encrypt the connection
if handshake.get("crypt_supported") and handshake["peer_id"] not in self.server.broken_ssl_peer_ids:
if self.ip.endswith(".onion"):
if handshake.get("crypt_supported") and self.ip not in self.server.broken_ssl_ips:
if type(handshake["crypt_supported"][0]) is bytes:
handshake["crypt_supported"] = [item.decode() for item in handshake["crypt_supported"]] # Backward compatibility
if self.ip_type == "onion" or self.ip in config.ip_local:
crypt = None
elif handshake.get("crypt"): # Recommended crypt by server
crypt = handshake["crypt"]
@ -215,18 +425,31 @@ class Connection(object):
if crypt:
self.crypt = crypt
if self.type == "in" and handshake.get("onion") and not self.ip_type == "onion": # Set incoming connection's onion address
if self.server.ips.get(self.ip) == self:
del self.server.ips[self.ip]
self.setIp(handshake["onion"] + ".onion")
self.log("Changing ip to %s" % self.ip)
self.server.ips[self.ip] = self
self.updateName()
self.event_connected.set(True) # Mark handshake as done
self.event_connected = None
self.handshake_time = time.time()
# Handle incoming message
def handleMessage(self, message):
cmd = message["cmd"]
self.last_message_time = time.time()
if message.get("cmd") == "response": # New style response
self.last_cmd_recv = cmd
if cmd == "response": # New style response
if message["to"] in self.waiting_requests:
if self.last_send_time:
if self.last_send_time and len(self.waiting_requests) == 1:
ping = time.time() - self.last_send_time
self.last_ping_delay = ping
self.waiting_requests[message["to"]].set(message) # Set the response to event
self.waiting_requests[message["to"]]["evt"].set(message) # Set the response to event
del self.waiting_requests[message["to"]]
elif message["to"] == 0: # Other peers handshake
ping = time.time() - self.start_time
@ -237,35 +460,27 @@ class Connection(object):
if message.get("crypt") and not self.sock_wrapped:
self.crypt = message["crypt"]
server = (self.type == "in")
self.log("Crypt out connection using: %s (server side: %s)..." % (self.crypt, server))
self.log("Crypt out connection using: %s (server side: %s, ping: %.3fs)..." % (self.crypt, server, ping))
self.sock = CryptConnection.manager.wrapSocket(self.sock, self.crypt, server, cert_pin=self.cert_pin)
self.sock.do_handshake()
self.sock_wrapped = True
if not self.sock_wrapped and self.cert_pin:
self.log("Crypt connection error: Socket not encrypted, but certificate pin present")
self.close()
self.close("Crypt connection error: Socket not encrypted, but certificate pin present")
return
self.setHandshake(message)
else:
self.log("Unknown response: %s" % message)
elif message.get("cmd"): # Handhsake request
if message["cmd"] == "handshake":
elif cmd:
self.server.num_recv += 1
if cmd == "handshake":
self.handleHandshake(message)
else:
self.server.handleRequest(self, message)
else: # Old style response, no req_id definied
if config.debug_socket:
self.log("Old style response, waiting: %s" % self.waiting_requests.keys())
last_req_id = min(self.waiting_requests.keys()) # Get the oldest waiting request and set it true
self.waiting_requests[last_req_id].set(message)
del self.waiting_requests[last_req_id] # Remove from waiting request
# Incoming handshake set request
def handleHandshake(self, message):
if config.debug_socket:
self.log("Handshake request: %s" % message)
self.setHandshake(message["params"])
data = self.getHandshakeInfo()
data["cmd"] = "response"
@ -278,114 +493,95 @@ class Connection(object):
try:
self.sock = CryptConnection.manager.wrapSocket(self.sock, self.crypt, server, cert_pin=self.cert_pin)
self.sock_wrapped = True
except Exception, err:
self.log("Crypt connection error: %s, adding peerid %s as broken ssl." % (err, message["params"]["peer_id"]))
self.server.broken_ssl_peer_ids[message["params"]["peer_id"]] = True
except Exception as err:
if not config.force_encryption:
self.log("Crypt connection error, adding %s:%s as broken ssl. %s" % (self.ip, self.port, Debug.formatException(err)))
self.server.broken_ssl_ips[self.ip] = True
self.close("Broken ssl")
if not self.sock_wrapped and self.cert_pin:
self.log("Crypt connection error: Socket not encrypted, but certificate pin present")
self.close()
# Stream socket directly to a file
def handleStream(self, message):
if config.debug_socket:
self.log("Starting stream %s: %s bytes" % (message["to"], message["stream_bytes"]))
read_bytes = message["stream_bytes"] # Bytes left we have to read from socket
try:
buff = self.unpacker.read_bytes(min(16 * 1024, read_bytes)) # Check if the unpacker has something left in buffer
except Exception, err:
buff = ""
file = self.waiting_streams[message["to"]]
if buff:
read_bytes -= len(buff)
file.write(buff)
try:
while 1:
if read_bytes <= 0:
break
buff = self.sock.recv(16 * 1024)
if not buff:
break
buff_len = len(buff)
read_bytes -= buff_len
file.write(buff)
# Statistics
self.last_recv_time = time.time()
self.incomplete_buff_recv += 1
self.bytes_recv += buff_len
self.server.bytes_recv += buff_len
except Exception, err:
self.log("Stream read error: %s" % Debug.formatException(err))
if config.debug_socket:
self.log("End stream %s" % message["to"])
self.incomplete_buff_recv = 0
self.waiting_requests[message["to"]].set(message) # Set the response to event
del self.waiting_streams[message["to"]]
del self.waiting_requests[message["to"]]
self.close("Crypt connection error: Socket not encrypted, but certificate pin present")
# Send data to connection
def send(self, message, streaming=False):
self.last_send_time = time.time()
if config.debug_socket:
self.log("Send: %s, to: %s, streaming: %s, site: %s, inner_path: %s, req_id: %s" % (
message.get("cmd"), message.get("to"), streaming,
message.get("params", {}).get("site"), message.get("params", {}).get("inner_path"),
message.get("req_id"))
)
self.last_send_time = time.time()
if not self.sock:
self.log("Send error: missing socket")
return False
if not self.connected and message.get("cmd") != "handshake":
self.log("Wait for handshake before send request")
self.event_connected.get()
try:
stat_key = message.get("cmd", "unknown")
if stat_key == "response":
stat_key = "response: %s" % self.last_cmd_recv
else:
self.server.num_sent += 1
self.server.stat_sent[stat_key]["num"] += 1
if streaming:
bytes_sent = StreamingMsgpack.stream(message, self.sock.sendall)
message = None
with self.send_lock:
bytes_sent = Msgpack.stream(message, self.sock.sendall)
self.bytes_sent += bytes_sent
self.server.bytes_sent += bytes_sent
else:
data = msgpack.packb(message)
self.server.stat_sent[stat_key]["bytes"] += bytes_sent
message = None
else:
data = Msgpack.pack(message)
self.bytes_sent += len(data)
self.server.bytes_sent += len(data)
self.sock.sendall(data)
except Exception, err:
self.log("Send errror: %s" % Debug.formatException(err))
self.close()
self.server.stat_sent[stat_key]["bytes"] += len(data)
message = None
with self.send_lock:
self.sock.sendall(data)
except Exception as err:
self.close("Send error: %s (cmd: %s)" % (err, stat_key))
return False
self.last_sent_time = time.time()
return True
# Stream raw file to connection
# Stream file to connection without msgpacking
def sendRawfile(self, file, read_bytes):
buff = 64 * 1024
bytes_left = read_bytes
bytes_sent = 0
while True:
self.last_send_time = time.time()
self.sock.sendall(
file.read(min(bytes_left, buff))
)
data = file.read(min(bytes_left, buff))
bytes_sent += len(data)
with self.send_lock:
self.sock.sendall(data)
bytes_left -= buff
if bytes_left <= 0:
break
self.bytes_sent += read_bytes
self.server.bytes_sent += read_bytes
self.bytes_sent += bytes_sent
self.server.bytes_sent += bytes_sent
self.server.stat_sent["raw_file"]["num"] += 1
self.server.stat_sent["raw_file"]["bytes"] += bytes_sent
return True
# Create and send a request to peer
def request(self, cmd, params={}, stream_to=None):
# Last command sent more than 10 sec ago, timeout
if self.waiting_requests and self.protocol == "v2" and time.time() - max(self.last_req_time, self.last_recv_time) > 10:
self.log("Request %s timeout: %s" % (self.last_cmd, time.time() - self.last_send_time))
self.close()
self.close("Request %s timeout: %.3fs" % (self.last_cmd_sent, time.time() - self.last_send_time))
return False
self.last_req_time = time.time()
self.last_cmd = cmd
self.last_cmd_sent = cmd
self.req_id += 1
data = {"cmd": cmd, "req_id": self.req_id, "params": params}
event = gevent.event.AsyncResult() # Create new event for response
self.waiting_requests[self.req_id] = event
self.waiting_requests[self.req_id] = {"evt": event, "cmd": cmd}
if stream_to:
self.waiting_streams[self.req_id] = stream_to
self.send(data) # Send request
@ -398,16 +594,16 @@ class Connection(object):
with gevent.Timeout(10.0, False):
try:
response = self.request("ping")
except Exception, err:
except Exception as err:
self.log("Ping error: %s" % Debug.formatException(err))
if response and "body" in response and response["body"] == "Pong!":
if response and "body" in response and response["body"] == b"Pong!":
self.last_ping_delay = time.time() - s
return True
else:
return False
# Close connection
def close(self):
def close(self, reason="Unknown"):
if self.closed:
return False # Already closed
self.closed = True
@ -415,21 +611,21 @@ class Connection(object):
if self.event_connected:
self.event_connected.set(False)
if config.debug_socket:
self.log(
"Closing connection, waiting_requests: %s, buff: %s..." %
(len(self.waiting_requests), self.incomplete_buff_recv)
)
self.log(
"Closing connection: %s, waiting_requests: %s, sites: %s, buff: %s..." %
(reason, len(self.waiting_requests), self.sites, self.incomplete_buff_recv)
)
for request in self.waiting_requests.values(): # Mark pending requests failed
request.set(False)
request["evt"].set(False)
self.waiting_requests = {}
self.waiting_streams = {}
self.sites = 0
self.server.removeConnection(self) # Remove connection from server registry
try:
if self.sock:
self.sock.shutdown(gevent.socket.SHUT_WR)
self.sock.close()
except Exception, err:
except Exception as err:
if config.debug_socket:
self.log("Close error: %s" % err)

View file

@ -1,82 +1,148 @@
import logging
import time
import sys
import socket
from collections import defaultdict
import gevent
import msgpack
from gevent.server import StreamServer
from gevent.pool import Pool
import util
from util import helper
from Debug import Debug
from Connection import Connection
from .Connection import Connection
from Config import config
from Crypt import CryptConnection
from Crypt import CryptHash
from Tor import TorManager
from Site import SiteManager
class ConnectionServer:
class ConnectionServer(object):
def __init__(self, ip=None, port=None, request_handler=None):
if not ip:
if config.fileserver_ip_type == "ipv6":
ip = "::1"
else:
ip = "127.0.0.1"
port = 15441
self.ip = ip
self.port = port
self.last_connection_id = 1 # Connection id incrementer
self.last_connection_id = 0 # Connection id incrementer
self.last_connection_id_current_version = 0 # Connection id incrementer for current client version
self.last_connection_id_supported_version = 0 # Connection id incrementer for last supported version
self.log = logging.getLogger("ConnServer")
self.port_opened = None
if config.tor != "disabled":
self.tor_manager = TorManager(self.ip, self.port)
else:
self.tor_manager = None
self.port_opened = {}
self.peer_blacklist = SiteManager.peer_blacklist
self.tor_manager = TorManager(self.ip, self.port)
self.connections = [] # Connections
self.whitelist = ("127.0.0.1",) # No flood protection on this ips
self.whitelist = config.ip_local # No flood protection on this ips
self.ip_incoming = {} # Incoming connections from ip in the last minute to avoid connection flood
self.broken_ssl_peer_ids = {} # Peerids of broken ssl connections
self.broken_ssl_ips = {} # Peerids of broken ssl connections
self.ips = {} # Connection by ip
self.has_internet = True # Internet outage detection
self.running = True
self.thread_checker = gevent.spawn(self.checkConnections)
self.stream_server = None
self.stream_server_proxy = None
self.running = False
self.stopping = False
self.thread_checker = None
self.stat_recv = defaultdict(lambda: defaultdict(int))
self.stat_sent = defaultdict(lambda: defaultdict(int))
self.bytes_recv = 0
self.bytes_sent = 0
self.num_recv = 0
self.num_sent = 0
self.num_incoming = 0
self.num_outgoing = 0
self.had_external_incoming = False
self.timecorrection = 0.0
self.pool = Pool(500) # do not accept more than 500 connections
# Bittorrent style peerid
self.peer_id = "-ZN0%s-%s" % (config.version.replace(".", ""), CryptHash.random(12, "base64"))
self.peer_id = "-UT3530-%s" % CryptHash.random(12, "base64")
# Check msgpack version
if msgpack.version[0] == 0 and msgpack.version[1] < 4:
self.log.error(
"Error: Unsupported msgpack version: %s (<0.4.0), please run `sudo apt-get install python-pip; sudo pip install msgpack-python --upgrade`" %
"Error: Unsupported msgpack version: %s (<0.4.0), please run `sudo apt-get install python-pip; sudo pip install msgpack --upgrade`" %
str(msgpack.version)
)
sys.exit(0)
if port: # Listen server on a port
self.pool = Pool(1000) # do not accept more than 1000 connections
self.stream_server = StreamServer(
(ip.replace("*", ""), port), self.handleIncomingConnection, spawn=self.pool, backlog=100
)
if request_handler:
self.handleRequest = request_handler
if request_handler:
self.handleRequest = request_handler
def start(self):
def start(self, check_connections=True):
if self.stopping:
return False
self.running = True
if check_connections:
self.thread_checker = gevent.spawn(self.checkConnections)
CryptConnection.manager.loadCerts()
if config.tor != "disable":
self.tor_manager.start()
if not self.port:
self.log.info("No port found, not binding")
return False
self.log.debug("Binding to: %s:%s, (msgpack: %s), supported crypt: %s" % (
self.ip, self.port,
".".join(map(str, msgpack.version)), CryptConnection.manager.crypt_supported)
)
self.ip, self.port, ".".join(map(str, msgpack.version)),
CryptConnection.manager.crypt_supported
))
try:
self.stream_server.serve_forever() # Start normal connection server
except Exception, err:
self.log.info("StreamServer bind error, must be running already: %s" % err)
self.stream_server = StreamServer(
(self.ip, self.port), self.handleIncomingConnection, spawn=self.pool, backlog=100
)
except Exception as err:
self.log.info("StreamServer create error: %s" % Debug.formatException(err))
def listen(self):
if not self.running:
return None
if self.stream_server_proxy:
gevent.spawn(self.listenProxy)
try:
self.stream_server.serve_forever()
except Exception as err:
self.log.info("StreamServer listen error: %s" % err)
return False
self.log.debug("Stopped.")
def stop(self):
self.log.debug("Stopping %s" % self.stream_server)
self.stopping = True
self.running = False
self.stream_server.stop()
if self.thread_checker:
gevent.kill(self.thread_checker)
if self.stream_server:
self.stream_server.stop()
def closeConnections(self):
self.log.debug("Closing all connection: %s" % len(self.connections))
for connection in self.connections[:]:
connection.close("Close all connections")
def handleIncomingConnection(self, sock, addr):
ip, port = addr
if config.offline:
sock.close()
return False
ip, port = addr[0:2]
ip = ip.lower()
if ip.startswith("::ffff:"): # IPv6 to IPv4 mapping
ip = ip.replace("::ffff:", "", 1)
self.num_incoming += 1
if not self.had_external_incoming and not helper.isPrivateIp(ip):
self.had_external_incoming = True
# Connection flood protection
if ip in self.ip_incoming and ip not in self.whitelist:
@ -91,12 +157,27 @@ class ConnectionServer:
connection = Connection(self, ip, port, sock)
self.connections.append(connection)
self.ips[ip] = connection
rev = connection.handshake.get("rev", 0)
if rev >= 4560:
self.last_connection_id_supported_version += 1
if rev == config.rev:
self.last_connection_id_current_version += 1
if ip not in config.ip_local:
self.ips[ip] = connection
connection.handleIncomingConnection(sock)
def getConnection(self, ip=None, port=None, peer_id=None, create=True, site=None):
if ip.endswith(".onion") and self.tor_manager.start_onions and site: # Site-unique connection for Tor
key = ip + site.address
def handleMessage(self, *args, **kwargs):
pass
def getConnection(self, ip=None, port=None, peer_id=None, create=True, site=None, is_tracker_connection=False):
ip_type = helper.getIpType(ip)
has_per_site_onion = (ip.endswith(".onion") or self.port_opened.get(ip_type, None) == False) and self.tor_manager.start_onions and site
if has_per_site_onion: # Site-unique connection for Tor
if ip.endswith(".onion"):
site_onion = self.tor_manager.getOnion(site.address)
else:
site_onion = self.tor_manager.getOnion("global")
key = ip + site_onion
else:
key = ip
@ -110,52 +191,67 @@ class ConnectionServer:
raise Exception("Connection event return error")
return connection
# Recover from connection pool
for connection in self.connections:
if connection.ip == ip:
if peer_id and connection.handshake.get("peer_id") != peer_id: # Does not match
continue
if ip.endswith(".onion") and self.tor_manager.start_onions and connection.site_lock != site.address:
# For different site
continue
if not connection.connected and create:
succ = connection.event_connected.get() # Wait for connection
if not succ:
raise Exception("Connection event return error")
return connection
# Recover from connection pool
for connection in self.connections:
if connection.ip == ip:
if peer_id and connection.handshake.get("peer_id") != peer_id: # Does not match
continue
if ip.endswith(".onion") and self.tor_manager.start_onions and ip.replace(".onion", "") != connection.target_onion:
# For different site
continue
if not connection.connected and create:
succ = connection.event_connected.get() # Wait for connection
if not succ:
raise Exception("Connection event return error")
return connection
# No connection found
if create: # Allow to create new connection if not found
if create and not config.offline: # Allow to create new connection if not found
if port == 0:
raise Exception("This peer is not connectable")
if (ip, port) in self.peer_blacklist and not is_tracker_connection:
raise Exception("This peer is blacklisted")
try:
if ip.endswith(".onion") and self.tor_manager.start_onions and site: # Lock connection to site
connection = Connection(self, ip, port, site_lock=site.address)
if has_per_site_onion: # Lock connection to site
connection = Connection(self, ip, port, target_onion=site_onion, is_tracker_connection=is_tracker_connection)
else:
connection = Connection(self, ip, port)
connection = Connection(self, ip, port, is_tracker_connection=is_tracker_connection)
self.num_outgoing += 1
self.ips[key] = connection
self.connections.append(connection)
connection.log("Connecting... (site: %s)" % site)
succ = connection.connect()
if not succ:
connection.close()
connection.close("Connection event return error")
raise Exception("Connection event return error")
else:
rev = connection.handshake.get("rev", 0)
if rev >= 4560:
self.last_connection_id_supported_version += 1
if rev == config.rev:
self.last_connection_id_current_version += 1
except Exception, err:
self.log.debug("%s Connect error: %s" % (ip, Debug.formatException(err)))
connection.close()
except Exception as err:
connection.close("%s Connect error: %s" % (ip, Debug.formatException(err)))
raise err
if len(self.connections) > config.global_connected_limit:
gevent.spawn(self.checkMaxConnections)
return connection
else:
return None
def removeConnection(self, connection):
self.log.debug("Removing %s..." % connection)
# Delete if same as in registry
if self.ips.get(connection.ip) == connection:
del self.ips[connection.ip]
# Site locked connection
if connection.site_lock and self.ips.get(connection.ip + connection.site_lock) == connection:
del self.ips[connection.ip + connection.site_lock]
if connection.target_onion:
if self.ips.get(connection.ip + connection.target_onion) == connection:
del self.ips[connection.ip + connection.target_onion]
# Cert pinned connection
if connection.cert_pin and self.ips.get(connection.ip + "#" + connection.cert_pin) == connection:
del self.ips[connection.ip + "#" + connection.cert_pin]
@ -164,44 +260,127 @@ class ConnectionServer:
self.connections.remove(connection)
def checkConnections(self):
run_i = 0
time.sleep(15)
while self.running:
time.sleep(60) # Check every minute
run_i += 1
self.ip_incoming = {} # Reset connected ips counter
self.broken_ssl_peer_ids = {} # Reset broken ssl peerids count
last_message_time = 0
s = time.time()
for connection in self.connections[:]: # Make a copy
if connection.ip.endswith(".onion") or config.tor == "always":
timeout_multipler = 2
else:
timeout_multipler = 1
idle = time.time() - max(connection.last_recv_time, connection.start_time, connection.last_message_time)
if connection.last_message_time > last_message_time and not connection.is_private_ip:
# Message from local IPs does not means internet connection
last_message_time = connection.last_message_time
if connection.unpacker and idle > 30:
# Delete the unpacker if not needed
del connection.unpacker
connection.unpacker = None
elif connection.last_cmd == "announce" and idle > 20: # Bootstrapper connection close after 20 sec
connection.log("[Cleanup] Tracker connection: %s" % idle)
connection.close()
elif connection.last_cmd_sent == "announce" and idle > 20: # Bootstrapper connection close after 20 sec
connection.close("[Cleanup] Tracker connection, idle: %.3fs" % idle)
if idle > 60 * 60:
# Wake up after 1h
connection.log("[Cleanup] After wakeup, idle: %s" % idle)
connection.close()
connection.close("[Cleanup] After wakeup, idle: %.3fs" % idle)
elif idle > 20 * 60 and connection.last_send_time < time.time() - 10:
# Idle more than 20 min and we not send request in last 10 sec
if not connection.ping(): # send ping request
connection.close()
# Idle more than 20 min and we have not sent request in last 10 sec
if not connection.ping():
connection.close("[Cleanup] Ping timeout")
elif idle > 10 and connection.incomplete_buff_recv > 0:
# Incompelte data with more than 10 sec idle
connection.log("[Cleanup] Connection buff stalled")
connection.close()
elif idle > 10 * timeout_multipler and connection.incomplete_buff_recv > 0:
# Incomplete data with more than 10 sec idle
connection.close("[Cleanup] Connection buff stalled")
elif idle > 10 and connection.waiting_requests and time.time() - connection.last_send_time > 10:
# Sent command and no response in 10 sec
connection.log(
"[Cleanup] Command %s timeout: %s" % (connection.last_cmd, time.time() - connection.last_send_time)
elif idle > 10 * timeout_multipler and connection.protocol == "?": # No connection after 10 sec
connection.close(
"[Cleanup] Connect timeout: %.3fs" % idle
)
connection.close()
elif idle > 60 and connection.protocol == "?": # No connection after 1 min
connection.log("[Cleanup] Connect timeout: %s" % idle)
connection.close()
elif idle > 10 * timeout_multipler and connection.waiting_requests and time.time() - connection.last_send_time > 10 * timeout_multipler:
# Sent command and no response in 10 sec
connection.close(
"[Cleanup] Command %s timeout: %.3fs" % (connection.last_cmd_sent, time.time() - connection.last_send_time)
)
elif idle < 60 and connection.bad_actions > 40:
connection.close(
"[Cleanup] Too many bad actions: %s" % connection.bad_actions
)
elif idle > 5 * 60 and connection.sites == 0:
connection.close(
"[Cleanup] No site for connection"
)
elif run_i % 90 == 0:
# Reset bad action counter every 30 min
connection.bad_actions = 0
# Internet outage detection
if time.time() - last_message_time > max(60, 60 * 10 / max(1, float(len(self.connections)) / 50)):
# Offline: Last message more than 60-600sec depending on connection number
if self.has_internet and last_message_time:
self.has_internet = False
self.onInternetOffline()
else:
# Online
if not self.has_internet:
self.has_internet = True
self.onInternetOnline()
self.timecorrection = self.getTimecorrection()
if time.time() - s > 0.01:
self.log.debug("Connection cleanup in %.3fs" % (time.time() - s))
time.sleep(15)
self.log.debug("Checkconnections ended")
@util.Noparallel(blocking=False)
def checkMaxConnections(self):
if len(self.connections) < config.global_connected_limit:
return 0
s = time.time()
num_connected_before = len(self.connections)
self.connections.sort(key=lambda connection: connection.sites)
num_closed = 0
for connection in self.connections:
idle = time.time() - max(connection.last_recv_time, connection.start_time, connection.last_message_time)
if idle > 60:
connection.close("Connection limit reached")
num_closed += 1
if num_closed > config.global_connected_limit * 0.1:
break
self.log.debug("Closed %s connections of %s after reached limit %s in %.3fs" % (
num_closed, num_connected_before, config.global_connected_limit, time.time() - s
))
return num_closed
def onInternetOnline(self):
self.log.info("Internet online")
def onInternetOffline(self):
self.had_external_incoming = False
self.log.info("Internet offline")
def getTimecorrection(self):
corrections = sorted([
connection.handshake.get("time") - connection.handshake_time + connection.last_ping_delay
for connection in self.connections
if connection.handshake.get("time") and connection.last_ping_delay
])
if len(corrections) < 9:
return 0.0
mid = int(len(corrections) / 2 - 1)
median = (corrections[mid - 1] + corrections[mid] + corrections[mid + 1]) / 3
return median

View file

@ -1,2 +1,2 @@
from ConnectionServer import ConnectionServer
from Connection import Connection
from .ConnectionServer import ConnectionServer
from .Connection import Connection

162
src/Content/ContentDb.py Normal file
View file

@ -0,0 +1,162 @@
import os
from Db.Db import Db, DbTableError
from Config import config
from Plugin import PluginManager
from Debug import Debug
@PluginManager.acceptPlugins
class ContentDb(Db):
def __init__(self, path):
Db.__init__(self, {"db_name": "ContentDb", "tables": {}}, path)
self.foreign_keys = True
def init(self):
try:
self.schema = self.getSchema()
try:
self.checkTables()
except DbTableError:
pass
self.log.debug("Checking foreign keys...")
foreign_key_error = self.execute("PRAGMA foreign_key_check").fetchone()
if foreign_key_error:
raise Exception("Database foreign key error: %s" % foreign_key_error)
except Exception as err:
self.log.error("Error loading content.db: %s, rebuilding..." % Debug.formatException(err))
self.close()
os.unlink(self.db_path) # Remove and try again
Db.__init__(self, {"db_name": "ContentDb", "tables": {}}, self.db_path)
self.foreign_keys = True
self.schema = self.getSchema()
try:
self.checkTables()
except DbTableError:
pass
self.site_ids = {}
self.sites = {}
def getSchema(self):
schema = {}
schema["db_name"] = "ContentDb"
schema["version"] = 3
schema["tables"] = {}
if not self.getTableVersion("site"):
self.log.debug("Migrating from table version-less content.db")
version = int(self.execute("PRAGMA user_version").fetchone()[0])
if version > 0:
self.checkTables()
self.execute("INSERT INTO keyvalue ?", {"json_id": 0, "key": "table.site.version", "value": 1})
self.execute("INSERT INTO keyvalue ?", {"json_id": 0, "key": "table.content.version", "value": 1})
schema["tables"]["site"] = {
"cols": [
["site_id", "INTEGER PRIMARY KEY ASC NOT NULL UNIQUE"],
["address", "TEXT NOT NULL"]
],
"indexes": [
"CREATE UNIQUE INDEX site_address ON site (address)"
],
"schema_changed": 1
}
schema["tables"]["content"] = {
"cols": [
["content_id", "INTEGER PRIMARY KEY UNIQUE NOT NULL"],
["site_id", "INTEGER REFERENCES site (site_id) ON DELETE CASCADE"],
["inner_path", "TEXT"],
["size", "INTEGER"],
["size_files", "INTEGER"],
["size_files_optional", "INTEGER"],
["modified", "INTEGER"]
],
"indexes": [
"CREATE UNIQUE INDEX content_key ON content (site_id, inner_path)",
"CREATE INDEX content_modified ON content (site_id, modified)"
],
"schema_changed": 1
}
return schema
def initSite(self, site):
self.sites[site.address] = site
def needSite(self, site):
if site.address not in self.site_ids:
self.execute("INSERT OR IGNORE INTO site ?", {"address": site.address})
self.site_ids = {}
for row in self.execute("SELECT * FROM site"):
self.site_ids[row["address"]] = row["site_id"]
return self.site_ids[site.address]
def deleteSite(self, site):
site_id = self.site_ids.get(site.address, 0)
if site_id:
self.execute("DELETE FROM site WHERE site_id = :site_id", {"site_id": site_id})
del self.site_ids[site.address]
del self.sites[site.address]
def setContent(self, site, inner_path, content, size=0):
self.insertOrUpdate("content", {
"size": size,
"size_files": sum([val["size"] for key, val in content.get("files", {}).items()]),
"size_files_optional": sum([val["size"] for key, val in content.get("files_optional", {}).items()]),
"modified": int(content.get("modified", 0))
}, {
"site_id": self.site_ids.get(site.address, 0),
"inner_path": inner_path
})
def deleteContent(self, site, inner_path):
self.execute("DELETE FROM content WHERE ?", {"site_id": self.site_ids.get(site.address, 0), "inner_path": inner_path})
def loadDbDict(self, site):
res = self.execute(
"SELECT GROUP_CONCAT(inner_path, '|') AS inner_paths FROM content WHERE ?",
{"site_id": self.site_ids.get(site.address, 0)}
)
row = res.fetchone()
if row and row["inner_paths"]:
inner_paths = row["inner_paths"].split("|")
return dict.fromkeys(inner_paths, False)
else:
return {}
def getTotalSize(self, site, ignore=None):
params = {"site_id": self.site_ids.get(site.address, 0)}
if ignore:
params["not__inner_path"] = ignore
res = self.execute("SELECT SUM(size) + SUM(size_files) AS size, SUM(size_files_optional) AS size_optional FROM content WHERE ?", params)
row = dict(res.fetchone())
if not row["size"]:
row["size"] = 0
if not row["size_optional"]:
row["size_optional"] = 0
return row["size"], row["size_optional"]
def listModified(self, site, after=None, before=None):
params = {"site_id": self.site_ids.get(site.address, 0)}
if after:
params["modified>"] = after
if before:
params["modified<"] = before
res = self.execute("SELECT inner_path, modified FROM content WHERE ?", params)
return {row["inner_path"]: row["modified"] for row in res}
content_dbs = {}
def getContentDb(path=None):
if not path:
path = "%s/content.db" % config.data_dir
if path not in content_dbs:
content_dbs[path] = ContentDb(path)
content_dbs[path].init()
return content_dbs[path]
getContentDb() # Pre-connect to default one

View file

@ -0,0 +1,155 @@
import time
import os
from . import ContentDb
from Debug import Debug
from Config import config
class ContentDbDict(dict):
def __init__(self, site, *args, **kwargs):
s = time.time()
self.site = site
self.cached_keys = []
self.log = self.site.log
self.db = ContentDb.getContentDb()
self.db_id = self.db.needSite(site)
self.num_loaded = 0
super(ContentDbDict, self).__init__(self.db.loadDbDict(site)) # Load keys from database
self.log.debug("ContentDb init: %.3fs, found files: %s, sites: %s" % (time.time() - s, len(self), len(self.db.site_ids)))
def loadItem(self, key):
try:
self.num_loaded += 1
if self.num_loaded % 100 == 0:
if config.verbose:
self.log.debug("Loaded json: %s (latest: %s) called by: %s" % (self.num_loaded, key, Debug.formatStack()))
else:
self.log.debug("Loaded json: %s (latest: %s)" % (self.num_loaded, key))
content = self.site.storage.loadJson(key)
dict.__setitem__(self, key, content)
except IOError:
if dict.get(self, key):
self.__delitem__(key) # File not exists anymore
raise KeyError(key)
self.addCachedKey(key)
self.checkLimit()
return content
def getItemSize(self, key):
return self.site.storage.getSize(key)
# Only keep last 10 accessed json in memory
def checkLimit(self):
if len(self.cached_keys) > 10:
key_deleted = self.cached_keys.pop(0)
dict.__setitem__(self, key_deleted, False)
def addCachedKey(self, key):
if key not in self.cached_keys and key != "content.json" and len(key) > 40: # Always keep keys smaller than 40 char
self.cached_keys.append(key)
def __getitem__(self, key):
val = dict.get(self, key)
if val: # Already loaded
return val
elif val is None: # Unknown key
raise KeyError(key)
elif val is False: # Loaded before, but purged from cache
return self.loadItem(key)
def __setitem__(self, key, val):
self.addCachedKey(key)
self.checkLimit()
size = self.getItemSize(key)
self.db.setContent(self.site, key, val, size)
dict.__setitem__(self, key, val)
def __delitem__(self, key):
self.db.deleteContent(self.site, key)
dict.__delitem__(self, key)
try:
self.cached_keys.remove(key)
except ValueError:
pass
def iteritems(self):
for key in dict.keys(self):
try:
val = self[key]
except Exception as err:
self.log.warning("Error loading %s: %s" % (key, err))
continue
yield key, val
def items(self):
back = []
for key in dict.keys(self):
try:
val = self[key]
except Exception as err:
self.log.warning("Error loading %s: %s" % (key, err))
continue
back.append((key, val))
return back
def values(self):
back = []
for key, val in dict.iteritems(self):
if not val:
try:
val = self.loadItem(key)
except Exception:
continue
back.append(val)
return back
def get(self, key, default=None):
try:
return self.__getitem__(key)
except KeyError:
return default
except Exception as err:
self.site.bad_files[key] = self.site.bad_files.get(key, 1)
dict.__delitem__(self, key)
self.log.warning("Error loading %s: %s" % (key, err))
return default
def execute(self, query, params={}):
params["site_id"] = self.db_id
return self.db.execute(query, params)
if __name__ == "__main__":
import psutil
process = psutil.Process(os.getpid())
s_mem = process.memory_info()[0] / float(2 ** 20)
root = "data-live/1MaiL5gfBM1cyb4a8e3iiL8L5gXmoAJu27"
contents = ContentDbDict("1MaiL5gfBM1cyb4a8e3iiL8L5gXmoAJu27", root)
print("Init len", len(contents))
s = time.time()
for dir_name in os.listdir(root + "/data/users/")[0:8000]:
contents["data/users/%s/content.json" % dir_name]
print("Load: %.3fs" % (time.time() - s))
s = time.time()
found = 0
for key, val in contents.items():
found += 1
assert key
assert val
print("Found:", found)
print("Iteritem: %.3fs" % (time.time() - s))
s = time.time()
found = 0
for key in list(contents.keys()):
found += 1
assert key in contents
print("In: %.3fs" % (time.time() - s))
print("Len:", len(list(contents.values())), len(list(contents.keys())))
print("Mem: +", process.memory_info()[0] / float(2 ** 20) - s_mem)

File diff suppressed because it is too large Load diff

View file

@ -1 +1 @@
from ContentManager import ContentManager
from .ContentManager import ContentManager

4
src/Crypt/Crypt.py Normal file
View file

@ -0,0 +1,4 @@
from Config import config
from util import ThreadPool
thread_pool_crypt = ThreadPool.ThreadPool(config.threads_crypt)

View file

@ -1,75 +1,101 @@
import logging
import base64
import binascii
import time
import hashlib
from lib.BitcoinECC import BitcoinECC
from lib.pybitcointools import bitcoin as btctools
from util.Electrum import dbl_format
from Config import config
# Try to load openssl
import util.OpensslFindPatch
lib_verify_best = "sslcrypto"
from lib import sslcrypto
sslcurve_native = sslcrypto.ecc.get_curve("secp256k1")
sslcurve_fallback = sslcrypto.fallback.ecc.get_curve("secp256k1")
sslcurve = sslcurve_native
def loadLib(lib_name, silent=False):
global sslcurve, libsecp256k1message, lib_verify_best
if lib_name == "libsecp256k1":
s = time.time()
from lib import libsecp256k1message
import coincurve
lib_verify_best = "libsecp256k1"
if not silent:
logging.info(
"Libsecpk256k1 loaded: %s in %.3fs" %
(type(coincurve._libsecp256k1.lib).__name__, time.time() - s)
)
elif lib_name == "sslcrypto":
sslcurve = sslcurve_native
if sslcurve_native == sslcurve_fallback:
logging.warning("SSLCurve fallback loaded instead of native")
elif lib_name == "sslcrypto_fallback":
sslcurve = sslcurve_fallback
try:
if not config.use_openssl:
if not config.use_libsecp256k1:
raise Exception("Disabled by config")
from lib.opensslVerify import opensslVerify
logging.info("OpenSSL loaded, version: %s" % opensslVerify.openssl_version)
except Exception, err:
logging.info("OpenSSL load failed: %s, falling back to slow bitcoin verify" % err)
opensslVerify = None
loadLib("libsecp256k1")
lib_verify_best = "libsecp256k1"
except Exception as err:
logging.info("Libsecp256k1 load failed: %s" % err)
def newPrivatekey(uncompressed=True): # Return new private key
privatekey = btctools.encode_privkey(btctools.random_key(), "wif")
return privatekey
def newPrivatekey(): # Return new private key
return sslcurve.private_to_wif(sslcurve.new_private_key()).decode()
def newSeed():
return btctools.random_key()
return binascii.hexlify(sslcurve.new_private_key()).decode()
def hdPrivatekey(seed, child):
masterkey = btctools.bip32_master_key(seed)
childkey = btctools.bip32_ckd(masterkey, child % 100000000) # Too large child id could cause problems
key = btctools.bip32_extract_key(childkey)
return btctools.encode_privkey(key, "wif")
# Too large child id could cause problems
privatekey_bin = sslcurve.derive_child(seed.encode(), child % 100000000)
return sslcurve.private_to_wif(privatekey_bin).decode()
def privatekeyToAddress(privatekey): # Return address from private key
if privatekey.startswith("23") and len(privatekey) > 52: # Backward compatibility to broken lib
bitcoin = BitcoinECC.Bitcoin()
bitcoin.BitcoinAddressFromPrivate(privatekey)
return bitcoin.BitcoinAddresFromPublicKey()
else:
try:
return btctools.privkey_to_address(privatekey)
except Exception: # Invalid privatekey
return False
try:
if len(privatekey) == 64:
privatekey_bin = bytes.fromhex(privatekey)
else:
privatekey_bin = sslcurve.wif_to_private(privatekey.encode())
return sslcurve.private_to_address(privatekey_bin).decode()
except Exception: # Invalid privatekey
return False
def sign(data, privatekey): # Return sign to data using private key
if privatekey.startswith("23") and len(privatekey) > 52:
return None # Old style private key not supported
sign = btctools.ecdsa_sign(data, privatekey)
return sign
return base64.b64encode(sslcurve.sign(
data.encode(),
sslcurve.wif_to_private(privatekey.encode()),
recoverable=True,
hash=dbl_format
)).decode()
def signOld(data, privatekey): # Return sign to data using private key (backward compatible old style)
bitcoin = BitcoinECC.Bitcoin()
bitcoin.BitcoinAddressFromPrivate(privatekey)
sign = bitcoin.SignECDSA(data)
return sign
def verify(data, valid_address, sign, lib_verify=None): # Verify data using address and sign
if not lib_verify:
lib_verify = lib_verify_best
if not sign:
return False
def verify(data, address, sign): # Verify data using address and sign
if hasattr(sign, "endswith"):
if opensslVerify: # Use the faster method if avalible
pub = opensslVerify.getMessagePubkey(data, sign)
sign_address = btctools.pubtoaddr(pub)
else: # Use pure-python
pub = btctools.ecdsa_recover(data, sign)
sign_address = btctools.pubtoaddr(pub)
if lib_verify == "libsecp256k1":
sign_address = libsecp256k1message.recover_address(data.encode("utf8"), sign).decode("utf8")
elif lib_verify in ("sslcrypto", "sslcrypto_fallback"):
publickey = sslcurve.recover(base64.b64decode(sign), data.encode(), hash=dbl_format)
sign_address = sslcurve.public_to_address(publickey).decode()
else:
raise Exception("No library enabled for signature verification")
if type(address) is list: # Any address in the list
return sign_address in address
else: # One possible address
return sign_address == address
else: # Backward compatible old style
bitcoin = BitcoinECC.Bitcoin()
return bitcoin.VerifyMessageFromBitcoinAddress(address, data, sign)
if type(valid_address) is list: # Any address in the list
return sign_address in valid_address
else: # One possible address
return sign_address == valid_address

View file

@ -3,23 +3,80 @@ import logging
import os
import ssl
import hashlib
import random
from Config import config
from util import SslPatch
from util import helper
class CryptConnectionManager:
def __init__(self):
# OpenSSL params
if sys.platform.startswith("win"):
self.openssl_bin = "src\\lib\\opensslVerify\\openssl.exe"
if config.openssl_bin_file:
self.openssl_bin = config.openssl_bin_file
elif sys.platform.startswith("win"):
self.openssl_bin = "tools\\openssl\\openssl.exe"
elif config.dist_type.startswith("bundle_linux"):
self.openssl_bin = "../runtime/bin/openssl"
else:
self.openssl_bin = "openssl"
self.openssl_env = {"OPENSSL_CONF": "src/lib/opensslVerify/openssl.cnf"}
self.context_client = None
self.context_server = None
self.openssl_conf_template = "src/lib/openssl/openssl.cnf"
self.openssl_conf = config.data_dir + "/openssl.cnf"
self.openssl_env = {
"OPENSSL_CONF": self.openssl_conf,
"RANDFILE": config.data_dir + "/openssl-rand.tmp"
}
self.crypt_supported = [] # Supported cryptos
self.cacert_pem = config.data_dir + "/cacert-rsa.pem"
self.cakey_pem = config.data_dir + "/cakey-rsa.pem"
self.cert_pem = config.data_dir + "/cert-rsa.pem"
self.cert_csr = config.data_dir + "/cert-rsa.csr"
self.key_pem = config.data_dir + "/key-rsa.pem"
self.log = logging.getLogger("CryptConnectionManager")
self.log.debug("Version: %s" % ssl.OPENSSL_VERSION)
self.fakedomains = [
"yahoo.com", "amazon.com", "live.com", "microsoft.com", "mail.ru", "csdn.net", "bing.com",
"amazon.co.jp", "office.com", "imdb.com", "msn.com", "samsung.com", "huawei.com", "ztedevices.com",
"godaddy.com", "w3.org", "gravatar.com", "creativecommons.org", "hatena.ne.jp",
"adobe.com", "opera.com", "apache.org", "rambler.ru", "one.com", "nationalgeographic.com",
"networksolutions.com", "php.net", "python.org", "phoca.cz", "debian.org", "ubuntu.com",
"nazwa.pl", "symantec.com"
]
def createSslContexts(self):
if self.context_server and self.context_client:
return False
ciphers = "ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA256:AES256-SHA:"
ciphers += "!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK"
if hasattr(ssl, "PROTOCOL_TLS"):
protocol = ssl.PROTOCOL_TLS
else:
protocol = ssl.PROTOCOL_TLSv1_2
self.context_client = ssl.SSLContext(protocol)
self.context_client.check_hostname = False
self.context_client.verify_mode = ssl.CERT_NONE
self.context_server = ssl.SSLContext(protocol)
self.context_server.load_cert_chain(self.cert_pem, self.key_pem)
for ctx in (self.context_client, self.context_server):
ctx.set_ciphers(ciphers)
ctx.options |= ssl.OP_NO_COMPRESSION
try:
ctx.set_alpn_protocols(["h2", "http/1.1"])
ctx.set_npn_protocols(["h2", "http/1.1"])
except Exception:
pass
# Select crypt that supported by both sides
# Return: Name of the crypto
def selectCrypt(self, client_supported):
@ -32,17 +89,14 @@ class CryptConnectionManager:
# Return: wrapped socket
def wrapSocket(self, sock, crypt, server=False, cert_pin=None):
if crypt == "tls-rsa":
ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES128-SHA256:HIGH:"
ciphers += "!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK"
if server:
sock_wrapped = ssl.wrap_socket(
sock, server_side=server, keyfile='%s/key-rsa.pem' % config.data_dir,
certfile='%s/cert-rsa.pem' % config.data_dir, ciphers=ciphers)
sock_wrapped = self.context_server.wrap_socket(sock, server_side=True)
else:
sock_wrapped = ssl.wrap_socket(sock, ciphers=ciphers)
sock_wrapped = self.context_client.wrap_socket(sock, server_hostname=random.choice(self.fakedomains))
if cert_pin:
cert_hash = hashlib.sha256(sock_wrapped.getpeercert(True)).hexdigest()
assert cert_hash == cert_pin, "Socket certificate does not match (%s != %s)" % (cert_hash, cert_pin)
if cert_hash != cert_pin:
raise Exception("Socket certificate does not match (%s != %s)" % (cert_hash, cert_pin))
return sock_wrapped
else:
return sock
@ -50,7 +104,7 @@ class CryptConnectionManager:
def removeCerts(self):
if config.keep_ssl_cert:
return False
for file_name in ["cert-rsa.pem", "key-rsa.pem"]:
for file_name in ["cert-rsa.pem", "key-rsa.pem", "cacert-rsa.pem", "cakey-rsa.pem", "cacert-rsa.srl", "cert-rsa.csr", "openssl-rand.tmp"]:
file_path = "%s/%s" % (config.data_dir, file_name)
if os.path.isfile(file_path):
os.unlink(file_path)
@ -60,68 +114,108 @@ class CryptConnectionManager:
if config.disable_encryption:
return False
if self.createSslRsaCert():
if self.createSslRsaCert() and "tls-rsa" not in self.crypt_supported:
self.crypt_supported.append("tls-rsa")
# Try to create RSA server cert + sign for connection encryption
# Return: True on success
def createSslRsaCert(self):
if os.path.isfile("%s/cert-rsa.pem" % config.data_dir) and os.path.isfile("%s/key-rsa.pem" % config.data_dir):
casubjects = [
"/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon",
"/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3",
"/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA",
"/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA"
]
self.openssl_env['CN'] = random.choice(self.fakedomains)
environ = os.environ
environ['OPENSSL_CONF'] = self.openssl_env['OPENSSL_CONF']
environ['RANDFILE'] = self.openssl_env['RANDFILE']
environ['CN'] = self.openssl_env['CN']
if os.path.isfile(self.cert_pem) and os.path.isfile(self.key_pem):
self.createSslContexts()
return True # Files already exits
import subprocess
proc = subprocess.Popen(
"%s req -x509 -newkey rsa:2048 -sha256 -batch -keyout %s -out %s -nodes -config %s" % helper.shellquote(
self.openssl_bin,
config.data_dir+"/key-rsa.pem",
config.data_dir+"/cert-rsa.pem",
self.openssl_env["OPENSSL_CONF"]
),
shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=self.openssl_env
)
back = proc.stdout.read().strip()
proc.wait()
logging.debug("Generating RSA cert and key PEM files...%s" % back)
if os.path.isfile("%s/cert-rsa.pem" % config.data_dir) and os.path.isfile("%s/key-rsa.pem" % config.data_dir):
# Replace variables in config template
conf_template = open(self.openssl_conf_template).read()
conf_template = conf_template.replace("$ENV::CN", self.openssl_env['CN'])
open(self.openssl_conf, "w").write(conf_template)
# Generate CAcert and CAkey
cmd_params = helper.shellquote(
self.openssl_bin,
self.openssl_conf,
random.choice(casubjects),
self.cakey_pem,
self.cacert_pem
)
cmd = "%s req -new -newkey rsa:2048 -days 3650 -nodes -x509 -config %s -subj %s -keyout %s -out %s -batch" % cmd_params
self.log.debug("Generating RSA CAcert and CAkey PEM files...")
self.log.debug("Running: %s" % cmd)
proc = subprocess.Popen(
cmd, shell=True, stderr=subprocess.STDOUT,
stdout=subprocess.PIPE, env=environ
)
back = proc.stdout.read().strip().decode(errors="replace").replace("\r", "")
proc.wait()
if not (os.path.isfile(self.cacert_pem) and os.path.isfile(self.cakey_pem)):
self.log.error("RSA ECC SSL CAcert generation failed, CAcert or CAkey files not exist. (%s)" % back)
return False
else:
self.log.debug("Result: %s" % back)
# Generate certificate key and signing request
cmd_params = helper.shellquote(
self.openssl_bin,
self.key_pem,
self.cert_csr,
"/CN=" + self.openssl_env['CN'],
self.openssl_conf,
)
cmd = "%s req -new -newkey rsa:2048 -keyout %s -out %s -subj %s -sha256 -nodes -batch -config %s" % cmd_params
self.log.debug("Generating certificate key and signing request...")
proc = subprocess.Popen(
cmd, shell=True, stderr=subprocess.STDOUT,
stdout=subprocess.PIPE, env=environ
)
back = proc.stdout.read().strip().decode(errors="replace").replace("\r", "")
proc.wait()
self.log.debug("Running: %s\n%s" % (cmd, back))
# Sign request and generate certificate
cmd_params = helper.shellquote(
self.openssl_bin,
self.cert_csr,
self.cacert_pem,
self.cakey_pem,
self.cert_pem,
self.openssl_conf
)
cmd = "%s x509 -req -in %s -CA %s -CAkey %s -set_serial 01 -out %s -days 730 -sha256 -extensions x509_ext -extfile %s" % cmd_params
self.log.debug("Generating RSA cert...")
proc = subprocess.Popen(
cmd, shell=True, stderr=subprocess.STDOUT,
stdout=subprocess.PIPE, env=environ
)
back = proc.stdout.read().strip().decode(errors="replace").replace("\r", "")
proc.wait()
self.log.debug("Running: %s\n%s" % (cmd, back))
if os.path.isfile(self.cert_pem) and os.path.isfile(self.key_pem):
self.createSslContexts()
# Remove no longer necessary files
os.unlink(self.openssl_conf)
os.unlink(self.cacert_pem)
os.unlink(self.cakey_pem)
os.unlink(self.cert_csr)
return True
else:
logging.error("RSA ECC SSL cert generation failed, cert or key files not exist.")
return False
self.log.error("RSA ECC SSL cert generation failed, cert or key files not exist.")
# Not used yet: Missing on some platform
"""def createSslEccCert(self):
return False
import subprocess
# Create ECC privatekey
proc = subprocess.Popen(
"%s ecparam -name prime256v1 -genkey -out %s/key-ecc.pem" % (self.openssl_bin, config.data_dir),
shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=self.openssl_env
)
back = proc.stdout.read().strip()
proc.wait()
self.log.debug("Generating ECC privatekey PEM file...%s" % back)
# Create ECC cert
proc = subprocess.Popen(
"%s req -new -key %s -x509 -nodes -out %s -config %s" % helper.shellquote(
self.openssl_bin,
config.data_dir+"/key-ecc.pem",
config.data_dir+"/cert-ecc.pem",
self.openssl_env["OPENSSL_CONF"]
),
shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, env=self.openssl_env
)
back = proc.stdout.read().strip()
proc.wait()
self.log.debug("Generating ECC cert PEM file...%s" % back)
if os.path.isfile("%s/cert-ecc.pem" % config.data_dir) and os.path.isfile("%s/key-ecc.pem" % config.data_dir):
return True
else:
self.logging.error("ECC SSL cert generation failed, cert or key files not exits.")
return False
"""
manager = CryptConnectionManager()

View file

@ -3,29 +3,25 @@ import os
import base64
def sha1sum(file, blocksize=65536):
if hasattr(file, "endswith"): # Its a string open it
file = open(file, "rb")
hash = hashlib.sha1()
for block in iter(lambda: file.read(blocksize), ""):
hash.update(block)
return hash.hexdigest()
def sha512sum(file, blocksize=65536):
if hasattr(file, "endswith"): # Its a string open it
def sha512sum(file, blocksize=65536, format="hexdigest"):
if type(file) is str: # Filename specified
file = open(file, "rb")
hash = hashlib.sha512()
for block in iter(lambda: file.read(blocksize), ""):
for block in iter(lambda: file.read(blocksize), b""):
hash.update(block)
return hash.hexdigest()[0:64] # Truncate to 256bits is good enough
# Truncate to 256bits is good enough
if format == "hexdigest":
return hash.hexdigest()[0:64]
else:
return hash.digest()[0:32]
def sha256sum(file, blocksize=65536):
if hasattr(file, "endswith"): # Its a string open it
if type(file) is str: # Filename specified
file = open(file, "rb")
hash = hashlib.sha256()
for block in iter(lambda: file.read(blocksize), ""):
for block in iter(lambda: file.read(blocksize), b""):
hash.update(block)
return hash.hexdigest()
@ -33,25 +29,28 @@ def sha256sum(file, blocksize=65536):
def random(length=64, encoding="hex"):
if encoding == "base64": # Characters: A-Za-z0-9
hash = hashlib.sha512(os.urandom(256)).digest()
return base64.standard_b64encode(hash).replace("+", "").replace("/", "").replace("=", "")[0:length]
return base64.b64encode(hash).decode("ascii").replace("+", "").replace("/", "").replace("=", "")[0:length]
else: # Characters: a-f0-9 (faster)
return hashlib.sha512(os.urandom(256)).hexdigest()[0:length]
# Sha512 truncated to 256bits
class Sha512t:
def __init__(self, data):
if data:
self.sha512 = hashlib.sha512(data)
else:
self.sha512 = hashlib.sha512()
if __name__ == "__main__":
import cStringIO as StringIO
a = StringIO.StringIO()
a.write("hello!")
a.seek(0)
print hashlib.sha1("hello!").hexdigest()
print sha1sum(a)
def hexdigest(self):
return self.sha512.hexdigest()[0:64]
import time
s = time.time()
print sha1sum(open("F:\\Temp\\bigfile")),
print time.time() - s
def digest(self):
return self.sha512.digest()[0:32]
s = time.time()
print sha512sum(open("F:\\Temp\\bigfile")),
print time.time() - s
def update(self, data):
return self.sha512.update(data)
def sha512t(data=None):
return Sha512t(data)

View file

@ -1,38 +0,0 @@
import base64
import hashlib
def sign(data, privatekey):
from lib import rsa
from lib.rsa import pkcs1
if "BEGIN RSA PRIVATE KEY" not in privatekey:
privatekey = "-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----" % privatekey
priv = rsa.PrivateKey.load_pkcs1(privatekey)
sign = rsa.pkcs1.sign(data, priv, 'SHA-256')
return sign
def verify(data, publickey, sign):
from lib import rsa
from lib.rsa import pkcs1
pub = rsa.PublicKey.load_pkcs1(publickey, format="DER")
try:
valid = rsa.pkcs1.verify(data, sign, pub)
except pkcs1.VerificationError:
valid = False
return valid
def privatekeyToPublickey(privatekey):
from lib import rsa
from lib.rsa import pkcs1
if "BEGIN RSA PRIVATE KEY" not in privatekey:
privatekey = "-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----" % privatekey
priv = rsa.PrivateKey.load_pkcs1(privatekey)
pub = rsa.PublicKey(priv.n, priv.e)
return pub.save_pkcs1("DER")
def publickeyToOnion(publickey):
return base64.b32encode(hashlib.sha1(publickey).digest()[:10]).lower()

Some files were not shown because too many files have changed in this diff Show more