001/**
002 *
003 * Copyright 2016 Florian Schmaus
004 *
005 * This file is part of smack-repl.
006 *
007 * smack-repl is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published by
009 * the Free Software Foundation; either version 3 of the License, or
010 * (at your option) any later version.
011 *
012 * This program is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
015 * GNU General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with this program; if not, write to the Free Software Foundation,
019 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
020 */
021package org.igniterealtime.smack.smackrepl;
022
023import java.io.IOException;
024import java.security.KeyManagementException;
025import java.security.NoSuchAlgorithmException;
026
027import org.jivesoftware.smack.SmackException;
028import org.jivesoftware.smack.SmackException.NoResponseException;
029import org.jivesoftware.smack.SmackException.NotConnectedException;
030import org.jivesoftware.smack.XMPPConnection;
031import org.jivesoftware.smack.XMPPException;
032import org.jivesoftware.smack.XMPPException.XMPPErrorException;
033import org.jivesoftware.smack.tcp.XMPPTCPConnection;
034import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
035import org.jivesoftware.smack.util.TLSUtils;
036
037import org.jivesoftware.smackx.iqregister.AccountManager;
038
039import org.jxmpp.jid.DomainBareJid;
040import org.jxmpp.jid.impl.JidCreate;
041import org.jxmpp.jid.parts.Localpart;
042
043public class XmppTools {
044
045    public static void main(String[] args) throws SmackException, IOException, XMPPException, InterruptedException,
046            KeyManagementException, NoSuchAlgorithmException {
047        boolean one = createAccount("xmpp.foobar.io", "smack1", "smack1");
048        boolean two = createAccount("xmpp.foobar.io", "smack2", "smack2");
049        // CHECKSTYLE:OFF
050        System.out.println("Account created: " + one + ' ' + two);
051        // CHECKSTYLE:ON
052    }
053
054    public static boolean supportsIbr(String xmppDomain) throws SmackException, IOException, XMPPException,
055            InterruptedException, KeyManagementException, NoSuchAlgorithmException {
056        DomainBareJid xmppDomainJid = JidCreate.domainBareFrom(xmppDomain);
057        return supportsIbr(xmppDomainJid);
058    }
059
060    public static boolean supportsIbr(DomainBareJid xmppDomain) throws SmackException, IOException, XMPPException,
061            InterruptedException, KeyManagementException, NoSuchAlgorithmException {
062        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder()
063                .setXmppDomain(xmppDomain);
064        TLSUtils.acceptAllCertificates(configBuilder);
065        XMPPTCPConnectionConfiguration config = configBuilder.build();
066        XMPPTCPConnection connection = new XMPPTCPConnection(config);
067        connection.connect();
068        try {
069            return supportsIbr(connection);
070        } finally {
071            connection.disconnect();
072        }
073    }
074
075    public static boolean supportsIbr(XMPPConnection connection)
076            throws NoResponseException, XMPPErrorException, NotConnectedException, InterruptedException {
077        AccountManager accountManager = AccountManager.getInstance(connection);
078        return accountManager.supportsAccountCreation();
079    }
080
081    public static boolean createAccount(String xmppDomain, String username, String password)
082            throws KeyManagementException, NoSuchAlgorithmException, SmackException, IOException, XMPPException,
083            InterruptedException {
084        DomainBareJid xmppDomainJid = JidCreate.domainBareFrom(xmppDomain);
085        Localpart localpart = Localpart.from(username);
086        return createAccount(xmppDomainJid, localpart, password);
087    }
088
089    public static boolean createAccount(DomainBareJid xmppDomain, Localpart username, String password)
090            throws KeyManagementException, NoSuchAlgorithmException, SmackException, IOException, XMPPException,
091            InterruptedException {
092        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder()
093                .setXmppDomain(xmppDomain);
094        TLSUtils.acceptAllCertificates(configBuilder);
095        XMPPTCPConnectionConfiguration config = configBuilder.build();
096        XMPPTCPConnection connection = new XMPPTCPConnection(config);
097        connection.connect();
098        try {
099            if (!supportsIbr(connection))
100                return false;
101
102            AccountManager accountManager = AccountManager.getInstance(connection);
103            accountManager.createAccount(username, password);
104            return true;
105        } finally {
106            connection.disconnect();
107        }
108    }
109}