Jelajahi Sumber

Merge branch 'dev' of github.com:emqtt/emqtt into dev

Feng Lee 10 tahun lalu
induk
melakukan
542f3d2c21

+ 0 - 0
plugins/emqttd_auth_mysql/.placehodler


+ 21 - 0
plugins/emqttd_auth_mysql/README.md

@@ -0,0 +1,21 @@
+##  Overview
+
+Authentication with user table of MySQL database.
+
+## Demo User Table
+
+```
+CREATE TABLE `mqtt_users` (
+  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+  `username` varchar(60) DEFAULT NULL,
+  `password` varchar(60) DEFAULT NULL,
+  `salt` varchar(20) DEFAULT NULL,
+  `created` datetime DEFAULT NULL,
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `mqtt_users_username` (`username`)
+) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
+```
+
+## Plugin config
+
+

+ 19 - 0
plugins/emqttd_auth_mysql/rebar.config

@@ -0,0 +1,19 @@
+%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
+%% ex: ts=4 sw=4 ft=erlang et
+
+{require_min_otp_vsn, "R17"}.
+
+%% fail_on_warning, 
+{erl_opts, [debug_info, {parse_transform, lager_transform}]}.
+
+{erl_opts, [warn_export_all,
+            warn_unused_import,
+            {i, "include"},
+			{src_dirs, ["src"]}]}.
+
+{xref_checks, [undefined_function_calls]}.
+
+{deps, [
+	{'Emysql', "*", {git, "git://github.com/Eonblast/Emysql.git", {branch, "master"}}}
+]}.
+

+ 12 - 0
plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src

@@ -0,0 +1,12 @@
+{application, emqttd_auth_mysql,
+ [
+  {description, ""},
+  {vsn, "0.1"},
+  {registered, []},
+  {applications, [
+                  kernel,
+                  stdlib
+                 ]},
+  {mod, {emqttd_auth_mysql_app, []}},
+  {env, []}
+ ]}.

+ 54 - 0
plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl

@@ -0,0 +1,54 @@
+%%%-----------------------------------------------------------------------------
+%%% Copyright (c) 2012-2015 eMQTT.IO, All Rights Reserved.
+%%%
+%%% Permission is hereby granted, free of charge, to any person obtaining a copy
+%%% of this software and associated documentation files (the "Software"), to deal
+%%% in the Software without restriction, including without limitation the rights
+%%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+%%% copies of the Software, and to permit persons to whom the Software is
+%%% furnished to do so, subject to the following conditions:
+%%%
+%%% The above copyright notice and this permission notice shall be included in all
+%%% copies or substantial portions of the Software.
+%%%
+%%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+%%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+%%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+%%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+%%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+%%% SOFTWARE.
+%%%-----------------------------------------------------------------------------
+%%% @doc
+%%% emqttd authentication by mysql user table.
+%%%
+%%% @end
+%%%-----------------------------------------------------------------------------
+-module(emqttd_auth_mysql).
+
+-author("Feng Lee <feng@emqtt.io>").
+
+-include_lib("emqttd/include/emqttd.hrl").
+
+-behaviour(emqttd_auth_mod).
+
+-export([init/1, check/3, description/0]).
+
+-record(state, {user_tab}).
+
+init(Opts) -> 
+    UserTab = proplists:get_value(user_table, Opts, mqtt_users),
+    {ok, #state{user_tab = UserTab}}.
+
+check(#mqtt_client{username = undefined}, _Password, _State) ->
+    {error, "Username undefined"};
+check(_Client, undefined, _State) ->
+    {error, "Password undefined"};
+check(#mqtt_client{username = Username}, Password, #state{user_tab = UserTab}) ->
+    case emysql:select(UserTab, {{username, Username}, {password, erlang:md5(Password)}}) of
+        {ok, []} -> {error, "Username or Password not match"};
+        {ok, _Record} -> ok
+    end.
+
+description() -> "Authentication by MySQL".
+

+ 19 - 0
plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl

@@ -0,0 +1,19 @@
+-module(emqttd_auth_mysql_app).
+
+-behaviour(application).
+
+%% Application callbacks
+-export([start/2, stop/1]).
+
+%% ===================================================================
+%% Application callbacks
+%% ===================================================================
+
+start(_StartType, _StartArgs) ->
+    {ok, Sup} = emqttd_auth_mysql_sup:start_link(),
+    emqttd_access_control:register_mod(auth, emqttd_auth_mysql, []),
+    {ok, Sup}.
+
+stop(_State) ->
+    emqttd_access_control:unregister_mod(auth, emqttd_auth_mysql),
+    ok.

+ 27 - 0
plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl

@@ -0,0 +1,27 @@
+-module(emqttd_auth_mysql_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/0]).
+
+%% Supervisor callbacks
+-export([init/1]).
+
+%% Helper macro for declaring children of supervisor
+-define(CHILD(I, Type), {I, {I, start_link, []}, permanent, 5000, Type, [I]}).
+
+%% ===================================================================
+%% API functions
+%% ===================================================================
+
+start_link() ->
+    supervisor:start_link({local, ?MODULE}, ?MODULE, []).
+
+%% ===================================================================
+%% Supervisor callbacks
+%% ===================================================================
+
+init([]) ->
+    {ok, { {one_for_one, 5, 10}, []} }.
+