group-edit.jsp 26.3 KB
Newer Older
1 2 3 4
<%--
  -	$Revision$
  -	$Date$
  -
5
  - Copyright (C) 2005-2008 Jive Software. All rights reserved.
6 7
  -
  - This software is published under the terms of the GNU Public License (GPL),
8 9
  - a copy of which is included in this distribution, or a commercial license
  - agreement with Jive.
10 11
--%>

12
<%@ page import="org.jivesoftware.openfire.PresenceManager,
13
                 org.jivesoftware.openfire.group.Group,
14 15 16 17 18
                 org.jivesoftware.openfire.group.GroupManager,
                 org.jivesoftware.openfire.security.SecurityAuditManager,
                 org.jivesoftware.openfire.user.User,
                 org.jivesoftware.openfire.user.UserManager,
                 org.jivesoftware.openfire.user.UserNotFoundException"
19
%>
20 21 22 23
<%@ page import="org.jivesoftware.stringprep.Stringprep"%>
<%@ page import="org.jivesoftware.util.LocaleUtils"%>
<%@ page import="org.jivesoftware.util.Log"%>
<%@ page import="org.jivesoftware.util.ParamUtils"%>
24
<%@ page import="org.xmpp.packet.JID"%>
25
<%@ page import="org.xmpp.packet.Presence"%>
26 27 28
<%@ page import="java.io.UnsupportedEncodingException"%>
<%@ page import="java.net.URLDecoder"%>
<%@ page import="java.net.URLEncoder"%>
29
<%@ page import="java.util.*" %>
30 31

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
32
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
33
<!-- Define Administration Bean -->
34
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager"/>
35
<%  webManager.init(pageContext); %>
36 37

<%  // Get parameters
38 39
    boolean add = request.getParameter("add") != null;
    boolean delete = request.getParameter("remove") != null;
40
    boolean updateMember = request.getParameter("updateMember") != null;
41 42
    boolean update = request.getParameter("save") != null;
    boolean cancel = request.getParameter("cancel") != null;
43
    String username = ParamUtils.getParameter(request, "username");
44 45
    String [] adminIDs = ParamUtils.getParameters(request, "admin");
    String [] deleteMembers = ParamUtils.getParameters(request, "delete");
Matt Tucker's avatar
Matt Tucker committed
46
    String groupName = ParamUtils.getParameter(request, "group");
47
    GroupManager groupManager = webManager.getGroupManager();
Derek DeMoro's avatar
Derek DeMoro committed
48
    boolean groupInfoChanged = ParamUtils.getBooleanParameter(request, "groupChanged", false);
Derek DeMoro's avatar
Derek DeMoro committed
49

50 51
    Map<String,String> errors = new HashMap<String,String>();

52 53 54 55
    // Get the presence manager
    PresenceManager presenceManager = webManager.getPresenceManager();
    UserManager userManager = webManager.getUserManager();

56
    boolean enableRosterGroups = ParamUtils.getBooleanParameter(request,"enableRosterGroups");
57
    boolean shareAdditional = ParamUtils.getParameter(request, "shareContactList") != null;
58 59 60 61
    String groupDisplayName = ParamUtils.getParameter(request,"groupDisplayName");
    String showGroup = ParamUtils.getParameter(request,"showGroup");
    String[] groupNames = ParamUtils.getParameters(request, "groupNames");

Matt Tucker's avatar
Matt Tucker committed
62
    Group group = groupManager.getGroup(groupName);
63
    boolean success;
Derek DeMoro's avatar
Derek DeMoro committed
64 65
    StringBuffer errorBuf = new StringBuffer();

66 67 68 69
    if (cancel) {
        response.sendRedirect("group-summary.jsp");
        return;
    }
Derek DeMoro's avatar
Derek DeMoro committed
70

