Skip to content

Commit

Permalink
[FIXED JENKINS-11407] support password-protected chatrooms
Browse files Browse the repository at this point in the history
  • Loading branch information
kutzi committed Oct 22, 2011
1 parent 7222889 commit 5958a1f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 43 deletions.
Expand Up @@ -22,6 +22,7 @@
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -95,7 +96,7 @@ class JabberIMConnection extends AbstractIMConnection {
private final String hostnameOverride;
private final int port;

private final String[] groupChats;
private final List<IMMessageTarget> groupChats;

private IMPresence impresence;

Expand Down Expand Up @@ -140,11 +141,7 @@ class JabberIMConnection extends AbstractIMConnection {
this.groupChatNick = desc.getGroupChatNickname() != null ?
desc.getGroupChatNickname() : this.nick;
this.botCommandPrefix = desc.getCommandPrefix();
if (desc.getInitialGroupChats() != null) {
this.groupChats = desc.getInitialGroupChats().trim().split("\\s");
} else {
this.groupChats = new String[0];
}
this.groupChats = desc.getDefaultTargets();
this.impresence = desc.isExposePresence() ? IMPresence.AVAILABLE : IMPresence.UNAVAILABLE;
}

Expand All @@ -166,15 +163,15 @@ public boolean connect() {
sendPresence();

groupChatCache.clear();
for (String groupChatName : this.groupChats) {
for (IMMessageTarget chat : this.groupChats) {
GroupChatIMMessageTarget groupChat = (GroupChatIMMessageTarget) chat;
try {
groupChatName = groupChatName.trim();
getOrCreateGroupChat(groupChatName);
LOGGER.info("Joined groupchat " + groupChatName);
getOrCreateGroupChat(groupChat);
LOGGER.info("Joined groupchat " + groupChat.getName());
} catch (IMException e) {
// if we got here, the XMPP connection could be established, but probably the groupchat name
// is invalid
LOGGER.warning("Unable to connect to groupchat '" + groupChatName + "'. Did you append @conference or so to the name?\n"
LOGGER.warning("Unable to connect to groupchat '" + groupChat.getName() + "'. Did you append @conference or so to the name?\n"
+ "Exception: " + ExceptionHelper.dump(e));
}
}
Expand Down Expand Up @@ -442,19 +439,19 @@ private void listenForPrivateChats() {
this.connection.addPacketListener(listener, filter);
}

private MultiUserChat getOrCreateGroupChat(String groupChatName) throws IMException {
WeakReference<MultiUserChat> ref = groupChatCache.get(groupChatName);
private MultiUserChat getOrCreateGroupChat(GroupChatIMMessageTarget chat) throws IMException {
WeakReference<MultiUserChat> ref = groupChatCache.get(chat.getName());
MultiUserChat groupChat = null;
if (ref != null) {
groupChat = ref.get();
}

if (groupChat == null) {
groupChat = new MultiUserChat(this.connection, groupChatName);
groupChat = new MultiUserChat(this.connection, chat.getName());
try {
groupChat.join(this.groupChatNick);
groupChat.join(this.groupChatNick, chat.getPassword());
} catch (XMPPException e) {
LOGGER.warning("Cannot join group chat '" + groupChatName + "'. Exception:\n" + ExceptionHelper.dump(e));
LOGGER.warning("Cannot join group chat '" + chat + "'. Exception:\n" + ExceptionHelper.dump(e));
throw new IMException(e);
}

Expand All @@ -466,7 +463,7 @@ private MultiUserChat getOrCreateGroupChat(String groupChatName) throws IMExcept
this.groupChatNick, this.desc.getHost(),
this.botCommandPrefix, this.authentication));

groupChatCache.put(groupChatName, new WeakReference<MultiUserChat>(groupChat));
groupChatCache.put(chat.getName(), new WeakReference<MultiUserChat>(groupChat));
}
return groupChat;
}
Expand Down Expand Up @@ -505,7 +502,7 @@ public void send(final IMMessageTarget target, final String text)
}
try {
if (target instanceof GroupChatIMMessageTarget) {
getOrCreateGroupChat(target.toString()).sendMessage(
getOrCreateGroupChat((GroupChatIMMessageTarget) target).sendMessage(
text);
} else {
final Chat chat = getOrCreatePrivateChat(target.toString(), null);
Expand Down
Expand Up @@ -6,6 +6,7 @@
import hudson.Util;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.plugins.im.GroupChatIMMessageTarget;
import hudson.plugins.im.IMException;
import hudson.plugins.im.IMMessageTarget;
import hudson.plugins.im.IMMessageTargetConversionException;
Expand All @@ -24,7 +25,6 @@
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.logging.Logger;

Expand Down Expand Up @@ -110,7 +110,15 @@ public class JabberPublisherDescriptor extends BuildStepDescriptor<Publisher> im
private String groupChatNickname;
private boolean exposePresence = true;
private boolean enableSASL = true;

/**
* @deprecated replaced by {@link #defaultTargets}
* Still needed to deserialize old descriptors
*/
@Deprecated
private String initialGroupChats;
private List<IMMessageTarget> defaultTargets;

private String commandPrefix = DEFAULT_COMMAND_PREFIX;
private String defaultIdSuffix;
private String hudsonCiLogin;
Expand Down Expand Up @@ -242,7 +250,17 @@ private void applyPort(final HttpServletRequest req, boolean check) throws FormE
}

private void applyInitialGroupChats(final HttpServletRequest req) {
this.initialGroupChats = Util.fixEmptyAndTrim(req.getParameter(PARAMETERNAME_INITIAL_GROUPCHATS));
String[] chatNames = req.getParameterValues("jabberPlugin.chat.name");
String[] chatPasswords = req.getParameterValues("jabberPlugin.chat.password");
this.defaultTargets = new ArrayList<IMMessageTarget>();

if (chatNames != null) {
for (int i = 0; i < chatNames.length; i++) {
String chatName = chatNames[i];
String chatPassword = Util.fixEmptyAndTrim(chatPasswords[i]);
this.defaultTargets.add(new GroupChatIMMessageTarget(chatName, chatPassword));
}
}
}

private void applyCommandPrefix(final HttpServletRequest req) {
Expand Down Expand Up @@ -431,14 +449,6 @@ public String getSubscriptionMode() {
return this.subscriptionMode;
}

/**
* Gets the whitespace separated list of group chats to join,
* or null if nothing is configured.
*/
public String getInitialGroupChats() {
return Util.fixEmptyAndTrim(this.initialGroupChats);
}

public boolean isEmailAddressAsJabberId() {
return emailAddressAsJabberId;
}
Expand Down Expand Up @@ -772,18 +782,24 @@ public IMMessageTargetConverter getIMMessageTargetConverter() {

@Override
public List<IMMessageTarget> getDefaultTargets() {
// not implemented for Jabber bot
return Collections.emptyList();
return this.defaultTargets;
}

// FIXME: provide a clean migration path for old nicknames without @
// See https://issues.jenkins-ci.org/browse/JENKINS-10523
// protected Object readResolve() {
// if (Util.fixEmptyAndTrim(this.hudsonNickname) != null && !this.hudsonNickname.contains("@")) {
// if (Util.fixEmptyAndTrim(this.hostname) != null) {
// this.hudsonNickname = this.hudsonNickname + "@" + this.hostname;
// }
// }
// return this;
// }
/**
* Deserialize old descriptors.
*/
private Object readResolve() {
if (this.initialGroupChats != null) {
String[] split = this.initialGroupChats.trim().split("\\s");
this.defaultTargets = new ArrayList<IMMessageTarget>();
for (String chatName : split) {
this.defaultTargets.add(new GroupChatIMMessageTarget(chatName));
}
this.initialGroupChats = null;
save();
}

return this;
}

}
Expand Up @@ -15,9 +15,18 @@
<f:password name="${descriptor.PARAMETERNAME_PASSWORD}"
value="${descriptor.password}"/>
</f:entry>
<f:entry title="Initial group chats" description="Group chats to automatically join on startup with a bot (whitespace separated)">
<f:textbox name="${descriptor.PARAMETERNAME_INITIAL_GROUPCHATS}"
value="${descriptor.initialGroupChats}" />
<f:entry title="Initial group chats" description="Group chats to automatically join on startup. Name, (optional) password pairs.">
<f:repeatable name="jabberPlugin.initialChats" var="ch" items="${descriptor.defaultTargets}">
<table width="100%">
<tr>
<td><input type="text" width="100%" style="text-align:left" name="jabberPlugin.chat.name" value="${ch.name}" /></td>
<td><input type="password" width="100%" style="text-align:left" name="jabberPlugin.chat.password" value="${ch.password}" /></td>
<td>
<div align="right"><f:repeatableDeleteButton /></div>
</td>
</tr>
</table>
</f:repeatable>
</f:entry>
<f:advanced>
<f:entry title="Server" help="${base}/help-server.html">
Expand Down

0 comments on commit 5958a1f

Please sign in to comment.