void ConnectionManager::connectTo(Konversation::ConnectionFlag flag, const QString& target, const QString& port, const QString& password, const QString& nick, const QString& channel, bool useSSL) { ConnectionSettings settings; if (target.startsWith(QLatin1String("irc://")) || target.startsWith(QLatin1String("ircs://"))) decodeIrcUrl(target, settings); else { decodeAddress(target, settings); Konversation::ServerSettings server = settings.server(); if (!port.isEmpty()) server.setPort(port.toInt()); if (!password.isEmpty()) server.setPassword(password); if (useSSL) server.setSSLEnabled(true); settings.setServer(server); if (!nick.isEmpty()) settings.setInitialNick(nick); if (!channel.isEmpty()) { Konversation::ChannelSettings channelSettings(channel); Konversation::ChannelList cl; cl << channelSettings; settings.setOneShotChannelList(cl); } } connectTo(flag, settings); }
void ConnectionManager::decodeIrcUrl(const QString& url, ConnectionSettings& settings) { if (!url.startsWith(QLatin1String("irc://")) && !url.startsWith(QLatin1String("ircs://"))) return; QString mangledUrl = url; mangledUrl.remove(QRegExp("^ircs?:/+")); if (mangledUrl.isEmpty()) return; // Parsing address and channel. QStringList mangledUrlSegments; mangledUrlSegments = mangledUrl.split('/', QString::KeepEmptyParts); // Check for ",isserver". if (mangledUrlSegments[0].contains(',')) { QStringList addressSegments; bool checkIfServerGroup = true; addressSegments = mangledUrlSegments[0].split(',', QString::KeepEmptyParts); if (addressSegments.filter("isserver").size() > 0) checkIfServerGroup = false; decodeAddress(addressSegments[0], settings, checkIfServerGroup); } else decodeAddress(mangledUrlSegments[0], settings); QString channel; Konversation::ChannelSettings channelSettings; // Grabbing channel from in front of potential ?key=value parameters. if (mangledUrlSegments.size() > 1) channel = mangledUrlSegments[1].section('?', 0, 0); if (!channel.isEmpty()) { // Add default prefix to channel if necessary. if (!channel.contains(QRegExp("^[#+&]{1}"))) channel = '#' + channel; channelSettings.setName(channel); } // Parsing ?key=value parameters. QString parameterString; if (mangledUrlSegments.size() > 1) parameterString = mangledUrlSegments[1].section('?', 1); if (parameterString.isEmpty() && mangledUrlSegments.size() > 2) parameterString = mangledUrlSegments[2]; if (!parameterString.isEmpty()) { QRegExp parameterCatcher; parameterCatcher.setPattern("pass=([^&]+)"); if (parameterCatcher.indexIn(parameterString) != -1) { Konversation::ServerSettings server = settings.server(); server.setPassword(parameterCatcher.cap(1)); settings.setServer(server); } parameterCatcher.setPattern("key=([^&]+)"); if (parameterCatcher.indexIn(parameterString) != -1) channelSettings.setPassword(parameterCatcher.cap(1)); } // Assigning channel. if (!channelSettings.name().isEmpty()) { Konversation::ChannelList cl; cl << channelSettings; settings.setOneShotChannelList(cl); } // Override SSL setting state with directive from URL. if (url.startsWith(QLatin1String("ircs://"))) { Konversation::ServerSettings server = settings.server(); server.setSSLEnabled(true); settings.setServer(server); } }