25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-24 16:23:40 +01:00

Merge branch 'master' of github.com:processone/ejabberd

This commit is contained in:
Mickael Remond 2016-03-15 22:42:15 +01:00
commit 3c2cd91fb1
23 changed files with 439 additions and 246 deletions

View File

@ -1,16 +1,15 @@
Please answer these questions before submitting your issue. It may help ! > What version of ejabberd are you using?
Thanks!
1. What version of ejabberd are you using ?
2. What operating system are you using ?
> What operating system (version) are you using?
3. How did you install ejabberd (source, package, distribution) ?
> How did you install ejabberd (source, package, distribution)?
4. What did not work as expected ? What that error in the log ?
What that unexpected behaviour ? What was the expected result ? > What did not work as expected? Are there error messages in the log? What
> was the unexpected behavior? What was the expected result?

View File

@ -1,23 +1,20 @@
We are open to contribution for ejabberd, as Github pull requests (PR). We are open to contributions for ejabberd, as GitHub pull requests (PR).
Here is a few points to consider before submitting your pull request. Here are a few points to consider before submitting your PR. (You can
(You can remove the whole text after reading). remove the whole text after reading.)
1. Does this PR address an issue ? 1. Does this PR address an issue? Please reference it in the PR
Please reference it in PR description. description.
2. Have you properly described the proposed changed ? 2. Have you properly described the proposed change?
3. Please, make sure the change is atomic and does only touch the 3. Please make sure the change is atomic and does only touch the needed
needed modules. modules. If you have other changes/fixes to provide, please submit
If you have other changes / fixes to provide, please make them as them as separate PRs.
separate PR.
4. If you change or new feature involves backends, 4. If your change or new feature involves storage backends, did you make
did you make sure you change is compliant with all backends or sure your change works with all backends?
provide the feature for all backends ?
5. Do you provides tests ? 5. Do you provide tests? How can we check the behavior of the code?
How can we check the behaviour of the code ?
6. Did you consider documentation changes on project 6. Did you consider documentation changes in the
processone/docs.ejabberd.im ? processone/docs.ejabberd.im repository?

View File

@ -44,7 +44,9 @@ script:
- make - make
- make install - make install
- make xref - make xref
- make test - sed -i -e 's/ct:pal/ct:log/' test/suite.erl
- ln -sf ../sql priv/
- escript ./rebar skip_deps=true ct -v
- grep -q 'TEST COMPLETE, \([[:digit:]]*\) ok, .* of \1 ' logs/raw.log - grep -q 'TEST COMPLETE, \([[:digit:]]*\) ok, .* of \1 ' logs/raw.log
after_script: after_script:

View File

