Access denied by service policy in ejabberd

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

New contributor

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

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật