diff --git a/Makefile b/Makefile index 3babaec69..a3b509386 100644 --- a/Makefile +++ b/Makefile @@ -38,3 +38,18 @@ plugins: dist: rel plugins +PLT = $(BASE_DIR)/.emqttd_dialyzer.plt +APPS = erts kernel stdlib sasl crypto ssl os_mon syntax_tools \ + public_key mnesia inets compiler + +check_plt: compile + dialyzer --check_plt --plt $(PLT) --apps $(APPS) \ + deps/*/ebin apps/*/ebin + +build_plt: compile + dialyzer --build_plt --output_plt $(PLT) --apps $(APPS) \ + deps/*/ebin apps/*/ebin + +dialyzer: compile + dialyzer -Wno_return --plt $(PLT) deps/*/ebin apps/*/ebin + diff --git a/README.md b/README.md index 1ad3709d4..f3ad0cd1c 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ The MIT License (MIT) [@huangdan](https://github.com/huangdan) + ## Author Feng Lee diff --git a/doc/emqtt.png b/doc/emqtt.png deleted file mode 100644 index df6462e86..000000000 Binary files a/doc/emqtt.png and /dev/null differ diff --git a/doc/emqttd.graphml b/doc/emqttd.graphml new file mode 100644 index 000000000..0add31baf --- /dev/null +++ b/doc/emqttd.graphml @@ -0,0 +1,993 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + emqttd broker cluster + + + + + + + + + + Folder 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + + + + + + + + + + + + + + y + + + + + + + + + + + + + + + + + t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + + + + + + + + + + + + + + y + + + + + + + + + + + + + + + + + t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + + + + + + + + + + + + + + y + + + + + + + + + + + + + + + + + t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + # + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + + + + + + + + + + + + + + + + + y + + + + + + + + + + + + + + + + + t + + + + + + + + + + + + + + + + + + + Client + + + + + + + + + + + + + + + + + Sensor + + + + + + + + + + + + + + + + + Sensor + + + + + + + + + + + + + + + + + Client + + + + + + + + + + + + + + + + + + Application Server + + + + + + + + + + + + + + + + + + Web + + + + + + + + + + + + + + + + + + Web + + + + + + + + + + + + + + + + + + iPhone + + + + + + + + + + + + + + + + + + Android + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MQTT + + + + + + + + + + + + + + + + + + + HTTP + + + + + + + + + + + + + + + + + + + MQTT + + + + + + + + + + + + + + + + + + + WebSocket + + + + + + + + + + + + + + + + + + + WebSocket + + + + + + + + + + + + + + + + + + + MQTT + + + + + + + + + + + + + + + + + + + MQTT + + + + + + + + + + + + + + + + + + + MQTT + + + + + + + + + + + + + + + + diff --git a/doc/emqttd.png b/doc/emqttd.png new file mode 100644 index 000000000..6066d5d08 Binary files /dev/null and b/doc/emqttd.png differ diff --git a/plugins/emqttd_auth_mysql/.placehodler b/plugins/emqttd_auth_mysql/.placehodler new file mode 100644 index 000000000..e69de29bb diff --git a/plugins/emqttd_auth_mysql/README.md b/plugins/emqttd_auth_mysql/README.md new file mode 100644 index 000000000..d6f783945 --- /dev/null +++ b/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 + + diff --git a/plugins/emqttd_auth_mysql/rebar.config b/plugins/emqttd_auth_mysql/rebar.config new file mode 100644 index 000000000..2e9d5c953 --- /dev/null +++ b/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"}}} +]}. + diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.app.src new file mode 100644 index 000000000..9094f9e77 --- /dev/null +++ b/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, []} + ]}. diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql.erl new file mode 100644 index 000000000..a6d5ce5a8 --- /dev/null +++ b/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 "). + +-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". + diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_app.erl new file mode 100644 index 000000000..e1f16bf98 --- /dev/null +++ b/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. diff --git a/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl b/plugins/emqttd_auth_mysql/src/emqttd_auth_mysql_sup.erl new file mode 100644 index 000000000..f2fc9e0b1 --- /dev/null +++ b/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}, []} }. + diff --git a/rebar.config b/rebar.config index 57e35432f..7755b06d7 100644 --- a/rebar.config +++ b/rebar.config @@ -2,7 +2,6 @@ %% ex: ts=4 sw=4 ft=erlang et {require_min_otp_vsn, "R17"}. -{cover_enabled, true}. %% fail_on_warning, {erl_opts, [debug_info, {parse_transform, lager_transform}]}. @@ -15,7 +14,7 @@ {eunit_opts, [verbose]}. {xref_checks, [undefined_function_calls]}. -{cover_enabled, false}. +{cover_enabled, true}. {validate_app_modules, true}.