@ -1,7 +1,7 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 2.1.0-alpha\n" "Project-Id-Version: 16.02\n"
"Last-Translator: Carlos E. Lopez - suso AT jabber-hispano.org\n" "Last-Translator: Carlos E. Lopez - carlos AT suchat.org\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@ -9,7 +9,7 @@ msgstr ""
#: ejabberd_c2s.erl:505 ejabberd_c2s.erl:853 #: ejabberd_c2s.erl:505 ejabberd_c2s.erl:853
msgid "Use of STARTTLS required" msgid "Use of STARTTLS required"
msgstr "É obrigatorio usar STARTTLS" msgstr "Requírese o uso de STARTTLS"
#: ejabberd_c2s.erl:604 #: ejabberd_c2s.erl:604
msgid "No resource provided" msgid "No resource provided"
@ -26,11 +26,11 @@ msgstr "foi expulsado"
#: ejabberd_c2s.erl:2114 #: ejabberd_c2s.erl:2114
msgid "Your active privacy list has denied the routing of this stanza." msgid "Your active privacy list has denied the routing of this stanza."
msgstr "" msgstr "A súa lista de privacidade activa negou o encaminamiento desta estrofa."
#: ejabberd_c2s.erl:2429 #: ejabberd_c2s.erl:2429
msgid "Too many unacked stanzas" msgid "Too many unacked stanzas"
msgstr "" msgstr "Demasiadas mensaxes sen recoñecer recibilos"
#: ejabberd_captcha.erl:122 ejabberd_captcha.erl:245 ejabberd_captcha.erl:284 #: ejabberd_captcha.erl:122 ejabberd_captcha.erl:245 ejabberd_captcha.erl:284
msgid "Enter the text you see" msgid "Enter the text you see"
@ -43,11 +43,11 @@ msgstr ""
#: ejabberd_captcha.erl:192 #: ejabberd_captcha.erl:192
msgid "If you don't see the CAPTCHA image here, visit the web page." msgid "If you don't see the CAPTCHA image here, visit the web page."
msgstr "" msgstr "Si non ves a imaxe CAPTCHA aquí, visita a páxina web."
#: ejabberd_captcha.erl:227 #: ejabberd_captcha.erl:227
msgid "CAPTCHA web page" msgid "CAPTCHA web page"
msgstr "" msgstr "CAPTCHA páxina Web"
#: ejabberd_captcha.erl:381 #: ejabberd_captcha.erl:381
msgid "The CAPTCHA is valid." msgid "The CAPTCHA is valid."
@ -59,9 +59,8 @@ msgid "User"
msgstr "Usuario" msgstr "Usuario"
#: ejabberd_oauth.erl:256 #: ejabberd_oauth.erl:256
#, fuzzy
msgid "Server" msgid "Server"
msgstr "Servidor ~b" msgstr "Servidor"
#: ejabberd_oauth.erl:259 ejabberd_web_admin.erl:1408 mod_configure.erl:1398 #: ejabberd_oauth.erl:259 ejabberd_web_admin.erl:1408 mod_configure.erl:1398
#: mod_configure.erl:1485 mod_configure.erl:1889 mod_configure.erl:2123 #: mod_configure.erl:1485 mod_configure.erl:1889 mod_configure.erl:2123
@ -71,7 +70,7 @@ msgstr "Contrasinal"
#: ejabberd_oauth.erl:267 #: ejabberd_oauth.erl:267
msgid "Accept" msgid "Accept"
msgstr "" msgstr "Aceptar"
#: ejabberd_web_admin.erl:202 ejabberd_web_admin.erl:214 #: ejabberd_web_admin.erl:202 ejabberd_web_admin.erl:214
#: ejabberd_web_admin.erl:234 ejabberd_web_admin.erl:246 #: ejabberd_web_admin.erl:234 ejabberd_web_admin.erl:246
@ -238,7 +237,6 @@ msgid "Outgoing s2s Connections:"
msgstr "Conexións S2S saíntes:" msgstr "Conexións S2S saíntes:"
#: ejabberd_web_admin.erl:1559 #: ejabberd_web_admin.erl:1559
#, fuzzy
msgid "Incoming s2s Connections:" msgid "Incoming s2s Connections:"
msgstr "Conexións S2S saíntes:" msgstr "Conexións S2S saíntes:"
@ -253,9 +251,8 @@ msgid "Change Password"
msgstr "Cambiar contrasinal" msgstr "Cambiar contrasinal"
#: ejabberd_web_admin.erl:1673 #: ejabberd_web_admin.erl:1673
#, fuzzy
msgid "User ~s" msgid "User ~s"
msgstr "Usuario " msgstr "Usuario ~s"
#: ejabberd_web_admin.erl:1684 #: ejabberd_web_admin.erl:1684
msgid "Connected Resources:" msgid "Connected Resources:"
@ -287,9 +284,8 @@ msgid "Stopped Nodes"
msgstr "Nodos detidos" msgstr "Nodos detidos"
#: ejabberd_web_admin.erl:1833 ejabberd_web_admin.erl:1858 #: ejabberd_web_admin.erl:1833 ejabberd_web_admin.erl:1858
#, fuzzy
msgid "Node ~p" msgid "Node ~p"
msgstr "Nodo " msgstr "Nodo ~p"
#: ejabberd_web_admin.erl:1842 mod_configure.erl:150 mod_configure.erl:611 #: ejabberd_web_admin.erl:1842 mod_configure.erl:150 mod_configure.erl:611
msgid "Database" msgid "Database"
@ -297,7 +293,7 @@ msgstr "Base de datos"
#: ejabberd_web_admin.erl:1843 mod_configure.erl:159 mod_configure.erl:648 #: ejabberd_web_admin.erl:1843 mod_configure.erl:159 mod_configure.erl:648
msgid "Backup" msgid "Backup"
msgstr "Gardar copia de seguridade" msgstr "Copia de seguridade"
#: ejabberd_web_admin.erl:1845 #: ejabberd_web_admin.erl:1845
msgid "Listened Ports" msgid "Listened Ports"
@ -326,9 +322,8 @@ msgid "RPC Call Error"
msgstr "Erro na chamada RPC" msgstr "Erro na chamada RPC"
#: ejabberd_web_admin.erl:1917 #: ejabberd_web_admin.erl:1917
#, fuzzy
msgid "Database Tables at ~p" msgid "Database Tables at ~p"
msgstr "Táboas da base de datos en " msgstr "Táboas da base de datos en ~p"
#: ejabberd_web_admin.erl:1927 mod_vcard.erl:490 mod_vcard.erl:616 #: ejabberd_web_admin.erl:1927 mod_vcard.erl:490 mod_vcard.erl:616
msgid "Name" msgid "Name"
@ -336,7 +331,7 @@ msgstr "Nome"
#: ejabberd_web_admin.erl:1928 #: ejabberd_web_admin.erl:1928
msgid "Storage Type" msgid "Storage Type"
msgstr "Tipo de almacenamiento" msgstr "Tipo de almacenamento"
#: ejabberd_web_admin.erl:1929 #: ejabberd_web_admin.erl:1929
msgid "Elements" msgid "Elements"
@ -351,9 +346,8 @@ msgid "Error"
msgstr "Erro" msgstr "Erro"
#: ejabberd_web_admin.erl:1955 #: ejabberd_web_admin.erl:1955
#, fuzzy
msgid "Backup of ~p" msgid "Backup of ~p"
msgstr "Copia de seguridade de " msgstr "Copia de seguridade de ~p"
#: ejabberd_web_admin.erl:1959 #: ejabberd_web_admin.erl:1959
msgid "" msgid ""
@ -387,7 +381,7 @@ msgid ""
"Restore binary backup after next ejabberd restart (requires less memory):" "Restore binary backup after next ejabberd restart (requires less memory):"
msgstr "" msgstr ""
"Restaurar copia de seguridade binaria no seguinte reinicio de ejabberd " "Restaurar copia de seguridade binaria no seguinte reinicio de ejabberd "
"(require menos memoria que se instantánea):" "(require menos memoria):"
#: ejabberd_web_admin.erl:1999 #: ejabberd_web_admin.erl:1999
msgid "Store plain text backup:" msgid "Store plain text backup:"
@ -399,7 +393,7 @@ msgstr "Restaurar copias de seguridade de texto plano inmediatamente:"
#: ejabberd_web_admin.erl:2019 #: ejabberd_web_admin.erl:2019
msgid "Import users data from a PIEFXIS file (XEP-0227):" msgid "Import users data from a PIEFXIS file (XEP-0227):"
msgstr "Importar usuarios desde un fichero PIEFXIS" msgstr "Importar usuarios en un fichero PIEFXIS (XEP-0227):"
#: ejabberd_web_admin.erl:2032 #: ejabberd_web_admin.erl:2032
msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):" msgid "Export data of all users in the server to PIEFXIS files (XEP-0227):"
@ -409,17 +403,15 @@ msgstr ""
#: ejabberd_web_admin.erl:2044 #: ejabberd_web_admin.erl:2044
msgid "Export data of users in a host to PIEFXIS files (XEP-0227):" msgid "Export data of users in a host to PIEFXIS files (XEP-0227):"
msgstr "" msgstr "Exportar datos dos usuarios dun dominio a ficheiros PIEFXIS (XEP-0227):"
"Exportar datos de todos os usuarios do servidor a ficheros PIEFXIS "
"(XEP-0227):"
#: ejabberd_web_admin.erl:2060 #: ejabberd_web_admin.erl:2060
msgid "Export all tables as SQL queries to a file:" msgid "Export all tables as SQL queries to a file:"
msgstr "" msgstr "Exportar todas as táboas a un ficheiro SQL:"
#: ejabberd_web_admin.erl:2076 #: ejabberd_web_admin.erl:2076
msgid "Import user data from jabberd14 spool file:" msgid "Import user data from jabberd14 spool file:"
msgstr "Importar usuario de fichero spool de jabberd14:" msgstr "Importar usuario de ficheiro spool de jabberd14:"
#: ejabberd_web_admin.erl:2087 #: ejabberd_web_admin.erl:2087
msgid "Import users data from jabberd14 spool directory:" msgid "Import users data from jabberd14 spool directory:"
@ -430,9 +422,8 @@ msgid "Listened Ports at "
msgstr "Portos de escoita en " msgstr "Portos de escoita en "
#: ejabberd_web_admin.erl:2144 #: ejabberd_web_admin.erl:2144
#, fuzzy
msgid "Modules at ~p" msgid "Modules at ~p"
msgstr "Módulos en " msgstr "Módulos en ~p"
#: ejabberd_web_admin.erl:2175 #: ejabberd_web_admin.erl:2175
msgid "Statistics of ~p" msgid "Statistics of ~p"
@ -463,9 +454,8 @@ msgid "Transactions Logged:"
msgstr "Transaccións rexistradas:" msgstr "Transaccións rexistradas:"
#: ejabberd_web_admin.erl:2243 #: ejabberd_web_admin.erl:2243
#, fuzzy
msgid "Update ~p" msgid "Update ~p"
msgstr "Actualizar" msgstr "Actualizar ~p"
#: ejabberd_web_admin.erl:2254 #: ejabberd_web_admin.erl:2254
msgid "Update plan" msgid "Update plan"
@ -525,7 +515,7 @@ msgstr "Pong"
#: mod_announce.erl:523 #: mod_announce.erl:523
msgid "Really delete message of the day?" msgid "Really delete message of the day?"
msgstr "Está seguro de quere borrar a mensaxe do dia?" msgstr "¿Está seguro que quere borrar a mensaxe do dia?"
#: mod_announce.erl:536 mod_configure.erl:1238 mod_configure.erl:1298 #: mod_announce.erl:536 mod_configure.erl:1238 mod_configure.erl:1298
msgid "Subject" msgid "Subject"
@ -553,7 +543,7 @@ msgstr "Enviar anuncio a todos os usuarios en todos os dominios"
#: mod_announce.erl:668 #: mod_announce.erl:668
msgid "Send announcement to all online users" msgid "Send announcement to all online users"
msgstr "Enviar anuncio a todos los usuarios conectados" msgstr "Enviar anuncio a todos os usuarios conectados"
#: mod_announce.erl:670 mod_configure.erl:1231 mod_configure.erl:1291 #: mod_announce.erl:670 mod_configure.erl:1231 mod_configure.erl:1291
msgid "Send announcement to all online users on all hosts" msgid "Send announcement to all online users on all hosts"
@ -595,7 +585,7 @@ msgstr "Iniciar módulos"
#: mod_configure.erl:156 mod_configure.erl:638 #: mod_configure.erl:156 mod_configure.erl:638
msgid "Stop Modules" msgid "Stop Modules"
msgstr "Detener módulos" msgstr "Deter módulos"
#: mod_configure.erl:162 mod_configure.erl:650 #: mod_configure.erl:162 mod_configure.erl:650
msgid "Restore" msgid "Restore"
@ -844,18 +834,20 @@ msgid ""
"Too many (~p) failed authentications from this IP address (~s). The address " "Too many (~p) failed authentications from this IP address (~s). The address "
"will be unblocked at ~s UTC" "will be unblocked at ~s UTC"
msgstr "" msgstr ""
"Demasiados (~p) fallou autenticaciones desde esta dirección IP (~s). A dirección "
"será desbloqueada as ~s UTC"
#: mod_http_upload.erl:586 #: mod_http_upload.erl:586
msgid "Please specify file size." msgid "Please specify file size."
msgstr "" msgstr "Por favor, especifica o tamaño do arquivo"
#: mod_http_upload.erl:590 #: mod_http_upload.erl:590
msgid "Please specify file name." msgid "Please specify file name."
msgstr "" msgstr "Por favor, indique o nome do arquivo."
#: mod_ip_blacklist.erl:121 #: mod_ip_blacklist.erl:121
msgid "This IP address is blacklisted in ~s" msgid "This IP address is blacklisted in ~s"
msgstr "" msgstr "Esta dirección IP está na lista negra en ~s"
#: mod_irc.erl:220 mod_muc.erl:467 #: mod_irc.erl:220 mod_muc.erl:467
msgid "Access denied by service policy" msgid "Access denied by service policy"
@ -884,8 +876,8 @@ msgid ""
"Enter username, encodings, ports and passwords you wish to use for " "Enter username, encodings, ports and passwords you wish to use for "
"connecting to IRC servers" "connecting to IRC servers"
msgstr "" msgstr ""
"Introduza o nome de usuario, codificaciones de carácter, portos e " "Introduce o nome de usuario, codificaciones de carácteres, portos e "
"contrasinal que pretende utilizar a conectar a servidores de IRC" "contrasinai que queiras usar ao conectar nos servidores de IRC"
#: mod_irc.erl:667 #: mod_irc.erl:667
msgid "IRC Username" msgid "IRC Username"
@ -970,9 +962,8 @@ msgid "Server ~b"
msgstr "Servidor ~b" msgstr "Servidor ~b"
#: mod_mam.erl:541 #: mod_mam.erl:541
#, fuzzy
msgid "Only members may query archives of this room" msgid "Only members may query archives of this room"
msgstr "Só os moderadores están autorizados a cambiar o tema nesta sala" msgstr "Só membros poden consultar o arquivo de mensaxes da sala"
#: mod_muc.erl:585 #: mod_muc.erl:585
msgid "Only service administrators are allowed to send service messages" msgid "Only service administrators are allowed to send service messages"
@ -994,10 +985,9 @@ msgstr "Salas de charla"
#: mod_muc.erl:781 #: mod_muc.erl:781
msgid "Empty Rooms" msgid "Empty Rooms"
msgstr "" msgstr "Salas baleiras"
#: mod_muc.erl:933 #: mod_muc.erl:933
#, fuzzy
msgid "You need a client that supports x:data to register the nickname" msgid "You need a client that supports x:data to register the nickname"
msgstr "" msgstr ""
"Necesitas un cliente con soporte de x:data para poder rexistrar o alcume" "Necesitas un cliente con soporte de x:data para poder rexistrar o alcume"
@ -1030,34 +1020,31 @@ msgstr "Módulo de MUC para ejabberd"
#: mod_muc_admin.erl:231 mod_muc_admin.erl:234 mod_muc_admin.erl:246 #: mod_muc_admin.erl:231 mod_muc_admin.erl:234 mod_muc_admin.erl:246
#: mod_muc_admin.erl:320 #: mod_muc_admin.erl:320
msgid "Multi-User Chat" msgid "Multi-User Chat"
msgstr "" msgstr "Salas de Charla"
#: mod_muc_admin.erl:249 #: mod_muc_admin.erl:249
#, fuzzy
msgid "Total rooms" msgid "Total rooms"
msgstr "Salas de charla" msgstr "Salas totais"
#: mod_muc_admin.erl:250 #: mod_muc_admin.erl:250
#, fuzzy
msgid "Permanent rooms" msgid "Permanent rooms"
msgstr "sae da sala" msgstr "Salas permanentes"
#: mod_muc_admin.erl:251 #: mod_muc_admin.erl:251
#, fuzzy
msgid "Registered nicknames" msgid "Registered nicknames"
msgstr "Usuarios rexistrados" msgstr "Alcumes rexistrados"
#: mod_muc_admin.erl:254 #: mod_muc_admin.erl:254
msgid "List of rooms" msgid "List of rooms"
msgstr "" msgstr "Lista de salas"
#: mod_muc_log.erl:398 mod_muc_log.erl:407 #: mod_muc_log.erl:398 mod_muc_log.erl:407
msgid "Chatroom configuration modified" msgid "Chatroom configuration modified"
msgstr "Configuración de la sala modificada" msgstr "Configuración da sala modificada"
#: mod_muc_log.erl:410 #: mod_muc_log.erl:410
msgid "joins the room" msgid "joins the room"
msgstr "entra en la sala" msgstr "entra na sala"
#: mod_muc_log.erl:413 mod_muc_log.erl:416 #: mod_muc_log.erl:413 mod_muc_log.erl:416
msgid "leaves the room" msgid "leaves the room"
@ -1077,7 +1064,7 @@ msgstr "foi expulsado, porque a sala cambiouse a só-membros"
#: mod_muc_log.erl:445 #: mod_muc_log.erl:445
msgid "has been kicked because of a system shutdown" msgid "has been kicked because of a system shutdown"
msgstr "foi expulsado por mor dun sistema de peche" msgstr "foi expulsado porque o sistema vaise a deter"
#: mod_muc_log.erl:450 #: mod_muc_log.erl:450
msgid "is now known as" msgid "is now known as"
@ -1088,24 +1075,20 @@ msgid " has set the subject to: "
msgstr " puxo o asunto: " msgstr " puxo o asunto: "
#: mod_muc_log.erl:493 #: mod_muc_log.erl:493
#, fuzzy
msgid "Chatroom is created" msgid "Chatroom is created"
msgstr "Salas de charla" msgstr "Creouse a sala"
#: mod_muc_log.erl:495 #: mod_muc_log.erl:495
#, fuzzy
msgid "Chatroom is destroyed" msgid "Chatroom is destroyed"
msgstr "Salas de charla" msgstr "Destruíuse a sala"
#: mod_muc_log.erl:497 #: mod_muc_log.erl:497
#, fuzzy
msgid "Chatroom is started" msgid "Chatroom is started"
msgstr "Salas de charla" msgstr "Iniciouse a sala"
#: mod_muc_log.erl:499 #: mod_muc_log.erl:499
#, fuzzy
msgid "Chatroom is stopped" msgid "Chatroom is stopped"
msgstr "Salas de charla" msgstr "Detívose a sala"
#: mod_muc_log.erl:503 #: mod_muc_log.erl:503
msgid "Monday" msgid "Monday"
@ -1200,6 +1183,8 @@ msgid ""
"It is not allowed to send error messages to the room. The participant (~s) " "It is not allowed to send error messages to the room. The participant (~s) "
"has sent an error message (~s) and got kicked from the room" "has sent an error message (~s) and got kicked from the room"
msgstr "" msgstr ""
"Non está permitido enviar mensaxes de erro á sala. Este participante (~s) "
"enviou unha mensaxe de erro (~s) e foi expulsado da sala"
#: mod_muc_room.erl:241 #: mod_muc_room.erl:241
msgid "It is not allowed to send private messages to the conference" msgid "It is not allowed to send private messages to the conference"
@ -1207,20 +1192,19 @@ msgstr "Impedir o envio de mensaxes privadas á sala"
#: mod_muc_room.erl:316 #: mod_muc_room.erl:316
msgid "Please, wait for a while before sending new voice request" msgid "Please, wait for a while before sending new voice request"
msgstr "" msgstr "Por favor, espera un pouco antes de enviar outra petición de voz"
#: mod_muc_room.erl:329 #: mod_muc_room.erl:329
msgid "Voice requests are disabled in this conference" msgid "Voice requests are disabled in this conference"
msgstr "" msgstr "As peticións de voz están desactivadas nesta sala"
#: mod_muc_room.erl:347 #: mod_muc_room.erl:347
msgid "Failed to extract JID from your voice request approval" msgid "Failed to extract JID from your voice request approval"
msgstr "" msgstr "Fallo ao extraer o Jabber ID da túa aprobación de petición de voz"
#: mod_muc_room.erl:377 #: mod_muc_room.erl:377
#, fuzzy
msgid "Only moderators can approve voice requests" msgid "Only moderators can approve voice requests"
msgstr "Permitir aos usuarios enviar invitacións" msgstr "Só os moderadores poden aprobar peticións de voz"
#: mod_muc_room.erl:389 #: mod_muc_room.erl:389
msgid "Improper message type" msgid "Improper message type"
@ -1269,11 +1253,11 @@ msgstr "Os visitantes non poden enviar mensaxes a todos os ocupantes"
#: mod_muc_room.erl:1080 #: mod_muc_room.erl:1080
msgid "Visitors are not allowed to change their nicknames in this room" msgid "Visitors are not allowed to change their nicknames in this room"
msgstr "" msgstr ""
"Os visitantes non están autorizados a cambiar os seus That alcumes nesta sala" "Os visitantes non teñen permitido cambiar os seus alcumes nesta sala"
#: mod_muc_room.erl:1093 mod_muc_room.erl:1835 #: mod_muc_room.erl:1093 mod_muc_room.erl:1835
msgid "That nickname is already in use by another occupant" msgid "That nickname is already in use by another occupant"
msgstr "Ese alcume que xa está en uso por outro ocupante" msgstr "Ese alcume xa está a ser usado por outro ocupante"
#: mod_muc_room.erl:1822 #: mod_muc_room.erl:1822
msgid "You have been banned from this room" msgid "You have been banned from this room"
@ -1289,12 +1273,11 @@ msgstr "Necesítase contrasinal para entrar nesta sala"
#: mod_muc_room.erl:1898 mod_register.erl:295 #: mod_muc_room.erl:1898 mod_register.erl:295
msgid "Too many CAPTCHA requests" msgid "Too many CAPTCHA requests"
msgstr "" msgstr "Demasiadas peticións de CAPTCHA"
#: mod_muc_room.erl:1908 mod_register.erl:301 #: mod_muc_room.erl:1908 mod_register.erl:301
#, fuzzy
msgid "Unable to generate a CAPTCHA" msgid "Unable to generate a CAPTCHA"
msgstr "Non se pode xerar un CAPTCHA" msgstr "No se pudo generar un CAPTCHA"
#: mod_muc_room.erl:1919 #: mod_muc_room.erl:1919
msgid "Incorrect password" msgid "Incorrect password"
@ -1378,20 +1361,19 @@ msgstr "calquera"
#: mod_muc_room.erl:3471 #: mod_muc_room.erl:3471
msgid "Roles for which Presence is Broadcasted" msgid "Roles for which Presence is Broadcasted"
msgstr "" msgstr "Roles para os que si se difunde a súa Presenza"
#: mod_muc_room.erl:3486 #: mod_muc_room.erl:3486
#, fuzzy
msgid "Moderator" msgid "Moderator"
msgstr "só moderadores" msgstr "Moderator"
#: mod_muc_room.erl:3496 #: mod_muc_room.erl:3496
msgid "Participant" msgid "Participant"
msgstr "" msgstr "Participante"
#: mod_muc_room.erl:3506 #: mod_muc_room.erl:3506
msgid "Visitor" msgid "Visitor"
msgstr "" msgstr "Visitante"
#: mod_muc_room.erl:3513 #: mod_muc_room.erl:3513
msgid "Make room members-only" msgid "Make room members-only"
@ -1414,13 +1396,12 @@ msgid "Allow users to send private messages"
msgstr "Permitir aos usuarios enviar mensaxes privadas" msgstr "Permitir aos usuarios enviar mensaxes privadas"
#: mod_muc_room.erl:3533 #: mod_muc_room.erl:3533
#, fuzzy
msgid "Allow visitors to send private messages to" msgid "Allow visitors to send private messages to"
msgstr "Permitir aos usuarios enviar mensaxes privadas" msgstr "Permitir aos visitantes enviar mensaxes privadas a"
#: mod_muc_room.erl:3551 #: mod_muc_room.erl:3551
msgid "nobody" msgid "nobody"
msgstr "" msgstr "ninguén"
#: mod_muc_room.erl:3576 #: mod_muc_room.erl:3576
msgid "Allow users to query other users" msgid "Allow users to query other users"
@ -1440,13 +1421,12 @@ msgid "Allow visitors to change nickname"
msgstr "Permitir aos visitantes cambiarse o alcume" msgstr "Permitir aos visitantes cambiarse o alcume"
#: mod_muc_room.erl:3589 #: mod_muc_room.erl:3589
#, fuzzy
msgid "Allow visitors to send voice requests" msgid "Allow visitors to send voice requests"
msgstr "Permitir aos usuarios enviar invitacións" msgstr "Permitir aos visitantes enviar peticións de voz"
#: mod_muc_room.erl:3592 #: mod_muc_room.erl:3592
msgid "Minimum interval between voice requests (in seconds)" msgid "Minimum interval between voice requests (in seconds)"
msgstr "" msgstr "Intervalo mínimo entre peticións de voz (en segundos)"
#: mod_muc_room.erl:3599 #: mod_muc_room.erl:3599
msgid "Make room CAPTCHA protected" msgid "Make room CAPTCHA protected"
@ -1454,11 +1434,11 @@ msgstr "Protexer a sala con CAPTCHA"
#: mod_muc_room.erl:3606 #: mod_muc_room.erl:3606
msgid "Enable message archiving" msgid "Enable message archiving"
msgstr "" msgstr "Activar o almacenamento de mensaxes"
#: mod_muc_room.erl:3612 #: mod_muc_room.erl:3612
msgid "Exclude Jabber IDs from CAPTCHA challenge" msgid "Exclude Jabber IDs from CAPTCHA challenge"
msgstr "" msgstr "Excluír Jabber IDs das probas de CAPTCHA"
#: mod_muc_room.erl:3621 #: mod_muc_room.erl:3621
msgid "Enable logging" msgid "Enable logging"
@ -1478,20 +1458,19 @@ msgstr "privado"
#: mod_muc_room.erl:4326 #: mod_muc_room.erl:4326
msgid "Voice request" msgid "Voice request"
msgstr "" msgstr "Petición de voz"
#: mod_muc_room.erl:4331 #: mod_muc_room.erl:4331
msgid "Either approve or decline the voice request." msgid "Either approve or decline the voice request."
msgstr "" msgstr "Aproba ou rexeita a petición de voz."
#: mod_muc_room.erl:4351 #: mod_muc_room.erl:4351
#, fuzzy
msgid "User JID" msgid "User JID"
msgstr "Usuario " msgstr "Jabber ID do usuario"
#: mod_muc_room.erl:4355 #: mod_muc_room.erl:4355
msgid "Grant voice to this person?" msgid "Grant voice to this person?"
msgstr "" msgstr "¿Conceder voz a esta persoa?"
#: mod_muc_room.erl:4498 #: mod_muc_room.erl:4498
msgid "~s invites you to the room ~s" msgid "~s invites you to the room ~s"
@ -1503,11 +1482,11 @@ msgstr "a contrasinal é"
#: mod_multicast.erl:291 #: mod_multicast.erl:291
msgid "Multicast" msgid "Multicast"
msgstr "" msgstr "Multicast"
#: mod_multicast.erl:306 #: mod_multicast.erl:306
msgid "ejabberd Multicast service" msgid "ejabberd Multicast service"
msgstr "" msgstr "Servizo Multicast de ejabberd"
#: mod_offline.erl:647 #: mod_offline.erl:647
msgid "" msgid ""
@ -1546,7 +1525,7 @@ msgstr "Borrar Todas as Mensaxes Sen conexión"
#: mod_proxy65_service.erl:248 #: mod_proxy65_service.erl:248
msgid "ejabberd SOCKS5 Bytestreams module" msgid "ejabberd SOCKS5 Bytestreams module"
msgstr "ejabberd SOCKS5 Bytestreams module" msgstr "Módulo SOCKS5 Bytestreams para ejabberd"
#: mod_pubsub.erl:1102 #: mod_pubsub.erl:1102
msgid "Publish-Subscribe" msgid "Publish-Subscribe"
@ -1566,7 +1545,7 @@ msgstr "Decidir se aprobar a subscripción desta entidade."
#: mod_pubsub.erl:1559 #: mod_pubsub.erl:1559
msgid "Node ID" msgid "Node ID"
msgstr "Nodo IDE" msgstr "Nodo ID"
#: mod_pubsub.erl:1571 #: mod_pubsub.erl:1571
msgid "Subscriber Address" msgid "Subscriber Address"
@ -1602,7 +1581,7 @@ msgstr "Persistir elementos ao almacenar"
#: mod_pubsub.erl:3757 #: mod_pubsub.erl:3757
msgid "A friendly name for the node" msgid "A friendly name for the node"
msgstr "Un nome para o nodo" msgstr "Un nome sinxelo para o nodo"
#: mod_pubsub.erl:3759 #: mod_pubsub.erl:3759
msgid "Max # of items to persist" msgid "Max # of items to persist"
@ -1626,12 +1605,11 @@ msgstr "Especificar o modelo do publicante"
#: mod_pubsub.erl:3769 #: mod_pubsub.erl:3769
msgid "Purge all items when the relevant publisher goes offline" msgid "Purge all items when the relevant publisher goes offline"
msgstr "" msgstr "Purgar todos os elementos cando o editor correspondente desconéctase"
#: mod_pubsub.erl:3771 #: mod_pubsub.erl:3771
#, fuzzy
msgid "Specify the event message type" msgid "Specify the event message type"
msgstr "Especifica o modelo de acceso" msgstr "Especifica o tipo da mensaxe de evento"
#: mod_pubsub.erl:3773 #: mod_pubsub.erl:3773
msgid "Max payload size in bytes" msgid "Max payload size in bytes"
@ -1650,15 +1628,13 @@ msgid "The collections with which a node is affiliated"
msgstr "As coleccións coas que un nodo está afiliado" msgstr "As coleccións coas que un nodo está afiliado"
#: mod_register.erl:209 #: mod_register.erl:209
#, fuzzy
msgid "The CAPTCHA verification has failed" msgid "The CAPTCHA verification has failed"
msgstr "O CAPTCHA é válido." msgstr "A verificación de CAPTCHA fallou"
#: mod_register.erl:253 #: mod_register.erl:253
#, fuzzy
msgid "You need a client that supports x:data and CAPTCHA to register" msgid "You need a client that supports x:data and CAPTCHA to register"
msgstr "" msgstr ""
"Necesitas un cliente con soporte de x:data para poder rexistrar o alcume" "Necesitas un cliente con soporte de x:data e CAPTCHA para rexistrarche"
#: mod_register.erl:259 mod_register.erl:320 #: mod_register.erl:259 mod_register.erl:320
msgid "Choose a username and password to register with this server" msgid "Choose a username and password to register with this server"
@ -1666,9 +1642,8 @@ msgstr ""
"Escolle un nome de usuario e contrasinal para rexistrarche neste servidor" "Escolle un nome de usuario e contrasinal para rexistrarche neste servidor"
#: mod_register.erl:373 mod_register.erl:421 #: mod_register.erl:373 mod_register.erl:421
#, fuzzy
msgid "The password is too weak" msgid "The password is too weak"
msgstr "a contrasinal é" msgstr "O contrasinal é demasiado débil"
#: mod_register.erl:426 #: mod_register.erl:426
msgid "Users are not allowed to register accounts so quickly" msgid "Users are not allowed to register accounts so quickly"
@ -1676,39 +1651,39 @@ msgstr "Os usuarios non están autorizados a rexistrar contas con tanta rapidez"
#: mod_register_web.erl:105 #: mod_register_web.erl:105
msgid "Your Jabber account was successfully created." msgid "Your Jabber account was successfully created."
msgstr "" msgstr "A súa conta Jabber creouse correctamente."
#: mod_register_web.erl:110 #: mod_register_web.erl:110
msgid "There was an error creating the account: " msgid "There was an error creating the account: "
msgstr "" msgstr "Produciuse un erro ao crear a conta: "
#: mod_register_web.erl:119 #: mod_register_web.erl:119
msgid "Your Jabber account was successfully deleted." msgid "Your Jabber account was successfully deleted."
msgstr "" msgstr "A súa conta Jabber eliminouse correctamente."
#: mod_register_web.erl:124 #: mod_register_web.erl:124
msgid "There was an error deleting the account: " msgid "There was an error deleting the account: "
msgstr "" msgstr "Produciuse un erro ao eliminar a conta: "
#: mod_register_web.erl:135 #: mod_register_web.erl:135
msgid "The password of your Jabber account was successfully changed." msgid "The password of your Jabber account was successfully changed."
msgstr "" msgstr "O contrasinal da súa conta Jabber cambiouse correctamente."
#: mod_register_web.erl:140 #: mod_register_web.erl:140
msgid "There was an error changing the password: " msgid "There was an error changing the password: "
msgstr "" msgstr "Produciuse un erro ao cambiar o contrasinal: "
#: mod_register_web.erl:175 mod_register_web.erl:183 #: mod_register_web.erl:175 mod_register_web.erl:183
msgid "Jabber Account Registration" msgid "Jabber Account Registration"
msgstr "" msgstr "Rexistro de conta Jabber"
#: mod_register_web.erl:186 mod_register_web.erl:204 mod_register_web.erl:212 #: mod_register_web.erl:186 mod_register_web.erl:204 mod_register_web.erl:212
msgid "Register a Jabber account" msgid "Register a Jabber account"
msgstr "" msgstr "Rexistrar unha conta Jabber"
#: mod_register_web.erl:191 mod_register_web.erl:453 mod_register_web.erl:461 #: mod_register_web.erl:191 mod_register_web.erl:453 mod_register_web.erl:461
msgid "Unregister a Jabber account" msgid "Unregister a Jabber account"
msgstr "" msgstr "Eliminar o rexistro dunha conta Jabber"
#: mod_register_web.erl:214 #: mod_register_web.erl:214
msgid "" msgid ""
@ -1716,40 +1691,45 @@ msgid ""
"(Jabber IDentifier) will be of the form: username@server. Please read " "(Jabber IDentifier) will be of the form: username@server. Please read "
"carefully the instructions to fill correctly the fields." "carefully the instructions to fill correctly the fields."
msgstr "" msgstr ""
"Esta páxina permite crear unha conta Jabber neste servidor Jabber. o seu JID "
"(Jabber IDentificador) será da forma: nomeusuario@servidor. Por favor le "
"coidadosamente as instrucións para encher correctamente os campos."
#: mod_register_web.erl:224 mod_register_web.erl:360 mod_register_web.erl:469 #: mod_register_web.erl:224 mod_register_web.erl:360 mod_register_web.erl:469
#, fuzzy
msgid "Username:" msgid "Username:"
msgstr "Nome de usuario en IRC" msgstr "Nome de usuario:"
#: mod_register_web.erl:230 #: mod_register_web.erl:230
msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth." msgid "This is case insensitive: macbeth is the same that MacBeth and Macbeth."
msgstr "" msgstr "Esta é insensible: Macbeth é o mesmo que MacBeth e Macbeth."
#: mod_register_web.erl:233 #: mod_register_web.erl:233
msgid "Characters not allowed:" msgid "Characters not allowed:"
msgstr "" msgstr "Caracteres non permitidos:"
#: mod_register_web.erl:236 mod_register_web.erl:364 mod_register_web.erl:473 #: mod_register_web.erl:236 mod_register_web.erl:364 mod_register_web.erl:473
#, fuzzy
msgid "Server:" msgid "Server:"
msgstr "Servidor ~b" msgstr "Servidor:"
#: mod_register_web.erl:245 #: mod_register_web.erl:245
msgid "" msgid ""
"Don't tell your password to anybody, not even the administrators of the " "Don't tell your password to anybody, not even the administrators of the "
"Jabber server." "Jabber Server."
msgstr "" msgstr ""
"Non lle diga o seu contrasinal a ninguén, nin sequera os administradores do "
"Servidor Jabber."
#: mod_register_web.erl:249 #: mod_register_web.erl:249
msgid "You can later change your password using a Jabber client." msgid "You can later change your password using a Jabber client."
msgstr "" msgstr "Máis tarde, pode cambiar o seu contrasinal utilizando un cliente Jabber."
#: mod_register_web.erl:252 #: mod_register_web.erl:252
msgid "" msgid ""
"Some Jabber clients can store your password in the computer, but you should " "Some Jabber clients can store your password in the computer, but you should "
"do this only in your personal computer for safety reasons." "do this only in your personal computer for safety reasons."
msgstr "" msgstr ""
"Algúns clientes Jabber pode almacenar o contrasinal no computador, pero debe "
"facer isto só no seu computador persoal por razóns de seguridade."
#: mod_register_web.erl:256 #: mod_register_web.erl:256
msgid "" msgid ""
@ -1757,34 +1737,33 @@ msgid ""
"Jabber there isn't an automated way to recover your password if you forget " "Jabber there isn't an automated way to recover your password if you forget "
"it." "it."
msgstr "" msgstr ""
"Memorice o seu contrasinal ou escribilo nun papel colocado nun lugar seguro. En "
"Jabber non hai unha forma automatizada para recuperar o seu contrasinal si "
"a esquece"
#: mod_register_web.erl:262 mod_register_web.erl:374 #: mod_register_web.erl:262 mod_register_web.erl:374
#, fuzzy
msgid "Password Verification:" msgid "Password Verification:"
msgstr "Verificación da contrasinal" msgstr "Verificación da contrasinal"
#: mod_register_web.erl:269 #: mod_register_web.erl:269
#, fuzzy
msgid "Register" msgid "Register"
msgstr "Lista de contactos" msgstr "Rexistrar"
#: mod_register_web.erl:366 #: mod_register_web.erl:366
#, fuzzy
msgid "Old Password:" msgid "Old Password:"
msgstr "Contrasinal:" msgstr "Contrasinal anterior:"
#: mod_register_web.erl:370 #: mod_register_web.erl:370
#, fuzzy
msgid "New Password:" msgid "New Password:"
msgstr "Contrasinal:" msgstr "Novo contrasinal:"
#: mod_register_web.erl:463 #: mod_register_web.erl:463
msgid "This page allows to unregister a Jabber account in this Jabber server." msgid "This page allows to unregister a Jabber account in this Jabber server."
msgstr "" msgstr "Esta páxina permite anular o rexistro dunha conta Jabber neste servidor Jabber."
#: mod_register_web.erl:480 #: mod_register_web.erl:480
msgid "Unregister" msgid "Unregister"
msgstr "" msgstr "Eliminar rexistro"
#: mod_roster.erl:1436 #: mod_roster.erl:1436
msgid "Subscription" msgid "Subscription"
@ -1872,8 +1851,8 @@ msgid ""
"Fill in the form to search for any matching Jabber User (Add * to the end of " "Fill in the form to search for any matching Jabber User (Add * to the end of "
"field to match substring)" "field to match substring)"
msgstr "" msgstr ""
"Enche o formulario para buscar usuarios Jabber. Engade * ao final dun campo " "Enche o formulario para buscar usuarios Jabber (Engade * ao final dun campo "
"para buscar subcadenas." "para buscar subcadenas)"
#: mod_vcard.erl:490 mod_vcard.erl:615 #: mod_vcard.erl:490 mod_vcard.erl:615
msgid "Full Name" msgid "Full Name"
@ -1901,7 +1880,7 @@ msgstr "Necesitas un cliente con soporte de x:data para poder buscar"
#: mod_vcard.erl:519 mod_vcard_ldap.erl:531 #: mod_vcard.erl:519 mod_vcard_ldap.erl:531
msgid "vCard User Search" msgid "vCard User Search"
msgstr "Procura de usuario en vCard" msgstr "vCard busqueda de usuario"
#: mod_vcard.erl:580 mod_vcard_ldap.erl:586 #: mod_vcard.erl:580 mod_vcard_ldap.erl:586
msgid "ejabberd vCard module" msgid "ejabberd vCard module"
@ -1942,7 +1921,6 @@ msgstr "Rechea campos para buscar usuarios Jabber que concuerden"
#~ "Este participante é expulsado da sala, porque el enviou un erro de " #~ "Este participante é expulsado da sala, porque el enviou un erro de "
#~ "presenza" #~ "presenza"
#, fuzzy
#~ msgid "CAPTCHA test failed" #~ msgid "CAPTCHA test failed"
#~ msgstr "O CAPTCHA é válido." #~ msgstr "O CAPTCHA é válido."

