refreshed and renamed docs, added bootstrap server, added default config for sec auditing

This commit is contained in:
Kevin Froman 2020-02-04 14:46:17 -06:00
parent fe36b87c57
commit 6960d9209d
270 changed files with 20816 additions and 8345 deletions

View file

@ -0,0 +1,190 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.blockimporter API documentation</title>
<meta name="description" content="Onionr - Private P2P Communication …" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.blockimporter</code></h1>
</header>
<section id="section-intro">
<p>Onionr - Private P2P Communication</p>
<p>Import block data and save it</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#39;&#39;&#39;
Onionr - Private P2P Communication
Import block data and save it
&#39;&#39;&#39;
from onionrexceptions import BlacklistedBlock
from onionrexceptions import DiskAllocationReached
from onionrexceptions import InvalidProof
from onionrexceptions import InvalidMetadata
import logger
from onionrutils import validatemetadata
from onionrutils import blockmetadata
from coredb import blockmetadb
import onionrstorage
import onionrcrypto as crypto
from . import onionrblacklist
&#39;&#39;&#39;
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 3 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, see &lt;https://www.gnu.org/licenses/&gt;.
&#39;&#39;&#39;
def import_block_from_data(content):
blacklist = onionrblacklist.OnionrBlackList()
ret_data = False
try:
content = content.encode()
except AttributeError:
pass
data_hash = crypto.hashers.sha3_hash(content)
if blacklist.inBlacklist(data_hash):
raise BlacklistedBlock(f&#39;%s is a blacklisted block {data_hash}&#39;)
# returns tuple(metadata, meta), meta is also in metadata
metas = blockmetadata.get_block_metadata_from_data(content)
metadata = metas[0]
# check if metadata is valid
if validatemetadata.validate_metadata(metadata, metas[2]):
# check if POW is enough/correct
if crypto.cryptoutils.verify_POW(content):
logger.info(f&#39;Imported block passed proof, saving: {data_hash}.&#39;,
terminal=True)
try:
blockHash = onionrstorage.set_data(content)
except DiskAllocationReached:
logger.warn(&#39;Failed to save block due to full disk allocation&#39;)
raise
else:
blockmetadb.add_to_block_DB(blockHash, dataSaved=True)
# caches block metadata values to block database
blockmetadata.process_block_metadata(blockHash)
ret_data = blockHash
else:
raise InvalidProof
else:
raise InvalidMetadata
return ret_data</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="src.onionrblocks.blockimporter.import_block_from_data"><code class="name flex">
<span>def <span class="ident">import_block_from_data</span></span>(<span>content)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def import_block_from_data(content):
blacklist = onionrblacklist.OnionrBlackList()
ret_data = False
try:
content = content.encode()
except AttributeError:
pass
data_hash = crypto.hashers.sha3_hash(content)
if blacklist.inBlacklist(data_hash):
raise BlacklistedBlock(f&#39;%s is a blacklisted block {data_hash}&#39;)
# returns tuple(metadata, meta), meta is also in metadata
metas = blockmetadata.get_block_metadata_from_data(content)
metadata = metas[0]
# check if metadata is valid
if validatemetadata.validate_metadata(metadata, metas[2]):
# check if POW is enough/correct
if crypto.cryptoutils.verify_POW(content):
logger.info(f&#39;Imported block passed proof, saving: {data_hash}.&#39;,
terminal=True)
try:
blockHash = onionrstorage.set_data(content)
except DiskAllocationReached:
logger.warn(&#39;Failed to save block due to full disk allocation&#39;)
raise
else:
blockmetadb.add_to_block_DB(blockHash, dataSaved=True)
# caches block metadata values to block database
blockmetadata.process_block_metadata(blockHash)
ret_data = blockHash
else:
raise InvalidProof
else:
raise InvalidMetadata
return ret_data</code></pre>
</details>
</dd>
</dl>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks" href="index.html">src.onionrblocks</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="src.onionrblocks.blockimporter.import_block_from_data" href="#src.onionrblocks.blockimporter.import_block_from_data">import_block_from_data</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

View file

@ -0,0 +1,123 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.deleteplaintext API documentation</title>
<meta name="description" content="Onionr - P2P Anonymous Storage Network …" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.deleteplaintext</code></h1>
</header>
<section id="section-intro">
<p>Onionr - P2P Anonymous Storage Network.</p>
<p>Delete but do not blacklist plaintext blocks</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;Onionr - P2P Anonymous Storage Network.
Delete but do not blacklist plaintext blocks
&#34;&#34;&#34;
from coredb import blockmetadb
from onionrstorage.removeblock import remove_block
import onionrstorage
from .onionrblockapi import Block
&#34;&#34;&#34;
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 3 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, see &lt;https://www.gnu.org/licenses/&gt;.
&#34;&#34;&#34;
def delete_plaintext_no_blacklist():
&#34;&#34;&#34;Delete, but do not blacklist, plaintext blocks.&#34;&#34;&#34;
block_list = blockmetadb.get_block_list()
for block in block_list:
block = Block(hash=block)
if not block.isEncrypted:
remove_block(block.hash)
onionrstorage.deleteBlock(block.hash)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="src.onionrblocks.deleteplaintext.delete_plaintext_no_blacklist"><code class="name flex">
<span>def <span class="ident">delete_plaintext_no_blacklist</span></span>(<span>)</span>
</code></dt>
<dd>
<section class="desc"><p>Delete, but do not blacklist, plaintext blocks.</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def delete_plaintext_no_blacklist():
&#34;&#34;&#34;Delete, but do not blacklist, plaintext blocks.&#34;&#34;&#34;
block_list = blockmetadb.get_block_list()
for block in block_list:
block = Block(hash=block)
if not block.isEncrypted:
remove_block(block.hash)
onionrstorage.deleteBlock(block.hash)</code></pre>
</details>
</dd>
</dl>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks" href="index.html">src.onionrblocks</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="src.onionrblocks.deleteplaintext.delete_plaintext_no_blacklist" href="#src.onionrblocks.deleteplaintext.delete_plaintext_no_blacklist">delete_plaintext_no_blacklist</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

View file

@ -0,0 +1,100 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks API documentation</title>
<meta name="description" content="" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from . import insert
from .insert import time_insert
insert = insert.insert_block
time_insert = time_insert</code></pre>
</details>
</section>
<section>
<h2 class="section-title" id="header-submodules">Sub-modules</h2>
<dl>
<dt><code class="name"><a title="src.onionrblocks.blockimporter" href="blockimporter.html">src.onionrblocks.blockimporter</a></code></dt>
<dd>
<section class="desc"><p>Onionr - Private P2P Communication …</p></section>
</dd>
<dt><code class="name"><a title="src.onionrblocks.deleteplaintext" href="deleteplaintext.html">src.onionrblocks.deleteplaintext</a></code></dt>
<dd>
<section class="desc"><p>Onionr - P2P Anonymous Storage Network …</p></section>
</dd>
<dt><code class="name"><a title="src.onionrblocks.insert" href="insert/index.html">src.onionrblocks.insert</a></code></dt>
<dd>
<section class="desc"></section>
</dd>
<dt><code class="name"><a title="src.onionrblocks.onionrblacklist" href="onionrblacklist.html">src.onionrblocks.onionrblacklist</a></code></dt>
<dd>
<section class="desc"><p>Onionr - Private P2P Communication …</p></section>
</dd>
<dt><code class="name"><a title="src.onionrblocks.onionrblockapi" href="onionrblockapi.html">src.onionrblocks.onionrblockapi</a></code></dt>
<dd>
<section class="desc"><p>Onionr - P2P Anonymous Storage Network …</p></section>
</dd>
<dt><code class="name"><a title="src.onionrblocks.storagecounter" href="storagecounter.html">src.onionrblocks.storagecounter</a></code></dt>
<dd>
<section class="desc"><p>Onionr - Private P2P Communication …</p></section>
</dd>
</dl>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src" href="../index.html">src</a></code></li>
</ul>
</li>
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
<ul>
<li><code><a title="src.onionrblocks.blockimporter" href="blockimporter.html">src.onionrblocks.blockimporter</a></code></li>
<li><code><a title="src.onionrblocks.deleteplaintext" href="deleteplaintext.html">src.onionrblocks.deleteplaintext</a></code></li>
<li><code><a title="src.onionrblocks.insert" href="insert/index.html">src.onionrblocks.insert</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist" href="onionrblacklist.html">src.onionrblocks.onionrblacklist</a></code></li>
<li><code><a title="src.onionrblocks.onionrblockapi" href="onionrblockapi.html">src.onionrblocks.onionrblockapi</a></code></li>
<li><code><a title="src.onionrblocks.storagecounter" href="storagecounter.html">src.onionrblocks.storagecounter</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

View file

@ -0,0 +1,79 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.insert API documentation</title>
<meta name="description" content="" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.insert</code></h1>
</header>
<section id="section-intro">
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">from . import main, timeinsert
insert_block = main.insert_block
time_insert = timeinsert.time_insert</code></pre>
</details>
</section>
<section>
<h2 class="section-title" id="header-submodules">Sub-modules</h2>
<dl>
<dt><code class="name"><a title="src.onionrblocks.insert.main" href="main.html">src.onionrblocks.insert.main</a></code></dt>
<dd>
<section class="desc"><p>Onionr - Private P2P Communication …</p></section>
</dd>
<dt><code class="name"><a title="src.onionrblocks.insert.timeinsert" href="timeinsert.html">src.onionrblocks.insert.timeinsert</a></code></dt>
<dd>
<section class="desc"><p>Onionr - Private P2P Communication …</p></section>
</dd>
</dl>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks" href="../index.html">src.onionrblocks</a></code></li>
</ul>
</li>
<li><h3><a href="#header-submodules">Sub-modules</a></h3>
<ul>
<li><code><a title="src.onionrblocks.insert.main" href="main.html">src.onionrblocks.insert.main</a></code></li>
<li><code><a title="src.onionrblocks.insert.timeinsert" href="timeinsert.html">src.onionrblocks.insert.timeinsert</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

View file

@ -0,0 +1,483 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.insert.main API documentation</title>
<meta name="description" content="Onionr - Private P2P Communication …" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.insert.main</code></h1>
</header>
<section id="section-intro">
<p>Onionr - Private P2P Communication</p>
<p>Create and insert Onionr blocks</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;
Onionr - Private P2P Communication
Create and insert Onionr blocks
&#34;&#34;&#34;
&#34;&#34;&#34;
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 3 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, see &lt;https://www.gnu.org/licenses/&gt;.
&#34;&#34;&#34;
from typing import Union
import json
from gevent import spawn
from onionrutils import bytesconverter, epoch
import filepaths, onionrstorage
from .. import storagecounter
from onionrplugins import onionrevents as events
from etc import powchoice, onionrvalues
import config, onionrcrypto as crypto, onionrexceptions
from onionrusers import onionrusers
from onionrutils import localcommand, blockmetadata, stringvalidators
import coredb
import onionrproofs
from onionrproofs import subprocesspow
import logger
from onionrtypes import UserIDSecretKey
def _check_upload_queue():
&#34;&#34;&#34;Returns the current upload queue len
raises OverflowError if max, false if api not running
&#34;&#34;&#34;
max_upload_queue: int = 5000
queue = localcommand.local_command(&#39;/gethidden&#39;, maxWait=10)
up_queue = False
try:
up_queue = len(queue.splitlines())
except AttributeError:
pass
else:
if up_queue &gt;= max_upload_queue:
raise OverflowError
return up_queue
def insert_block(data: Union[str, bytes], header: str = &#39;txt&#39;,
sign: bool = False, encryptType: str = &#39;&#39;, symKey: str = &#39;&#39;,
asymPeer: str = &#39;&#39;, meta: dict = {},
expire: Union[int, None] = None, disableForward: bool = False,
signing_key: UserIDSecretKey = &#39;&#39;) -&gt; Union[str, bool]:
&#34;&#34;&#34;
Inserts a block into the network
encryptType must be specified to encrypt a block
&#34;&#34;&#34;
our_private_key = crypto.priv_key
our_pub_key = crypto.pub_key
is_offline = True
storage_counter = storagecounter.StorageCounter()
allocationReachedMessage = &#39;Cannot insert block, disk allocation reached.&#39;
if storage_counter.is_full():
logger.error(allocationReachedMessage)
raise onionrexceptions.DiskAllocationReached
if not _check_upload_queue() is False: is_offline = False
if signing_key != &#39;&#39;:
# if it was specified to use an alternative private key
our_private_key = signing_key
our_pub_key = bytesconverter.bytes_to_str(crypto.cryptoutils.get_pub_key_from_priv(our_private_key))
use_subprocess = powchoice.use_subprocess(config)
retData = False
if type(data) is None:
raise ValueError(&#39;Data cannot be none&#39;)
createTime = epoch.get_epoch()
dataNonce = bytesconverter.bytes_to_str(crypto.hashers.sha3_hash(data))
try:
with open(filepaths.data_nonce_file, &#39;r&#39;) as nonces:
if dataNonce in nonces:
return retData
except FileNotFoundError:
pass
# record nonce
with open(filepaths.data_nonce_file, &#39;a&#39;) as nonceFile:
nonceFile.write(dataNonce + &#39;\n&#39;)
plaintext = data
plaintextMeta = {}
plaintextPeer = asymPeer
retData = &#39;&#39;
signature = &#39;&#39;
signer = &#39;&#39;
metadata = {}
# metadata is full block metadata, meta is internal, user specified metadata
# only use header if not set in provided meta
meta[&#39;type&#39;] = str(header)
if encryptType in (&#39;asym&#39;, &#39;sym&#39;):
metadata[&#39;encryptType&#39;] = encryptType
else:
if not config.get(&#39;general.store_plaintext_blocks&#39;, True): raise onionrexceptions.InvalidMetadata(&#34;Plaintext blocks are disabled, yet a plaintext block was being inserted&#34;)
if not encryptType in (&#39;&#39;, None):
raise onionrexceptions.InvalidMetadata(&#39;encryptType must be asym or sym, or blank&#39;)
try:
data = data.encode()
except AttributeError:
pass
if encryptType == &#39;asym&#39;:
meta[&#39;rply&#39;] = createTime # Duplicate the time in encrypted messages to prevent replays
if not disableForward and sign and asymPeer != our_pub_key:
try:
forwardEncrypted = onionrusers.OnionrUser(asymPeer).forwardEncrypt(data)
data = forwardEncrypted[0]
meta[&#39;forwardEnc&#39;] = True
expire = forwardEncrypted[2] # Expire time of key. no sense keeping block after that
except onionrexceptions.InvalidPubkey:
pass
#onionrusers.OnionrUser(self, asymPeer).generateForwardKey()
fsKey = onionrusers.OnionrUser(asymPeer).generateForwardKey()
#fsKey = onionrusers.OnionrUser(self, asymPeer).getGeneratedForwardKeys().reverse()
meta[&#39;newFSKey&#39;] = fsKey
jsonMeta = json.dumps(meta)
plaintextMeta = jsonMeta
if sign:
signature = crypto.signing.ed_sign(jsonMeta.encode() + data, key=our_private_key, encodeResult=True)
signer = our_pub_key
if len(jsonMeta) &gt; 1000:
raise onionrexceptions.InvalidMetadata(&#39;meta in json encoded form must not exceed 1000 bytes&#39;)
# encrypt block metadata/sig/content
if encryptType == &#39;sym&#39;:
raise NotImplementedError(&#34;not yet implemented&#34;)
elif encryptType == &#39;asym&#39;:
if stringvalidators.validate_pub_key(asymPeer):
# Encrypt block data with forward secrecy key first, but not meta
jsonMeta = json.dumps(meta)
jsonMeta = crypto.encryption.pub_key_encrypt(jsonMeta, asymPeer, encodedData=True).decode()
data = crypto.encryption.pub_key_encrypt(data, asymPeer, encodedData=False)#.decode()
signature = crypto.encryption.pub_key_encrypt(signature, asymPeer, encodedData=True).decode()
signer = crypto.encryption.pub_key_encrypt(signer, asymPeer, encodedData=True).decode()
try:
onionrusers.OnionrUser(asymPeer, saveUser=True)
except ValueError:
# if peer is already known
pass
else:
raise onionrexceptions.InvalidPubkey(asymPeer + &#39; is not a valid base32 encoded ed25519 key&#39;)
# compile metadata
metadata[&#39;meta&#39;] = jsonMeta
if len(signature) &gt; 0: # I don&#39;t like not pattern
metadata[&#39;sig&#39;] = signature
metadata[&#39;signer&#39;] = signer
metadata[&#39;time&#39;] = createTime
# ensure expire is integer and of sane length
if type(expire) is not type(None):
if not len(str(int(expire))) &lt; 20: raise ValueError(&#39;expire must be valid int less than 20 digits in length&#39;)
metadata[&#39;expire&#39;] = expire
# send block data (and metadata) to POW module to get tokenized block data
if use_subprocess:
payload = subprocesspow.SubprocessPOW(data, metadata).start()
else:
payload = onionrproofs.POW(metadata, data).waitForResult()
if payload != False:
try:
retData = onionrstorage.set_data(payload)
except onionrexceptions.DiskAllocationReached:
logger.error(allocationReachedMessage)
retData = False
else:
# Tell the api server through localCommand to wait for the daemon to upload this block to make statistical analysis more difficult
spawn(
localcommand.local_command,
f&#39;/daemon-event/upload_event&#39;,
post=True,
is_json=True,
postData={&#39;block&#39;: retData}
).get(timeout=5)
coredb.blockmetadb.add.add_to_block_DB(retData, selfInsert=True, dataSaved=True)
if expire is None:
coredb.blockmetadb.update_block_info(retData, &#39;expire&#39;,
createTime + onionrvalues.DEFAULT_EXPIRE)
else:
coredb.blockmetadb.update_block_info(retData, &#39;expire&#39;, expire)
blockmetadata.process_block_metadata(retData)
if retData != False:
if plaintextPeer == onionrvalues.DENIABLE_PEER_ADDRESS:
events.event(&#39;insertdeniable&#39;, {&#39;content&#39;: plaintext, &#39;meta&#39;: plaintextMeta, &#39;hash&#39;: retData, &#39;peer&#39;: bytesconverter.bytes_to_str(asymPeer)}, threaded = True)
else:
events.event(&#39;insertblock&#39;, {&#39;content&#39;: plaintext, &#39;meta&#39;: plaintextMeta, &#39;hash&#39;: retData, &#39;peer&#39;: bytesconverter.bytes_to_str(asymPeer)}, threaded = True)
spawn(
localcommand.local_command,
&#39;/daemon-event/remove_from_insert_queue_wrapper&#39;,
post=True,
postData={&#39;block_hash&#39;: retData},
is_json=True
).get(timeout=5)
return retData</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="src.onionrblocks.insert.main.insert_block"><code class="name flex">
<span>def <span class="ident">insert_block</span></span>(<span>data, header='txt', sign=False, encryptType='', symKey='', asymPeer='', meta={}, expire=None, disableForward=False, signing_key='')</span>
</code></dt>
<dd>
<section class="desc"><p>Inserts a block into the network
encryptType must be specified to encrypt a block</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def insert_block(data: Union[str, bytes], header: str = &#39;txt&#39;,
sign: bool = False, encryptType: str = &#39;&#39;, symKey: str = &#39;&#39;,
asymPeer: str = &#39;&#39;, meta: dict = {},
expire: Union[int, None] = None, disableForward: bool = False,
signing_key: UserIDSecretKey = &#39;&#39;) -&gt; Union[str, bool]:
&#34;&#34;&#34;
Inserts a block into the network
encryptType must be specified to encrypt a block
&#34;&#34;&#34;
our_private_key = crypto.priv_key
our_pub_key = crypto.pub_key
is_offline = True
storage_counter = storagecounter.StorageCounter()
allocationReachedMessage = &#39;Cannot insert block, disk allocation reached.&#39;
if storage_counter.is_full():
logger.error(allocationReachedMessage)
raise onionrexceptions.DiskAllocationReached
if not _check_upload_queue() is False: is_offline = False
if signing_key != &#39;&#39;:
# if it was specified to use an alternative private key
our_private_key = signing_key
our_pub_key = bytesconverter.bytes_to_str(crypto.cryptoutils.get_pub_key_from_priv(our_private_key))
use_subprocess = powchoice.use_subprocess(config)
retData = False
if type(data) is None:
raise ValueError(&#39;Data cannot be none&#39;)
createTime = epoch.get_epoch()
dataNonce = bytesconverter.bytes_to_str(crypto.hashers.sha3_hash(data))
try:
with open(filepaths.data_nonce_file, &#39;r&#39;) as nonces:
if dataNonce in nonces:
return retData
except FileNotFoundError:
pass
# record nonce
with open(filepaths.data_nonce_file, &#39;a&#39;) as nonceFile:
nonceFile.write(dataNonce + &#39;\n&#39;)
plaintext = data
plaintextMeta = {}
plaintextPeer = asymPeer
retData = &#39;&#39;
signature = &#39;&#39;
signer = &#39;&#39;
metadata = {}
# metadata is full block metadata, meta is internal, user specified metadata
# only use header if not set in provided meta
meta[&#39;type&#39;] = str(header)
if encryptType in (&#39;asym&#39;, &#39;sym&#39;):
metadata[&#39;encryptType&#39;] = encryptType
else:
if not config.get(&#39;general.store_plaintext_blocks&#39;, True): raise onionrexceptions.InvalidMetadata(&#34;Plaintext blocks are disabled, yet a plaintext block was being inserted&#34;)
if not encryptType in (&#39;&#39;, None):
raise onionrexceptions.InvalidMetadata(&#39;encryptType must be asym or sym, or blank&#39;)
try:
data = data.encode()
except AttributeError:
pass
if encryptType == &#39;asym&#39;:
meta[&#39;rply&#39;] = createTime # Duplicate the time in encrypted messages to prevent replays
if not disableForward and sign and asymPeer != our_pub_key:
try:
forwardEncrypted = onionrusers.OnionrUser(asymPeer).forwardEncrypt(data)
data = forwardEncrypted[0]
meta[&#39;forwardEnc&#39;] = True
expire = forwardEncrypted[2] # Expire time of key. no sense keeping block after that
except onionrexceptions.InvalidPubkey:
pass
#onionrusers.OnionrUser(self, asymPeer).generateForwardKey()
fsKey = onionrusers.OnionrUser(asymPeer).generateForwardKey()
#fsKey = onionrusers.OnionrUser(self, asymPeer).getGeneratedForwardKeys().reverse()
meta[&#39;newFSKey&#39;] = fsKey
jsonMeta = json.dumps(meta)
plaintextMeta = jsonMeta
if sign:
signature = crypto.signing.ed_sign(jsonMeta.encode() + data, key=our_private_key, encodeResult=True)
signer = our_pub_key
if len(jsonMeta) &gt; 1000:
raise onionrexceptions.InvalidMetadata(&#39;meta in json encoded form must not exceed 1000 bytes&#39;)
# encrypt block metadata/sig/content
if encryptType == &#39;sym&#39;:
raise NotImplementedError(&#34;not yet implemented&#34;)
elif encryptType == &#39;asym&#39;:
if stringvalidators.validate_pub_key(asymPeer):
# Encrypt block data with forward secrecy key first, but not meta
jsonMeta = json.dumps(meta)
jsonMeta = crypto.encryption.pub_key_encrypt(jsonMeta, asymPeer, encodedData=True).decode()
data = crypto.encryption.pub_key_encrypt(data, asymPeer, encodedData=False)#.decode()
signature = crypto.encryption.pub_key_encrypt(signature, asymPeer, encodedData=True).decode()
signer = crypto.encryption.pub_key_encrypt(signer, asymPeer, encodedData=True).decode()
try:
onionrusers.OnionrUser(asymPeer, saveUser=True)
except ValueError:
# if peer is already known
pass
else:
raise onionrexceptions.InvalidPubkey(asymPeer + &#39; is not a valid base32 encoded ed25519 key&#39;)
# compile metadata
metadata[&#39;meta&#39;] = jsonMeta
if len(signature) &gt; 0: # I don&#39;t like not pattern
metadata[&#39;sig&#39;] = signature
metadata[&#39;signer&#39;] = signer
metadata[&#39;time&#39;] = createTime
# ensure expire is integer and of sane length
if type(expire) is not type(None):
if not len(str(int(expire))) &lt; 20: raise ValueError(&#39;expire must be valid int less than 20 digits in length&#39;)
metadata[&#39;expire&#39;] = expire
# send block data (and metadata) to POW module to get tokenized block data
if use_subprocess:
payload = subprocesspow.SubprocessPOW(data, metadata).start()
else:
payload = onionrproofs.POW(metadata, data).waitForResult()
if payload != False:
try:
retData = onionrstorage.set_data(payload)
except onionrexceptions.DiskAllocationReached:
logger.error(allocationReachedMessage)
retData = False
else:
# Tell the api server through localCommand to wait for the daemon to upload this block to make statistical analysis more difficult
spawn(
localcommand.local_command,
f&#39;/daemon-event/upload_event&#39;,
post=True,
is_json=True,
postData={&#39;block&#39;: retData}
).get(timeout=5)
coredb.blockmetadb.add.add_to_block_DB(retData, selfInsert=True, dataSaved=True)
if expire is None:
coredb.blockmetadb.update_block_info(retData, &#39;expire&#39;,
createTime + onionrvalues.DEFAULT_EXPIRE)
else:
coredb.blockmetadb.update_block_info(retData, &#39;expire&#39;, expire)
blockmetadata.process_block_metadata(retData)
if retData != False:
if plaintextPeer == onionrvalues.DENIABLE_PEER_ADDRESS:
events.event(&#39;insertdeniable&#39;, {&#39;content&#39;: plaintext, &#39;meta&#39;: plaintextMeta, &#39;hash&#39;: retData, &#39;peer&#39;: bytesconverter.bytes_to_str(asymPeer)}, threaded = True)
else:
events.event(&#39;insertblock&#39;, {&#39;content&#39;: plaintext, &#39;meta&#39;: plaintextMeta, &#39;hash&#39;: retData, &#39;peer&#39;: bytesconverter.bytes_to_str(asymPeer)}, threaded = True)
spawn(
localcommand.local_command,
&#39;/daemon-event/remove_from_insert_queue_wrapper&#39;,
post=True,
postData={&#39;block_hash&#39;: retData},
is_json=True
).get(timeout=5)
return retData</code></pre>
</details>
</dd>
</dl>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks.insert" href="index.html">src.onionrblocks.insert</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="src.onionrblocks.insert.main.insert_block" href="#src.onionrblocks.insert.main.insert_block">insert_block</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

View file

@ -0,0 +1,163 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.insert.timeinsert API documentation</title>
<meta name="description" content="Onionr - Private P2P Communication …" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.insert.timeinsert</code></h1>
</header>
<section id="section-intro">
<p>Onionr - Private P2P Communication.</p>
<p>Wrapper to insert blocks with variable delay</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;Onionr - Private P2P Communication.
Wrapper to insert blocks with variable delay
&#34;&#34;&#34;
from . import main
&#34;&#34;&#34;
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 3 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, see &lt;https://www.gnu.org/licenses/&gt;.
&#34;&#34;&#34;
def time_insert(*args, **kwargs):
&#34;&#34;&#34;Block insert wrapper to allow for insertions independent of mixmate.
Takes exact args as insert_block, with additional keyword:
delay=n; where n=seconds to tell initial nodes to delay share for.
defaults to 0 or previously set value in current block meta
&#34;&#34;&#34;
try:
kwargs[&#39;meta&#39;]
except KeyError:
kwargs[&#39;meta&#39;] = {}
try:
delay = int(kwargs[&#39;meta&#39;][&#39;dly&#39;])
except KeyError:
delay = 0
try:
delay = kwargs[&#39;delay&#39;]
del kwargs[&#39;delay&#39;]
except KeyError:
delay = 0
# Ensure delay &gt;=0
if delay &lt; 0:
raise ValueError(&#39;delay cannot be less than 0&#39;)
kwargs[&#39;meta&#39;][&#39;dly&#39;] = delay
return main.insert_block(*args, **kwargs)</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="src.onionrblocks.insert.timeinsert.time_insert"><code class="name flex">
<span>def <span class="ident">time_insert</span></span>(<span>*args, **kwargs)</span>
</code></dt>
<dd>
<section class="desc"><p>Block insert wrapper to allow for insertions independent of mixmate.</p>
<p>Takes exact args as insert_block, with additional keyword:
delay=n; where n=seconds to tell initial nodes to delay share for.</p>
<p>defaults to 0 or previously set value in current block meta</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def time_insert(*args, **kwargs):
&#34;&#34;&#34;Block insert wrapper to allow for insertions independent of mixmate.
Takes exact args as insert_block, with additional keyword:
delay=n; where n=seconds to tell initial nodes to delay share for.
defaults to 0 or previously set value in current block meta
&#34;&#34;&#34;
try:
kwargs[&#39;meta&#39;]
except KeyError:
kwargs[&#39;meta&#39;] = {}
try:
delay = int(kwargs[&#39;meta&#39;][&#39;dly&#39;])
except KeyError:
delay = 0
try:
delay = kwargs[&#39;delay&#39;]
del kwargs[&#39;delay&#39;]
except KeyError:
delay = 0
# Ensure delay &gt;=0
if delay &lt; 0:
raise ValueError(&#39;delay cannot be less than 0&#39;)
kwargs[&#39;meta&#39;][&#39;dly&#39;] = delay
return main.insert_block(*args, **kwargs)</code></pre>
</details>
</dd>
</dl>
</section>
<section>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks.insert" href="index.html">src.onionrblocks.insert</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="src.onionrblocks.insert.timeinsert.time_insert" href="#src.onionrblocks.insert.timeinsert.time_insert">time_insert</a></code></li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

View file

@ -0,0 +1,473 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.onionrblacklist API documentation</title>
<meta name="description" content="Onionr - Private P2P Communication …" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.onionrblacklist</code></h1>
</header>
<section id="section-intro">
<p>Onionr - Private P2P Communication.</p>
<p>Handle maintenance of a blacklist database, for blocks and peers</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;Onionr - Private P2P Communication.
Handle maintenance of a blacklist database, for blocks and peers
&#34;&#34;&#34;
import sqlite3
import os
from onionrplugins.onionrevents import event
import onionrcrypto
from onionrutils import epoch, bytesconverter
from coredb import dbfiles
&#34;&#34;&#34;
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 3 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, see &lt;https://www.gnu.org/licenses/&gt;.
&#34;&#34;&#34;
class OnionrBlackList:
def __init__(self):
self.blacklistDB = dbfiles.blacklist_db
if not os.path.exists(dbfiles.blacklist_db):
self.generateDB()
return
def inBlacklist(self, data):
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
retData = False
if not hashed.isalnum():
raise Exception(&#34;Hashed data is not alpha numeric&#34;)
if len(hashed) &gt; 64:
raise Exception(&#34;Hashed data is too large&#34;)
for i in self._dbExecute(&#34;SELECT * FROM blacklist WHERE hash = ?&#34;, (hashed,)):
retData = True # this only executes if an entry is present by that hash
break
return retData
def _dbExecute(self, toExec, params = ()):
conn = sqlite3.connect(self.blacklistDB)
c = conn.cursor()
retData = c.execute(toExec, params)
conn.commit()
return retData
def deleteBeforeDate(self, date):
# TODO, delete blacklist entries before date
return
def deleteExpired(self, dataType=0):
&#34;&#34;&#34;Delete expired entries&#34;&#34;&#34;
deleteList = []
curTime = epoch.get_epoch()
try:
int(dataType)
except AttributeError:
raise TypeError(&#34;dataType must be int&#34;)
for i in self._dbExecute(&#39;SELECT * FROM blacklist WHERE dataType = ?&#39;, (dataType,)):
if i[1] == dataType:
if (curTime - i[2]) &gt;= i[3]:
deleteList.append(i[0])
for thing in deleteList:
self._dbExecute(&#34;DELETE FROM blacklist WHERE hash = ?&#34;, (thing,))
def generateDB(self):
return
def clearDB(self):
self._dbExecute(&#34;&#34;&#34;DELETE FROM blacklist;&#34;&#34;&#34;)
def getList(self):
data = self._dbExecute(&#39;SELECT * FROM blacklist&#39;)
myList = []
for i in data:
myList.append(i[0])
return myList
def addToDB(self, data, dataType=0, expire=0):
&#34;&#34;&#34;Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses
0=block
1=peer
2=pubkey
&#34;&#34;&#34;
# we hash the data so we can remove data entirely from our node&#39;s disk
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
event(&#39;blacklist_add&#39;, data={&#39;data&#39;: data, &#39;hash&#39;: hashed})
if len(hashed) &gt; 64:
raise Exception(&#34;Hashed data is too large&#34;)
if not hashed.isalnum():
raise Exception(&#34;Hashed data is not alpha numeric&#34;)
try:
int(dataType)
except ValueError:
raise Exception(&#34;dataType is not int&#34;)
try:
int(expire)
except ValueError:
raise Exception(&#34;expire is not int&#34;)
if self.inBlacklist(hashed):
return
insert = (hashed,)
blacklistDate = epoch.get_epoch()
try:
self._dbExecute(&#34;INSERT INTO blacklist (hash, dataType, blacklistDate, expire) VALUES(?, ?, ?, ?);&#34;, (str(hashed), dataType, blacklistDate, expire))
except sqlite3.IntegrityError:
pass</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList"><code class="flex name class">
<span>class <span class="ident">OnionrBlackList</span></span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class OnionrBlackList:
def __init__(self):
self.blacklistDB = dbfiles.blacklist_db
if not os.path.exists(dbfiles.blacklist_db):
self.generateDB()
return
def inBlacklist(self, data):
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
retData = False
if not hashed.isalnum():
raise Exception(&#34;Hashed data is not alpha numeric&#34;)
if len(hashed) &gt; 64:
raise Exception(&#34;Hashed data is too large&#34;)
for i in self._dbExecute(&#34;SELECT * FROM blacklist WHERE hash = ?&#34;, (hashed,)):
retData = True # this only executes if an entry is present by that hash
break
return retData
def _dbExecute(self, toExec, params = ()):
conn = sqlite3.connect(self.blacklistDB)
c = conn.cursor()
retData = c.execute(toExec, params)
conn.commit()
return retData
def deleteBeforeDate(self, date):
# TODO, delete blacklist entries before date
return
def deleteExpired(self, dataType=0):
&#34;&#34;&#34;Delete expired entries&#34;&#34;&#34;
deleteList = []
curTime = epoch.get_epoch()
try:
int(dataType)
except AttributeError:
raise TypeError(&#34;dataType must be int&#34;)
for i in self._dbExecute(&#39;SELECT * FROM blacklist WHERE dataType = ?&#39;, (dataType,)):
if i[1] == dataType:
if (curTime - i[2]) &gt;= i[3]:
deleteList.append(i[0])
for thing in deleteList:
self._dbExecute(&#34;DELETE FROM blacklist WHERE hash = ?&#34;, (thing,))
def generateDB(self):
return
def clearDB(self):
self._dbExecute(&#34;&#34;&#34;DELETE FROM blacklist;&#34;&#34;&#34;)
def getList(self):
data = self._dbExecute(&#39;SELECT * FROM blacklist&#39;)
myList = []
for i in data:
myList.append(i[0])
return myList
def addToDB(self, data, dataType=0, expire=0):
&#34;&#34;&#34;Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses
0=block
1=peer
2=pubkey
&#34;&#34;&#34;
# we hash the data so we can remove data entirely from our node&#39;s disk
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
event(&#39;blacklist_add&#39;, data={&#39;data&#39;: data, &#39;hash&#39;: hashed})
if len(hashed) &gt; 64:
raise Exception(&#34;Hashed data is too large&#34;)
if not hashed.isalnum():
raise Exception(&#34;Hashed data is not alpha numeric&#34;)
try:
int(dataType)
except ValueError:
raise Exception(&#34;dataType is not int&#34;)
try:
int(expire)
except ValueError:
raise Exception(&#34;expire is not int&#34;)
if self.inBlacklist(hashed):
return
insert = (hashed,)
blacklistDate = epoch.get_epoch()
try:
self._dbExecute(&#34;INSERT INTO blacklist (hash, dataType, blacklistDate, expire) VALUES(?, ?, ?, ?);&#34;, (str(hashed), dataType, blacklistDate, expire))
except sqlite3.IntegrityError:
pass</code></pre>
</details>
<h3>Methods</h3>
<dl>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.addToDB"><code class="name flex">
<span>def <span class="ident">addToDB</span></span>(<span>self, data, dataType=0, expire=0)</span>
</code></dt>
<dd>
<section class="desc"><p>Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses
0=block
1=peer
2=pubkey</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def addToDB(self, data, dataType=0, expire=0):
&#34;&#34;&#34;Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses
0=block
1=peer
2=pubkey
&#34;&#34;&#34;
# we hash the data so we can remove data entirely from our node&#39;s disk
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
event(&#39;blacklist_add&#39;, data={&#39;data&#39;: data, &#39;hash&#39;: hashed})
if len(hashed) &gt; 64:
raise Exception(&#34;Hashed data is too large&#34;)
if not hashed.isalnum():
raise Exception(&#34;Hashed data is not alpha numeric&#34;)
try:
int(dataType)
except ValueError:
raise Exception(&#34;dataType is not int&#34;)
try:
int(expire)
except ValueError:
raise Exception(&#34;expire is not int&#34;)
if self.inBlacklist(hashed):
return
insert = (hashed,)
blacklistDate = epoch.get_epoch()
try:
self._dbExecute(&#34;INSERT INTO blacklist (hash, dataType, blacklistDate, expire) VALUES(?, ?, ?, ?);&#34;, (str(hashed), dataType, blacklistDate, expire))
except sqlite3.IntegrityError:
pass</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.clearDB"><code class="name flex">
<span>def <span class="ident">clearDB</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def clearDB(self):
self._dbExecute(&#34;&#34;&#34;DELETE FROM blacklist;&#34;&#34;&#34;)</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.deleteBeforeDate"><code class="name flex">
<span>def <span class="ident">deleteBeforeDate</span></span>(<span>self, date)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def deleteBeforeDate(self, date):
# TODO, delete blacklist entries before date
return</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.deleteExpired"><code class="name flex">
<span>def <span class="ident">deleteExpired</span></span>(<span>self, dataType=0)</span>
</code></dt>
<dd>
<section class="desc"><p>Delete expired entries</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def deleteExpired(self, dataType=0):
&#34;&#34;&#34;Delete expired entries&#34;&#34;&#34;
deleteList = []
curTime = epoch.get_epoch()
try:
int(dataType)
except AttributeError:
raise TypeError(&#34;dataType must be int&#34;)
for i in self._dbExecute(&#39;SELECT * FROM blacklist WHERE dataType = ?&#39;, (dataType,)):
if i[1] == dataType:
if (curTime - i[2]) &gt;= i[3]:
deleteList.append(i[0])
for thing in deleteList:
self._dbExecute(&#34;DELETE FROM blacklist WHERE hash = ?&#34;, (thing,))</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.generateDB"><code class="name flex">
<span>def <span class="ident">generateDB</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def generateDB(self):
return</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.getList"><code class="name flex">
<span>def <span class="ident">getList</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def getList(self):
data = self._dbExecute(&#39;SELECT * FROM blacklist&#39;)
myList = []
for i in data:
myList.append(i[0])
return myList</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.onionrblacklist.OnionrBlackList.inBlacklist"><code class="name flex">
<span>def <span class="ident">inBlacklist</span></span>(<span>self, data)</span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def inBlacklist(self, data):
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
retData = False
if not hashed.isalnum():
raise Exception(&#34;Hashed data is not alpha numeric&#34;)
if len(hashed) &gt; 64:
raise Exception(&#34;Hashed data is too large&#34;)
for i in self._dbExecute(&#34;SELECT * FROM blacklist WHERE hash = ?&#34;, (hashed,)):
retData = True # this only executes if an entry is present by that hash
break
return retData</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks" href="index.html">src.onionrblocks</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList" href="#src.onionrblocks.onionrblacklist.OnionrBlackList">OnionrBlackList</a></code></h4>
<ul class="two-column">
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.addToDB" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.addToDB">addToDB</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.clearDB" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.clearDB">clearDB</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.deleteBeforeDate" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.deleteBeforeDate">deleteBeforeDate</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.deleteExpired" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.deleteExpired">deleteExpired</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.generateDB" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.generateDB">generateDB</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.getList" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.getList">getList</a></code></li>
<li><code><a title="src.onionrblocks.onionrblacklist.OnionrBlackList.inBlacklist" href="#src.onionrblocks.onionrblacklist.OnionrBlackList.inBlacklist">inBlacklist</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,298 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.7.4" />
<title>src.onionrblocks.storagecounter API documentation</title>
<meta name="description" content="Onionr - Private P2P Communication …" />
<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>src.onionrblocks.storagecounter</code></h1>
</header>
<section id="section-intro">
<p>Onionr - Private P2P Communication</p>
<p>Keeps track of how much disk space we're using</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;
Onionr - Private P2P Communication
Keeps track of how much disk space we&#39;re using
&#34;&#34;&#34;
&#34;&#34;&#34;
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 3 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, see &lt;https://www.gnu.org/licenses/&gt;.
&#34;&#34;&#34;
import config, filepaths
config.reload()
class StorageCounter:
def __init__(self):
self.data_file = filepaths.usage_file
return
def is_full(self)-&gt;bool:
&#34;&#34;&#34;Returns if the allocated disk space is full (this is Onionr config, not true FS capacity)&#34;&#34;&#34;
ret_data = False
if config.get(&#39;allocations.disk&#39;, 2000000000) &lt;= (self.get_amount() + 1000):
ret_data = True
return ret_data
def _update(self, data):
with open(self.data_file, &#39;w&#39;) as data_file:
data_file.write(str(data))
def get_amount(self)-&gt;int:
&#34;&#34;&#34;Return how much disk space we&#39;re using (according to record)&#34;&#34;&#34;
ret_data = 0
try:
with open(self.data_file, &#39;r&#39;) as data_file:
ret_data = int(data_file.read())
except FileNotFoundError:
pass
except ValueError:
pass # Possibly happens when the file is empty
return ret_data
def get_percent(self)-&gt;int:
&#34;&#34;&#34;Return percent (decimal/float) of disk space we&#39;re using&#34;&#34;&#34;
amount = self.get_amount()
return round(amount / config.get(&#39;allocations.disk&#39;, 2000000000), 2)
def add_bytes(self, amount)-&gt;int:
&#34;&#34;&#34;Record that we are now using more disk space, unless doing so would exceed configured max&#34;&#34;&#34;
new_amount = amount + self.get_amount()
ret_data = new_amount
if new_amount &gt; config.get(&#39;allocations.disk&#39;, 2000000000):
ret_data = False
else:
self._update(new_amount)
return ret_data
def remove_bytes(self, amount)-&gt;int:
&#34;&#34;&#34;Record that we are now using less disk space&#34;&#34;&#34;
new_amount = self.get_amount() - amount
self._update(new_amount)
return new_amount</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="src.onionrblocks.storagecounter.StorageCounter"><code class="flex name class">
<span>class <span class="ident">StorageCounter</span></span>
</code></dt>
<dd>
<section class="desc"></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class StorageCounter:
def __init__(self):
self.data_file = filepaths.usage_file
return
def is_full(self)-&gt;bool:
&#34;&#34;&#34;Returns if the allocated disk space is full (this is Onionr config, not true FS capacity)&#34;&#34;&#34;
ret_data = False
if config.get(&#39;allocations.disk&#39;, 2000000000) &lt;= (self.get_amount() + 1000):
ret_data = True
return ret_data
def _update(self, data):
with open(self.data_file, &#39;w&#39;) as data_file:
data_file.write(str(data))
def get_amount(self)-&gt;int:
&#34;&#34;&#34;Return how much disk space we&#39;re using (according to record)&#34;&#34;&#34;
ret_data = 0
try:
with open(self.data_file, &#39;r&#39;) as data_file:
ret_data = int(data_file.read())
except FileNotFoundError:
pass
except ValueError:
pass # Possibly happens when the file is empty
return ret_data
def get_percent(self)-&gt;int:
&#34;&#34;&#34;Return percent (decimal/float) of disk space we&#39;re using&#34;&#34;&#34;
amount = self.get_amount()
return round(amount / config.get(&#39;allocations.disk&#39;, 2000000000), 2)
def add_bytes(self, amount)-&gt;int:
&#34;&#34;&#34;Record that we are now using more disk space, unless doing so would exceed configured max&#34;&#34;&#34;
new_amount = amount + self.get_amount()
ret_data = new_amount
if new_amount &gt; config.get(&#39;allocations.disk&#39;, 2000000000):
ret_data = False
else:
self._update(new_amount)
return ret_data
def remove_bytes(self, amount)-&gt;int:
&#34;&#34;&#34;Record that we are now using less disk space&#34;&#34;&#34;
new_amount = self.get_amount() - amount
self._update(new_amount)
return new_amount</code></pre>
</details>
<h3>Methods</h3>
<dl>
<dt id="src.onionrblocks.storagecounter.StorageCounter.add_bytes"><code class="name flex">
<span>def <span class="ident">add_bytes</span></span>(<span>self, amount)</span>
</code></dt>
<dd>
<section class="desc"><p>Record that we are now using more disk space, unless doing so would exceed configured max</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def add_bytes(self, amount)-&gt;int:
&#34;&#34;&#34;Record that we are now using more disk space, unless doing so would exceed configured max&#34;&#34;&#34;
new_amount = amount + self.get_amount()
ret_data = new_amount
if new_amount &gt; config.get(&#39;allocations.disk&#39;, 2000000000):
ret_data = False
else:
self._update(new_amount)
return ret_data</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.storagecounter.StorageCounter.get_amount"><code class="name flex">
<span>def <span class="ident">get_amount</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"><p>Return how much disk space we're using (according to record)</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_amount(self)-&gt;int:
&#34;&#34;&#34;Return how much disk space we&#39;re using (according to record)&#34;&#34;&#34;
ret_data = 0
try:
with open(self.data_file, &#39;r&#39;) as data_file:
ret_data = int(data_file.read())
except FileNotFoundError:
pass
except ValueError:
pass # Possibly happens when the file is empty
return ret_data</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.storagecounter.StorageCounter.get_percent"><code class="name flex">
<span>def <span class="ident">get_percent</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"><p>Return percent (decimal/float) of disk space we're using</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get_percent(self)-&gt;int:
&#34;&#34;&#34;Return percent (decimal/float) of disk space we&#39;re using&#34;&#34;&#34;
amount = self.get_amount()
return round(amount / config.get(&#39;allocations.disk&#39;, 2000000000), 2)</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.storagecounter.StorageCounter.is_full"><code class="name flex">
<span>def <span class="ident">is_full</span></span>(<span>self)</span>
</code></dt>
<dd>
<section class="desc"><p>Returns if the allocated disk space is full (this is Onionr config, not true FS capacity)</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def is_full(self)-&gt;bool:
&#34;&#34;&#34;Returns if the allocated disk space is full (this is Onionr config, not true FS capacity)&#34;&#34;&#34;
ret_data = False
if config.get(&#39;allocations.disk&#39;, 2000000000) &lt;= (self.get_amount() + 1000):
ret_data = True
return ret_data</code></pre>
</details>
</dd>
<dt id="src.onionrblocks.storagecounter.StorageCounter.remove_bytes"><code class="name flex">
<span>def <span class="ident">remove_bytes</span></span>(<span>self, amount)</span>
</code></dt>
<dd>
<section class="desc"><p>Record that we are now using less disk space</p></section>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def remove_bytes(self, amount)-&gt;int:
&#34;&#34;&#34;Record that we are now using less disk space&#34;&#34;&#34;
new_amount = self.get_amount() - amount
self._update(new_amount)
return new_amount</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="src.onionrblocks" href="index.html">src.onionrblocks</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="src.onionrblocks.storagecounter.StorageCounter" href="#src.onionrblocks.storagecounter.StorageCounter">StorageCounter</a></code></h4>
<ul class="">
<li><code><a title="src.onionrblocks.storagecounter.StorageCounter.add_bytes" href="#src.onionrblocks.storagecounter.StorageCounter.add_bytes">add_bytes</a></code></li>
<li><code><a title="src.onionrblocks.storagecounter.StorageCounter.get_amount" href="#src.onionrblocks.storagecounter.StorageCounter.get_amount">get_amount</a></code></li>
<li><code><a title="src.onionrblocks.storagecounter.StorageCounter.get_percent" href="#src.onionrblocks.storagecounter.StorageCounter.get_percent">get_percent</a></code></li>
<li><code><a title="src.onionrblocks.storagecounter.StorageCounter.is_full" href="#src.onionrblocks.storagecounter.StorageCounter.is_full">is_full</a></code></li>
<li><code><a title="src.onionrblocks.storagecounter.StorageCounter.remove_bytes" href="#src.onionrblocks.storagecounter.StorageCounter.remove_bytes">remove_bytes</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad()</script>
</body>
</html>