Move here mod_irc module from the main ejabberd repo
This commit is contained in:
parent
721ca125ea
commit
65575478a3
|
@ -0,0 +1,83 @@
|
||||||
|
## mod_irc
|
||||||
|
|
||||||
|
This module is an IRC transport that can be used to join channels on IRC
|
||||||
|
servers.
|
||||||
|
|
||||||
|
End user information:
|
||||||
|
|
||||||
|
- A XMPP client with ‘groupchat 1.0’ support or Multi-User Chat
|
||||||
|
support ([`XEP-0045`][72]) is
|
||||||
|
necessary to join IRC channels.
|
||||||
|
|
||||||
|
- An IRC channel can be joined in nearly the same way as joining a
|
||||||
|
XMPP Multi-User Chat room. The difference is that the room name will
|
||||||
|
be ‘channel%`irc.example.org`’ in case `irc.example.org` is the IRC
|
||||||
|
server hosting ‘channel’. And of course the host should point to the
|
||||||
|
IRC transport instead of the Multi-User Chat service.
|
||||||
|
|
||||||
|
- You can register your nickame by sending ‘IDENTIFY password’ to
|
||||||
|
`nickserver!irc.example.org@irc.jabberserver.org`.
|
||||||
|
|
||||||
|
- Entering your password is possible by sending ‘LOGIN nick
|
||||||
|
password’
|
||||||
|
to `nickserver!irc.example.org@irc.jabberserver.org`.
|
||||||
|
|
||||||
|
- The IRC transport provides Ad-Hoc Commands
|
||||||
|
([`XEP-0050`][73]) to join a
|
||||||
|
channel, and to set custom IRC username and encoding.
|
||||||
|
|
||||||
|
- When using a popular XMPP server, it can occur that no connection
|
||||||
|
can be achieved with some IRC servers because they limit the number
|
||||||
|
of connections from one IP.
|
||||||
|
|
||||||
|
Options:
|
||||||
|
|
||||||
|
**`host: HostName`**: This option defines the Jabber ID of the service. If the `host`
|
||||||
|
option is not specified, the Jabber ID will be the hostname of the
|
||||||
|
virtual host with the prefix ‘`irc.`’. The keyword “@HOST@” is
|
||||||
|
replaced at start time with the real virtual host name.
|
||||||
|
|
||||||
|
**`db_type: mnesia|sql|riak`**: Define the type of storage where the module will create the tables and store user information. The default is the storage defined by the global option `default_db`, or `mnesia` if omitted. If `sql` or `riak` value is defined, make sure you have defined the database, see [database](#database-and-ldap-configuration).
|
||||||
|
|
||||||
|
**`access: AccessName`**: This option can be used to specify who may use the IRC transport
|
||||||
|
(default value: `all`).
|
||||||
|
|
||||||
|
**`default_encoding: Encoding`**: Set the default IRC encoding. Default value: `iso8859-1`
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
- In the first example, the IRC transport is available on (all) your
|
||||||
|
virtual host(s) with the prefix ‘`irc.`’. Furthermore, anyone is
|
||||||
|
able to use the transport. The default encoding is set to
|
||||||
|
“iso8859-15”.
|
||||||
|
|
||||||
|
|
||||||
|
modules:
|
||||||
|
...
|
||||||
|
mod_irc:
|
||||||
|
access: all
|
||||||
|
default_encoding: "iso8859-15"
|
||||||
|
...
|
||||||
|
|
||||||
|
- In next example the IRC transport is available with JIDs with prefix
|
||||||
|
`irc-t.net`. Moreover, the transport is only accessible to two users
|
||||||
|
of `example.org`, and any user of `example.com`:
|
||||||
|
|
||||||
|
|
||||||
|
acl:
|
||||||
|
paying_customers:
|
||||||
|
user:
|
||||||
|
- "customer1": "example.org"
|
||||||
|
- "customer2": "example.org"
|
||||||
|
server: "example.com"
|
||||||
|
|
||||||
|
access_rules:
|
||||||
|
irc_users:
|
||||||
|
- allow: paying_customers
|
||||||
|
|
||||||
|
modules:
|
||||||
|
...
|
||||||
|
mod_irc:
|
||||||
|
access: irc_users
|
||||||
|
host: "irc.example.net"
|
||||||
|
...
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,81 @@
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% File : mod_irc_mnesia.erl
|
||||||
|
%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%% Created : 14 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%%
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2018 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% This program 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; either version 2 of the
|
||||||
|
%%% License, or (at your option) any later version.
|
||||||
|
%%%
|
||||||
|
%%% This program 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 this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(mod_irc_mnesia).
|
||||||
|
|
||||||
|
-behaviour(mod_irc).
|
||||||
|
|
||||||
|
%% API
|
||||||
|
-export([init/2, get_data/3, set_data/4, import/2]).
|
||||||
|
-export([need_transform/1, transform/1]).
|
||||||
|
|
||||||
|
-include("jid.hrl").
|
||||||
|
-include("mod_irc.hrl").
|
||||||
|
-include("logger.hrl").
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% API
|
||||||
|
%%%===================================================================
|
||||||
|
init(_Host, _Opts) ->
|
||||||
|
ejabberd_mnesia:create(?MODULE, irc_custom,
|
||||||
|
[{disc_copies, [node()]},
|
||||||
|
{attributes, record_info(fields, irc_custom)}]).
|
||||||
|
|
||||||
|
get_data(_LServer, Host, From) ->
|
||||||
|
{U, S, _} = jid:tolower(From),
|
||||||
|
case catch mnesia:dirty_read({irc_custom, {{U, S}, Host}}) of
|
||||||
|
{'EXIT', _Reason} -> error;
|
||||||
|
[] -> empty;
|
||||||
|
[#irc_custom{data = Data}] -> Data
|
||||||
|
end.
|
||||||
|
|
||||||
|
set_data(_LServer, Host, From, Data) ->
|
||||||
|
{U, S, _} = jid:tolower(From),
|
||||||
|
F = fun () ->
|
||||||
|
mnesia:write(#irc_custom{us_host = {{U, S}, Host},
|
||||||
|
data = Data})
|
||||||
|
end,
|
||||||
|
mnesia:transaction(F).
|
||||||
|
|
||||||
|
import(_LServer, #irc_custom{} = R) ->
|
||||||
|
mnesia:dirty_write(R).
|
||||||
|
|
||||||
|
need_transform(#irc_custom{us_host = {{U, S}, H}})
|
||||||
|
when is_list(U) orelse is_list(S) orelse is_list(H) ->
|
||||||
|
?INFO_MSG("Mnesia table 'irc_custom' will be converted to binary", []),
|
||||||
|
true;
|
||||||
|
need_transform(_) ->
|
||||||
|
false.
|
||||||
|
|
||||||
|
transform(#irc_custom{us_host = {{U, S}, H},
|
||||||
|
data = Data} = R) ->
|
||||||
|
JID = jid:make(U, S),
|
||||||
|
R#irc_custom{us_host = {{iolist_to_binary(U),
|
||||||
|
iolist_to_binary(S)},
|
||||||
|
iolist_to_binary(H)},
|
||||||
|
data = mod_irc:data_to_binary(JID, Data)}.
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% Internal functions
|
||||||
|
%%%===================================================================
|
|
@ -0,0 +1,65 @@
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% File : mod_irc_riak.erl
|
||||||
|
%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%% Created : 14 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%%
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2018 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% This program 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; either version 2 of the
|
||||||
|
%%% License, or (at your option) any later version.
|
||||||
|
%%%
|
||||||
|
%%% This program 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 this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(mod_irc_riak).
|
||||||
|
|
||||||
|
-behaviour(mod_irc).
|
||||||
|
|
||||||
|
%% API
|
||||||
|
-export([init/2, get_data/3, set_data/4, import/2]).
|
||||||
|
|
||||||
|
-include("jid.hrl").
|
||||||
|
-include("mod_irc.hrl").
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% API
|
||||||
|
%%%===================================================================
|
||||||
|
init(_Host, _Opts) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
get_data(_LServer, Host, From) ->
|
||||||
|
{U, S, _} = jid:tolower(From),
|
||||||
|
case ejabberd_riak:get(irc_custom, irc_custom_schema(), {{U, S}, Host}) of
|
||||||
|
{ok, #irc_custom{data = Data}} ->
|
||||||
|
Data;
|
||||||
|
{error, notfound} ->
|
||||||
|
empty;
|
||||||
|
_Err ->
|
||||||
|
error
|
||||||
|
end.
|
||||||
|
|
||||||
|
set_data(_LServer, Host, From, Data) ->
|
||||||
|
{U, S, _} = jid:tolower(From),
|
||||||
|
{atomic, ejabberd_riak:put(#irc_custom{us_host = {{U, S}, Host},
|
||||||
|
data = Data},
|
||||||
|
irc_custom_schema())}.
|
||||||
|
|
||||||
|
import(_LServer, #irc_custom{} = R) ->
|
||||||
|
ejabberd_riak:put(R, irc_custom_schema()).
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% Internal functions
|
||||||
|
%%%===================================================================
|
||||||
|
irc_custom_schema() ->
|
||||||
|
{record_info(fields, irc_custom), #irc_custom{}}.
|
|
@ -0,0 +1,106 @@
|
||||||
|
%%%-------------------------------------------------------------------
|
||||||
|
%%% File : mod_irc_sql.erl
|
||||||
|
%%% Author : Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%% Created : 14 Apr 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
|
||||||
|
%%%
|
||||||
|
%%%
|
||||||
|
%%% ejabberd, Copyright (C) 2002-2018 ProcessOne
|
||||||
|
%%%
|
||||||
|
%%% This program 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; either version 2 of the
|
||||||
|
%%% License, or (at your option) any later version.
|
||||||
|
%%%
|
||||||
|
%%% This program 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 this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
%%%
|
||||||
|
%%%----------------------------------------------------------------------
|
||||||
|
|
||||||
|
-module(mod_irc_sql).
|
||||||
|
|
||||||
|
-compile([{parse_transform, ejabberd_sql_pt}]).
|
||||||
|
|
||||||
|
-behaviour(mod_irc).
|
||||||
|
|
||||||
|
%% API
|
||||||
|
-export([init/2, get_data/3, set_data/4, import/1, import/2, export/1]).
|
||||||
|
|
||||||
|
-include("jid.hrl").
|
||||||
|
-include("mod_irc.hrl").
|
||||||
|
-include("ejabberd_sql_pt.hrl").
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% API
|
||||||
|
%%%===================================================================
|
||||||
|
init(_Host, _Opts) ->
|
||||||
|
ok.
|
||||||
|
|
||||||
|
get_data(LServer, Host, From) ->
|
||||||
|
SJID = jid:encode(jid:tolower(jid:remove_resource(From))),
|
||||||
|
case catch ejabberd_sql:sql_query(
|
||||||
|
LServer,
|
||||||
|
?SQL("select @(data)s from irc_custom"
|
||||||
|
" where jid=%(SJID)s and host=%(Host)s and %(LServer)H")) of
|
||||||
|
{selected, [{SData}]} ->
|
||||||
|
mod_irc:data_to_binary(From, ejabberd_sql:decode_term(SData));
|
||||||
|
{'EXIT', _} -> error;
|
||||||
|
{selected, _} -> empty
|
||||||
|
end.
|
||||||
|
|
||||||
|
set_data(LServer, Host, From, Data) ->
|
||||||
|
SJID = jid:encode(jid:tolower(jid:remove_resource(From))),
|
||||||
|
SData = misc:term_to_expr(Data),
|
||||||
|
F = fun () ->
|
||||||
|
?SQL_UPSERT_T(
|
||||||
|
"irc_custom",
|
||||||
|
["!jid=%(SJID)s",
|
||||||
|
"!host=%(Host)s",
|
||||||
|
"server_host=%(LServer)s",
|
||||||
|
"data=%(SData)s"]),
|
||||||
|
ok
|
||||||
|
end,
|
||||||
|
ejabberd_sql:sql_transaction(LServer, F).
|
||||||
|
|
||||||
|
export(_Server) ->
|
||||||
|
[{irc_custom,
|
||||||
|
fun(Host, #irc_custom{us_host = {{U, S}, IRCHost},
|
||||||
|
data = Data}) ->
|
||||||
|
case str:suffix(Host, IRCHost) of
|
||||||
|
true ->
|
||||||
|
SJID = jid:encode(jid:make(U, S)),
|
||||||
|
LServer = ejabberd_router:host_of_route(IRCHost),
|
||||||
|
SData = misc:term_to_expr(Data),
|
||||||
|
[?SQL("delete from irc_custom"
|
||||||
|
" where jid=%(SJID)s and host=%(IRCHost)s and %(LServer)H;"),
|
||||||
|
?SQL_INSERT(
|
||||||
|
"irc_custom",
|
||||||
|
["jid=%(SJID)s",
|
||||||
|
"host=%(Host)s",
|
||||||
|
"server_host=%(LServer)s",
|
||||||
|
"data=%(SData)s"])];
|
||||||
|
false ->
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end}].
|
||||||
|
|
||||||
|
import(_LServer) ->
|
||||||
|
[{<<"select jid, host, data from irc_custom;">>,
|
||||||
|
fun([SJID, IRCHost, SData]) ->
|
||||||
|
#jid{luser = U, lserver = S} = jid:decode(SJID),
|
||||||
|
Data = ejabberd_sql:decode_term(SData),
|
||||||
|
#irc_custom{us_host = {{U, S}, IRCHost},
|
||||||
|
data = Data}
|
||||||
|
end}].
|
||||||
|
|
||||||
|
import(_, _) ->
|
||||||
|
pass.
|
||||||
|
|
||||||
|
%%%===================================================================
|
||||||
|
%%% Internal functions
|
||||||
|
%%%===================================================================
|
Loading…
Reference in New Issue