group-edit.jsp 27 KB
Newer Older
1 2 3 4
<%--
  -	$Revision$
  -	$Date$
  -
5
  - Copyright (C) 2005-2008 Jive Software. All rights reserved.
6
  -
7 8 9 10 11 12 13 14 15 16 17
  - Licensed under the Apache License, Version 2.0 (the "License");
  - you may not use this file except in compliance with the License.
  - You may obtain a copy of the License at
  -
  -     http://www.apache.org/licenses/LICENSE-2.0
  -
  - Unless required by applicable law or agreed to in writing, software
  - distributed under the License is distributed on an "AS IS" BASIS,
  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - See the License for the specific language governing permissions and
  - limitations under the License.
18 19
--%>

20
<%@ page import="org.jivesoftware.openfire.PresenceManager,
21
                 org.jivesoftware.openfire.group.Group,
22 23 24 25 26
                 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"
27
%>
28
<%@ page import="gnu.inet.encoding.Stringprep"%>
29 30 31
<%@ page import="org.jivesoftware.util.LocaleUtils"%>
<%@ page import="org.jivesoftware.util.Log"%>
<%@ page import="org.jivesoftware.util.ParamUtils"%>
32
<%@ page import="org.jivesoftware.util.StringUtils"%>
33
<%@ page import="org.xmpp.packet.JID"%>
34
<%@ page import="org.xmpp.packet.Presence"%>
35 36 37
<%@ page import="java.io.UnsupportedEncodingException"%>
<%@ page import="java.net.URLDecoder"%>
<%@ page import="java.net.URLEncoder"%>
38
<%@ page import="java.util.*" %>
39

40 41
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
42
<!-- Define Administration Bean -->
43
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager"/>
44
<%  webManager.init(pageContext); %>
45 46

<%  // Get parameters
47 48
    boolean add = request.getParameter("add") != null;
    boolean delete = request.getParameter("remove") != null;
49
    boolean updateMember = request.getParameter("updateMember") != null;
50 51
    boolean update = request.getParameter("save") != null;
    boolean cancel = request.getParameter("cancel") != null;
52
    String username = ParamUtils.getParameter(request, "username");
53 54
    String [] adminIDs = ParamUtils.getParameters(request, "admin");
    String [] deleteMembers = ParamUtils.getParameters(request, "delete");
Matt Tucker's avatar
Matt Tucker committed
55
    String groupName = ParamUtils.getParameter(request, "group");
56
    GroupManager groupManager = webManager.getGroupManager();
Derek DeMoro's avatar
Derek DeMoro committed
57
    boolean groupInfoChanged = ParamUtils.getBooleanParameter(request, "groupChanged", false);
Derek DeMoro's avatar
Derek DeMoro committed
58

59 60
    Map<String,String> errors = new HashMap<String,String>();

61 62 63 64
    // Get the presence manager
    PresenceManager presenceManager = webManager.getPresenceManager();
    UserManager userManager = webManager.getUserManager();

65
    boolean enableRosterGroups = ParamUtils.getBooleanParameter(request,"enableRosterGroups");
66
    boolean shareAdditional = ParamUtils.getParameter(request, "shareContactList") != null;
67 68 69 70
    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
71
    Group group = groupManager.getGroup(groupName);
72
    boolean success;
Derek DeMoro's avatar
Derek DeMoro committed
73 74
    StringBuffer errorBuf = new StringBuffer();

75 76 77 78
    if (cancel) {
        response.sendRedirect("group-summary.jsp");
        return;
    }
Derek DeMoro's avatar
Derek DeMoro committed
79