71
    if (update) {
72 73
        if (enableRosterGroups && (groupDisplayName == null || groupDisplayName.trim().length() == 0)) {
            errors.put("groupDisplayName", "");
74 75
        }
        if (errors.isEmpty()) {
76 77 78 79 80 81
            if (enableRosterGroups) {
                if (showGroup == null || !shareAdditional) {
                    showGroup = "onlyGroup";
                }
                if ("spefgroups".equals(showGroup)) {
                    showGroup = "onlyGroup";
82 83
                }
                else {
84
                    groupNames = new String[] {};
85
                }
86 87 88 89 90 91
                group.getProperties().put("sharedRoster.showInRoster", showGroup);
                if (groupDisplayName != null) {
                    group.getProperties().put("sharedRoster.displayName", groupDisplayName);
                }
                group.getProperties().put("sharedRoster.groupList", toList(groupNames, "UTF-8"));

92 93 94 95
                if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
                    // Log the event
                    webManager.logEvent("enabled roster groups for "+groupName, "showinroster = "+showGroup+"\ndisplayname = "+groupDisplayName+"\ngrouplist = "+toList(groupNames, "UTF-8"));
                }
96 97 98 99 100 101
            }
            else {
                group.getProperties().put("sharedRoster.showInRoster", "nobody");
                group.getProperties().put("sharedRoster.displayName", "");
                group.getProperties().put("sharedRoster.groupList", "");

102 103 104 105
                if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
                    // Log the event
                    webManager.logEvent("disabled roster groups for "+groupName, null);
                }
106
            }
107

108
            // Get admin list and compare it the admin posted list.
109 110 111 112 113
            response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&groupChanged=true");
            return;
        }
        else {
            // Continue editing since there are some errors
114
            updateMember = false;
115
        }
Derek DeMoro's avatar
Derek DeMoro committed
116 117
    }

Derek DeMoro's avatar
Derek DeMoro committed
118

119
    if (updateMember) {
120
        Set<JID> adminIDSet = new HashSet<JID>();
121 122
        for (String adminID : adminIDs) {
            JID newAdmin = new JID(adminID);
123 124
            adminIDSet.add(newAdmin);
            boolean isAlreadyAdmin = group.getAdmins().contains(newAdmin);
125 126 127
            if (!isAlreadyAdmin) {
                // Add new admin
                group.getAdmins().add(newAdmin);
128 129
            }
        }
130
        Collection<JID> admins = Collections.unmodifiableCollection(group.getAdmins());
131
        Set<JID> removeList = new HashSet<JID>();
132 133 134
        for (JID admin : admins) {
            if (!adminIDSet.contains(admin)) {
                removeList.add(admin);
135 136
            }
        }
137 138
        for (JID member : removeList) {
            group.getMembers().add(member);
139
        }
140 141 142 143 144
        if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
            // Log the event
            // TODO: Should log more here later
            webManager.logEvent("updated group membership for "+groupName, null);
        }
145
        // Get admin list and compare it the admin posted list.
Derek DeMoro's avatar
Derek DeMoro committed
146
        response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&updatesuccess=true");
147 148
        return;
    }
149
    else if (add && username != null) {
Matt Tucker's avatar
Matt Tucker committed
150
        int count = 0;
151 152
        username = username.trim();
        username = username.toLowerCase();
153

154
        if (username.indexOf('@') != -1) {
155 156 157 158
            try {
                UserManager.getInstance().getUser(JID.escapeNode(username));
                // That means that this user has an email address as their node.
                username = JID.escapeNode(username);
159
            }
160
            catch (UserNotFoundException e) {
161

162 163
            }
        }
164

165 166 167 168 169 170 171 172 173 174 175 176 177
        // Add to group as member by default.
        try {
            boolean added;
            if (username.indexOf('@') == -1) {
                // No @ was found so assume this is a JID of a local user
                username = JID.escapeNode(username);
                username = Stringprep.nodeprep(username);
                UserManager.getInstance().getUser(username);
                added = group.getMembers().add(webManager.getXMPPServer().createJID(username, null));
            }
            else {
                // Admin entered a JID. Add the JID directly to the list of group members
                added = group.getMembers().add(new JID(username));
178 179 180 181
                if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
                    // Log the event
                    webManager.logEvent("added group member to "+groupName, "username = "+username);
                }
182
            }
183

184 185
            if (added) {
                count++;
Derek DeMoro's avatar
Derek DeMoro committed
186
            }
187
            else {
188
                errorBuf.append("<br>").append(
189
                        LocaleUtils.getLocalizedString("group.edit.already_user", Arrays.asList(username)));
190
            }
191 192 193 194 195 196

        }
        catch (Exception e) {
            Log.warn("Problem adding new user to existing group", e);
            errorBuf.append("<br>").append(
                    LocaleUtils.getLocalizedString("group.edit.inexistent_user", Arrays.asList(username)));
197
        }
