Skip to content

Commit

Permalink
Merge pull request #7 from guusdk/6_4.8.0-compat
Browse files Browse the repository at this point in the history
fixes #6: Openfire 4.8.0 compatibility
  • Loading branch information
akrherz committed Jan 19, 2024
2 parents 2c35a57 + adf1dfe commit 411ed05
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 80 deletions.
4 changes: 3 additions & 1 deletion changelog.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,14 @@ <h1>

<p><b>1.7.2</b> -- (TBD)</p>
<ul>
<li>[<a href='https://github.com/igniterealtime/openfire-presence-plugin/issues/6'>#6</a>] - Fix Openfire 4.8.0 incompatibility</li>
<li>[<a href='https://github.com/igniterealtime/openfire-presence-plugin/issues/5'>#5</a>] - Guard against unloaded images</li>
</ul>

<p><b>1.7.1</b> -- November 12, 2020</p>
<ul>
<li>[<a href='https://issues.igniterealtime.org/browse/OF-1641'>OF-1641</a>] - Ensure all JSP pages have the correct contentType.</li>
<li>[<a href='https://github.com/igniterealtime/openfire-presence-plugin/issues/1'>#1] - Fix Maven build</li>
<li>[<a href='https://github.com/igniterealtime/openfire-presence-plugin/issues/1'>#1</a>] - Fix Maven build</li>
<li>Requires Openfire 4.1.1.</li>
</ul>

Expand Down
2 changes: 1 addition & 1 deletion plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<description>Exposes presence information through HTTP.</description>
<author>Jive Software</author>
<version>${project.version}</version>
<date>11/12/2020</date>
<date>2024-01-19</date>
<minServerVersion>4.1.1</minServerVersion>

<adminconsole>
Expand Down
10 changes: 6 additions & 4 deletions src/java/org/jivesoftware/openfire/plugin/PresencePlugin.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
* Copyright (C) 2004-2008 Jive Software, 2024 Ignite Realtime Foundation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -225,11 +225,14 @@ public Presence getPresence(String sender, String jid) throws UserNotFoundExcept
// Return component presence
return presence;
}
if (targetJID.getNode() == null ||
!UserManager.getInstance().isRegisteredUser(targetJID.getNode())) {

if (targetJID.getNode() == null) {
// Sender is requesting presence information of an anonymous user
throw new UserNotFoundException("Username is null");
}
// throws UserNotFound if the user doesn't exist.
User user = userManager.getUser(targetJID.getNode());

if (!isPresencePublic()) {
if (sender == null) {
throw new UserNotFoundException("Sender is null");
Expand All @@ -243,7 +246,6 @@ public Presence getPresence(String sender, String jid) throws UserNotFoundExcept
}
}
}
User user = userManager.getUser(targetJID.getNode());
return presenceManager.getPresence(user);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
* Copyright (C) 2004-2008 Jive Software, 2024 Ignite Realtime Foundation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -59,9 +59,9 @@ class ImagePresenceProvider extends PresenceInfoProvider {

private static final Logger Log = LoggerFactory.getLogger(ImagePresenceProvider.class);

private PresenceStatusServlet servlet;
private Map<String, byte[]> imageCache = new HashMap<String, byte[]>();
private Map<String, String> imageTypeCache = new HashMap<String, String>();
private final PresenceStatusServlet servlet;
private final Map<String, byte[]> imageCache = new HashMap<>();
private final Map<String, String> imageTypeCache = new HashMap<>();

public ImagePresenceProvider(PresenceStatusServlet servlet) {
this.servlet = servlet;
Expand All @@ -71,29 +71,29 @@ public ImagePresenceProvider(PresenceStatusServlet servlet) {
public void sendInfo(HttpServletRequest request,
HttpServletResponse response, Presence presence) throws IOException {
if (presence == null) {
writeImageContent(request, response, "offline", servlet.offline);
writeImageContent(request, response, "offline", servlet.getOffline());
}
else if (presence.getShow() == null) {
writeImageContent(request, response, "available", servlet.available);
writeImageContent(request, response, "available", servlet.getAvailable());
}
else if (presence.getShow().equals(org.xmpp.packet.Presence.Show.away)) {
writeImageContent(request, response, "away", servlet.away);
writeImageContent(request, response, "away", servlet.getAway());
}
else if (presence.getShow().equals(org.xmpp.packet.Presence.Show.chat)) {
writeImageContent(request, response, "chat", servlet.chat);
writeImageContent(request, response, "chat", servlet.getChat());
}
else if (presence.getShow().equals(org.xmpp.packet.Presence.Show.dnd)) {
writeImageContent(request, response, "dnd", servlet.dnd);
writeImageContent(request, response, "dnd", servlet.getDnd());
}
else if (presence.getShow().equals(org.xmpp.packet.Presence.Show.xa)) {
writeImageContent(request, response, "xa", servlet.xa);
writeImageContent(request, response, "xa", servlet.getXa());
}
}

@Override
public void sendUserNotFound(HttpServletRequest request, HttpServletResponse response)
throws IOException {
writeImageContent(request, response, "forbidden", servlet.offline);
writeImageContent(request, response, "forbidden", servlet.getOffline());
}

private void writeImageContent(HttpServletRequest request, HttpServletResponse response,
Expand Down Expand Up @@ -122,8 +122,8 @@ private void writeImageContent(String url, byte[] defaultContent, HttpServletRes
URLConnection connection = new URL(url).openConnection();
InputStream in = connection.getInputStream();
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
byte buffer[] = new byte[1024 * 4];
int last_read_bytes = 0;
byte[] buffer = new byte[1024 * 4];
int last_read_bytes;
while ((last_read_bytes = in.read(buffer)) != -1) {
bytes.write(buffer, 0, last_read_bytes);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (C) 2004-2008 Jive Software. All rights reserved.
* Copyright (C) 2004-2008 Jive Software, 2024 Ignite Realtime Foundation. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -56,12 +56,12 @@ public class PresenceStatusServlet extends HttpServlet {
private ImagePresenceProvider imageProvider;
private TextPresenceProvider textProvider;

byte available[];
byte away[];
byte chat[];
byte dnd[];
byte offline[];
byte xa[];
private byte[] available;
private byte[] away;
private byte[] chat;
private byte[] dnd;
private byte[] offline;
private byte[] xa;

@Override
public void init(ServletConfig servletConfig) throws ServletException {
Expand All @@ -71,13 +71,7 @@ public void init(ServletConfig servletConfig) throws ServletException {
xmlProvider = new XMLPresenceProvider();
imageProvider = new ImagePresenceProvider(this);
textProvider = new TextPresenceProvider();
available = loadResource("/images/user-green-16x16.gif");
away = loadResource("/images/user-yellow-16x16.gif");
chat = loadResource("/images/user-green-16x16.gif");
dnd = loadResource("/images/user-red-16x16.gif");
offline = loadResource("/images/user-clear-16x16.gif");
xa = loadResource("/images/user-yellow-16x16.gif");
// Exclude this servlet from requering the user to login
// Exclude this servlet from requiring the user to login
AuthCheckFilter.addExclude("presence/status");
}

Expand All @@ -91,48 +85,37 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)

try {
Presence presence = plugin.getPresence(sender, jid);
if ("image".equals(type)) {
imageProvider.sendInfo(request, response, presence);
}
else if ("xml".equals(type)) {
xmlProvider.sendInfo(request, response, presence);
}
else if ("text".equals(type)) {
textProvider.sendInfo(request, response, presence);
}
else {
Log.warn("The presence servlet received an invalid request of type: " + type);
// TODO Do something
switch (type) {
case "image":
imageProvider.sendInfo(request, response, presence);
break;
case "xml":
xmlProvider.sendInfo(request, response, presence);
break;
case "text":
textProvider.sendInfo(request, response, presence);
break;
default:
Log.warn("The presence servlet received an invalid request of type: " + type);
// TODO Do something
break;
}
}
catch (UserNotFoundException e) {
if ("image".equals(type)) {
imageProvider.sendUserNotFound(request, response);
}
else if ("xml".equals(type)) {
xmlProvider.sendUserNotFound(request, response);
}
else if ("text".equals(type)) {
textProvider.sendUserNotFound(request, response);
}
else {
Log.warn("The presence servlet received an invalid request of type: " + type);
// TODO Do something
}
}
catch (IllegalArgumentException e) {
if ("image".equals(type)) {
imageProvider.sendUserNotFound(request, response);
}
else if ("xml".equals(type)) {
xmlProvider.sendUserNotFound(request, response);
}
else if ("text".equals(type)) {
textProvider.sendUserNotFound(request, response);
}
else {
Log.warn("The presence servlet received an invalid request of type: " + type);
// TODO Do something
catch (UserNotFoundException | IllegalArgumentException e) {
switch (type) {
case "image":
imageProvider.sendUserNotFound(request, response);
break;
case "xml":
xmlProvider.sendUserNotFound(request, response);
break;
case "text":
textProvider.sendUserNotFound(request, response);
break;
default:
Log.warn("The presence servlet received an invalid request of type: " + type);
// TODO Do something
break;
}
}
}
Expand All @@ -144,7 +127,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
}

@Override
public void destroy() {
public synchronized void destroy() {
super.destroy();
available = null;
away = null;
Expand All @@ -158,17 +141,65 @@ public void destroy() {

private byte[] loadResource(String path) {
ServletContext context = getServletContext();
InputStream in = context.getResourceAsStream(path);
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
try (InputStream in = context.getResourceAsStream(path);
ByteArrayOutputStream out = new ByteArrayOutputStream())
{
for (int i = in.read(); i > -1; i = in.read()) {
out.write(i);
}
return out.toByteArray();
}
catch (IOException e) {
Log.error("error loading:" + path);
catch (Throwable e) {
Log.error("error loading: {}", path, e);
}
return null;
}

public synchronized byte[] getAvailable()
{
if (available == null) {
available = loadResource("/images/user-green-16x16.gif");
}
return out.toByteArray();
return available;
}

public synchronized byte[] getAway()
{
if (away == null) {
away = loadResource("/images/user-yellow-16x16.gif");
}
return away;
}

public synchronized byte[] getChat()
{
if (chat == null) {
chat = loadResource("/images/user-green-16x16.gif");
}
return chat;
}

public synchronized byte[] getDnd()
{
if (dnd == null) {
dnd = loadResource("/images/user-red-16x16.gif");
}
return dnd;
}

public synchronized byte[] getOffline()
{
if (offline == null) {
offline = loadResource("/images/user-clear-16x16.gif");
}
return offline;
}

public byte[] getXa()
{
if (xa == null) {
xa = loadResource("/images/user-yellow-16x16.gif");
}
return xa;
}
}

0 comments on commit 411ed05

Please sign in to comment.