I am trying register new user in my xmpp server with help of node.js.
we are using ejabberd version 23.10 and using the debian 11 operating system, we have installed ejabberd which has provided by process-one. By using below :
Link: https://www.process-one.net/downloads/downloads-action.php?file=/23.10/ejabberd_23.10-1_amd64.deb” -O ejabberd_23.10-1_amd64.deb
below is the code:
`import { client, xml } from '@xmpp/client';
import { Injectable } from '@nestjs/common';
import { exec as execCallback } from 'child_process';
import { promisify } from 'util';
const exec = promisify(execCallback);
@Injectable()
export class XmppService {
private xmppClient: any;
private pendingIQs: Map<string, Function>;
constructor() {
this.pendingIQs = new Map();
this.initializeClient();
}
private initializeClient() {
this.xmppClient = client({
service: 'wss://abc.com:5443/ws/rest/register', // WebSocket URL
domain: 'abc.com', // ejabberd domain
username: 'admin', // Admin username
password: 'abc@123', // Admin password
});
this.xmppClient.on('error', (err: any) => {
console.error('❌ XMPP Error:', err);
});
this.xmppClient.on('offline', () => {
console.log('❌ XMPP Client is offline');
});
this.xmppClient.on('stanza', (stanza: any) => {
console.log('🔶 Incoming stanza:', stanza.toString());
if (stanza.is('iq')) {
const id = stanza.attrs.id;
const resolve = this.pendingIQs.get(id);
if (resolve) {
resolve(stanza);
this.pendingIQs.delete(id);
}
}
});
this.xmppClient.on('online', async (address: any) => {
console.log('✅ XMPP Client is online as', address.toString());
});
this.xmppClient.start().catch((err: any) => {
console.error('❌ Failed to start XMPP Client:', err);
// Retry logic with delay
setTimeout(() => this.initializeClient(), 60000); // Wait for 1 minute before retrying
});
}
async addUser(adduserDto: any) {
console.log("=========AdduserDTO==============", adduserDto);
try {
console.log(`🔄 Attempting to add user ${adduserDto.username}...`);
const id = 'register1';
const iq = xml(
'iq',
{ type: 'set', id },
xml('query', { xmlns: 'jabber:iq:register' },
xml('username', {}, adduserDto.username),
xml('password', {}, adduserDto.password)
)
);
const responsePromise = new Promise((resolve) => {
this.pendingIQs.set(id, resolve);
});
await this.xmppClient.send(iq);
const response = await responsePromise;
console.log(`✅ User ${adduserDto.username} added successfully.`);
if (typeof response === 'object' && response !== null && 'toString' in response) {
console.log('🔶 Response:', response.toString());
} else {
console.log('⚠️ Response is not in the expected format:', response);
}
console.log(response);
console.log("responseeeeeeeee");
} catch (error: any) {
console.error('❌ Error adding user:', error);
if (error.condition === 'policy-violation' && error.text.includes('Too many failed authentications')) {
console.log('⚠️ Too many failed authentications. Please wait before trying again.');
// Optionally, add retry logic here if needed
}
}
}
}`
And receive below error:
Response: <iq xmlns="jabber:client" xml:lang="en" to="[email protected]/123490873350233766351458" from="[email protected]" type="error" id="register1"><query xmlns="jabber:iq:register"><username>newuser1</username><password>newuser1@123</password></query><error type="auth"><forbidden xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/><text xml:lang="en" xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">Access denied by service policy</text></error></iq>
Below is the ejabberd.yml file:
`###
### ejabberd configuration file
###
default_db: sql
sql_type: pgsql
sql_server: "localhost"
sql_database: "ejabberd"
sql_username: "ejabberd"
sql_password: "abc@1kceci"
sql_port: 5432
hosts:
- abc.com
loglevel: 5
certfiles:
- /opt/ejabberd/conf/certs/server.pem
- /opt/ejabberd/conf/certs/muc.abc.com
- /opt/ejabberd/conf/certs/proxy.abc.com
- /opt/ejabberd/conf/certs/pubsub.abc.com
- /opt/ejabberd/conf/certs/upload.abc.com
listen:
-
port: 5222
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
starttls_required: true
-
port: 5223
ip: "::"
module: ejabberd_c2s
max_stanza_size: 262144
shaper: c2s_shaper
access: c2s
tls: true
-
port: 5269
ip: "::"
module: ejabberd_s2s_in
max_stanza_size: 524288
shaper: s2s_shaper
-
port: 5443
ip: "::"
module: ejabberd_http
tls: true
request_handlers:
/admin: ejabberd_web_admin
/api: mod_http_api
/bosh: mod_bosh
/captcha: ejabberd_captcha
/upload: mod_http_upload
/ws: ejabberd_http_ws
-
port: 5280
ip: "::"
module: ejabberd_http
request_handlers:
/admin: ejabberd_web_admin
/.well-known/acme-challenge: ejabberd_acme
-
port: 1883
ip: "::"
module: mod_mqtt
backlog: 1000
s2s_use_starttls: optional
acl:
admin:
user:
- admin
local:
user_regexp: ""
loopback:
ip:
- 127.0.0.0/8
- ::1/128
access_rules:
local:
allow: local
c2s:
deny: blocked
allow: all
announce:
allow: admin
configure:
allow: admin
muc_create:
allow: local
pubsub_createnode:
allow: local
trusted_network:
deny: loopback
allow: all
register:
allow: all # Allow registration for all users and connections (including s2s)
api_permissions:
"console commands":
from:
- ejabberd_ctl
who: all
what: "*"
"admin access":
who:
access:
allow:
- acl: all
- acl: admin
oauth:
scope: "ejabberd:admin"
access:
allow:
- acl: all
- acl: admin
what:
- "*"
- "!stop"
- "!start"
"public commands":
who:
ip: 127.0.0.1/8
what:
- status
- connected_users_number
shaper:
normal:
rate: 3000
burst_size: 20000
fast: 100000
shaper_rules:
max_user_sessions: 10
max_user_offline_messages:
5000: admin
100: all
c2s_shaper:
none: admin
normal: all
s2s_shaper: fast
modules:
mod_adhoc: {}
mod_admin_extra: {}
mod_announce:
access: announce
mod_avatar: {}
mod_blocking: {}
mod_bosh: {}
mod_caps: {}
mod_carboncopy: {}
mod_client_state: {}
mod_configure: {}
mod_disco: {}
mod_fail2ban: {}
mod_http_api: {}
mod_http_upload:
put_url: https://@HOST@:5443/upload
custom_headers:
"Access-Control-Allow-Origin": "https://@HOST@"
"Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
"Access-Control-Allow-Headers": "Content-Type"
mod_last: {}
mod_mam:
assume_mam_usage: true
default: always
mod_mqtt: {}
mod_muc:
host: muc.abc.com
access:
- allow
access_admin:
- allow: admin
access_create: muc_create
access_persistent: muc_create
access_mam:
- allow
default_room_options:
mam: true
mod_muc_admin: {}
mod_offline:
access_max_user_messages: max_user_offline_messages
mod_ping: {}
mod_privacy: {}
mod_private: {}
mod_proxy65:
access: local
max_connections: 5
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
- flat
- pep
force_node_config:
storage:bookmarks:
access_model: whitelist
mod_push: {}
mod_push_keepalive: {}
mod_register:
ip_access: trusted_network # Ensure trusted network is used for registration
access: register # Use the newly defined access rule
mod_roster:
versioning: true
mod_s2s_dialback: {}
mod_shared_roster: {}
mod_stream_mgmt:
resend_on_timeout: if_offline
mod_stun_disco: {}
mod_vcard: {}
mod_vcard_xupdate: {}
mod_version:
show_os: false
### Local Variables:
### mode: yaml
### End:
### vim: set filetype=yaml tabstop=8
below are received in ejabberd.log:
`2024-07-16 07:44:51.618168+00:00 [debug] <0.1756.0>@ejabberd_router:do_route/1:384 Route:
#iq{id = <<"register1">>,type = set,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
sub_els =
[#xmlel{
name = <<"query">>,
attrs = [{<<"xmlns">>,<<"jabber:iq:register">>}],
children =
[#xmlel{
name = <<"username">>,attrs = [],
children = [{xmlcdata,<<"riddhi">>}]},
#xmlel{
name = <<"password">>,attrs = [],
children = [{xmlcdata,<<"riddhi123">>}]}]}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.620155+00:00 [debug] <0.1756.0>@ejabberd_local:route/1:74 Local route:
#iq{id = <<"register1">>,type = set,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
sub_els =
[#xmlel{
name = <<"query">>,
attrs = [{<<"xmlns">>,<<"jabber:iq:register">>}],
children =
[#xmlel{
name = <<"username">>,attrs = [],
children = [{xmlcdata,<<"riddhi">>}]},
#xmlel{
name = <<"password">>,attrs = [],
children = [{xmlcdata,<<"riddhi123">>}]}]}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.621726+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook sm_receive_packet: mod_mam:sm_receive_packet/1
2024-07-16 07:44:51.622826+00:00 [debug] <0.1756.0>@ejabberd_sm:do_route/1:712 Processing IQ to bare JID:
#iq{id = <<"register1">>,type = set,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
sub_els =
[#xmlel{
name = <<"query">>,
attrs = [{<<"xmlns">>,<<"jabber:iq:register">>}],
children =
[#xmlel{
name = <<"username">>,attrs = [],
children = [{xmlcdata,<<"riddhi">>}]},
#xmlel{
name = <<"password">>,attrs = [],
children = [{xmlcdata,<<"riddhi123">>}]}]}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.624464+00:00 [debug] <0.1756.0>@ejabberd_router:do_route/1:384 Route:
#iq{id = <<"register1">>,type = error,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
sub_els =
[#register{
registered = false,remove = false,instructions = undefined,
username = <<"riddhi">>,nick = undefined,
password = <<"riddhi123">>,name = undefined,first = undefined,
last = undefined,email = undefined,address = undefined,
city = undefined,state = undefined,zip = undefined,
phone = undefined,url = undefined,date = undefined,
misc = undefined,text = undefined,key = undefined,
xdata = undefined,sub_els = []},
#stanza_error{
type = auth,by = undefined,reason = forbidden,
text =
[#text{
lang = <<"en">>,
data = <<"Access denied by service policy">>}],
sub_els = []}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.625532+00:00 [debug] <0.1756.0>@ejabberd_local:route/1:74 Local route:
#iq{id = <<"register1">>,type = error,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
sub_els =
[#register{
registered = false,remove = false,instructions = undefined,
username = <<"riddhi">>,nick = undefined,
password = <<"riddhi123">>,name = undefined,first = undefined,
last = undefined,email = undefined,address = undefined,
city = undefined,state = undefined,zip = undefined,
phone = undefined,url = undefined,date = undefined,
misc = undefined,text = undefined,key = undefined,
xdata = undefined,sub_els = []},
#stanza_error{
type = auth,by = undefined,reason = forbidden,
text =
[#text{
lang = <<"en">>,
data = <<"Access denied by service policy">>}],
sub_els = []}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.626621+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook sm_receive_packet: mod_mam:sm_receive_packet/1
2024-07-16 07:44:51.627363+00:00 [debug] <0.1756.0>@ejabberd_sm:do_route/1:719 Processing packet to full JID:
#iq{id = <<"register1">>,type = error,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
sub_els =
[#register{
registered = false,remove = false,instructions = undefined,
username = <<"riddhi">>,nick = undefined,
password = <<"riddhi123">>,name = undefined,first = undefined,
last = undefined,email = undefined,address = undefined,
city = undefined,state = undefined,zip = undefined,
phone = undefined,url = undefined,date = undefined,
misc = undefined,text = undefined,key = undefined,
xdata = undefined,sub_els = []},
#stanza_error{
type = auth,by = undefined,reason = forbidden,
text =
[#text{
lang = <<"en">>,
data = <<"Access denied by service policy">>}],
sub_els = []}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.628581+00:00 [debug] <0.1756.0>@ejabberd_sm:do_route/1:741 Sending to process <0.1756.0>:
#iq{id = <<"register1">>,type = error,lang = <<"en">>,
from =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<>>,luser = <<"admin">>,
lserver = <<"abc.com">>,lresource = <<>>},
to =
#jid{
user = <<"admin">>,server = <<"abc.com">>,
resource = <<"54781444652829145323347">>,luser = <<"admin">>,
lserver = <<"abc.com">>,
lresource = <<"54781444652829145323347">>},
sub_els =
[#register{
registered = false,remove = false,instructions = undefined,
username = <<"riddhi">>,nick = undefined,
password = <<"riddhi123">>,name = undefined,first = undefined,
last = undefined,email = undefined,address = undefined,
city = undefined,state = undefined,zip = undefined,
phone = undefined,url = undefined,date = undefined,
misc = undefined,text = undefined,key = undefined,
xdata = undefined,sub_els = []},
#stanza_error{
type = auth,by = undefined,reason = forbidden,
text =
[#text{
lang = <<"en">>,
data = <<"Access denied by service policy">>}],
sub_els = []}],
meta = #{ip => {0,0,0,0,0,65535,38529,27643}}}
2024-07-16 07:44:51.629935+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_handle_info: ejabberd_sm:c2s_handle_info/2
2024-07-16 07:44:51.630587+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_handle_info: mod_offline:c2s_handle_info/2
2024-07-16 07:44:51.631197+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_handle_info: mod_pubsub:c2s_handle_info/2
2024-07-16 07:44:51.631801+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_handle_info: mod_push_keepalive:c2s_handle_info/2
2024-07-16 07:44:51.632564+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_handle_info: mod_stream_mgmt:c2s_handle_info/2
2024-07-16 07:44:51.633167+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_handle_info: ejabberd_c2s:process_info/2
2024-07-16 07:44:51.633692+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook privacy_check_packet: mod_last:privacy_check_packet/4
2024-07-16 07:44:51.634088+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook privacy_check_packet: mod_privacy:check_packet/4
2024-07-16 07:44:51.634477+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook user_receive_packet: mod_caps:user_receive_packet/1
2024-07-16 07:44:51.635019+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook user_receive_packet: mod_mam:user_receive_packet/1
2024-07-16 07:44:51.635634+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook user_receive_packet: mod_carboncopy:user_receive_packet/1
2024-07-16 07:44:51.636389+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_filter_send: mod_client_state:filter_chat_states/1
2024-07-16 07:44:51.636906+00:`your text`00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_filter_send: mod_client_state:filter_pep/1
2024-07-16 07:44:51.637397+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_filter_send: mod_client_state:filter_presence/1
2024-07-16 07:44:51.637813+00:00 [debug] <0.1756.0>@ejabberd_hooks:safe_apply/4:315 Running hook c2s_filter_send: mod_client_state:filter_other/1
2024-07-16 07:44:51.638253+00:00 [debug] <0.1756.0>@mod_client_state:filter_other/1:314 Won't add stanza for [email protected]/54781444652829145323347 to CSI queue
2024-07-16 07:44:51.638667+00:00 [debug] <0.1756.0>@mod_client_state:dequeue_sender/2:365 Flushing packets of [email protected] from CSI queue of [email protected]/54781444652829145323347
2024-07-16 07:44:51.639257+00:00 [notice] <0.1756.0> (websocket|<0.1755.0>) Send XML on stream = <<"<iq xml:lang='en' to='[email protected]/54781444652829145323347' from='[email protected]' type='error' id='register1'><query xmlns='jabber:iq:register'><username>riddhi</username><password>riddhi123</password></query><error type='auth'><forbidden xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><text xml:lang='en' xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Access denied by service policy</text></error></iq>">>
`
`
We are trying register new user by using the rest api in ejabberd
Dhruvil Panchal is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
trusted_network:
deny: loopback
allow: all
This is not present in the default configuration file. You added it, why?
We are trying register new user by using the rest api in ejabberd
Then why does your script use the XMPP protocol? XMPP is not required at all to run ejabberd API commands.
this.xmppClient = client({
service: 'wss://abc.com:5443/ws/rest/register', // WebSocket URL
That is nonsense. This mixes WebSocket (useful for XMPP) and adds a rest/register
path in the URL (useful for API ReST).
Your script smells to AI silliness and incoherence, am I right?
That script apparently tries to use XMPP and In-Band Registration (implemented in mod_register in ejabberd). That script does not even attempt to use the ReST API.
Also, in your log file, where are the most important lines, that demonstrate from whay IP address are you attempting to connect? Something like
13:50:45.295 [info] (#PID<0.19264.0>)
Accepted connection [::ffff:127.0.0.1]:39843 -> [::ffff:127.0.0.1]:5222