Matt Tucker's avatar
Matt Tucker committed
198 199 200
        if (count > 0) {
            response.sendRedirect("group-edit.jsp?group=" +
                    URLEncoder.encode(groupName, "UTF-8") + "&success=true");
Derek DeMoro's avatar
Derek DeMoro committed
201
            return;
Matt Tucker's avatar
Matt Tucker committed
202 203
        }
        else {
Derek DeMoro's avatar
Derek DeMoro committed
204 205
            success = false;
            add = true;
Matt Tucker's avatar
Matt Tucker committed
206
        }
Derek DeMoro's avatar
Derek DeMoro committed
207 208

    }
209
    else if(add && username == null){
Derek DeMoro's avatar
Derek DeMoro committed
210
        add = false;
211 212
    }
    else if (delete) {
213 214
        for (String deleteMember : deleteMembers) {
            JID member = new JID(deleteMember);
215 216
            group.getMembers().remove(member);
            group.getAdmins().remove(member);
217
        }
Derek DeMoro's avatar
Derek DeMoro committed
218
        response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&deletesuccess=true");
219 220
        return;
    }
Derek DeMoro's avatar
Derek DeMoro committed
221
    success = groupInfoChanged || "true".equals(request.getParameter("success")) ||
Matt Tucker's avatar
Matt Tucker committed
222
            "true".equals(request.getParameter("deletesuccess")) ||
Matt Tucker's avatar
Matt Tucker committed
223 224
            "true".equals(request.getParameter("updatesuccess")) ||
            "true".equals(request.getParameter("creategroupsuccess"));
225 226 227

    if (errors.size() == 0) {
        showGroup = group.getProperties().get("sharedRoster.showInRoster");
228 229
        enableRosterGroups = !"nobody".equals(showGroup);
        shareAdditional = "everybody".equals(showGroup);
230
        if ("onlyGroup".equals(showGroup)) {
231
            String glist = group.getProperties().get("sharedRoster.groupList");
232
            List<String> l = new ArrayList<String>();
233
            if (glist != null) {
234
                StringTokenizer tokenizer = new StringTokenizer(glist,",\t\n\r\f");
235
                while (tokenizer.hasMoreTokens()) {
236
                    String tok = tokenizer.nextToken().trim();
237 238
                    l.add(tok.trim());
                }
239 240 241
                if (!l.isEmpty()) {
                    shareAdditional = true;
                }
242
            }
243
            groupNames = l.toArray(new String[]{});
244 245 246
        }
        groupDisplayName = group.getProperties().get("sharedRoster.displayName"); 
    }
247
%>
Matt Tucker's avatar
Matt Tucker committed
248

249
<html>
250 251 252 253 254 255 256 257
<head>
<title><fmt:message key="group.edit.title"/></title>
<meta name="subPageID" content="group-edit"/>
<meta name="extraParams" content="<%= "group="+URLEncoder.encode(groupName, "UTF-8") %>"/>
<meta name="helpPage" content="edit_group_properties.html"/>
</head>
<body>

258 259 260 261 262 263
<% if (webManager.getGroupManager().isReadOnly() && webManager.getGroupManager().isPropertyReadOnly()) { %>
<div class="error">
    <fmt:message key="group.read_only"/>
</div>
<% } %>

264 265 266 267 268 269 270
<p>
	<fmt:message key="group.edit.form_info" />
</p>

<p>
	<a href="group-summary.jsp" class="jive-link-back"><span>&laquo;</span> Back to all groups</a>
</p>
Gaston Dombiak's avatar
Gaston Dombiak committed
271