View File

@ -178,6 +178,7 @@ bounce_resource_packet(From, To, Packet) ->
init([]) -> init([]) ->
lists:foreach(fun (Host) -> lists:foreach(fun (Host) ->
ejabberd_router:register_route(Host, ejabberd_router:register_route(Host,
Host,
{apply, ?MODULE, {apply, ?MODULE,
route}), route}),
ejabberd_hooks:add(local_send_to_resource_hook, Host, ejabberd_hooks:add(local_send_to_resource_hook, Host,

View File

@ -36,7 +36,9 @@
route_error/4, route_error/4,
register_route/1, register_route/1,
register_route/2, register_route/2,
register_route/3,
register_routes/1, register_routes/1,
host_of_route/1,
unregister_route/1, unregister_route/1,
unregister_routes/1, unregister_routes/1,
dirty_get_all_routes/0, dirty_get_all_routes/0,
@ -55,7 +57,7 @@
-type local_hint() :: undefined | integer() | {apply, atom(), atom()}. -type local_hint() :: undefined | integer() | {apply, atom(), atom()}.
-record(route, {domain, pid, local_hint}). -record(route, {domain, server_host, pid, local_hint}).
-record(state, {}). -record(state, {}).
@ -94,19 +96,29 @@ route_error(From, To, ErrPacket, OrigPacket) ->
-spec register_route(binary()) -> term(). -spec register_route(binary()) -> term().
register_route(Domain) -> register_route(Domain) ->
register_route(Domain, undefined). ?WARNING_MSG("~s:register_route/1 is deprected, "
"use ~s:register_route/2 instead",
[?MODULE, ?MODULE]),
register_route(Domain, ?MYNAME).
-spec register_route(binary(), local_hint()) -> term(). -spec register_route(binary(), binary()) -> term().
register_route(Domain, LocalHint) -> register_route(Domain, ServerHost) ->
case jid:nameprep(Domain) of register_route(Domain, ServerHost, undefined).
error -> erlang:error({invalid_domain, Domain});
LDomain -> -spec register_route(binary(), binary(), local_hint()) -> term().
register_route(Domain, ServerHost, LocalHint) ->
case {jid:nameprep(Domain), jid:nameprep(ServerHost)} of
{error, _} -> erlang:error({invalid_domain, Domain});
{_, error} -> erlang:error({invalid_domain, ServerHost});
{LDomain, LServerHost} ->
Pid = self(), Pid = self(),
case get_component_number(LDomain) of case get_component_number(LDomain) of
undefined -> undefined ->
F = fun () -> F = fun () ->
mnesia:write(#route{domain = LDomain, pid = Pid, mnesia:write(#route{domain = LDomain, pid = Pid,
server_host = LServerHost,
local_hint = LocalHint}) local_hint = LocalHint})
end, end,
mnesia:transaction(F); mnesia:transaction(F);
@ -115,31 +127,27 @@ register_route(Domain, LocalHint) ->
case mnesia:wread({route, LDomain}) of case mnesia:wread({route, LDomain}) of
[] -> [] ->
mnesia:write(#route{domain = LDomain, mnesia:write(#route{domain = LDomain,
server_host = LServerHost,
pid = Pid, pid = Pid,
local_hint = 1}), local_hint = 1}),
lists:foreach(fun (I) -> lists:foreach(
mnesia:write(#route{domain fun (I) ->
= mnesia:write(
LDomain, #route{domain = LDomain,
pid pid = undefined,
= server_host = LServerHost,
undefined, local_hint = I})
local_hint
=
I})
end, end,
lists:seq(2, N)); lists:seq(2, N));
Rs -> Rs ->
lists:any(fun (#route{pid = undefined, lists:any(
local_hint = I} = fun (#route{pid = undefined,
R) -> local_hint = I} = R) ->
mnesia:write(#route{domain = mnesia:write(
LDomain, #route{domain = LDomain,
pid = pid = Pid,
Pid, server_host = LServerHost,
local_hint local_hint = I}),
=
I}),
mnesia:delete_object(R), mnesia:delete_object(R),
true; true;
(_) -> false (_) -> false
@ -151,10 +159,10 @@ register_route(Domain, LocalHint) ->
end end
end. end.
-spec register_routes([binary()]) -> ok. -spec register_routes([{binary(), binary()}]) -> ok.
register_routes(Domains) -> register_routes(Domains) ->
lists:foreach(fun (Domain) -> register_route(Domain) lists:foreach(fun ({Domain, ServerHost}) -> register_route(Domain, ServerHost)
end, end,
Domains). Domains).
@ -183,7 +191,9 @@ unregister_route(Domain) ->
of of
[R] -> [R] ->
I = R#route.local_hint, I = R#route.local_hint,
ServerHost = R#route.server_host,
mnesia:write(#route{domain = LDomain, mnesia:write(#route{domain = LDomain,
server_host = ServerHost,
pid = undefined, pid = undefined,
local_hint = I}), local_hint = I}),
mnesia:delete_object(R); mnesia:delete_object(R);
@ -211,6 +221,20 @@ dirty_get_all_routes() ->
dirty_get_all_domains() -> dirty_get_all_domains() ->
lists:usort(mnesia:dirty_all_keys(route)). lists:usort(mnesia:dirty_all_keys(route)).
-spec host_of_route(binary()) -> binary().
host_of_route(Domain) ->
case jid:nameprep(Domain) of
error ->
erlang:error({invalid_domain, Domain});
LDomain ->
case mnesia:dirty_read(route, LDomain) of
[#route{server_host = ServerHost}|_] ->
ServerHost;
[] ->
erlang:error({unregistered_route, Domain})
end
end.
%%==================================================================== %%====================================================================
%% gen_server callbacks %% gen_server callbacks
@ -283,8 +307,11 @@ handle_info({'DOWN', _Ref, _Type, Pid, _Info}, State) ->
if is_integer(E#route.local_hint) -> if is_integer(E#route.local_hint) ->
LDomain = E#route.domain, LDomain = E#route.domain,
I = E#route.local_hint, I = E#route.local_hint,
ServerHost = E#route.server_host,
mnesia:write(#route{domain = mnesia:write(#route{domain =
LDomain, LDomain,
server_host =
ServerHost,
pid = pid =
undefined, undefined,
local_hint = local_hint =
@ -394,12 +421,10 @@ get_component_number(LDomain) ->
undefined). undefined).
update_tables() -> update_tables() ->
case catch mnesia:table_info(route, attributes) of try
[domain, node, pid] -> mnesia:delete_table(route); mnesia:transform_table(route, ignore, record_info(fields, route))
[domain, pid] -> mnesia:delete_table(route); catch exit:{aborted, {no_exists, _}} ->
[domain, pid, local_hint] -> ok; ok
[domain, pid, local_hint|_] -> mnesia:delete_table(route);
{'EXIT', _} -> ok
end, end,
case lists:member(local_route, case lists:member(local_route,
mnesia:system_info(tables)) mnesia:system_info(tables))

View File

@ -222,7 +222,7 @@ wait_for_handshake({xmlstreamelement, El}, StateData) ->
send_text(StateData, <<"<handshake/>">>), send_text(StateData, <<"<handshake/>">>),
lists:foreach( lists:foreach(
fun (H) -> fun (H) ->
ejabberd_router:register_route(H), ejabberd_router:register_route(H, ?MYNAME),
?INFO_MSG("Route registered for service ~p~n", ?INFO_MSG("Route registered for service ~p~n",
[H]) [H])
end, dict:fetch_keys(StateData#state.host_opts)), end, dict:fetch_keys(StateData#state.host_opts)),

View File

@ -186,18 +186,24 @@ process_large_heap(Pid, Info) ->
"much memory:~n~p~n~s", "much memory:~n~p~n~s",
[node(), Pid, Info, DetailedInfo])), [node(), Pid, Info, DetailedInfo])),
From = jid:make(<<"">>, Host, <<"watchdog">>), From = jid:make(<<"">>, Host, <<"watchdog">>),
Hint = [#xmlel{name = <<"no-permanent-store">>,
attrs = [{<<"xmlns">>, ?NS_HINTS}]}],
lists:foreach(fun (JID) -> lists:foreach(fun (JID) ->
send_message(From, jid:make(JID), Body) send_message(From, jid:make(JID), Body, Hint)
end, JIDs). end, JIDs).
send_message(From, To, Body) -> send_message(From, To, Body) ->
send_message(From, To, Body, []).
send_message(From, To, Body, ExtraEls) ->
ejabberd_router:route(From, To, ejabberd_router:route(From, To,
#xmlel{name = <<"message">>, #xmlel{name = <<"message">>,
attrs = [{<<"type">>, <<"chat">>}], attrs = [{<<"type">>, <<"chat">>}],
children = children =
[#xmlel{name = <<"body">>, attrs = [], [#xmlel{name = <<"body">>, attrs = [],
children = children =
[{xmlcdata, Body}]}]}). [{xmlcdata, Body}]}
| ExtraEls]}).
get_admin_jids() -> get_admin_jids() ->
ejabberd_config:get_option( ejabberd_config:get_option(

View File

@ -861,7 +861,8 @@ connected_users_info() ->
PI when is_integer(PI) -> PI; PI when is_integer(PI) -> PI;
_ -> nil _ -> nil
end, end,
{[U, $@, S, $/, R], atom_to_list(Conn), IPS, Port, PriorityI, NodeS, Uptime} {binary_to_list(<<U/binary, $@, S/binary, $/, R/binary>>),
atom_to_list(Conn), IPS, Port, PriorityI, NodeS, Uptime}
end, end,
USRIs). USRIs).

