Changes based on style and lint checks. Some empty docstrings remain … #1368
|
@ -1,84 +0,0 @@
|
|||
|
||||
#!/usr/bin/env python2.7
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
from PyQt4 import QtCore, QtGui
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
class MigrationWizardIntroPage(QtGui.QWizardPage):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def __init__(self):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
super(QtGui.QWizardPage, self).__init__()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setTitle("Migrating configuration")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label = QtGui.QLabel("This wizard will help you to migrate your configuration. "
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
"You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label.setWordWrap(True)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout = QtGui.QVBoxLayout()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout.addWidget(label)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setLayout(layout)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def nextId(self):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
return 1
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
class MigrationWizardAddressesPage(QtGui.QWizardPage):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def __init__(self, addresses):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
super(QtGui.QWizardPage, self).__init__()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setTitle("Addresses")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label = QtGui.QLabel("Please select addresses that you are already using with mailchuck. ")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label.setWordWrap(True)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout = QtGui.QVBoxLayout()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout.addWidget(label)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setLayout(layout)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def nextId(self):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
return 10
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
class MigrationWizardGPUPage(QtGui.QWizardPage):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def __init__(self):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
super(QtGui.QWizardPage, self).__init__()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setTitle("GPU")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label = QtGui.QLabel("Are you using a GPU? ")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label.setWordWrap(True)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout = QtGui.QVBoxLayout()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout.addWidget(label)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setLayout(layout)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def nextId(self):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
return 10
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
class MigrationWizardConclusionPage(QtGui.QWizardPage):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def __init__(self):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
super(QtGui.QWizardPage, self).__init__()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setTitle("All done!")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label = QtGui.QLabel("You successfully migrated.")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
label.setWordWrap(True)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout = QtGui.QVBoxLayout()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
layout.addWidget(label)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setLayout(layout)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
class Ui_MigrationWizard(QtGui.QWizard):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
def __init__(self, addresses):
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
super(QtGui.QWizard, self).__init__()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.pages = {}
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
page = MigrationWizardIntroPage()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setPage(0, page)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setStartId(0)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
page = MigrationWizardAddressesPage(addresses)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setPage(1, page)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
page = MigrationWizardGPUPage()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setPage(2, page)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
page = MigrationWizardConclusionPage()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setPage(10, page)
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.setWindowTitle("Migration from PyBitMessage wizard")
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.adjustSize()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
||||
self.show()
|
||||
Unused, unfinished and obsolete. Remove whole file. Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :) +1 for ruthlessness :)
|
|
@ -1,10 +1,18 @@
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
from HTMLParser import HTMLParser
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
src/bitmessageqt/safehtmlparser.py
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
==================================
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
# pylint: disable=attribute-defined-outside-init
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
import inspect
|
||||
import re
|
||||
from urllib import quote, quote_plus
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
from HTMLParser import HTMLParser
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
from urllib import quote_plus
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
from urlparse import urlparse
|
||||
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
class SafeHTMLParser(HTMLParser):
|
||||
"""HTML parser with sanitisation"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
# from html5lib.sanitiser
|
||||
acceptable_elements = ['a', 'abbr', 'acronym', 'address', 'area',
|
||||
'article', 'aside', 'audio', 'b', 'big', 'blockquote', 'br', 'button',
|
||||
|
@ -20,21 +28,29 @@ class SafeHTMLParser(HTMLParser):
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
'sub', 'sup', 'table', 'tbody', 'td', 'textarea', 'time', 'tfoot',
|
||||
'th', 'thead', 'tr', 'tt', 'u', 'ul', 'var', 'video']
|
||||
replaces_pre = [["&", "&"], ["\"", """], ["<", "<"], [">", ">"]]
|
||||
replaces_post = [["\n", "<br/>"], ["\t", " "], [" ", " "], [" ", " "], ["<br/> ", "<br/> "]]
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
src_schemes = [ "data" ]
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
#uriregex1 = re.compile(r'(?i)\b((?:(https?|ftp|bitcoin):(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?]))')
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
uriregex1 = re.compile(r'((https?|ftp|bitcoin):(?:/{1,3}|[a-z0-9%])(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)')
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
replaces_post = [
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
["\n", "<br/>"],
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
["\t", " "],
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
[" ", " "],
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
[" ", " "],
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
["<br/> ", "<br/> "]]
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
src_schemes = ["data"]
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
uriregex1 = re.compile(
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
r'((https?|ftp|bitcoin):'
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
r'(?:/{1,3}|[a-z0-9%])(?:[a-zA-Z]|[0-9]|[$-_@.&+#]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)')
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
uriregex2 = re.compile(r'<a href="([^"]+)&')
|
||||
emailregex = re.compile(r'\b([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,})\b')
|
||||
|
||||
@staticmethod
|
||||
def replace_pre(text):
|
||||
"""Perform substring replacement before regex replacements"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
for a in SafeHTMLParser.replaces_pre:
|
||||
text = text.replace(a[0], a[1])
|
||||
return text
|
||||
|
||||
@staticmethod
|
||||
def replace_post(text):
|
||||
"""Perform substring replacement after regex replacements"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
for a in SafeHTMLParser.replaces_post:
|
||||
text = text.replace(a[0], a[1])
|
||||
if len(text) > 1 and text[0] == " ":
|
||||
|
@ -44,8 +60,9 @@ class SafeHTMLParser(HTMLParser):
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def __init__(self, *args, **kwargs):
|
||||
HTMLParser.__init__(self, *args, **kwargs)
|
||||
self.reset_safe()
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def reset_safe(self):
|
||||
"""Reset runtime variables specific to this class"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.elements = set()
|
||||
self.raw = u""
|
||||
self.sanitised = u""
|
||||
|
@ -53,7 +70,8 @@ class SafeHTMLParser(HTMLParser):
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.allow_picture = False
|
||||
self.allow_external_src = False
|
||||
|
||||
def add_if_acceptable(self, tag, attrs = None):
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def add_if_acceptable(self, tag, attrs=None):
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
"""Add tag if it passes sanitisation"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
if tag not in SafeHTMLParser.acceptable_elements:
|
||||
return
|
||||
self.sanitised += "<"
|
||||
|
@ -69,35 +87,42 @@ class SafeHTMLParser(HTMLParser):
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
if url.scheme not in SafeHTMLParser.src_schemes:
|
||||
val = ""
|
||||
self.sanitised += " " + quote_plus(attr)
|
||||
if not (val is None):
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
if val is not None:
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.sanitised += "=\"" + val + "\""
|
||||
if inspect.stack()[1][3] == "handle_startendtag":
|
||||
self.sanitised += "/"
|
||||
self.sanitised += ">"
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def handle_starttag(self, tag, attrs):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
if tag in SafeHTMLParser.acceptable_elements:
|
||||
self.has_html = True
|
||||
self.add_if_acceptable(tag, attrs)
|
||||
|
||||
def handle_endtag(self, tag):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.add_if_acceptable(tag)
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def handle_startendtag(self, tag, attrs):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
if tag in SafeHTMLParser.acceptable_elements:
|
||||
self.has_html = True
|
||||
self.add_if_acceptable(tag, attrs)
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def handle_data(self, data):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.sanitised += data
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def handle_charref(self, name):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.sanitised += "&#" + name + ";"
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def handle_entityref(self, name):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
self.sanitised += "&" + name + ";"
|
||||
|
||||
def feed(self, data):
|
||||
""""""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
try:
|
||||
data = unicode(data, 'utf-8')
|
||||
except UnicodeDecodeError:
|
||||
|
@ -112,7 +137,8 @@ class SafeHTMLParser(HTMLParser):
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
tmp = SafeHTMLParser.replace_post(tmp)
|
||||
self.raw += tmp
|
||||
|
||||
def is_html(self, text = None, allow_picture = False):
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
def is_html(self, text=None, allow_picture=False):
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
"""Detect if string contains HTML tags"""
|
||||
```suggestion
"""HTML parser with sanitisation"""
```
|
||||
if text:
|
||||
self.reset()
|
||||
self.reset_safe()
|
||||
|
|
|||
```suggestion
"""HTML parser with sanitisation"""
```
```suggestion
"""HTML parser with sanitisation"""
```
|
|
@ -1,24 +1,31 @@
|
|||
"""
|
||||
src/bitmessageqt/support.py
|
||||
===========================
|
||||
|
||||
"""
|
||||
|
||||
import ctypes
|
||||
from PyQt4 import QtCore, QtGui
|
||||
import ssl
|
||||
import sys
|
||||
import time
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from version import softwareVersion
|
||||
|
||||
import account
|
||||
from bmconfigparser import BMConfigParser
|
||||
from debug import logger
|
||||
import defaults
|
||||
from foldertree import AccountMixin
|
||||
from helper_sql import *
|
||||
from l10n import getTranslationLanguage
|
||||
from openclpow import openclAvailable, openclEnabled
|
||||
import network.stats
|
||||
import paths
|
||||
import proofofwork
|
||||
from pyelliptic.openssl import OpenSSL
|
||||
import queues
|
||||
import network.stats
|
||||
import state
|
||||
from version import softwareVersion
|
||||
from bmconfigparser import BMConfigParser
|
||||
from foldertree import AccountMixin
|
||||
from helper_sql import sqlExecute, sqlQuery
|
||||
from l10n import getTranslationLanguage
|
||||
from openclpow import openclEnabled
|
||||
from pyelliptic.openssl import OpenSSL
|
||||
|
||||
# this is BM support address going to Peter Surda
|
||||
OLD_SUPPORT_ADDRESS = 'BM-2cTkCtMYkrSPwFTpgcBrMrf5d8oZwvMZWK'
|
||||
|
@ -26,7 +33,10 @@ SUPPORT_ADDRESS = 'BM-2cUdgkDDAahwPAU6oD2A7DnjqZz3hgY832'
|
|||
SUPPORT_LABEL = 'PyBitmessage support'
|
||||
SUPPORT_MY_LABEL = 'My new address'
|
||||
SUPPORT_SUBJECT = 'Support request'
|
||||
SUPPORT_MESSAGE = '''You can use this message to send a report to one of the PyBitmessage core developers regarding PyBitmessage or the mailchuck.com email service. If you are using PyBitmessage involuntarily, for example because your computer was infected with ransomware, this is not an appropriate venue for resolving such issues.
|
||||
SUPPORT_MESSAGE = (
|
||||
'''You can use this message to send a report to one of the PyBitmessage core developers regarding PyBitmessage'''
|
||||
''' or the mailchuck.com email service. If you are using PyBitmessage involuntarily, for example because your'''
|
||||
''' computer was infected with ransomware, this is not an appropriate venue for resolving such issues.
|
||||
|
||||
Please describe what you are trying to do:
|
||||
|
||||
|
@ -51,39 +61,64 @@ Locale: {}
|
|||
SOCKS: {}
|
||||
UPnP: {}
|
||||
Connected hosts: {}
|
||||
'''
|
||||
''')
|
||||
|
||||
|
||||
def checkAddressBook(myapp):
|
||||
"""
|
||||
Check if the support bitmessage address is in addressbook, and add it if necessary. Also delete the old one which
|
||||
is considered compromised.
|
||||
"""
|
||||
sqlExecute('''DELETE from addressbook WHERE address=?''', OLD_SUPPORT_ADDRESS)
|
||||
queryreturn = sqlQuery('''SELECT * FROM addressbook WHERE address=?''', SUPPORT_ADDRESS)
|
||||
if queryreturn == []:
|
||||
sqlExecute('''INSERT INTO addressbook VALUES (?,?)''', str(QtGui.QApplication.translate("Support", SUPPORT_LABEL)), SUPPORT_ADDRESS)
|
||||
sqlExecute(
|
||||
'''INSERT INTO addressbook VALUES (?,?)''', str(
|
||||
QtGui.QApplication.translate(
|
||||
"Support", SUPPORT_LABEL)), SUPPORT_ADDRESS)
|
||||
myapp.rerenderAddressBook()
|
||||
|
||||
|
||||
def checkHasNormalAddress():
|
||||
"""Check if a normal (non-chan, non-subscription) address exists"""
|
||||
for address in account.getSortedAccounts():
|
||||
acct = account.accountClass(address)
|
||||
if acct.type == AccountMixin.NORMAL and BMConfigParser().safeGetBoolean(address, 'enabled'):
|
||||
return address
|
||||
return False
|
||||
|
||||
|
||||
def createAddressIfNeeded(myapp):
|
||||
"""Create a normal address (for sending the support request) in case it doesn't exist already"""
|
||||
if not checkHasNormalAddress():
|
||||
queues.addressGeneratorQueue.put(('createRandomAddress', 4, 1, str(QtGui.QApplication.translate("Support", SUPPORT_MY_LABEL)), 1, "", False, defaults.networkDefaultProofOfWorkNonceTrialsPerByte, defaults.networkDefaultPayloadLengthExtraBytes))
|
||||
queues.addressGeneratorQueue.put(('createRandomAddress',
|
||||
4,
|
||||
1,
|
||||
str(QtGui.QApplication.translate("Support",
|
||||
SUPPORT_MY_LABEL)),
|
||||
1,
|
||||
"",
|
||||
False,
|
||||
defaults.networkDefaultProofOfWorkNonceTrialsPerByte,
|
||||
defaults.networkDefaultPayloadLengthExtraBytes))
|
||||
while state.shutdown == 0 and not checkHasNormalAddress():
|
||||
time.sleep(.2)
|
||||
myapp.rerenderComboBoxSendFrom()
|
||||
return checkHasNormalAddress()
|
||||
|
||||
|
||||
def createSupportMessage(myapp):
|
||||
"""Create a support message (pre-fill from system info)"""
|
||||
# pylint: disable=too-many-locals
|
||||
checkAddressBook(myapp)
|
||||
address = createAddressIfNeeded(myapp)
|
||||
if state.shutdown:
|
||||
return
|
||||
|
||||
myapp.ui.lineEditSubject.setText(str(QtGui.QApplication.translate("Support", SUPPORT_SUBJECT)))
|
||||
addrIndex = myapp.ui.comboBoxSendFrom.findData(address, QtCore.Qt.UserRole, QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive)
|
||||
if addrIndex == -1: # something is very wrong
|
||||
addrIndex = myapp.ui.comboBoxSendFrom.findData(
|
||||
address, QtCore.Qt.UserRole, QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive)
|
||||
if addrIndex == -1: # something is very wrong
|
||||
return
|
||||
myapp.ui.comboBoxSendFrom.setCurrentIndex(addrIndex)
|
||||
myapp.ui.lineEditTo.setText(SUPPORT_ADDRESS)
|
||||
|
@ -95,7 +130,7 @@ def createSupportMessage(myapp):
|
|||
|
||||
os = sys.platform
|
||||
if os == "win32":
|
||||
windowsversion = sys.getwindowsversion()
|
||||
windowsversion = sys.getwindowsversion() # pylint: disable=no-member
|
||||
os = "Windows " + str(windowsversion[0]) + "." + str(windowsversion[1])
|
||||
else:
|
||||
try:
|
||||
|
@ -106,8 +141,9 @@ def createSupportMessage(myapp):
|
|||
pass
|
||||
architecture = "32" if ctypes.sizeof(ctypes.c_voidp) == 4 else "64"
|
||||
pythonversion = sys.version
|
||||
|
||||
opensslversion = "%s (Python internal), %s (external for PyElliptic)" % (ssl.OPENSSL_VERSION, OpenSSL._version)
|
||||
|
||||
opensslversion = "%s (Python internal), %s (external for PyElliptic)" % (
|
||||
ssl.OPENSSL_VERSION, OpenSSL._version) # pylint: disable=protected-access
|
||||
|
||||
frozen = "N/A"
|
||||
if paths.frozen:
|
||||
|
@ -123,7 +159,9 @@ def createSupportMessage(myapp):
|
|||
upnp = BMConfigParser().safeGet('bitmessagesettings', 'upnp', "N/A")
|
||||
connectedhosts = len(network.stats.connectedHostsList())
|
||||
|
||||
myapp.ui.textEditMessage.setText(str(QtGui.QApplication.translate("Support", SUPPORT_MESSAGE)).format(version, os, architecture, pythonversion, opensslversion, frozen, portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts))
|
||||
myapp.ui.textEditMessage.setText(str(QtGui.QApplication.translate("Support", SUPPORT_MESSAGE)).format(
|
||||
version, os, architecture, pythonversion, opensslversion, frozen,
|
||||
portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts))
|
||||
|
||||
# single msg tab
|
||||
myapp.ui.tabWidgetSend.setCurrentIndex(
|
||||
|
|
|
@ -1,44 +1,52 @@
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from ConfigParser import NoOptionError, NoSectionError
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
src/network/connectionpool.py
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
=============================
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import errno
|
||||
import re
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import socket
|
||||
import time
|
||||
import random
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import re
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from ConfigParser import NoOptionError, NoSectionError
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
|
||||
import helper_bootstrap
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import helper_random
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import knownnodes
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import protocol
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import state
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from bmconfigparser import BMConfigParser
|
||||
from debug import logger
|
||||
import helper_bootstrap
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import knownnodes
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.proxy import Proxy
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.tcp import TCPServer, Socks5BMConnection, Socks4aBMConnection, TCPConnection
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.udp import UDPSocket
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.connectionchooser import chooseConnection
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import network.asyncore_pollchoose as asyncore
|
||||
import protocol
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.connectionchooser import chooseConnection
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.proxy import Proxy
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.tcp import Socks4aBMConnection, Socks5BMConnection, TCPConnection, TCPServer
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from network.udp import UDPSocket
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
from singleton import Singleton
|
||||
import state
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
import helper_random
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
|
||||
|
||||
@Singleton
|
||||
class BMConnectionPool(object):
|
||||
"""Pool of all existing connections"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# pylint: disable=too-many-instance-attributes
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
def __init__(self):
|
||||
asyncore.set_rates(
|
||||
BMConfigParser().safeGetInt("bitmessagesettings", "maxdownloadrate"),
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
BMConfigParser().safeGetInt("bitmessagesettings", "maxuploadrate"))
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
BMConfigParser().safeGetInt("bitmessagesettings", "maxdownloadrate"),
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
BMConfigParser().safeGetInt("bitmessagesettings", "maxuploadrate"))
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.outboundConnections = {}
|
||||
self.inboundConnections = {}
|
||||
self.listeningSockets = {}
|
||||
self.udpSockets = {}
|
||||
self.streams = []
|
||||
self.lastSpawned = 0
|
||||
self.spawnWait = 2
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.spawnWait = 2
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.bootstrapped = False
|
||||
|
||||
def connectToStream(self, streamNumber):
|
||||
"""Connect to a bitmessage stream"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.streams.append(streamNumber)
|
||||
|
||||
def getConnectionByAddr(self, addr):
|
||||
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if addr in self.inboundConnections:
|
||||
return self.inboundConnections[addr]
|
||||
try:
|
||||
|
@ -56,6 +64,7 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
raise KeyError
|
||||
|
||||
def isAlreadyConnected(self, nodeid):
|
||||
"""Check if we're already connected to this peer"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
for i in self.inboundConnections.values() + self.outboundConnections.values():
|
||||
try:
|
||||
if nodeid == i.nodeid:
|
||||
|
@ -65,6 +74,7 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
return False
|
||||
|
||||
def addConnection(self, connection):
|
||||
"""Add a connection object to our internal dict"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if isinstance(connection, UDPSocket):
|
||||
return
|
||||
if connection.isOutbound:
|
||||
|
@ -76,6 +86,7 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.inboundConnections[connection.destination.host] = connection
|
||||
|
||||
def removeConnection(self, connection):
|
||||
"""Remove a connection from our internal dict"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if isinstance(connection, UDPSocket):
|
||||
del self.udpSockets[connection.listening.host]
|
||||
elif isinstance(connection, TCPServer):
|
||||
|
@ -96,18 +107,19 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
connection.close()
|
||||
|
||||
def getListeningIP(self):
|
||||
"""What IP are we supposed to be listening on?"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# pylint: disable=no-self-use
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if BMConfigParser().safeGet("bitmessagesettings", "onionhostname").endswith(".onion"):
|
||||
host = BMConfigParser().safeGet("bitmessagesettings", "onionbindip")
|
||||
else:
|
||||
host = '127.0.0.1'
|
||||
if BMConfigParser().safeGetBoolean("bitmessagesettings", "sockslisten") or \
|
||||
BMConfigParser().get("bitmessagesettings", "socksproxytype") == "none":
|
||||
# python doesn't like bind + INADDR_ANY?
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
#host = socket.INADDR_ANY
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
host = BMConfigParser().get("network", "bind")
|
||||
return host
|
||||
|
||||
def startListening(self, bind=None):
|
||||
"""Open a listening socket and start accepting connections on it"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if bind is None:
|
||||
bind = self.getListeningIP()
|
||||
port = BMConfigParser().safeGetInt("bitmessagesettings", "port")
|
||||
|
@ -116,6 +128,10 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.listeningSockets[ls.destination] = ls
|
||||
|
||||
def startUDPSocket(self, bind=None):
|
||||
"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
Open an UDP socket. Depending on settings, it can either only accept incoming UDP packets, or also be able to
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
send them.
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if bind is None:
|
||||
host = self.getListeningIP()
|
||||
udpSocket = UDPSocket(host=host, announcing=True)
|
||||
|
@ -127,7 +143,8 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.udpSockets[udpSocket.listening.host] = udpSocket
|
||||
|
||||
def loop(self):
|
||||
# defaults to empty loop if outbound connections are maxed
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
"""defaults to empty loop if outbound connections are maxed"""
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# pylint: disable=too-many-statements,too-many-branches,too-many-nested-blocks
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
spawnConnections = False
|
||||
acceptConnections = True
|
||||
if BMConfigParser().safeGetBoolean('bitmessagesettings', 'dontconnect'):
|
||||
|
@ -135,8 +152,8 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
elif BMConfigParser().safeGetBoolean('bitmessagesettings', 'sendoutgoingconnections'):
|
||||
spawnConnections = True
|
||||
if BMConfigParser().get('bitmessagesettings', 'socksproxytype')[0:5] == 'SOCKS' and \
|
||||
(not BMConfigParser().getboolean('bitmessagesettings', 'sockslisten') and \
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
".onion" not in BMConfigParser().get('bitmessagesettings', 'onionhostname')):
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
(not BMConfigParser().getboolean('bitmessagesettings', 'sockslisten') and
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
".onion" not in BMConfigParser().get('bitmessagesettings', 'onionhostname')):
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
acceptConnections = False
|
||||
|
||||
if spawnConnections:
|
||||
|
@ -145,14 +162,14 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if not self.bootstrapped:
|
||||
self.bootstrapped = True
|
||||
Proxy.proxy = (BMConfigParser().safeGet("bitmessagesettings", "sockshostname"),
|
||||
BMConfigParser().safeGetInt("bitmessagesettings", "socksport"))
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# TODO AUTH
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# TODO reset based on GUI settings changes
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
BMConfigParser().safeGetInt("bitmessagesettings", "socksport"))
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# .. todo:: AUTH
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# .. todo:: reset based on GUI settings changes
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
try:
|
||||
if not BMConfigParser().get("network", "onionsocksproxytype").startswith("SOCKS"):
|
||||
raise NoOptionError
|
||||
Proxy.onionproxy = (BMConfigParser().get("network", "onionsockshostname"),
|
||||
BMConfigParser().getint("network", "onionsocksport"))
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
BMConfigParser().getint("network", "onionsocksport"))
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
except (NoOptionError, NoSectionError):
|
||||
Proxy.onionproxy = None
|
||||
established = sum(1 for c in self.outboundConnections.values() if (c.connected and c.fullyEstablished))
|
||||
|
@ -170,13 +187,7 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# don't connect to self
|
||||
if chosen in state.ownAddresses:
|
||||
continue
|
||||
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
#for c in self.outboundConnections:
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# if chosen == c.destination:
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# continue
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
#for c in self.inboundConnections:
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# if chosen.host == c.destination.host:
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# continue
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
try:
|
||||
if chosen.host.endswith(".onion") and Proxy.onionproxy is not None:
|
||||
if BMConfigParser().get("network", "onionsocksproxytype") == "SOCKS5":
|
||||
|
@ -203,7 +214,7 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.outboundConnections.values()
|
||||
):
|
||||
i.set_state("close")
|
||||
# FIXME: rating will be increased after next connection
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
# .. todo:: FIXME: rating will be increased after next connection
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
i.handle_close()
|
||||
|
||||
if acceptConnections:
|
||||
|
@ -211,14 +222,14 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if BMConfigParser().safeGet("network", "bind") == '':
|
||||
self.startListening()
|
||||
else:
|
||||
for bind in re.sub("[^\w.]+", " ", BMConfigParser().safeGet("network", "bind")).split():
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
for bind in re.sub(r"[^\w.]+", " ", BMConfigParser().safeGet("network", "bind")).split():
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.startListening(bind)
|
||||
logger.info('Listening for incoming connections.')
|
||||
if not self.udpSockets:
|
||||
if BMConfigParser().safeGet("network", "bind") == '':
|
||||
self.startUDPSocket()
|
||||
else:
|
||||
for bind in re.sub("[^\w.]+", " ", BMConfigParser().safeGet("network", "bind")).split():
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
for bind in re.sub(r"[^\w.]+", " ", BMConfigParser().safeGet("network", "bind")).split():
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.startUDPSocket(bind)
|
||||
self.startUDPSocket(False)
|
||||
logger.info('Starting UDP socket(s).')
|
||||
|
@ -239,7 +250,6 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
loopTime = 2.0
|
||||
asyncore.loop(timeout=loopTime, count=1000)
|
||||
|
||||
reaper = []
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
for i in self.inboundConnections.values() + self.outboundConnections.values():
|
||||
minTx = time.time() - 20
|
||||
if i.fullyEstablished:
|
||||
|
@ -248,16 +258,20 @@ class BMConnectionPool(object):
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if i.fullyEstablished:
|
||||
i.append_write_buf(protocol.CreatePacket('ping'))
|
||||
else:
|
||||
i.close_reason = "Timeout (%is)" % (time.time() - i.lastTx)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
i.close_reason = "Timeout (%is)" % (time.time() - i.lastTx)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
i.set_state("close")
|
||||
for i in self.inboundConnections.values() + self.outboundConnections.values() + self.listeningSockets.values() + self.udpSockets.values():
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
all_connections = list()
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
all_connections.extend(self.inboundConnections.values())
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
all_connections.extend(self.outboundConnections.values())
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
all_connections.extend(self.listeningSockets.values())
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
all_connections.extend(self.udpSockets.values())
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
for i in all_connections:
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
if not (i.accepting or i.connecting or i.connected):
|
||||
reaper.append(i)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.removeConnection(i)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
else:
|
||||
try:
|
||||
if i.state == "close":
|
||||
reaper.append(i)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.removeConnection(i)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
except AttributeError:
|
||||
pass
|
||||
for i in reaper:
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
self.removeConnection(i)
|
||||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
||||
|
|
|||
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Pool of all existing connections"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Connect to a bitmessage stream"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
```suggestion
"""Return an (existing) connection object based on a `Peer` object (IP and port)"""
```
|
|
@ -1,14 +1,22 @@
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
src/network/proxy.py
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
====================
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
# pylint: disable=protected-access
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
import socket
|
||||
import time
|
||||
|
||||
from advanceddispatcher import AdvancedDispatcher
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
import asyncore_pollchoose as asyncore
|
||||
import state
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
from advanceddispatcher import AdvancedDispatcher
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
from bmconfigparser import BMConfigParser
|
||||
from debug import logger
|
||||
import network.connectionpool
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
import state
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
class ProxyError(Exception):
|
||||
"""Base proxy exception class"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
errorCodes = ("UnknownError")
|
||||
|
||||
def __init__(self, code=-1):
|
||||
|
@ -21,19 +29,21 @@ class ProxyError(Exception):
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
|
||||
class GeneralProxyError(ProxyError):
|
||||
"""General proxy error class (not specfic to an implementation)"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
errorCodes = ("Success",
|
||||
"Invalid data",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Not connected",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Not available",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Bad proxy type",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Bad input",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Timed out",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Network unreachable",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Connection refused",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Host unreachable")
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Invalid data",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Not connected",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Not available",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Bad proxy type",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Bad input",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Timed out",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Network unreachable",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Connection refused",
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"Host unreachable")
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
|
||||
class Proxy(AdvancedDispatcher):
|
||||
"""Base proxy class for AdvancedDispatcher"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
# these are global, and if you change config during runtime, all active/new
|
||||
# instances should change too
|
||||
_proxy = ("127.0.0.1", 9050)
|
||||
|
@ -44,10 +54,12 @@ class Proxy(AdvancedDispatcher):
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
@property
|
||||
def proxy(self):
|
||||
"""Return proxy IP and port"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
return self.__class__._proxy
|
||||
|
||||
@proxy.setter
|
||||
def proxy(self, address):
|
||||
"""Set proxy IP and port"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
if not isinstance(address, tuple) or (len(address) < 2) or \
|
||||
(not isinstance(address[0], str) or not isinstance(address[1], int)):
|
||||
raise ValueError
|
||||
|
@ -55,29 +67,35 @@ class Proxy(AdvancedDispatcher):
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
|
||||
@property
|
||||
def auth(self):
|
||||
"""Return proxy authentication settings"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
return self.__class__._auth
|
||||
|
||||
@auth.setter
|
||||
def auth(self, authTuple):
|
||||
"""Set proxy authentication (username and password)"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
self.__class__._auth = authTuple
|
||||
|
||||
@property
|
||||
def onion_proxy(self):
|
||||
"""Return separate proxy IP and port for use only with onion addresses. Untested."""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
return self.__class__._onion_proxy
|
||||
|
||||
@onion_proxy.setter
|
||||
def onion_proxy(self, address):
|
||||
if address is not None and (not isinstance(address, tuple) or (len(address) < 2) or \
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
(not isinstance(address[0], str) or not isinstance(address[1], int))):
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
"""Set onion proxy address"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
if address is not None and (not isinstance(address, tuple) or (len(address) < 2) or
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
(not isinstance(address[0], str) or not isinstance(address[1], int))):
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
raise ValueError
|
||||
self.__class__._onion_proxy = address
|
||||
|
||||
@property
|
||||
def onion_auth(self):
|
||||
"""Set proxy authentication for onion hosts only. Untested"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
return self.__class__._onion_auth
|
||||
|
||||
@onion_auth.setter
|
||||
def onion_auth(self, authTuple):
|
||||
"""Set proxy authentication for onion hosts only. Untested"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
self.__class__._onion_auth = authTuple
|
||||
|
||||
def __init__(self, address):
|
||||
|
@ -90,7 +108,7 @@ class Proxy(AdvancedDispatcher):
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
if BMConfigParser().safeGetBoolean("bitmessagesettings", "socksauthentication"):
|
||||
self.auth = (BMConfigParser().safeGet("bitmessagesettings", "socksusername"),
|
||||
BMConfigParser().safeGet("bitmessagesettings", "sockspassword"))
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
BMConfigParser().safeGet("bitmessagesettings", "sockspassword"))
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
else:
|
||||
self.auth = None
|
||||
if address.host.endswith(".onion") and self.onion_proxy is not None:
|
||||
|
@ -99,6 +117,7 @@ class Proxy(AdvancedDispatcher):
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
self.connect(self.proxy)
|
||||
|
||||
def handle_connect(self):
|
||||
"""Handle connection event (to the proxy)"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
self.set_state("init")
|
||||
try:
|
||||
AdvancedDispatcher.handle_connect(self)
|
||||
|
@ -109,5 +128,7 @@ class Proxy(AdvancedDispatcher):
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
||||
self.state_init()
|
||||
|
||||
def state_proxy_handshake_done(self):
|
||||
"""Handshake is complete at this point"""
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
# pylint: disable=attribute-defined-outside-init
|
||||
```suggestion
""Base proxy exception class"""
```
|
||||
self.connectedAt = time.time()
|
||||
return False
|
||||
|
|
|||
```suggestion
""Base proxy exception class"""
```
```suggestion
""Base proxy exception class"""
```
|
|
@ -1,21 +1,29 @@
|
|||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
src/storage/filesystem.py
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
=========================
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
import string
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
import time
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
from binascii import hexlify, unhexlify
|
||||
from os import listdir, makedirs, path, remove, rmdir
|
||||
import string
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
from threading import RLock
|
||||
import time
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
import traceback
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
from paths import lookupAppdataFolder
|
||||
from storage import InventoryStorage, InventoryItem
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
from storage import InventoryItem, InventoryStorage
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
class FilesystemInventory(InventoryStorage):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
class FilesystemInventory(InventoryStorage): # pylint: disable=too-many-ancestors
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
"""Module for using filesystem (directory with files) for inventory storage"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
# pylint: disable=abstract-method
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
topDir = "inventory"
|
||||
objectDir = "objects"
|
||||
metadataFilename = "metadata"
|
||||
dataFilename = "data"
|
||||
|
||||
def __init__(self):
|
||||
super(self.__class__, self).__init__()
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
super(FilesystemInventory, self).__init__()
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self.baseDir = path.join(lookupAppdataFolder(), FilesystemInventory.topDir)
|
||||
for createDir in [self.baseDir, path.join(self.baseDir, "objects")]:
|
||||
if path.exists(createDir):
|
||||
|
@ -23,72 +31,85 @@ class FilesystemInventory(InventoryStorage):
|
|||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
raise IOError("%s exists but it's not a directory" % (createDir))
|
||||
else:
|
||||
makedirs(createDir)
|
||||
self.lock = RLock() # Guarantees that two receiveDataThreads don't receive and process the same message concurrently (probably sent by a malicious individual)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self.lock = RLock()
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
# Guarantees that two receiveDataThreads don't receive and process the
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
# same message concurrently (probably sent by a malicious individual)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self._inventory = {}
|
||||
self._load()
|
||||
|
||||
def __contains__(self, hash):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
retval = False
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
def __contains__(self, hash_):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
for streamDict in self._inventory.values():
|
||||
if hash in streamDict:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
if hash_ in streamDict:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return True
|
||||
return False
|
||||
|
||||
def __getitem__(self, hash):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
def __getitem__(self, hash_):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
for streamDict in self._inventory.values():
|
||||
try:
|
||||
retval = streamDict[hash]
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
retval = streamDict[hash_]
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except KeyError:
|
||||
continue
|
||||
if retval.payload is None:
|
||||
retval = InventoryItem(retval.type, retval.stream, self.getData(hash), retval.expires, retval.tag)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
retval = InventoryItem(retval.type, retval.stream, self.getData(hash_), retval.expires, retval.tag)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return retval
|
||||
raise KeyError(hash)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
raise KeyError(hash_)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
def __setitem__(self, hash, value):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
def __setitem__(self, hash_, value):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
with self.lock:
|
||||
value = InventoryItem(*value)
|
||||
try:
|
||||
makedirs(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash)))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
makedirs(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash_)))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except OSError:
|
||||
pass
|
||||
try:
|
||||
with open(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash), FilesystemInventory.metadataFilename), 'w') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
inv_path = path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash_))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
with open(path.join(inv_path, FilesystemInventory.metadataFilename), 'w') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
f.write("%s,%s,%s,%s," % (value.type, value.stream, value.expires, hexlify(value.tag)))
|
||||
with open(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash), FilesystemInventory.dataFilename), 'w') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
with open(path.join(inv_path, FilesystemInventory.dataFilename), 'w') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
f.write(value.payload)
|
||||
except IOError:
|
||||
raise KeyError
|
||||
try:
|
||||
self._inventory[value.stream][hash] = value
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self._inventory[value.stream][hash_] = value
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except KeyError:
|
||||
self._inventory[value.stream] = {}
|
||||
self._inventory[value.stream][hash] = value
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self._inventory[value.stream][hash_] = value
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
def delHashId(self, hash):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
for stream in self._inventory.keys():
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
def delHashId(self, hash_):
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
"""Remove object from inventory"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
for stream in self._inventory:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
try:
|
||||
del self._inventory[stream][hash]
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
del self._inventory[stream][hash_]
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except KeyError:
|
||||
pass
|
||||
with self.lock:
|
||||
try:
|
||||
remove(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash), FilesystemInventory.metadataFilename))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
remove(
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
path.join(
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self.baseDir,
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
FilesystemInventory.objectDir,
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
hexlify(hash_),
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
FilesystemInventory.metadataFilename))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except IOError:
|
||||
pass
|
||||
try:
|
||||
remove(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash), FilesystemInventory.dataFilename))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
remove(
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
path.join(
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self.baseDir,
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
FilesystemInventory.objectDir,
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
hexlify(hash_),
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
FilesystemInventory.dataFilename))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except IOError:
|
||||
pass
|
||||
try:
|
||||
rmdir(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash)))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
rmdir(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hash_)))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
def __iter__(self):
|
||||
elems = []
|
||||
for streamDict in self._inventory.values():
|
||||
elems.extend (streamDict.keys())
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
elems.extend(streamDict.keys())
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return elems.__iter__()
|
||||
|
||||
def __len__(self):
|
||||
|
@ -103,44 +124,52 @@ class FilesystemInventory(InventoryStorage):
|
|||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
try:
|
||||
objectType, streamNumber, expiresTime, tag = self.getMetadata(hashId)
|
||||
try:
|
||||
newInventory[streamNumber][hashId] = InventoryItem(objectType, streamNumber, None, expiresTime, tag)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
newInventory[streamNumber][hashId] = InventoryItem(
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
objectType, streamNumber, None, expiresTime, tag)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except KeyError:
|
||||
newInventory[streamNumber] = {}
|
||||
newInventory[streamNumber][hashId] = InventoryItem(objectType, streamNumber, None, expiresTime, tag)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
newInventory[streamNumber][hashId] = InventoryItem(
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
objectType, streamNumber, None, expiresTime, tag)
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
except KeyError:
|
||||
print "error loading %s" % (hexlify(hashId))
|
||||
pass
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self._inventory = newInventory
|
||||
# for i, v in self._inventory.items():
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
# print "loaded stream: %s, %i items" % (i, len(v))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
|
||||
def stream_list(self):
|
||||
"""Return list of streams"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return self._inventory.keys()
|
||||
|
||||
def object_list(self):
|
||||
"""Return inventory vectors (hashes) from a directory"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return [unhexlify(x) for x in listdir(path.join(self.baseDir, FilesystemInventory.objectDir))]
|
||||
|
||||
def getData(self, hashId):
|
||||
"""Get object data"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
try:
|
||||
with open(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hashId), FilesystemInventory.dataFilename), 'r') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
inv_path = path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hashId))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
with open(path.join(inv_path, FilesystemInventory.dataFilename), 'r') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return f.read()
|
||||
except IOError:
|
||||
raise AttributeError
|
||||
|
||||
def getMetadata(self, hashId):
|
||||
"""Get object metadata"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
# pylint: disable=unused-variable
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
try:
|
||||
with open(path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hashId), FilesystemInventory.metadataFilename), 'r') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
inv_path = path.join(self.baseDir, FilesystemInventory.objectDir, hexlify(hashId))
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
with open(path.join(inv_path, FilesystemInventory.metadataFilename), 'r') as f:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
objectType, streamNumber, expiresTime, tag, undef = string.split(f.read(), ",", 4)
|
||||
return [int(objectType), int(streamNumber), int(expiresTime), unhexlify(tag)]
|
||||
except IOError:
|
||||
raise KeyError
|
||||
|
||||
def by_type_and_tag(self, objectType, tag):
|
||||
"""Get object type and tag"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
# pylint: disable=unused-variable
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
retval = []
|
||||
for stream, streamDict in self._inventory:
|
||||
for hashId, item in streamDict:
|
||||
if item.type == objectType and item.tag == tag:
|
||||
try:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
try:
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
if item.payload is None:
|
||||
item.payload = self.getData(hashId)
|
||||
except IOError:
|
||||
|
@ -149,12 +178,14 @@ class FilesystemInventory(InventoryStorage):
|
|||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return retval
|
||||
|
||||
def hashes_by_stream(self, stream):
|
||||
"""Return inventory vectors (hashes) for a stream"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
try:
|
||||
return self._inventory[stream].keys()
|
||||
except KeyError:
|
||||
return []
|
||||
|
||||
def unexpired_hashes_by_stream(self, stream):
|
||||
"""Return unexpired hashes in the inventory for a particular stream"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
t = int(time.time())
|
||||
try:
|
||||
return [x for x, value in self._inventory[stream].items() if value.expires > t]
|
||||
|
@ -162,12 +193,14 @@ class FilesystemInventory(InventoryStorage):
|
|||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
return []
|
||||
You can do a You can do a `for _, streamDict` instead of `# pylint: disable=unused-variable`.
|
||||
|
||||
def flush(self):
|
||||
"""Flush the inventory and create a new, empty one"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
self._load()
|
||||
|
||||
def clean(self):
|
||||
"""Clean out old items from the inventory"""
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
minTime = int(time.time()) - (60 * 60 * 30)
|
||||
deletes = []
|
||||
for stream, streamDict in self._inventory.items():
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
for _, streamDict in self._inventory.items():
|
||||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
|
||||
for hashId, item in streamDict.items():
|
||||
if item.expires < minTime:
|
||||
deletes.append(hashId)
|
||||
|
|
|||
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Module for using filesystem (directory with files) for inventory storage"""
```
```suggestion
"""Remove object from inventory"""
```
```suggestion
"""Remove object from inventory"""
```
|
Unused, unfinished and obsolete. Remove whole file.
Unused, unfinished and obsolete. Remove whole file.
+1 for ruthlessness :)
+1 for ruthlessness :)