Derek DeMoro's avatar
Derek DeMoro committed
272
<%
Matt Tucker's avatar
Matt Tucker committed
273
    if (success) {
Derek DeMoro's avatar
Derek DeMoro committed
274
%>
Matt Tucker's avatar
Matt Tucker committed
275 276 277
    <div class="jive-success">
    <table cellpadding="0" cellspacing="0" border="0">
    <tbody>
278
        <tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0" alt=""></td>
Matt Tucker's avatar
Matt Tucker committed
279 280
        <td class="jive-icon-label">
        <% if (groupInfoChanged) { %>
281
        <fmt:message key="group.edit.update" />
Matt Tucker's avatar
Matt Tucker committed
282
        <% } else if ("true".equals(request.getParameter("success"))) { %>
283
            <fmt:message key="group.edit.update_add_user" />
Matt Tucker's avatar
Matt Tucker committed
284
        <% } else if ("true".equals(request.getParameter("deletesuccess"))) { %>
285
            <fmt:message key="group.edit.update_del_user" />
Matt Tucker's avatar
Matt Tucker committed
286
        <% } else if ("true".equals(request.getParameter("updatesuccess"))) { %>
287
            <fmt:message key="group.edit.update_user" />
Matt Tucker's avatar
Matt Tucker committed
288
         <% } else if ("true".equals(request.getParameter("creategroupsuccess"))) { %>
289
            <fmt:message key="group.edit.update_success" />
Matt Tucker's avatar
Matt Tucker committed
290 291 292 293 294 295 296
        <%
            }
        %>
        </td></tr>
    </tbody>
    </table>
    </div><br>
297 298
<%
    }
Derek DeMoro's avatar
Derek DeMoro committed
299
    else if(!success && add){
300
%>
301
	<div class="jive-error">
Derek DeMoro's avatar
Derek DeMoro committed
302 303
    <table cellpadding="0" cellspacing="0" border="0">
    <tbody>
304
        <tr><td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0" alt=""></td>
Derek DeMoro's avatar
Derek DeMoro committed
305 306
        <td class="jive-icon-label">
        <% if(add) { %>
307
        <fmt:message key="group.edit.not_update" />
Derek DeMoro's avatar
Derek DeMoro committed
308
        <%= errorBuf %>
Derek DeMoro's avatar
Derek DeMoro committed
309 310 311 312 313 314
        <% } %>
        </td></tr>
    </tbody>
    </table>
    </div><br>
<% } %>
Derek DeMoro's avatar
Derek DeMoro committed
315

316
	<div class="jive-horizontalRule"></div>
317

318 319
<form name="ff" action="group-edit.jsp">
<input type="hidden" name="group" value="<%= groupName %>"/>
320 321


322 323
	<!-- BEGIN group name and description -->
	<div class="jive-contentBox-plain">
324 325 326
        <%  // Only show edit and delete options if the groups aren't read-only.
            if (!webManager.getGroupManager().isReadOnly()) { %>
        <div class="jive-contentBox-toolbox">
Matt Tucker's avatar
Matt Tucker committed
327
			<a href="group-create.jsp?group=<%= URLEncoder.encode(group.getName(), "UTF-8")%>&name=<%= URLEncoder.encode(group.getName(), "UTF-8")%>&description=<%= group.getDescription() != null? URLEncoder.encode(group.getDescription(), "UTF-8") : "" %>" class="jive-link-edit"><fmt:message key="group.edit.edit_details" /></a>
328
			<a href="group-delete.jsp?group=<%= URLEncoder.encode(group.getName(), "UTF-8")%>" class="jive-link-delete"><fmt:message key="group.edit.delete" /></a>
329
		</div>
330
        <% } %>
331

332
        <h3>
333 334 335 336 337 338 339 340 341 342 343
			<%= group.getName() %>
		</h3>
		<p>
			<%= group.getDescription() != null ? group.getDescription() : "" %>
		</p>
    </div>
	<!-- END group name and description -->


	<!-- BEGIN contact list settings -->
	<div class="jive-contentBoxHeader">
344 345
		<fmt:message key="group.edit.share_title" />

346 347
	</div>
	<div class="jive-contentBox">
348 349 350 351 352 353 354 355 356 357 358
            <% if (webManager.getGroupManager().isPropertyReadOnly()) { %>
        <p>
                <% if (enableRosterGroups) { %>
            <fmt:message key="group.edit.share_status_enabled" />
                <% } else { %>
            <fmt:message key="group.edit.share_status_disabled" />
                <% } %>
        </p>

            <% } else { %>
        <p>
359
            <fmt:message key="group.edit.share_content" />
360 361
        </p>

362
		<table cellpadding="3" cellspacing="0" border="0">
363 364
		<tbody>
		<tr>
365
            <td width="1%">
366
                <input type="radio" name="enableRosterGroups" value="false" id="rb201" <%= !enableRosterGroups ? "checked" : "" %> onClick="document.getElementById('jive-roster').style.display = 'none';">
367 368
            </td>
            <td width="99%">
369
                <label for="rb201"><fmt:message key="group.edit.share_not_in_rosters" /></label>
370 371 372
            </td>
        </tr>
        <tr>
373 374
            <td width="1%" valign="top">
                <input type="radio" name="enableRosterGroups" value="true" id="rb202" <%= enableRosterGroups ? "checked" : "" %> onClick="document.getElementById('jive-roster').style.display = 'block';">
375 376
            </td>
            <td width="99%">
377
                <label for="rb202"><fmt:message key="group.edit.share_in_rosters" /></label>
378 379

                <div id="jive-roster" style="display: <%= !enableRosterGroups ? "none" : "block"  %>;">
380
	               <b><fmt:message key="group.edit.share_display_name" /></b>
381 382
	               <input type="text" name="groupDisplayName" size="30" maxlength="100" value="<%= (groupDisplayName != null ? groupDisplayName : "") %>"><br>
                       <%  if (errors.get("groupDisplayName") != null) { %>
Matt Tucker's avatar
Matt Tucker committed
383
                           <span class="jive-error-text"><fmt:message key="group.edit.share_display_name" /></span><br/>
384 385 386 387 388
                       <%  } %>
	                   <script type="text/javascript" language="JavaScript">
		                   function toggleRosterShare() {
			                   if (document.getElementById('cb101').checked == false) {
			                       document.getElementById('jive-rosterShare').style.display = 'none';
389
                                } else {
390
				                   document.getElementById('jive-rosterShare').style.display = 'block';
391
                                   document.getElementById('rb002').checked = true;
392 393 394 395
			                   }
		                   }
	                   </script>

396 397
	               <input type="checkbox" id="cb101" name="shareContactList" onClick="toggleRosterShare();" style="vertical-align: middle;"
										 <%= (shareAdditional ? "checked" : "") %>>
398
	               <label for="cb101"><fmt:message key="group.edit.share_additional" /></label>
399
	                    <div id="jive-rosterShare" style="display: <%= (enableRosterGroups && shareAdditional) ? "block" : "none"  %>;">
400 401 402 403 404
		                    <table cellpadding="2" cellspacing="0" border="0" width="100%">
							<tbody>
								<tr>
									<td width="1%" nowrap>
										<input type="radio" name="showGroup" value="everybody" id="rb002"
405
										 <%= ("everybody".equals(showGroup) ? "checked" : "") %>>
406 407
									</td>
									<td width="99%">
408
										<label for="rb002"><fmt:message key="group.edit.share_all_users" /></label>
409 410 411 412 413 414 415 416
									</td>
								</tr>
								<tr>
									<td width="1%" nowrap>
										<input type="radio" name="showGroup" value="spefgroups" id="rb003"
										 <%= (groupNames != null && groupNames.length > 0) ? "checked" : "" %>>
									</td>
									<td width="99%">
417
										<label for="rb003"><fmt:message key="group.edit.share_roster_groups" /></label>
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
									</td>
								</tr>
								<tr>
									<td width="1%" nowrap>
										&nbsp;
									</td>
									<td width="99%">
										<select name="groupNames" size="6" onclick="this.form.showGroup[1].checked=true;"
										 multiple style="width:340px;font-family:verdana,arial,helvetica,sans-serif;font-size:8pt;">

										<%  for (Group g : webManager.getGroupManager().getGroups()) {
											// Do not offer the edited group in the list of groups
											// Members of the editing group can always see each other
											if (g.equals(group)) {
												continue;
											}
										%>

											<option value="<%= URLEncoder.encode(g.getName(), "UTF-8") %>"
											 <%= (contains(groupNames, g.getName()) ? "selected" : "") %>
											 ><%= g.getName() %></option>

										<%  } %>

										</select>
									</td>
								</tr>
							</tbody>
							</table>
		                </div>
                </div>
449 450 451 452 453 454 455 456
            </td>
        </tr>
        <tr>
            <td width="1%">
                &nbsp;
            </td>
            <td width="99%">

457
                <input type="submit" name="save" value="<fmt:message key="group.edit.share_save" />">
458

Matt Tucker's avatar
Matt Tucker committed
459
            </td>
460 461 462
        </tr>
    </tbody>
    </table>
463
            <% } %>