80
    if (update) {
81 82
        if (enableRosterGroups && (groupDisplayName == null || groupDisplayName.trim().length() == 0)) {
            errors.put("groupDisplayName", "");
83 84
        }
        if (errors.isEmpty()) {
85 86 87 88 89 90
            if (enableRosterGroups) {
                if (showGroup == null || !shareAdditional) {
                    showGroup = "onlyGroup";
                }
                if ("spefgroups".equals(showGroup)) {
                    showGroup = "onlyGroup";
91 92
                }
                else {
93
                    groupNames = new String[] {};
94
                }
95 96 97 98 99 100
                group.getProperties().put("sharedRoster.showInRoster", showGroup);
                if (groupDisplayName != null) {
                    group.getProperties().put("sharedRoster.displayName", groupDisplayName);
                }
                group.getProperties().put("sharedRoster.groupList", toList(groupNames, "UTF-8"));

101 102 103 104
                if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
                    // Log the event
                    webManager.logEvent("enabled roster groups for "+groupName, "showinroster = "+showGroup+"\ndisplayname = "+groupDisplayName+"\ngrouplist = "+toList(groupNames, "UTF-8"));
                }
105 106 107 108 109 110
            }
            else {
                group.getProperties().put("sharedRoster.showInRoster", "nobody");
                group.getProperties().put("sharedRoster.displayName", "");
                group.getProperties().put("sharedRoster.groupList", "");

111 112 113 114
                if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
                    // Log the event
                    webManager.logEvent("disabled roster groups for "+groupName, null);
                }
115
            }
116

117
            // Get admin list and compare it the admin posted list.
118 119 120 121 122
            response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&groupChanged=true");
            return;
        }
        else {
            // Continue editing since there are some errors
123
            updateMember = false;
124
        }
Derek DeMoro's avatar
Derek DeMoro committed
125 126
    }

Derek DeMoro's avatar
Derek DeMoro committed
127

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

163
        if (username.indexOf('@') != -1) {
164 165 166 167
            try {
                UserManager.getInstance().getUser(JID.escapeNode(username));
                // That means that this user has an email address as their node.
                username = JID.escapeNode(username);
168
            }
169
            catch (UserNotFoundException e) {
170

171 172
            }
        }
173

174 175 176 177 178 179 180 181 182 183 184 185 186
        // 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));
187 188 189 190
                if (!SecurityAuditManager.getSecurityAuditProvider().blockGroupEvents()) {
                    // Log the event
                    webManager.logEvent("added group member to "+groupName, "username = "+username);
                }
191
            }
192

193 194
            if (added) {
                count++;
Derek DeMoro's avatar
Derek DeMoro committed
195
            }
196
            else {
197
                errorBuf.append("<br>").append(
198
                        LocaleUtils.getLocalizedString("group.edit.already_user", Arrays.asList(username)));
199
            }
200 201 202 203 204 205

        }
        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)));
206
        }
Matt Tucker's avatar
Matt Tucker committed
207 208 209
        if (count > 0) {
            response.sendRedirect("group-edit.jsp?group=" +
                    URLEncoder.encode(groupName, "UTF-8") + "&success=true");
Derek DeMoro's avatar
Derek DeMoro committed
210
            return;
Matt Tucker's avatar
Matt Tucker committed
211 212
        }
        else {
Derek DeMoro's avatar
Derek DeMoro committed
213 214
            success = false;
            add = true;
Matt Tucker's avatar
Matt Tucker committed
215
        }
Derek DeMoro's avatar
Derek DeMoro committed
216 217

    }
218
    else if(add && username == null){
Derek DeMoro's avatar
Derek DeMoro committed
219
        add = false;
220 221
    }
    else if (delete) {
222 223
        for (String deleteMember : deleteMembers) {
            JID member = new JID(deleteMember);
224 225
            group.getMembers().remove(member);
            group.getAdmins().remove(member);
226
        }
Derek DeMoro's avatar
Derek DeMoro committed
227
        response.sendRedirect("group-edit.jsp?group=" + URLEncoder.encode(groupName, "UTF-8") + "&deletesuccess=true");
228 229
        return;
    }
Derek DeMoro's avatar
Derek DeMoro committed
230
    success = groupInfoChanged || "true".equals(request.getParameter("success")) ||
Matt Tucker's avatar
Matt Tucker committed
231
            "true".equals(request.getParameter("deletesuccess")) ||
Matt Tucker's avatar
Matt Tucker committed
232 233
            "true".equals(request.getParameter("updatesuccess")) ||
            "true".equals(request.getParameter("creategroupsuccess"));
234 235 236

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

258
<html>
259 260 261 262 263 264 265 266
<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>

