Add plugin for checking if anonymous connection are authorized

pull/8/head
Nicolas Jouanin 2015-08-21 22:48:56 +02:00
rodzic d70e6437cf
commit 3f2a7fc8c8
3 zmienionych plików z 49 dodań i 8 usunięć

Wyświetl plik

@ -31,6 +31,9 @@ from .plugins.manager import PluginManager, BaseContext
_defaults = {
'timeout-disconnect-delay': 2,
'publish-retry-delay': 5,
'auth': {
'allow-anonymous': True,
}
}
DOLLAR_SYS_ROOT = '$SYS/broker/'
@ -129,15 +132,15 @@ class Broker:
:param config: Example Yaml config
listeners:
- default: #Mandatory
default: #Mandatory
max-connections: 50000
type: tcp
- my-tcp-1:
my-tcp-1:
bind: 127.0.0.1:1883
- my-tcp-2:
my-tcp-2:
bind: 1.2.3.4:1883
max-connections: 1000
- my-tcp-ssl-1:
my-tcp-ssl-1:
bind: 127.0.0.1:8883
ssl: on
cafile: /some/cafile
@ -145,14 +148,14 @@ class Broker:
capath: certificate data
certfile: /some/certfile
keyfile: /some/key
- my-ws-1:
my-ws-1:
bind: 0.0.0.0:8080
type: ws
timeout-disconnect-delay: 2
publish-retry-delay: 5
plugins-enabled: ['auth.anonymous'] #List of plugins to activate among all registered plugins
auth:
allow-anonymous: true / false
plugins: ['auth.anonymous'] #List of plugins to activate among all registered plugins
:param loop:
:return:
@ -636,7 +639,7 @@ class Broker:
:param listener:
:return:
"""
returns = yield from self.plugins_manager.map_plugin_coro("authenticate", session)
returns = yield from self.plugins_manager.map_plugin_coro("authenticate", session=session)
if not returns:
self.logger.debug("Authentication plugin results: %r" % returns)
return True

Wyświetl plik

@ -1 +1,38 @@
__author__ = 'nico'
# Copyright (c) 2015 Nicolas JOUANIN
#
# See the file license.txt for copying permission.
import logging
class AnonymousAuthPlugin:
def __init__(self, context):
self.context = context
try:
self.auth_config = self.context.config['auth']
except KeyError:
self.context.logger.warn("'auth' section not found in context configuration")
def authenticate(self, *args, **kwargs):
authenticated = False
if not self.auth_config:
# auth config section not found
self.context.logger.warn("'auth' section not found in context configuration")
authenticated = False
else:
allow_anonymous = self.auth_config.get('allow-anonymous', True) # allow anonymous by default
if allow_anonymous:
authenticated = True
self.context.logger.debug("Authentication success: config allows anonymous")
else:
try:
session = kwargs.get('session', None)
authenticated = True if session.username else False
if self.context.logger.isEnabledFor(logging.DEBUG):
if authenticated:
self.context.logger.debug("Authentication success: session has a non empty username")
else:
self.context.logger.debug("Authentication failure: session has an empty username")
except KeyError:
self.context.logger.warn("Session informations not available")
authenticated = False
return authenticated

Wyświetl plik

@ -39,6 +39,7 @@ setup(
'hbmqtt.broker.plugins': [
# 'event_logger_plugin = hbmqtt.plugins.logging:EventLoggerPlugin',
'packet_logger_plugin = hbmqtt.plugins.logging:PacketLoggerPlugin',
'auth_anonymous = hbmqtt.plugins.authentication:AnonymousAuthPlugin',
],
'hbmqtt.client.plugins': [
'packet_logger_plugin = hbmqtt.plugins.logging:PacketLoggerPlugin',