Ejabberd рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдирд╛

рдпрджрд┐ рдЖрдкрдХреЛ ejabberd XMPP рд╕рд░реНрд╡рд░ рд╕реЗ рдЧреИрд░-рдорд╛рдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕реЗ рдирд┐рдпрдорд┐рдд рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЖрдк рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЬрдм рдЕрдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдиреЗ рдЬреИрдмрд░ рдореЗрдВ рдмреЗрдХрд╛рд░ рдХреА рдмрдХрд╡рд╛рд╕ рдкрд░ рдпреБрджреНрдз рдХреА рдШреЛрд╖рдгрд╛ рдХреА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЪреИрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдПред рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЕрднреА рднреА рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХрд╣рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдЯреНрд░реЗрдирд┐рдВрдЧ


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рдереЛрдбрд╝реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЗрд░рд▓рд╛рдВрдЧ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдореИрдВрдиреЗ рдЖрд░рдПрд╕рдбреАрдПрди рдкрддреНрд░рд┐рдХрд╛ рдХреЗ рдПрдХ рд▓реЗрдЦ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдФрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ ред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдерд╛рдкрд┐рдд рдЗрд░рд▓реИрдВрдЧ рдФрд░ рдЗрдЬрд╝рдмрд░реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
  1. рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред
    $ erlc mod_restrictions.erl 
  2. рдкрд░рд┐рдгрд╛рдореА рдмрд╛рдЗрдирд░реА рдХреЛ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдИрдЬрд╝рдмрд░реНрдб рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВред
     $ mv mod_restrictions.beam /usr/lib/ejabberd/ebin/ 
  3. рдирдпрд╛ (рдЕрдкрдбреЗрдЯреЗрдб) рдореЙрдбреНрдпреВрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕ ejabberd рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
     $ service ejabberd restart 
    рдФрд░ рдЖрдк рдордХреНрдЦреА рдкрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИрдЬрд╝рдмрд░реНрдб рдПрдбрдорд┐рди рдПрд░рд┐рдпрд╛ ( рдиреЛрдбреНрд╕ -> рдЖрдкрдХрд╛ рдиреЛрдб -> рдЕрдкрдбреЗрдЯ ) рдореЗрдВ
(Ubuntu 11.04 рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢)

рд╕рдВрдХрд▓рдХ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:

 ./mod_restrictions.erl:5: Warning: behaviour gen_mod undefined 

рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдирд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрдЬрд╝рдмреЗрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдлрд╝рд╛рдЗрд▓ /etc/ejabberd/ejabberd.cfg) рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдореЗрдВ рд▓рд╛рдЗрди рдЬреЛрдбрд╝реЗрдВ ( {modules,[ рдмрд╛рдж:

 {mod_restrictions, []} 

рдХрдВрдХрд╛рд▓


Ejabberd рдореЙрдбреНрдпреВрд▓ gen_mod рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдкреНрд░рд╛рд░рдВрдн / 2 рдФрд░ рд╕реНрдЯреЙрдк / 1 , рдЬрд┐рд╕реЗ рдХреНрд░рдорд╢рдГ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рдореЙрдбреНрдпреВрд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдирд┐рдореНрди рдХреЛрдб рдХреЛ mod_restrictions.erl рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 -module(mod_restrictions). -behavior(gen_mod). -export([start/2, stop/1]). start(_Host, _Opts) ->  ok. stop(_Host) ->  ok. 

рдпрд╣рд╛рдБ рд╣рдо рд╣реИрдВ:
  1. рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ (рдпрд╣ рдмрд┐рдирд╛ .erl рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдХреА рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
  2. рд╣рдореЗрдВ gen_mod рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
  3. рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ (рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде) рдФрд░ рд╕реНрдЯреЙрдк (рдПрдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде) рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рд╕реБрд▓рдн рд╣реИрдВред
  4. рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВред рддрд░реНрдХ рдирд╛рдореЛрдВ рдореЗрдВ рдирд┐рдЪрд▓рд╛ рд╕реНрдерд╛рди рдПрд░рд▓рдВрдЧ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрди рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  5. рдареАрдХ рд╣реИ рд▓реМрдЯреЛ

рд╣рдо рд▓реЙрдЧ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ


рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ рдореЙрдбреНрдпреВрд▓ рд╢реБрд░реВ рдФрд░ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ), рдЖрдк INFO_MSG рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 -module(mod_restrictions). -behavior(gen_mod). -include("ejabberd.hrl"). -export([start/2, stop/1]). start(Host, _Opts) ->  ?INFO_MSG("mod_restrictions   ~p", [Host]),  ok. stop(Host) ->  ?INFO_MSG("mod_restrictions   ~p", [Host]),  ok. 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕реНрдереВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ INFO_MSG рдХреЗ рд╕рд╛рде ejabberd.hrl рдлрд╝рд╛рдЗрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХрдиреЗрдХреНрдЯ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдИрдЬрд╝рдмреЗрд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред
рд╕рд░реНрд╡рд░ рд▓реЙрдЧреНрд╕ рдореЗрдВ рд╣рдорд╛рд░рд╛ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ /var/log/ejabberd/ejabberd.log рд╣реИ), рдФрд░ рдкреНрд░рддреНрдпреЗрдХ ~ рдкреА рдХреЗ рдмрдЬрд╛рдп рд╕реВрдЪреА рд╕реЗ рдПрдХ рддрддреНрд╡ рд╣реЛрдЧрд╛ - рджреВрд╕рд░рд╛ рддрд░реНрдХред

рдИрдЬрдмрд░реНрдб рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ


рдПрдЬрд╝рдмрд░реНрдб рдШрдЯрдирд╛рдУрдВ (рдШрдЯрдирд╛рдУрдВ) рдФрд░ рд╣реБрдХ (рд╣реБрдХ) рдХреЗ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрд╕рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

 ejabberd_hooks:add(Hook, Host, Module, Function, Prioritet) ejabberd_hooks:remove(Hook, Host, Module, Function, Prioritet) 

Ejabberd рдореЙрдбреНрдпреВрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ (рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ? MODULE рдореИрдХреНрд░реЛ рддрд╛рдХрд┐ рдпрд╣ рдЖрдкрдХрд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ) рд╣рд░ рдмрд╛рд░ рд╣реЛрд╕реНрдЯ рдиреЛрдб рдкрд░ рдПрдХ рд╣реБрдХ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИ (рдпрджрд┐ рдЖрдк рд╕рднреА рдиреЛрдбреНрд╕ рд╕реБрдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рдПрдХ рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреНрд░рд╛рд╣рдХ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓реЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рдПрдХ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рдеред
рд╣рдо filter_packet рдИрд╡реЗрдВрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рд░ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рдХреЛ рдХреБрдЫ рднреЗрдЬрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрджреЗрд╢)ред
рдЕрдм рдореЙрдбреНрдпреВрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 -module(mod_restrictions). -behavior(gen_mod). -include("ejabberd.hrl"). -export([start/2, stop/1, on_filter_packet/1]). start(_Host, _Opts) ->  ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 50),  ok. stop(_Host) ->  ejabberd_hooks:delete(filter_packet, global, ?MODULE, on_filter_packet, 50),  ok. on_filter_packet(Packet) ->  Packet. 

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рдирд╛


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ ejabberd рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдФрд░ рдкрдврд╝реЗрдВред

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ рдФрд░ рдРрдб-рд░рд┐рдореВрд╡ рд╣реБрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

 -include("web/ejabberd_http.hrl"). -include("web/ejabberd_web_admin.hrl"). start(_Host, _Opts) ->  ...  ejabberd_hooks:add(webadmin_menu_main, ?MODULE, web_menu_host, 50),  ejabberd_hooks:add(webadmin_page_main, ?MODULE, web_page_host, 50),  ... stop(_Host) ->  ...  ejabberd_hooks:delete(webadmin_menu_main, ?MODULE, web_menu_host, 50),  ejabberd_hooks:delete(webadmin_page_main, ?MODULE, web_page_host, 50),  ... 


рдПрдХ рдЖрдЗрдЯрдо рдХреЛ рдореБрдЦреНрдп рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЗрдиреВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

 web_menu_host(Acc, Lang) ->  Acc ++ [{"mod_restrictions", ?T("Restrictions")}]. 

рдФрд░ рдореЙрдбреНрдпреВрд▓ рдкреГрд╖реНрда рд╣реА:

 web_page_host(_,      #request{method = Method,            q = Query,            path = ["mod_restrictions"],            lang = _Lang}) ->  case Method of    'POST' -> %% Handle database query      case lists:keyfind("act", 1, Query) of        {"act","add_usrgrp"} -> %% add user to group          {"usr",NewUser} = lists:keyfind("usr", 1, Query),          {"grp",NewGroup} = lists:keyfind("grp", 1, Query),          ?INFO_MSG("mod_restrictions: ADD NewUser=~p NewGroup=~p", [NewUser, NewGroup]);        ...        _ -> none      end;    _ -> none  end,  Res = [?XC("h1", "Restriction module manager"),      ?XE("table",[        ?XE("tr",          [?XC("th","Users"),?XC("th","Groups")]        ),        ?XE("tr",          [?XAE("td",[{"style","vertical-align:top;"}],web_user_list()),?XAE("td",[{"style","vertical-align:top;"}],web_group_list())]        )]      )     ],  {stop, Res}; web_page_host(Acc, _) -> Acc. 

рдпрд╣рд╛рдВ рд╣рдо рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдирд┐рдореНрди HTML рдХреЛрдб рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ:

 <h1>Restriction module manager</h1> <table><tr><th>Users</th><th>Groups</th></tr><tr><td style="vertical-align:top;">  - <form action="" method="post"><input type="text" name="usr" value=""/><input type="text" name="grp" value=""/><input type="hidden" name="act" value="add_usrgrp"/><input type="submit" name="btn" value="Add"/></form></td><td style="vertical-align:top;">  - <form action="" method="post"><input type="text" name="grp" value=""/><input type="text" name="dest" value=""/><input type="hidden" name="act" value="add_grpdest"/><input type="submit" name="btn" value="Add"/></form></td></tr></table> 

рд╕рднреА HTML рдкреАрдврд╝реА рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ ejabberd_web_admin.hrl рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрдЬрд╝рдмрд░реНрдб рдХреЗ рд╕рд╛рде рдордиреЗрд╕рд┐рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╣рдореЗрдВ 2 рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рддрд╛рд▓рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрд░рд▓рд╛рдВрдЧ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 -record(restrictions_users, {usr, grp}). -record(restrictions_groups, {grp, dest}). 

рд╣рдордиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ JID рдФрд░ рд╕рдореВрд╣ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрдВрдз_рд╕рд░реНрд╕ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рд╕рдореВрд╣ рдФрд░ рджрд┐рд╢рд╛ рдлрд╝реАрд▓реНрдб (рдЬрд╣рд╛рдБ рдЖрдк рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрдВрдз_ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдмрдирд╛рдПред

Mnesia рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: рд▓реЗрдирджреЗрди рдФрд░ рдЧрдВрджреЗ рддрд░реАрдХреЗред рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рддреЗрдЬрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЯреЗрдмрд▓ рдирд┐рд░реНрдорд╛рдг

рдЕрдм, рд╕реНрдЯрд╛рд░реНрдЯ рдлрдВрдХреНрд╢рди рдореЗрдВ, рдЗрди рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдЯреЗрдмрд▓реНрд╕ рдмрдирд╛рдПрдВред рдЬрдм рддрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╡реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред

 mnesia:create_table(restrictions_groups, [{disc_copies, [node()]} , {attributes, record_info(fields, restrictions_groups)}, {type, bag}]), mnesia:create_table(restrictions_users, [{disc_copies, [node()]} , {attributes, record_info(fields, restrictions_users)}, {type, bag}]), 

рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рд░реИрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдмреИрдЧ рдЯреЗрдмрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдорд╛рди рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдЕрджреНрд╡рд┐рддреАрдп рд╣реИред

рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЪреБрдиреЗрдВ *

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдореЗрдВ, рд╣рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 mnesia:dirty_match_object(mnesia:table_info(,wild_pattern)) 

рдпрд╣ рд╣рдореЗрдВ рд╕рднреА рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ : HTML рд╕реВрдЪреА рд╕реЗ рдПрдХ рд▓реЗрдмрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдЪрд┐рддреНрд░ / 2 рдлрд╝рдВрдХреНрд╢рдиред

рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ

рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (usr) рдФрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ (рднрд╛рдЧреНрдп) рдХреЗ рдмреАрдЪ рдкрддреНрд░рд╛рдЪрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП qlc рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 Ftemp = fun() ->  Qvve = qlc:q([allow || U <- mnesia:table(restrictions_users),              G <- mnesia:table(restrictions_groups),              (U#restrictions_users.usr == FromUsr++"@"++FromDomain) and              (U#restrictions_users.grp == G#restrictions_groups.grp) and (                (G#restrictions_groups.dest == "all") or                (G#restrictions_groups.dest == ToDomain) or                (G#restrictions_groups.dest == ToUsr++"@"++ToDomain)              )        ]),  qlc:eval(Qvve) end, ?INFO_MSG("mod_restrictions: allow? ~p", [mnesia:transaction(Ftemp)]), 

рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдХрд┐рд╕реА рдРрд╕реЗ рд╕рдореВрд╣ рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╕рднреА рдЕрдиреБрдорддрд┐ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЛрдореЗрди рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдпрд╛ рд╕реНрд╡рдпрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рд┐рдЦреЗрдВ, рдлрд┐рд░ рдХреНрд╡реЗрд░реА {atomic, [allow, ...]} рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдореЙрдбреНрдпреВрд▓ рдкреИрд░рд╛рдореАрдЯрд░


рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рдЬрдЧрд╣, ejabberd.cfg рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 {mod_restrictions, [{deny_message,"    :("}]} 

рд╕рдВрджреЗрд╢ рдХреЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдЙрддреНрддрд░ рджреЗрдиреЗ рд╡рд╛рд▓реА рдорд╢реАрди рдХрд╛ рдкрд╛рда рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рднреЗрдЬреЗрдВрдЧреЗред
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, get_module_opt рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 gen_mod:get_module_opt(Host, Module, Opt, Default) 

рдХрд┐рд╕реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛


 Attrs = [{"type",Type},{"id","legal"},{"to",To#jid.user++"@"++To#jid.server++"/"++To#jid.resource},{"from",From#jid.user++"@"++From#jid.server++"/"++From#jid.resource}], Els = [{xmlcdata,<<"\n">>},{xmlelement,"body",[],[{xmlcdata,list_to_binary(Message)}]}], DenyMessage = {xmlelement,"message",Attrs,Els}, ejabberd_router:route(From,To,DenyMessage) 

рд╣рдо on_filter_packet рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ From рдФрд░ To рд╡реИрд░рд┐рдПрдмрд▓ рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ jid рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/In130396/


All Articles