267 268 269 270 271 272
<% if (webManager.getGroupManager().isReadOnly() && webManager.getGroupManager().isPropertyReadOnly()) { %>
<div class="error">
    <fmt:message key="group.read_only"/>
</div>
<% } %>

273 274 275 276 277 278 279
<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
280

Derek DeMoro's avatar
Derek DeMoro committed
281
<%
Matt Tucker's avatar
Matt Tucker committed
282
    if (success) {
Derek DeMoro's avatar
Derek DeMoro committed
283
%>
Matt Tucker's avatar
Matt Tucker committed
284 285 286
    <div class="jive-success">
    <table cellpadding="0" cellspacing="0" border="0">
    <tbody>
287
        <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
288 289
        <td class="jive-icon-label">
        <% if (groupInfoChanged) { %>
290
        <fmt:message key="group.edit.update" />
Matt Tucker's avatar
Matt Tucker committed
291
        <% } else if ("true".equals(request.getParameter("success"))) { %>
292
            <fmt:message key="group.edit.update_add_user" />
Matt Tucker's avatar
Matt Tucker committed
293
        <% } else if ("true".equals(request.getParameter("deletesuccess"))) { %>
294
            <fmt:message key="group.edit.update_del_user" />
Matt Tucker's avatar
Matt Tucker committed
295
        <% } else if ("true".equals(request.getParameter("updatesuccess"))) { %>
296
            <fmt:message key="group.edit.update_user" />
Matt Tucker's avatar
Matt Tucker committed
297
         <% } else if ("true".equals(request.getParameter("creategroupsuccess"))) { %>
298
            <fmt:message key="group.edit.update_success" />
Matt Tucker's avatar
Matt Tucker committed
299 300 301 302 303 304 305
        <%
            }
        %>
        </td></tr>
    </tbody>
    </table>
    </div><br>
306 307
<%
    }
Derek DeMoro's avatar
Derek DeMoro committed
308
    else if(!success && add){
309
%>
310
	<div class="jive-error">
Derek DeMoro's avatar
Derek DeMoro committed
311 312
    <table cellpadding="0" cellspacing="0" border="0">
    <tbody>
313
        <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
314 315
        <td class="jive-icon-label">
        <% if(add) { %>
316
        <fmt:message key="group.edit.not_update" />
Sven Tantau's avatar
Sven Tantau committed
317
        <%= StringUtils.escapeHTMLTags(errorBuf.toString()) %>
Derek DeMoro's avatar
Derek DeMoro committed
318 319 320 321 322 323
        <% } %>
        </td></tr>
    </tbody>
    </table>
    </div><br>
<% } %>
Derek DeMoro's avatar
Derek DeMoro committed
324

325
	<div class="jive-horizontalRule"></div>
326

327
<form name="ff" action="group-edit.jsp">
Sven Tantau's avatar
Sven Tantau committed
328
<input type="hidden" name="group" value="<%= StringUtils.escapeForXML(groupName) %>"/>
329 330


331 332
	<!-- BEGIN group name and description -->
	<div class="jive-contentBox-plain">
333 334 335
        <%  // 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
336
			<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>
337
			<a href="group-delete.jsp?group=<%= URLEncoder.encode(group.getName(), "UTF-8")%>" class="jive-link-delete"><fmt:message key="group.edit.delete" /></a>
338
		</div>
339
        <% } %>
340

341
        <h3>
342
			<%= StringUtils.escapeHTMLTags(group.getName()) %>
343 344
		</h3>
		<p>
345
			<%= group.getDescription() != null ? StringUtils.escapeHTMLTags(group.getDescription()) : "" %>
346 347 348 349 350 351 352
		</p>
    </div>
	<!-- END group name and description -->


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

355 356
	</div>
	<div class="jive-contentBox">
357 358 359 360 361 362 363 364 365 366 367
            <% 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>
368
            <fmt:message key="group.edit.share_content" />
369 370
        </p>

371
		<table cellpadding="3" cellspacing="0" border="0">
372 373
		<tbody>
		<tr>
374
            <td width="1%">
375
                <input type="radio" name="enableRosterGroups" value="false" id="rb201" <%= !enableRosterGroups ? "checked" : "" %> onClick="document.getElementById('jive-roster').style.display = 'none';">
