Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Philipp Hörist
omemo-new
Commits
8f85cb4d
Commit
8f85cb4d
authored
Nov 20, 2018
by
Philipp Hörist
Browse files
steap
parent
e230d059
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
.pylintrc
0 → 100644
View file @
8f85cb4d
[MASTER]
# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code
extension-pkg-whitelist=pycurl
# Add files or directories to the blacklist. They should be base names, not
# paths.
ignore=CVS
# Add files or directories matching the regex patterns to the blacklist. The
# regex matches against base names, not paths.
ignore-patterns=
# Python code to execute, usually for sys.path manipulation such as
# pygtk.require().
#init-hook=
# Use multiple processes to speed up Pylint.
jobs=2
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=
# Pickle collected data for later comparisons.
persistent=yes
# Specify a configuration file.
#rcfile=
# Allow loading of arbitrary C extensions. Extensions are imported into the
# active Python interpreter and may run arbitrary code.
unsafe-load-any-extension=no
[MESSAGES CONTROL]
# Only show warnings with the listed confidence levels. Leave empty to show
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
confidence=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once).You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
disable=C0111,C0301,R1710,R0912,R0914,R0915,W0511,W0231,W0233
# Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option
# multiple time (only on the command line, not in the configuration file where
# it should appear only once). See also the "--disable" option for examples.
enable=
[REPORTS]
# Python expression which should return a note less than 10 (10 is the highest
# note). You have access to the variables errors warning, statement which
# respectively contain the number of errors / warnings messages and the total
# number of statements analyzed. This is used by the global evaluation report
# (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details
#msg-template=
# Set the output format. Available formats are text, parseable, colorized, json
# and msvs (visual studio).You can also give a reporter class, eg
# mypackage.mymodule.MyReporterClass.
output-format=text
# Tells whether to display a full report or only the messages
reports=no
# Activate the evaluation score.
score=yes
[REFACTORING]
# Maximum number of nested blocks for function / method body
max-nested-blocks=5
[VARIABLES]
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=
# Tells whether unused global variables should be treated as a violation.
allow-global-unused-variables=yes
# List of strings which can identify a callback function by name. A callback
# name must start or end with one of those strings.
callbacks=cb_,_cb
# A regular expression matching the name of dummy variables (i.e. expectedly
# not used).
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy
# Argument names that match this expression will be ignored. Default to name
# with leading underscore
ignored-argument-names=(_.*|kwargs|args)
# Tells whether we should check for unused import in __init__ files.
init-import=no
# List of qualified module names which can have objects that can redefine
# builtins.
redefining-builtins-modules=six.moves,future.builtins
[TYPECHECK]
# List of decorators that produce context managers, such as
# contextlib.contextmanager. Add to this list to register other decorators that
# produce valid context managers.
contextmanager-decorators=contextlib.contextmanager
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=
# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members=yes
# List of class names for which member attributes should not be checked (useful
# for classes with dynamically set attributes). This supports the use of
# qualified names.
ignored-classes=optparse.Values,thread._local,_thread._local
# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules=
# Show a hint with possible names when a member name was not found. The aspect
# of finding the hint is based on edit distance.
missing-member-hint=yes
# The minimum edit distance a name should have in order to be considered a
# similar match for a missing member name.
missing-member-hint-distance=1
# The total number of similar names that should be taken in consideration when
# showing a hint for a missing member.
missing-member-max-choices=1
[SPELLING]
# Spelling dictionary name. Available dictionaries: none. To make it working
# install python-enchant package.
spelling-dict=
# List of comma separated words that should not be checked.
spelling-ignore-words=
# A path to a file that contains private dictionary; one word per line.
spelling-private-dict-file=
# Tells whether to store unknown words to indicated private dictionary in
# --spelling-private-dict-file option instead of raising a message.
spelling-store-unknown-words=no
[SIMILARITIES]
# Ignore comments when computing similarities.
ignore-comments=yes
# Ignore docstrings when computing similarities.
ignore-docstrings=yes
# Ignore imports when computing similarities.
ignore-imports=no
# Minimum lines number of a similarity.
min-similarity-lines=4
[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
notes=FIXME,XXX,TODO
[LOGGING]
# Logging modules to check that the string format arguments are in logging
# function parameter format
logging-modules=logging
[FORMAT]
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
expected-line-ending-format=
# Regexp for a line that is allowed to be longer than the limit.
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
# Number of spaces of indent required inside a hanging or continued line.
indent-after-paren=4
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string=' '
# Maximum number of characters on a single line.
max-line-length=100
# Maximum number of lines in a module
max-module-lines=1000
# List of optional constructs for which whitespace checking is disabled. `dict-
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
# `empty-line` allows space-only lines.
no-space-check=trailing-comma,dict-separator
# Allow the body of an if to be on the same line as the test if there is no
# else.
single-line-if-stmt=no
[BASIC]
# Naming hint for argument names
argument-name-hint=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$
# Regular expression matching correct argument names
argument-rgx=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$
# Naming hint for attribute names
attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct attribute names
attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata
# Naming hint for class attribute names
class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Naming hint for class names
class-name-hint=[A-Z_][a-zA-Z0-9]+$
# Regular expression matching correct class names
class-rgx=[A-Z_][a-zA-Z0-9]+$
# Naming hint for constant names
const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Regular expression matching correct constant names
const-rgx=
# Minimum line length for functions/classes that require docstrings, shorter
# ones are exempt.
docstring-min-length=-1
# Naming hint for function names
function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct function names
function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,iq
# Include a hint for the correct naming format with invalid-name
include-naming-hint=no
# Naming hint for inline iteration names
inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
# Regular expression matching correct inline iteration names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
# Naming hint for method names
method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct method names
method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Naming hint for module names
module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Regular expression matching correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Colon-delimited sets of names that determine each other's naming style when
# the name regexes allow several styles.
name-group=
# Regular expression which should only match function or class names that do
# not require a docstring.
no-docstring-rgx=^_
# List of decorators that produce properties, such as abc.abstractproperty. Add
# to this list to register other decorators that produce valid properties.
property-classes=abc.abstractproperty
# Naming hint for variable names
variable-name-hint=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$
# Regular expression matching correct variable names
variable-rgx=(([a-z][a-z0-9_]{1,30})|(_[a-z0-9_]*))$
[IMPORTS]
# Analyse import fallback blocks. This can be used to support both Python 2 and
# 3 compatible code, which means that the block might have code that exists
# only in one or another interpreter, leading to false positives when analysed.
analyse-fallback-blocks=no
# Deprecated modules which should not be used, separated by a comma
deprecated-modules=optparse,tkinter.tix
# Create a graph of external dependencies in the given file (report RP0402 must
# not be disabled)
ext-import-graph=
# Create a graph of every (i.e. internal and external) dependencies in the
# given file (report RP0402 must not be disabled)
import-graph=
# Create a graph of internal dependencies in the given file (report RP0402 must
# not be disabled)
int-import-graph=
# Force import order to recognize a module as part of the standard
# compatibility libraries.
known-standard-library=
# Force import order to recognize a module as part of a third party library.
known-third-party=enchant
[DESIGN]
# Maximum number of arguments for function / method
max-args=10
# Maximum number of attributes for a class (see R0902).
max-attributes=9999
# Maximum number of boolean expressions in a if statement
max-bool-expr=5
# Maximum number of branch for function / method body
max-branches=12
# Maximum number of locals for function / method body
max-locals=15
# Maximum number of parents for a class (see R0901).
max-parents=7
# Maximum number of public methods for a class (see R0904).
max-public-methods=20
# Maximum number of return / yield for function / method body
max-returns=100
# Maximum number of statements in function / method body
max-statements=50
# Minimum number of public methods for a class (see R0903).
min-public-methods=0
[CLASSES]
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,__new__,setUp
# List of member names, which should be excluded from the protected access
# warning.
exclude-protected=_asdict,_fields,_replace,_source,_make
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg=mcs
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=
omemo2/manifest.ini
View file @
8f85cb4d
...
...
@@ -3,8 +3,7 @@ name: OMEMO2
short_name:
omemo2
version:
2.5.7
description:
OMEMO
authors:
Bahtiar
`kalkin-`
Gadimov
<bahtiar@gadimov.de>
Daniel
Gultsch
<daniel@gultsch.de>
Philipp
Hörist
<philipp@hoerist.com>
authors:
Philipp
Hörist
<philipp@hoerist.com>
homepage:
https://dev.gajim.org/gajim/gajim-plugins/wikis/OmemoGajimPlugin
min_gajim_version:
0.16.11.2
min_gajim_version:
1.1.91
max_gajim_version:
1.2.90
omemo2/modules/omemo.py
View file @
8f85cb4d
This diff is collapsed.
Click to expand it.
omemo2/modules/omemo_devicelist.py
View file @
8f85cb4d
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of
Gajim
.
# This file is part of
OMEMO
.
#
#
Gajim
is free software; you can redistribute it and/or modify
#
OMEMO
is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; version 3 only.
#
#
Gajim
is distributed in the hope that it will be useful,
#
OMEMO
is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with
Gajim
. If not, see <http://www.gnu.org/licenses/>.
# along with
OMEMO
. If not, see <http://www.gnu.org/licenses/>.
# XEP-03
73
: O
penPGP for XMPP
# XEP-03
84
: O
MEMO Encryption
import
logging
import
nbxmpp
from
gajim.common
import
app
from
gajim.common.exceptions
import
StanzaMalformed
from
gajim.common.modules.pep
import
AbstractPEPModule
,
AbstractPEPData
from
openpgp.modules
import
util
from
omemo2.modules
import
util
from
omemo2.modules.util
import
unpack_devicelist
log
=
logging
.
getLogger
(
'gajim.plugin_system.omemo.pep'
)
...
...
@@ -37,10 +37,6 @@ class OMEMODevicelistData(AbstractPEPData):
type_
=
'omemo-devicelist'
def
__init__
(
self
,
devicelist
):
self
.
_pep_specific_data
=
devicelist
self
.
data
=
devicelist
class
OMEMODevicelist
(
AbstractPEPModule
):
'''
...
...
@@ -58,33 +54,16 @@ class OMEMODevicelist(AbstractPEPModule):
store_publish
=
True
_log
=
log
def
__init__
(
self
,
con
):
AbstractPEPModule
.
__init__
(
self
,
con
,
con
.
name
)
self
.
handlers
=
[]
def
_extract_info
(
self
,
item
):
list_
=
item
.
getTag
(
'list'
,
namespace
=
util
.
NS_OMEMO
)
if
list_
is
None
:
raise
StanzaMalformed
(
'No list node'
)
device_list
=
list_
.
getTags
(
'device'
)
devices
=
[]
for
device
in
device_list
:
id_
=
device
.
getAttr
(
'id'
)
if
id_
is
None
:
raise
StanzaMalformed
(
'No id for device found'
)
devices
.
append
(
int
(
id_
))
return
devices
@
staticmethod
def
_extract_info
(
item
):
return
unpack_devicelist
(
item
)
def
_notification_received
(
self
,
jid
,
devicelist
):
con
=
app
.
connections
[
self
.
_account
]
con
.
get_module
(
'OMEMO'
).
device_list_received
(
devicelist
.
data
,
jid
.
getStripped
())
def
_build_node
(
self
,
devicelist
):
@
staticmethod
def
_build_node
(
devicelist
):
list_node
=
nbxmpp
.
Node
(
'list'
,
{
'xmlns'
:
util
.
NS_OMEMO
})
if
devicelist
is
None
:
return
list_node
...
...
omemo2/modules/util.py
View file @
8f85cb4d
# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com>
#
# This file is part of
Gajim
.
# This file is part of
OMEMO
.
#
#
Gajim
is free software; you can redistribute it and/or modify
#
OMEMO
is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published
# by the Free Software Foundation; version 3 only.
#
#
Gajim
is distributed in the hope that it will be useful,
#
OMEMO
is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with
Gajim.
If not, see <http://www.gnu.org/licenses/>.
# along with
OMEMO.
If not, see <http://www.gnu.org/licenses/>.
# XEP-0384: OMEMO Encryption
...
...
@@ -21,13 +21,13 @@ import logging
from
base64
import
b64decode
,
b64encode
import
nbxmpp
from
nbxmpp.protocol
import
NS_PUBSUB
,
Iq
from
nbxmpp.protocol
import
NS_PUBSUB
from
nbxmpp.simplexml
import
Node
from
gajim.common
import
app
from
gajim.common
.exceptions
import
StanzaMalformed
from
omemo.extendedpublicbundle
import
ExtendedPublicBundle
from
omemo
.signal.wireformat
import
decodePublicKey
from
omemo
_backend_signal
import
BACKEND
log
=
logging
.
getLogger
(
'gajim.plugin_system.omemo'
)
...
...
@@ -35,7 +35,7 @@ log = logging.getLogger('gajim.plugin_system.omemo')
NS_OMEMO
=
'eu.siacs.conversations.axolotl'
NS_DEVICE_LIST
=
NS_OMEMO
+
'.devicelist'
NS_NOTIFY
=
NS_DEVICE_LIST
+
'+notify'
NS_BUNDLES
=
NS_OMEMO
+
'.bundles
:
'
NS_BUNDLES
=
NS_OMEMO
+
'.bundles'
def
build_omemo_stanza
(
message_node
,
msg_dict
):
...
...
@@ -140,7 +140,7 @@ def unpack_device_bundle(bundle, device_id):
return
spk
=
{}
spk
[
'key'
]
=
decodePublicKey
(
decode
_data
(
signed_prekey_node
)
)
spk
[
'key'
]
=
b64
decode
(
signed_prekey_node
)
if
not
spk
[
'key'
]:
log
.
warning
(
'OMEMO device bundle has no signedPreKeyPublic data'
)
return
...
...
@@ -156,7 +156,7 @@ def unpack_device_bundle(bundle, device_id):
log
.
warning
(
'OMEMO device bundle has no signedPreKeySignature node'
)
return
spk_signature
=
decode
_data
(
signed_signature_node
)
spk_signature
=
b64
decode
(
signed_signature_node
)
if
not
spk_signature
:
log
.
warning
(
'OMEMO device bundle has no signedPreKeySignature data'
)
return
...
...
@@ -166,7 +166,7 @@ def unpack_device_bundle(bundle, device_id):
log
.
warning
(
'OMEMO device bundle has no identityKey node'
)
return
identity_key
=
decodePublicKey
(
decode
_data
(
identity_key_node
)
)
identity_key
=
b64
decode
(
identity_key_node
)
if
not
identity_key
:
log
.
warning
(
'OMEMO device bundle has no identityKey data'
)
return
...
...
@@ -179,11 +179,47 @@ def unpack_device_bundle(bundle, device_id):
otpks
=
[]
for
prekey_node
in
prekeys_node
.
getChildren
():
otpks
.
append
({
"key"
:
decodePublicKey
(
b64decode
(
prekey_node
.
getData
())
)
,
"key"
:
b64decode
(
prekey_node
.
getData
()),
"id"
:
int
(
prekey_node
.
getAttr
(
'preKeyId'
))
})
return
ExtendedPublicBundle
(
identity_key
,
spk
,
spk_signature
,
otpks
)
return
ExtendedPublicBundle
.
parse
(
BACKEND
,
identity_key
,
spk
,
spk_signature
,
otpks
)
def
get_item_from_pubsub_query
(
stanza
):
pubsub
=
stanza
.
getTag
(
'pubsub'
,
namespace
=
nbxmpp
.
NS_PUBSUB
)
items
=
pubsub
.
getTag
(
'items'
)
if
items
is
None
:
raise
StanzaMalformed
(
'Malformed query (no items node)'
)
namespace
=
items
.
getAttr
(
'node'
)
if
namespace
is
None
:
raise
StanzaMalformed
(
'Malformed query (no node attr)'
)
if
len
(
items
.
getChildren
())
!=
1
:
raise
StanzaMalformed
(
'Invalid item count received'
)
item
=
items
.
getTag
(
'item'
)
if
item
is
None
:
raise
StanzaMalformed
(
'No item node'
)
return
item
def
unpack_devicelist
(
item
):
list_
=
item
.
getTag
(
'list'
,
namespace
=
NS_OMEMO
)
if
list_
is
None
:
raise
StanzaMalformed
(
'No list node'
)
device_list
=
list_
.
getTags
(
'device'
)
devices
=
[]
for
device
in
device_list
:
id_
=
device
.
getAttr
(
'id'
)
if
id_
is
None
:
raise
StanzaMalformed
(
'No id for device found'
)
devices
.
append
(
int
(
id_
))
return
devices
def
unpack_encrypted
(
encrypted_node
):
...
...
@@ -207,17 +243,17 @@ def unpack_encrypted(encrypted_node):
log
.
warning
(
"OMEMO message without iv"
)
return
iv
=
decode
_data
(
iv_node
)
iv
=
b64
decode
(
iv_node
)
if
not
iv
:
log
.
warning
(
"OMEMO message without iv data"
)
payload_node
=
encrypted_node
.
getTag
(
'payload'
,
namespace
=
NS_OMEMO
)
payload
=
None
if
payload_node
:
payload
=
decode
_data
(
payload_node
)
payload
=
b64
decode
(
payload_node
)
key_nodes
=
header_node
.
getTags
(
'key'
)
if
len
(
key_nodes
)
<