464 465 466 467 468
	</div>
	<!-- END contact list settings -->


</form>
469 470


471 472
	<!-- BEGIN group membership management -->
	<div class="jive-contentBoxHeader">
473
		<fmt:message key="group.edit.members" />
474 475
	</div>
	<div class="jive-contentBox">
476 477 478
		<%  // Only show if the group isn't read-only.
            if (!webManager.getGroupManager().isReadOnly()) { %>
        <p>
479
			<fmt:message key="group.edit.members_description" />
480
		</p>
481

482
        <form action="group-edit.jsp" method="post" name="f">
483 484
        <input type="hidden" name="group" value="<%= groupName %>">
        <input type="hidden" name="add" value="Add"/>
485
        <table cellpadding="3" cellspacing="1" border="0" style="margin: 0 0 8px 0;">
486 487
            <tr>
                <td nowrap width="1%">
488
                    <fmt:message key="group.edit.add_user" />
489 490
                </td>
                <td nowrap class="c1" align="left">
491
                    <input type="text" size="45" name="username"/>
492
                    &nbsp;<input type="submit" name="addbutton" value="<fmt:message key="global.add" />">
493 494 495
                </td>
            </tr>
        </table>
496
        </form>
497

498 499 500
        <% } %>

        <form action="group-edit.jsp" method="post" name="main">
501
        <input type="hidden" name="group" value="<%= groupName %>">
502
        <table class="jive-table" cellpadding="3" cellspacing="0" border="0" width="435">
503
            <tr>
504 505
	            <th>&nbsp;</th>
                <th nowrap><fmt:message key="group.edit.username" /></th>
506 507
                <%  // Only show if the group isn't read-only.
                if (!webManager.getGroupManager().isReadOnly()) { %>
508 509
                <th width="1%" nowrap class="jive-table-th-center"><fmt:message key="group.edit.admin" /></th>
                <th width="1%" nowrap class="jive-table-th-center"><fmt:message key="group.edit.remove" /></th>
510
                <% } %>
511 512
            </tr>
            <!-- Add admins first -->
513
<%
Matt Tucker's avatar
Matt Tucker committed
514
            int memberCount = group.getMembers().size() + group.getAdmins().size();
Matt Tucker's avatar
Matt Tucker committed
515 516
            boolean showUpdateButtons = memberCount > 0;
            boolean showRemoteJIDsWarning = false;
517 518 519
            if (memberCount == 0) {
%>
                <tr>
520
                    <td align="center" colspan="4">
521
                        <br>
522
                        <fmt:message key="group.edit.user_hint" />
523 524 525 526
                        <br>
                        <br>
                    </td>
                </tr>
527
<%
528
            }