376 377
            </td>
            <td width="99%">
378
                <label for="rb201"><fmt:message key="group.edit.share_not_in_rosters" /></label>
379 380 381
            </td>
        </tr>
        <tr>
382 383
            <td width="1%" valign="top">
                <input type="radio" name="enableRosterGroups" value="true" id="rb202" <%= enableRosterGroups ? "checked" : "" %> onClick="document.getElementById('jive-roster').style.display = 'block';">
384 385
            </td>
            <td width="99%">
386
                <label for="rb202"><fmt:message key="group.edit.share_in_rosters" /></label>
387 388

                <div id="jive-roster" style="display: <%= !enableRosterGroups ? "none" : "block"  %>;">
389
	               <b><fmt:message key="group.edit.share_display_name" /></b>
Sven Tantau's avatar
Sven Tantau committed
390
	               <input type="text" name="groupDisplayName" size="30" maxlength="100" value="<%= (groupDisplayName != null ? StringUtils.escapeForXML(groupDisplayName) : "") %>"><br>
391
                       <%  if (errors.get("groupDisplayName") != null) { %>
Matt Tucker's avatar
Matt Tucker committed
392
                           <span class="jive-error-text"><fmt:message key="group.edit.share_display_name" /></span><br/>
393 394 395 396 397
                       <%  } %>
	                   <script type="text/javascript" language="JavaScript">
		                   function toggleRosterShare() {
			                   if (document.getElementById('cb101').checked == false) {
			                       document.getElementById('jive-rosterShare').style.display = 'none';
398
                                } else {
399
				                   document.getElementById('jive-rosterShare').style.display = 'block';
400
                                   document.getElementById('rb002').checked = true;
401 402 403 404
			                   }
		                   }
	                   </script>

405 406
	               <input type="checkbox" id="cb101" name="shareContactList" onClick="toggleRosterShare();" style="vertical-align: middle;"
										 <%= (shareAdditional ? "checked" : "") %>>
407
	               <label for="cb101"><fmt:message key="group.edit.share_additional" /></label>
408
	                    <div id="jive-rosterShare" style="display: <%= (enableRosterGroups && shareAdditional) ? "block" : "none"  %>;">
409 410 411 412 413
		                    <table cellpadding="2" cellspacing="0" border="0" width="100%">
							<tbody>
								<tr>
									<td width="1%" nowrap>
										<input type="radio" name="showGroup" value="everybody" id="rb002"
414
										 <%= ("everybody".equals(showGroup) ? "checked" : "") %>>
415 416
									</td>
									<td width="99%">
417
										<label for="rb002"><fmt:message key="group.edit.share_all_users" /></label>
418 419 420 421 422 423 424 425
									</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%">
426
										<label for="rb003"><fmt:message key="group.edit.share_roster_groups" /></label>
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
									</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" : "") %>
447
											 ><%= StringUtils.escapeHTMLTags(g.getName()) %></option>
448 449 450 451 452 453 454 455 456 457

										<%  } %>

										</select>
									</td>
								</tr>
							</tbody>
							</table>
		                </div>
                </div>
458 459 460 461 462 463 464 465
            </td>
        </tr>
        <tr>
            <td width="1%">
                &nbsp;
            </td>
            <td width="99%">

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

Matt Tucker's avatar
Matt Tucker committed
468
            </td>
469 470 471
        </tr>
    </tbody>
    </table>
472
            <% } %>
473 474 475 476 477
	</div>
	<!-- END contact list settings -->


</form>
478 479


480 481
	<!-- BEGIN group membership management -->
	<div class="jive-contentBoxHeader">
482
		<fmt:message key="group.edit.members" />
483 484
	</div>
	<div class="jive-contentBox">
