Getting "$XMPPErrorException: XMPPError: forbidden - auth" error while creating MultiUserChat
Asked Answered
R

2

2

I've created a login connection succesfully for XMPP with Smack Api(4.1.4). Now i'm trying to create MultiUserChat using,

    try {
        String myMUCName = "TestGroup";
        String myMUCService = "conference.(my local ip)";
        String myMUCfullName = myMUCName + "@" + myMUCService;
        String userName =  "Test5";

        MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);
        MultiUserChat muc = manager.getMultiUserChat(myMUCfullName);
        muc.create(userName);

        Log.d(LOCAL_TAG, "createGroupChat  -- Group CEATED Successfully ");
        Form form = muc.getConfigurationForm();
        Form submitForm = form.createAnswerForm();

        List<FormField> fields = form.getFields();
        Log.d(LOCAL_TAG, "createGroupChat  -- fields.size(): "+fields.size());
        for (int i = 0; i < fields.size(); i++) {
            FormField field = (FormField) fields.get(i);
            if (!FormField.Type.hidden.equals(field.getType()) && field.getVariable() != null) {
                submitForm.setDefaultAnswer(field.getVariable());
            }
        }

        List owners = new ArrayList();
        owners.add(userName); //Own user
        owners.add("Test7"); //Another user

        submitForm.setAnswer("muc#roomconfig_roomowners", owners);
        submitForm.setAnswer("muc#roomconfig_publicroom", true);
        submitForm.setAnswer("muc#roomconfig_persistentroom", true);
        muc.sendConfigurationForm(new Form(DataForm.Type.submit));
        //muc.sendConfigurationForm(submitForm);
    Log.d(LOCAL_TAG, "createGroupChat  -- Sent Configuration");
        muc.join(TestGroup);
        Log.d(LOCAL_TAG, "createGroupChat  -- Group Joined Successfully -- owners.size(): "+owners.size());

But while creating the group i'm getting an exception as

    "org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: forbidden - auth". 

Hope so, this exception occurs at the code

   muc.sendConfigurationForm(submitForm);

which is commented in this for that reason. Because i didn't get the log after that code. To fix that, I have changed that code to

   muc.sendConfigurationForm(new Form(DataForm.Type.submit));

which fixes that exception and created me a group, because i could see the log as printed and can see my group in the open fire. But i do know how my selected users for the group gets added, by doing like this, since owners list(or submit form) is not included in this at anywhere. I don't know what's happening in this and I'm not sure that i'm doing right. Plz suggest me to how to proceed. Thanks in advance.

Restate answered 17/6, 2016 at 7:25 Comment(1)
Hi @Restate I am also getting same issue, can you please describe how did you fix that error?Sensationalism
T
1

Try this code:

Form form = muc.getConfigurationForm().createAnswerForm();


        // Create a new form to submit based on the original form
        form.setAnswer("muc#roomconfig_passwordprotectedroom", false);
        form.setAnswer("muc#roomconfig_roomname",myMUCName);
        form.setAnswer("muc#roomconfig_persistentroom", true);
        form.setAnswer("muc#roomconfig_changesubject", true);
        form.setAnswer("muc#roomconfig_publicroom",true);
        form.setAnswer("muc#roomconfig_allowinvites",true);
        form.setAnswer("muc#roomconfig_membersonly",false);
        form.setAnswer("muc#roomconfig_moderatedroom",false);

        // Sets the new owner of the room
        List<String> owners = new ArrayList<String>();

        //Be carefull: if members does not exists, it brokes!

        owners.add(userName +"@"+"(my local ip or server name placeholder)");
        form.setAnswer("muc#roomconfig_roomowners", owners);

        // Send the completed form
        muc.sendConfigurationForm(form);
        System.out.println("MUC is now registered");

        muc.join(userName );

Right now, if all it's ok, you'll join the Room as userName and userName will be also the owner.

You'll can check Owners of a MUC programmatically by

muc.getOwners()  //List<Affiliate>, for each Affialiate you'll have to affiliate.getJid().toString()

You can invite people by this line of code:

muc.invite(user, "Invite");

And then, if you want to see them "forever",

muc.grantMembership(user);

so you'll be able to see membership with

muc.getMembers();

Please pay attention: Affiliate: user with a defined role (Onwer, Admin, Member, Outcast) in a MUC Occupants: user ONLINE in a MUC

Not all Occupants can have a role, not all Affiliates are automatically be occupants.

More, you can't be sure an Affiliate ever joined the groupchat.

Flux it's something like:

Muc Creation by User1 (optional) Muc Invitation by User1 to any user he desire (example: User2, User4) (optional) Muc Affiliate assignation by User1 to any existant user he desire (example: User3, User4)

User2 and User4 will recive, when online, a invitation to accept/reject User3 and User4 will not recive nothing, but they will have a role in the MUC.

User2, User3, User4 need to register IQProviders to get IQ Stanzas and then listners for each MUC to recive Invitations, another to recive Messages (and or other events).

Timeless answered 17/6, 2016 at 8:25 Comment(3)
Hi.. Thank you so much for your response. It fixed that exception. But while i'm trying to invite user with that code, i didn't get any invitation notification on another user, eventhough that 2nd user is in online. I've invited that 2nd user as "muc.invite("test7@(domain name)", "Meet me in this excellent room"); muc.grantMembership("test7@(domain name)"); muc.getMembers();". How to check whether i has sent an invitation and the other user has received that invitation.Restate
in muc code not needed to add domain.name, however be sure to register the InvitationListener (MultiUserChatManager.addInvitationListener(new InvitationListner). I suggest also to checkout those classes on javadoc ;)Timeless
Hi @Restate I am also getting same issue, can you please describe how did you fix that error?Sensationalism
T
0

For SMACK 4.3.4 and above.

        multiUserChatManager = MultiUserChatManager.getInstanceFor(connection);

        multiUserChat = multiUserChatManager.getMultiUserChat(JidCreate.entityBareFrom(roomJID));

        multiUserChat.create(Resourcepart.from(nickname));

        Form form = multiUserChat.getConfigurationForm();
        Form submitForm = form.createAnswerForm(); submitForm.getField("muc#roomconfig_publicroom").addValue("1");
        submitForm.getField("muc#roomconfig_enablelogging").addValue("1");
        submitForm.getField("x-muc#roomconfig_reservednick").addValue("0");
        submitForm.getField("x-muc#roomconfig_canchangenick").addValue("0");
        submitForm.getField("x-muc#roomconfig_registration").addValue("0");
        submitForm.getField("muc#roomconfig_passwordprotectedroom").addValue("0");
        submitForm.getField("muc#roomconfig_roomname").addValue(roomName);
        submitForm.getField("muc#roomconfig_whois").addValue("participants");
        submitForm.getField("muc#roomconfig_membersonly").addValue("1");
        submitForm.getField("muc#roomconfig_persistentroom").addValue("1");
        multiUserChat.sendConfigurationForm(submitForm);

This is how you can send the room configuration from and create room (MUC).

Torus answered 31/12, 2019 at 6:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.