Matt Tucker's avatar
Matt Tucker committed
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545
            else {
                // Sort the list of members.
                ArrayList<JID> allMembers = new ArrayList<JID>(memberCount);
                allMembers.addAll(group.getMembers());
                Collection<JID> admins = group.getAdmins();
                allMembers.addAll(admins);
                Collections.sort(allMembers);
                for (JID jid:allMembers) {
                    boolean isLocal = webManager.getXMPPServer().isLocal(jid);
                    User user = null;
                    if (isLocal) {
                        try {
                            user = userManager.getUser(jid.getNode());
                        }
                        catch (UserNotFoundException unfe) {
                            // Ignore.
                        }
546
                    }
547
%>
548
                <tr>
549
                    <td width="1%">
550
                    <%  if (user != null && presenceManager.isAvailable(user)) {
551 552 553
                            Presence presence = presenceManager.getPresence(user);
                    %>
                    <% if (presence.getShow() == null) { %>
554
                    <img src="images/im_available.gif" width="16" height="16" border="0" title="<fmt:message key="user.properties.available" />" alt="<fmt:message key="user.properties.available" />">
555 556
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.chat) { %>
557
                    <img src="images/im_free_chat.gif" width="16" height="16" border="0" title="<fmt:message key="session.details.chat_available" />" alt="<fmt:message key="session.details.chat_available" />">
558 559
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.away) { %>
560
                    <img src="images/im_away.gif" width="16" height="16" border="0" title="<fmt:message key="session.details.away" />" alt="<fmt:message key="session.details.away" />">
561 562
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.xa) { %>
563
                    <img src="images/im_away.gif" width="16" height="16" border="0" title="<fmt:message key="session.details.extended" />" alt="<fmt:message key="session.details.extended" />">
564 565
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.dnd) { %>
566
                    <img src="images/im_dnd.gif" width="16" height="16" border="0" title="<fmt:message key="session.details.not_disturb" />" alt="<fmt:message key="session.details.not_disturb" />">
567 568 569
                    <% } %>

                    <%  } else { %>
570
                    <img src="images/im_unavailable.gif" width="16" height="16" border="0" title="<fmt:message key="user.properties.offline" />" alt="<fmt:message key="user.properties.offline" />">
571
                    <%  } %>
572

573 574
                    </td>
                    <% if (user != null) { %>
575
                    <td><a href="user-properties.jsp?username=<%= URLEncoder.encode(user.getUsername(), "UTF-8") %>"><%= JID.unescapeNode(user.getUsername()) %></a><% if (!isLocal) { showRemoteJIDsWarning = true; %> <font color="red"><b>*</b></font><%}%></td>
576 577 578
                    <% } else { %>
                    <td><%= jid %><% showRemoteJIDsWarning = true; %> <font color="red"><b>*</b></font></td>
                    <% } %>
579 580
                    <%  // Only show if the group isn't read-only.
                    if (!webManager.getGroupManager().isReadOnly()) { %>
Matt Tucker's avatar
Matt Tucker committed
581
                    <td align="center">
Matt Tucker's avatar
Matt Tucker committed
582
                        <input type="checkbox" name="admin" value="<%= jid %>" <% if (admins.contains(jid)) { %>checked<% } %>>
583 584
                    </td>
                    <td align="center">
585
                        <input type="checkbox" name="delete" value="<%= jid %>">
586
                    </td>
587
                    <% } %>
588 589
                </tr>
<%
590
                }
591
            }
592
            if (showUpdateButtons && !webManager.getGroupManager().isReadOnly()) {
593 594
%>
                <tr>
595
                    <td colspan="2">
596 597 598
                        &nbsp;
                    </td>
                    <td align="center">
599
                        <input type="submit" name="updateMember" value="Update">
600 601 602 603 604
                    </td>
                    <td align="center">
                        <input type="submit" name="remove" value="Remove">
                    </td>
                </tr>
605 606 607 608 609 610
<%
            }

            if (showRemoteJIDsWarning) {
%>
            <tr>
611
                <td colspan="4">
612
                    <font color="red">* <fmt:message key="group.edit.note" /></font>
613 614
                </td>
            </tr>
615 616 617 618
<%
            }
%>
        </table>
619
        </form>
620 621

    <script type="text/javascript">
622
        document.f.username.focus();
623
    </script>
624

625 626 627 628 629 630
	</div>
	<!-- END group membership management -->



</body>
631
</html>
632

633

634
<%!
635
    private static String toList(String[] array, String enc) {
636 637 638 639 640
        if (array == null || array.length == 0) {
            return "";
        }
        StringBuffer buf = new StringBuffer();
        String sep = "";
641
        for (String anArray : array) {
642 643
            String item;
            try {
644
                item = URLDecoder.decode(anArray, enc);
645 646
            }
            catch (UnsupportedEncodingException e) {
647
                item = anArray;
648 649
            }
            buf.append(sep).append(item);
650 651 652 653 654 655 656 657 658
            sep = ",";
        }
        return buf.toString();
    }

    private static boolean contains(String[] array, String item) {
        if (array == null || array.length == 0 || item == null) {
            return false;
        }
659 660
        for (String anArray : array) {
            if (item.equals(anArray)) {
661 662 663 664 665 666
                return true;
            }
        }
        return false;
    }
%>