485 486 487
		<%  // Only show if the group isn't read-only.
            if (!webManager.getGroupManager().isReadOnly()) { %>
        <p>
488
			<fmt:message key="group.edit.members_description" />
489
		</p>
490

491
        <form action="group-edit.jsp" method="post" name="f">
Sven Tantau's avatar
Sven Tantau committed
492
        <input type="hidden" name="group" value="<%= StringUtils.escapeForXML(groupName) %>">
493
        <input type="hidden" name="add" value="Add"/>
494
        <table cellpadding="3" cellspacing="1" border="0" style="margin: 0 0 8px 0;">
495 496
            <tr>
                <td nowrap width="1%">
497
                    <fmt:message key="group.edit.add_user" />
498 499
                </td>
                <td nowrap class="c1" align="left">
500
                    <input type="text" size="45" name="username"/>
501
                    &nbsp;<input type="submit" name="addbutton" value="<fmt:message key="global.add" />">
502 503 504
                </td>
            </tr>
        </table>
505
        </form>
506

507 508 509
        <% } %>

        <form action="group-edit.jsp" method="post" name="main">
Sven Tantau's avatar
Sven Tantau committed
510
        <input type="hidden" name="group" value="<%= StringUtils.escapeForXML(groupName) %>">
511
        <table class="jive-table" cellpadding="3" cellspacing="0" border="0" width="435">
512
            <tr>
513 514
	            <th>&nbsp;</th>
                <th nowrap><fmt:message key="group.edit.username" /></th>
515 516
                <%  // Only show if the group isn't read-only.
                if (!webManager.getGroupManager().isReadOnly()) { %>
517 518
                <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>
519
                <% } %>
520 521
            </tr>
            <!-- Add admins first -->
522
<%
Matt Tucker's avatar
Matt Tucker committed
523
            int memberCount = group.getMembers().size() + group.getAdmins().size();
Matt Tucker's avatar
Matt Tucker committed
524 525
            boolean showUpdateButtons = memberCount > 0;
            boolean showRemoteJIDsWarning = false;
526 527 528
            if (memberCount == 0) {
%>
                <tr>
529
                    <td align="center" colspan="4">
530
                        <br>
531
                        <fmt:message key="group.edit.user_hint" />
532 533 534 535
                        <br>
                        <br>
                    </td>
                </tr>
536
<%
537
            }
Matt Tucker's avatar
Matt Tucker committed
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
            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.
                        }
555
                    }
556
%>
557
                <tr>
558
                    <td width="1%">
559
                    <%  if (user != null && presenceManager.isAvailable(user)) {
560 561 562
                            Presence presence = presenceManager.getPresence(user);
                    %>
                    <% if (presence.getShow() == null) { %>
563
                    <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" />">
564 565
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.chat) { %>
566
                    <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" />">
567 568
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.away) { %>
569
                    <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" />">
570 571
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.xa) { %>
572
                    <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" />">
573 574
                    <% } %>
                    <% if (presence.getShow() == Presence.Show.dnd) { %>
575
                    <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" />">
576 577 578
                    <% } %>

                    <%  } else { %>
579
                    <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" />">
580
                    <%  } %>
581

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

            if (showRemoteJIDsWarning) {
%>
            <tr>
620
                <td colspan="4">
621
                    <font color="red">* <fmt:message key="group.edit.note" /></font>
622 623
                </td>
            </tr>
624 625 626 627
<%
            }
%>
        </table>
628
        </form>
629 630

    <script type="text/javascript">
631
        document.f.username.focus();
632
    </script>
633

634 635 636 637 638 639
	</div>
	<!-- END group membership management -->



</body>
640
</html>
641

642

643
<%!
644
    private static String toList(String[] array, String enc) {
645 646 647 648 649
        if (array == null || array.length == 0) {
            return "";
        }
        StringBuffer buf = new StringBuffer();
        String sep = "";
650
        for (String anArray : array) {
651 652
            String item;
            try {
653
                item = URLDecoder.decode(anArray, enc);
654 655
            }
            catch (UnsupportedEncodingException e) {
656
                item = anArray;
657 658
            }
            buf.append(sep).append(item);
659 660 661 662 663 664 665 666 667
            sep = ",";
        }
        return buf.toString();
    }

    private static boolean contains(String[] array, String item) {
        if (array == null || array.length == 0 || item == null) {
            return false;
        }
668 669
        for (String anArray : array) {
            if (item.equals(anArray)) {
670 671 672 673 674
                return true;
            }
        }
        return false;
    }
Sven Tantau's avatar
Sven Tantau committed
675
%>