View File

@ -86,7 +86,7 @@ stop(Host) ->
init([Host, Opts]) -> init([Host, Opts]) ->
MyHost = gen_mod:get_opt_host(Host, Opts, MyHost = gen_mod:get_opt_host(Host, Opts,
<<"echo.@HOST@">>), <<"echo.@HOST@">>),
ejabberd_router:register_route(MyHost), ejabberd_router:register_route(MyHost, Host),
{ok, #state{host = MyHost}}. {ok, #state{host = MyHost}}.
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------

View File

@ -306,7 +306,7 @@ init({ServerHost, Opts}) ->
false -> false ->
ok ok
end, end,
ejabberd_router:register_route(Host), ejabberd_router:register_route(Host, ServerHost),
{ok, #state{server_host = ServerHost, host = Host, name = Name, {ok, #state{server_host = ServerHost, host = Host, name = Name,
access = Access, max_size = MaxSize, access = Access, max_size = MaxSize,
secret_length = SecretLength, jid_in_url = JIDinURL, secret_length = SecretLength, jid_in_url = JIDinURL,

View File

@ -133,7 +133,7 @@ init([Host, Opts]) ->
catch ets:new(irc_connection, catch ets:new(irc_connection,
[named_table, public, [named_table, public,
{keypos, #irc_connection.jid_server_host}]), {keypos, #irc_connection.jid_server_host}]),
ejabberd_router:register_route(MyHost), ejabberd_router:register_route(MyHost, Host),
{ok, {ok,
#state{host = MyHost, server_host = Host, #state{host = MyHost, server_host = Host,
access = Access}}. access = Access}}.

View File

@ -168,7 +168,7 @@ init([ServerHost, Opts]) ->
?NS_PUBSUB, mod_pubsub, iq_sm, IQDisc), ?NS_PUBSUB, mod_pubsub, iq_sm, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
?NS_MIX_0, ?MODULE, process_iq, IQDisc), ?NS_MIX_0, ?MODULE, process_iq, IQDisc),
ejabberd_router:register_route(Host), ejabberd_router:register_route(Host, ServerHost),
{ok, #state{server_host = ServerHost, host = Host}}. {ok, #state{server_host = ServerHost, host = Host}}.
handle_call(_Request, _From, State) -> handle_call(_Request, _From, State) ->

View File

@ -373,7 +373,7 @@ init([Host, Opts]) ->
RoomShaper = gen_mod:get_opt(room_shaper, Opts, RoomShaper = gen_mod:get_opt(room_shaper, Opts,
fun(A) when is_atom(A) -> A end, fun(A) when is_atom(A) -> A end,
none), none),
ejabberd_router:register_route(MyHost), ejabberd_router:register_route(MyHost, Host),
load_permanent_rooms(MyHost, Host, load_permanent_rooms(MyHost, Host,
{Access, AccessCreate, AccessAdmin, AccessPersistent}, {Access, AccessCreate, AccessAdmin, AccessPersistent},
HistorySize, RoomShaper), HistorySize, RoomShaper),

View File

@ -151,7 +151,7 @@ init([LServerS, Opts]) ->
try_start_loop(), try_start_loop(),
create_pool(), create_pool(),
ejabberd_router_multicast:register_route(LServerS), ejabberd_router_multicast:register_route(LServerS),
ejabberd_router:register_route(LServiceS), ejabberd_router:register_route(LServiceS, LServerS),
{ok, {ok,
#state{lservice = LServiceS, lserver = LServerS, #state{lservice = LServiceS, lserver = LServerS,
access = Access, service_limits = SLimits}}. access = Access, service_limits = SLimits}}.
@ -395,7 +395,7 @@ act_groups(FromJID, Packet_stripped, AAttrs, LServiceS,
perform(From, Packet, AAttrs, _, perform(From, Packet, AAttrs, _,
{route_single, Group}) -> {route_single, Group}) ->
[route_packet(From, ToUser, Packet, AAttrs, [route_packet(From, ToUser, Packet, AAttrs,
Group#group.addresses) Group#group.others, Group#group.addresses)
|| ToUser <- Group#group.dests]; || ToUser <- Group#group.dests];
perform(From, Packet, AAttrs, _, perform(From, Packet, AAttrs, _,
{{route_multicast, JID, RLimits}, Group}) -> {{route_multicast, JID, RLimits}, Group}) ->
@ -634,13 +634,13 @@ decide_action_group(Group) ->
%%% Route packet %%% Route packet
%%%------------------------- %%%-------------------------
route_packet(From, ToDest, Packet, AAttrs, Addresses) -> route_packet(From, ToDest, Packet, AAttrs, Others, Addresses) ->
Dests = case ToDest#dest.type of Dests = case ToDest#dest.type of
<<"bcc">> -> []; <<"bcc">> -> [];
_ -> [ToDest] _ -> [ToDest]
end, end,
route_packet2(From, ToDest#dest.jid_string, Dests, route_packet2(From, ToDest#dest.jid_string, Dests,
Packet, AAttrs, Addresses). Packet, AAttrs, {Others, Addresses}).
route_packet_multicast(From, ToS, Packet, AAttrs, Dests, route_packet_multicast(From, ToS, Packet, AAttrs, Dests,
Addresses, Limits) -> Addresses, Limits) ->
@ -666,6 +666,8 @@ route_packet2(From, ToS, Dests, Packet, AAttrs,
ToJID = stj(ToS), ToJID = stj(ToS),
ejabberd_router:route(From, ToJID, Packet2). ejabberd_router:route(From, ToJID, Packet2).
append_dests(_Dests, {Others, Addresses}) ->
Addresses++Others;
append_dests([], Addresses) -> Addresses; append_dests([], Addresses) -> Addresses;
append_dests([Dest | Dests], Addresses) -> append_dests([Dest | Dests], Addresses) ->
append_dests(Dests, [Dest#dest.full_xml | Addresses]). append_dests(Dests, [Dest#dest.full_xml | Addresses]).
@ -912,8 +914,9 @@ received_awaiter(JID, Waiter, LServiceS) ->
From = Waiter#waiter.sender, From = Waiter#waiter.sender,
Packet = Waiter#waiter.packet, Packet = Waiter#waiter.packet,
AAttrs = Waiter#waiter.aattrs, AAttrs = Waiter#waiter.aattrs,
Others = Group#group.others,
Addresses = Waiter#waiter.addresses, Addresses = Waiter#waiter.addresses,
[route_packet(From, ToUser, Packet, AAttrs, Addresses) [route_packet(From, ToUser, Packet, AAttrs, Others, Addresses)
|| ToUser <- Group#group.dests]; || ToUser <- Group#group.dests];
true -> true ->
send_query_info(RServer, LServiceS), send_query_info(RServer, LServiceS),

View File

@ -63,7 +63,7 @@ start_link(Host, Opts) ->
init([Host, Opts]) -> init([Host, Opts]) ->
State = parse_options(Host, Opts), State = parse_options(Host, Opts),
ejabberd_router:register_route(State#state.myhost), ejabberd_router:register_route(State#state.myhost, Host),
{ok, State}. {ok, State}.
terminate(_Reason, #state{myhost = MyHost}) -> terminate(_Reason, #state{myhost = MyHost}) ->

View File

@ -241,6 +241,7 @@ stop(Host) ->
init([ServerHost, Opts]) -> init([ServerHost, Opts]) ->
?DEBUG("pubsub init ~p ~p", [ServerHost, Opts]), ?DEBUG("pubsub init ~p ~p", [ServerHost, Opts]),
Host = gen_mod:get_opt_host(ServerHost, Opts, <<"pubsub.@HOST@">>), Host = gen_mod:get_opt_host(ServerHost, Opts, <<"pubsub.@HOST@">>),
ejabberd_router:register_route(Host, ServerHost),
Access = gen_mod:get_opt(access_createnode, Opts, Access = gen_mod:get_opt(access_createnode, Opts,
fun(A) when is_atom(A) -> A end, all), fun(A) when is_atom(A) -> A end, all),
PepOffline = gen_mod:get_opt(ignore_pep_from_offline, Opts, PepOffline = gen_mod:get_opt(ignore_pep_from_offline, Opts,
@ -256,22 +257,26 @@ init([ServerHost, Opts]) ->
DefaultNodeCfg = gen_mod:get_opt(default_node_config, Opts, DefaultNodeCfg = gen_mod:get_opt(default_node_config, Opts,
fun(A) when is_list(A) -> filter_node_options(A) end, []), fun(A) when is_list(A) -> filter_node_options(A) end, []),
pubsub_index:init(Host, ServerHost, Opts), pubsub_index:init(Host, ServerHost, Opts),
ets:new(gen_mod:get_module_proc(ServerHost, config), [set, named_table]),
{Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts), {Plugins, NodeTree, PepMapping} = init_plugins(Host, ServerHost, Opts),
mnesia:create_table(pubsub_last_item, mnesia:create_table(pubsub_last_item,
[{ram_copies, [node()]}, [{ram_copies, [node()]},
{attributes, record_info(fields, pubsub_last_item)}]), {attributes, record_info(fields, pubsub_last_item)}]),
mod_disco:register_feature(ServerHost, ?NS_PUBSUB), mod_disco:register_feature(ServerHost, ?NS_PUBSUB),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {nodetree, NodeTree}), lists:foreach(
ets:insert(gen_mod:get_module_proc(ServerHost, config), {plugins, Plugins}), fun(H) ->
ets:insert(gen_mod:get_module_proc(ServerHost, config), {last_item_cache, LastItemCache}), T = gen_mod:get_module_proc(H, config),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_items_node, MaxItemsNode}), ets:new(T, [set, named_table]),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {max_subscriptions_node, MaxSubsNode}), ets:insert(T, {nodetree, NodeTree}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {default_node_config, DefaultNodeCfg}), ets:insert(T, {plugins, Plugins}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {pep_mapping, PepMapping}), ets:insert(T, {last_item_cache, LastItemCache}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {ignore_pep_from_offline, PepOffline}), ets:insert(T, {max_items_node, MaxItemsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {host, Host}), ets:insert(T, {max_subscriptions_node, MaxSubsNode}),
ets:insert(gen_mod:get_module_proc(ServerHost, config), {access, Access}), ets:insert(T, {default_node_config, DefaultNodeCfg}),
ets:insert(T, {pep_mapping, PepMapping}),
ets:insert(T, {ignore_pep_from_offline, PepOffline}),
ets:insert(T, {host, Host}),
ets:insert(T, {access, Access})
end, [Host, ServerHost]),
ejabberd_hooks:add(sm_remove_connection_hook, ServerHost, ejabberd_hooks:add(sm_remove_connection_hook, ServerHost,
?MODULE, on_user_offline, 75), ?MODULE, on_user_offline, 75),
ejabberd_hooks:add(disco_local_identity, ServerHost, ejabberd_hooks:add(disco_local_identity, ServerHost,
@ -309,7 +314,6 @@ init([ServerHost, Opts]) ->
false -> false ->
ok ok
end, end,
ejabberd_router:register_route(Host),
pubsub_migrate:update_node_database(Host, ServerHost), pubsub_migrate:update_node_database(Host, ServerHost),
pubsub_migrate:update_state_database(Host, ServerHost), pubsub_migrate:update_state_database(Host, ServerHost),
pubsub_migrate:update_lastitem_database(Host, ServerHost), pubsub_migrate:update_lastitem_database(Host, ServerHost),
@ -873,7 +877,6 @@ handle_info(_Info, State) ->
%% @private %% @private
terminate(_Reason, terminate(_Reason,
#state{host = Host, server_host = ServerHost, nodetree = TreePlugin, plugins = Plugins}) -> #state{host = Host, server_host = ServerHost, nodetree = TreePlugin, plugins = Plugins}) ->
ejabberd_router:unregister_route(Host),
case lists:member(?PEPNODE, Plugins) of case lists:member(?PEPNODE, Plugins) of
true -> true ->
ejabberd_hooks:delete(caps_add, ServerHost, ejabberd_hooks:delete(caps_add, ServerHost,
@ -918,7 +921,8 @@ terminate(_Reason,
Pid -> Pid ->
Pid ! stop Pid ! stop
end, end,
terminate_plugins(Host, ServerHost, Plugins, TreePlugin). terminate_plugins(Host, ServerHost, Plugins, TreePlugin),
ejabberd_router:unregister_route(Host).
%%-------------------------------------------------------------------- %%--------------------------------------------------------------------
%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} %% Func: code_change(OldVsn, State, Extra) -> {ok, NewState}
@ -3641,7 +3645,7 @@ get_option(Options, Var, Def) ->
end. end.
node_options(Host, Type) -> node_options(Host, Type) ->
case config(serverhost(Host), default_node_config) of case config(Host, default_node_config) of
undefined -> node_plugin_options(Host, Type); undefined -> node_plugin_options(Host, Type);
[] -> node_plugin_options(Host, Type); [] -> node_plugin_options(Host, Type);
Config -> Config Config -> Config
@ -3954,15 +3958,15 @@ set_xoption(Host, [_ | Opts], NewOpts) ->
set_xoption(Host, Opts, NewOpts). set_xoption(Host, Opts, NewOpts).
get_max_items_node(Host) -> get_max_items_node(Host) ->
config(serverhost(Host), max_items_node, undefined). config(Host, max_items_node, undefined).
get_max_subscriptions_node(Host) -> get_max_subscriptions_node(Host) ->
config(serverhost(Host), max_subscriptions_node, undefined). config(Host, max_subscriptions_node, undefined).
%%%% last item cache handling %%%% last item cache handling
is_last_item_cache_enabled(Host) -> is_last_item_cache_enabled(Host) ->
config(serverhost(Host), last_item_cache, false). config(Host, last_item_cache, false).
set_cached_item({_, ServerHost, _}, Nidx, ItemId, Publisher, Payload) -> set_cached_item({_, ServerHost, _}, Nidx, ItemId, Publisher, Payload) ->
set_cached_item(ServerHost, Nidx, ItemId, Publisher, Payload); set_cached_item(ServerHost, Nidx, ItemId, Publisher, Payload);
@ -4013,13 +4017,12 @@ host(ServerHost) ->
config(ServerHost, host, <<"pubsub.", ServerHost/binary>>). config(ServerHost, host, <<"pubsub.", ServerHost/binary>>).
serverhost({_U, ServerHost, _R})-> serverhost({_U, ServerHost, _R})->
ServerHost; serverhost(ServerHost);
serverhost(Host) -> serverhost(Host) ->
[_, ServerHost] = binary:split(Host, <<".">>), ejabberd_router:host_of_route(Host).
ServerHost.
tree(Host) -> tree(Host) ->
case config(serverhost(Host), nodetree) of case config(Host, nodetree) of
undefined -> tree(Host, ?STDTREE); undefined -> tree(Host, ?STDTREE);
Tree -> Tree Tree -> Tree
end. end.
@ -4041,7 +4044,7 @@ plugin(Host, Name) ->
end. end.
plugins(Host) -> plugins(Host) ->
case config(serverhost(Host), plugins) of case config(Host, plugins) of
undefined -> [?STDNODE]; undefined -> [?STDNODE];
[] -> [?STDNODE]; [] -> [?STDNODE];
Plugins -> Plugins Plugins -> Plugins
@ -4056,6 +4059,9 @@ subscription_plugin(Host) ->
config(ServerHost, Key) -> config(ServerHost, Key) ->
config(ServerHost, Key, undefined). config(ServerHost, Key, undefined).
config({_User, Host, _Resource}, Key, Default) ->
config(Host, Key, Default);
config(ServerHost, Key, Default) -> config(ServerHost, Key, Default) ->
case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), Key) of case catch ets:lookup(gen_mod:get_module_proc(ServerHost, config), Key) of
[{Key, Value}] -> Value; [{Key, Value}] -> Value;

View File

@ -145,7 +145,7 @@ get_user_roster(Items, {U, S} = US) ->
%%case dict:find(US1, SRUsers1) of %%case dict:find(US1, SRUsers1) of
{value, _, SRUsers2} -> {Item#roster{subscription = both, ask = none}, SRUsers2}; {value, _, SRUsers2} -> {Item#roster{subscription = both, ask = none}, SRUsers2};
%%{ok, _GroupNames} -> {Item#roster{subscription = both, ask = none}, dict:erase(US1, SRUsers1)}; %%{ok, _GroupNames} -> {Item#roster{subscription = both, ask = none}, dict:erase(US1, SRUsers1)};
error -> {Item, SRUsers1} false -> {Item, SRUsers1}
end end
end, end,
SRUsers, Items), SRUsers, Items),

View File

@ -105,7 +105,7 @@ init(Host, ServerHost, Search) ->
case Search of case Search of
false -> loop(Host, ServerHost); false -> loop(Host, ServerHost);
_ -> _ ->
ejabberd_router:register_route(Host), ejabberd_router:register_route(Host, ServerHost),
loop(Host, ServerHost) loop(Host, ServerHost)
end. end.

View File

@ -173,7 +173,7 @@ init([Host, Opts]) ->
State#state.password, State#state.tls_options), State#state.password, State#state.tls_options),
case State#state.search of case State#state.search of
true -> true ->
ejabberd_router:register_route(State#state.myhost); ejabberd_router:register_route(State#state.myhost, Host);
_ -> ok _ -> ok
end, end,
{ok, State}. {ok, State}.

170
src/node_mix_odbc.erl Normal file
View File

@ -0,0 +1,170 @@
%%%-------------------------------------------------------------------
%%% @author Evgeny Khramtsov <ekhramtsov@process-one.net>
%%% @copyright (C) 2016, Evgeny Khramtsov
%%% @doc
%%%
%%% @end
%%% Created : 8 Mar 2016 by Evgeny Khramtsov <ekhramtsov@process-one.net>
%%%-------------------------------------------------------------------
-module(node_mix_odbc).
-behaviour(gen_pubsub_node).
%% API
-export([init/3, terminate/2, options/0, features/0,
create_node_permission/6, create_node/2, delete_node/1,
purge_node/2, subscribe_node/8, unsubscribe_node/4,
publish_item/6, delete_item/4, remove_extra_items/3,
get_entity_affiliations/2, get_node_affiliations/1,
get_affiliation/2, set_affiliation/3,
get_entity_subscriptions/2, get_node_subscriptions/1,
get_subscriptions/2, set_subscriptions/4,
get_pending_nodes/2, get_states/1, get_state/2,
set_state/1, get_items/7, get_items/3, get_item/7,
get_item/2, set_item/1, get_item_name/3, node_to_path/1,
path_to_node/1, get_entity_subscriptions_for_send_last/2]).
-include("pubsub.hrl").
%%%===================================================================
%%% API
%%%===================================================================
init(Host, ServerHost, Opts) ->
node_flat_odbc:init(Host, ServerHost, Opts).
terminate(Host, ServerHost) ->
node_flat_odbc:terminate(Host, ServerHost).
options() ->
[{deliver_payloads, true},
{notify_config, false},
{notify_delete, false},
{notify_retract, true},
{purge_offline, false},
{persist_items, true},
{max_items, ?MAXITEMS},
{subscribe, true},
{access_model, open},
{roster_groups_allowed, []},
{publish_model, open},
{notification_type, headline},
{max_payload_size, ?MAX_PAYLOAD_SIZE},
{send_last_published_item, never},
{deliver_notifications, true},
{broadcast_all_resources, true},
{presence_based_delivery, false}].
features() ->
[<<"create-nodes">>,
<<"delete-nodes">>,
<<"delete-items">>,
<<"instant-nodes">>,
<<"item-ids">>,
<<"outcast-affiliation">>,
<<"persistent-items">>,
<<"publish">>,
<<"purge-nodes">>,
<<"retract-items">>,
<<"retrieve-affiliations">>,
<<"retrieve-items">>,
<<"retrieve-subscriptions">>,
<<"subscribe">>,
<<"subscription-notifications">>].
create_node_permission(Host, ServerHost, Node, ParentNode, Owner, Access) ->
node_flat_odbc:create_node_permission(Host, ServerHost, Node, ParentNode, Owner, Access).
create_node(Nidx, Owner) ->
node_flat_odbc:create_node(Nidx, Owner).
delete_node(Removed) ->
node_flat_odbc:delete_node(Removed).
subscribe_node(Nidx, Sender, Subscriber, AccessModel,
SendLast, PresenceSubscription, RosterGroup, Options) ->
node_flat_odbc:subscribe_node(Nidx, Sender, Subscriber, AccessModel, SendLast,
PresenceSubscription, RosterGroup, Options).
unsubscribe_node(Nidx, Sender, Subscriber, SubId) ->
node_flat_odbc:unsubscribe_node(Nidx, Sender, Subscriber, SubId).
publish_item(Nidx, Publisher, Model, MaxItems, ItemId, Payload) ->
node_flat_odbc:publish_item(Nidx, Publisher, Model, MaxItems, ItemId, Payload).
remove_extra_items(Nidx, MaxItems, ItemIds) ->
node_flat_odbc:remove_extra_items(Nidx, MaxItems, ItemIds).
delete_item(Nidx, Publisher, PublishModel, ItemId) ->
node_flat_odbc:delete_item(Nidx, Publisher, PublishModel, ItemId).
purge_node(Nidx, Owner) ->
node_flat_odbc:purge_node(Nidx, Owner).
get_entity_affiliations(Host, Owner) ->
node_flat_odbc:get_entity_affiliations(Host, Owner).
get_node_affiliations(Nidx) ->
node_flat_odbc:get_node_affiliations(Nidx).
get_affiliation(Nidx, Owner) ->
node_flat_odbc:get_affiliation(Nidx, Owner).
set_affiliation(Nidx, Owner, Affiliation) ->
node_flat_odbc:set_affiliation(Nidx, Owner, Affiliation).
get_entity_subscriptions(Host, Owner) ->
node_flat_odbc:get_entity_subscriptions(Host, Owner).
get_node_subscriptions(Nidx) ->
node_flat_odbc:get_node_subscriptions(Nidx).
get_subscriptions(Nidx, Owner) ->
node_flat_odbc:get_subscriptions(Nidx, Owner).
set_subscriptions(Nidx, Owner, Subscription, SubId) ->
node_flat_odbc:set_subscriptions(Nidx, Owner, Subscription, SubId).
get_pending_nodes(Host, Owner) ->
node_flat_odbc:get_pending_nodes(Host, Owner).
get_states(Nidx) ->
node_flat_odbc:get_states(Nidx).
get_state(Nidx, JID) ->
node_flat_odbc:get_state(Nidx, JID).
set_state(State) ->
node_flat_odbc:set_state(State).
get_items(Nidx, From, RSM) ->
node_flat_odbc:get_items(Nidx, From, RSM).
get_items(Nidx, JID, AccessModel, PresenceSubscription, RosterGroup, SubId, RSM) ->
node_flat_odbc:get_items(Nidx, JID, AccessModel,
PresenceSubscription, RosterGroup, SubId, RSM).
get_item(Nidx, ItemId) ->
node_flat_odbc:get_item(Nidx, ItemId).
get_item(Nidx, ItemId, JID, AccessModel, PresenceSubscription, RosterGroup, SubId) ->
node_flat_odbc:get_item(Nidx, ItemId, JID, AccessModel,
PresenceSubscription, RosterGroup, SubId).
set_item(Item) ->
node_flat_odbc:set_item(Item).
get_item_name(Host, Node, Id) ->
node_flat_odbc:get_item_name(Host, Node, Id).
node_to_path(Node) ->
node_flat_odbc:node_to_path(Node).
path_to_node(Path) ->
node_flat_odbc:path_to_node(Path).
get_entity_subscriptions_for_send_last(Host, Owner) ->
node_flat_odbc:get_entity_subscriptions_for_send_last(Host, Owner).
%%%===================================================================
%%% Internal functions
%%%===================================================================

View File

@ -293,6 +293,8 @@ db_tests(_) ->
test_unregister]}, test_unregister]},
{test_muc_register, [sequence], {test_muc_register, [sequence],
[muc_register_master, muc_register_slave]}, [muc_register_master, muc_register_slave]},
{test_mix, [parallel],
[mix_master, mix_slave]},
{test_roster_subscribe, [parallel], {test_roster_subscribe, [parallel],
[roster_subscribe_master, [roster_subscribe_master,
roster_subscribe_slave]}, roster_subscribe_slave]},

View File

@ -35,6 +35,7 @@ host_config:
- "flat" - "flat"
- "hometree" - "hometree"
- "pep" - "pep"
mod_mix: []
mod_roster: mod_roster:
versioning: true versioning: true
store_current_id: true store_current_id: true
@ -88,6 +89,7 @@ Welcome to this XMPP server."
- "flat" - "flat"
- "hometree" - "hometree"
- "pep" - "pep"
mod_mix: []
mod_roster: mod_roster:
versioning: true versioning: true
store_current_id: true store_current_id: true
@ -147,6 +149,7 @@ Welcome to this XMPP server."
- "flat" - "flat"
- "hometree" - "hometree"
- "pep" - "pep"
mod_mix: []
mod_roster: mod_roster:
versioning: true versioning: true
store_current_id: true store_current_id: true