From 0d9f75c8800841a850f49f99523d64a372f1ec4d Mon Sep 17 00:00:00 2001 From: Mark Hilbush Date: Tue, 22 Jan 2019 11:40:44 -0500 Subject: [PATCH 1/3] Fix local cover art download failure when auth enabled Signed-off-by: Mark Hilbush --- .../handler/SqueezeBoxPlayerHandler.java | 32 ++++++++++++++++--- .../handler/SqueezeBoxPlayerState.java | 25 ++++++++------- .../handler/SqueezeBoxServerHandler.java | 25 ++++++++++++--- 3 files changed, 60 insertions(+), 22 deletions(-) diff --git a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java index bd2ad03069042..bce58c09268dc 100644 --- a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java +++ b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java @@ -14,6 +14,8 @@ import static org.openhab.binding.squeezebox.internal.SqueezeBoxBindingConstants.*; +import java.net.URI; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -68,8 +70,7 @@ * @author Mark Hilbush - Convert sound notification volume from channel to config parameter */ public class SqueezeBoxPlayerHandler extends BaseThingHandler implements SqueezeBoxPlayerEventListener { - - private Logger logger = LoggerFactory.getLogger(SqueezeBoxPlayerHandler.class); + private final Logger logger = LoggerFactory.getLogger(SqueezeBoxPlayerHandler.class); public static final Set SUPPORTED_THING_TYPES_UIDS = Collections .singleton(SQUEEZEBOXPLAYER_THING_TYPE); @@ -417,17 +418,18 @@ private RawType downloadImage(String mac, String url) { // Only get the image if this is my PlayerHandler instance if (isMe(mac)) { if (StringUtils.isNotEmpty(url)) { + String sanitizedUrl = sanitizeUrl(url); RawType image = IMAGE_CACHE.putIfAbsentAndGet(url, () -> { - logger.debug("Trying to download the content of URL {}", url); + logger.debug("Trying to download the content of URL {}", sanitizedUrl); try { return HttpUtil.downloadImage(url); } catch (IllegalArgumentException e) { - logger.debug("IllegalArgumentException when downloading image from {}", url, e); + logger.debug("IllegalArgumentException when downloading image from {}", sanitizedUrl, e); return null; } }); if (image == null) { - logger.debug("Failed to download the content of URL {}", url); + logger.debug("Failed to download the content of URL {}", sanitizedUrl); return null; } else { return image; @@ -437,6 +439,26 @@ private RawType downloadImage(String mac, String url) { return null; } + /* + * Replaces the password in the URL, if present + */ + private String sanitizeUrl(String url) { + String sanitizedUrl = url; + try { + URI uri = new URI(url); + String userInfo = uri.getUserInfo(); + if (userInfo != null) { + String[] userInfoParts = userInfo.split(":"); + if (userInfoParts.length == 2) { + sanitizedUrl = url.replace(userInfoParts[1], "password"); + } + } + } catch (URISyntaxException e) { + // Just return what was passed in + } + return sanitizedUrl; + } + /** * Wrap the given RawType and return it as {@link State} or return {@link UnDefType#UNDEF} if the RawType is null. */ diff --git a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerState.java b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerState.java index 500cb9a1ed270..e8d7720f878d5 100644 --- a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerState.java +++ b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerState.java @@ -22,20 +22,21 @@ * @author Patrik Gfeller - Moved class to its own file. */ class SqueezeBoxPlayerState { - boolean savedMute; - boolean savedPower; - boolean savedStop; - boolean savedControl; - - int savedVolume; - int savedShuffle; - int savedRepeat; - int savedPlaylistIndex; - int savedNumberPlaylistTracks; - int savedPlayingTime; + private final Logger logger = LoggerFactory.getLogger(SqueezeBoxPlayerState.class); + + private boolean savedMute; + private boolean savedPower; + private boolean savedStop; + private boolean savedControl; + + private int savedVolume; + private int savedShuffle; + private int savedRepeat; + private int savedPlaylistIndex; + private int savedNumberPlaylistTracks; + private int savedPlayingTime; private SqueezeBoxPlayerHandler playerHandler; - private Logger logger = LoggerFactory.getLogger(SqueezeBoxPlayerState.class); public SqueezeBoxPlayerState(SqueezeBoxPlayerHandler playerHandler) { this.playerHandler = playerHandler; diff --git a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java index 473d35e68482c..159d0969eb605 100644 --- a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java +++ b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java @@ -68,7 +68,7 @@ * @author Mark Hilbush - Get favorites from LMS; update channel and send to players */ public class SqueezeBoxServerHandler extends BaseBridgeHandler { - private Logger logger = LoggerFactory.getLogger(SqueezeBoxServerHandler.class); + private final Logger logger = LoggerFactory.getLogger(SqueezeBoxServerHandler.class); public static final Set SUPPORTED_THING_TYPES_UIDS = Collections .singleton(SQUEEZEBOXSERVER_THING_TYPE); @@ -324,16 +324,27 @@ private synchronized void sendCommand(String command) { return; } - logger.debug("Sending command: {}", command); + logger.debug("Sending command: {}", sanitizeCommand(command)); try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); writer.write(command + NEW_LINE); writer.flush(); } catch (IOException e) { - logger.error("Error while sending command to Squeeze Server ({}) ", command, e); + logger.error("Error while sending command to Squeeze Server ({}) ", sanitizeCommand(command), e); } } + /* + * Remove password from login command to prevent it from being logged + */ + String sanitizeCommand(String command) { + String sanitizedCommand = command; + if (command.startsWith("login")) { + sanitizedCommand = command.replace(password, "password"); + } + return sanitizedCommand; + } + /** * Connects to a SqueezeBox Server */ @@ -789,7 +800,12 @@ public void updateListener(SqueezeBoxPlayerEventListener listener) { } private String constructCoverArtUrl(String mac, boolean coverart, String coverid, String artwork_url) { - String hostAndPort = "http://" + host + ":" + webport; + String hostAndPort; + if (StringUtils.isNotEmpty(userId)) { + hostAndPort = "http://" + userId + ":" + password + "@" + host + ":" + webport; + } else { + hostAndPort = "http://" + host + ":" + webport; + } // Default to using the convenience artwork URL (should be rare) String url = hostAndPort + "/music/current/cover.jpg?player=" + encode(mac); @@ -812,7 +828,6 @@ private String constructCoverArtUrl(String mac, boolean coverart, String coverid url = hostAndPort + "/" + decode(artwork_url); } } - logger.trace("{}: URL for cover art is {}", mac, url); return url; } From 09157301edb90eaf2853a0b8ac6ef16fe84d39a8 Mon Sep 17 00:00:00 2001 From: Mark Hilbush Date: Tue, 22 Jan 2019 14:56:58 -0500 Subject: [PATCH 2/3] Use asterisk for password display Signed-off-by: Mark Hilbush --- .../squeezebox/internal/handler/SqueezeBoxPlayerHandler.java | 2 +- .../squeezebox/internal/handler/SqueezeBoxServerHandler.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java index bce58c09268dc..11e32c8b0c78a 100644 --- a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java +++ b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxPlayerHandler.java @@ -450,7 +450,7 @@ private String sanitizeUrl(String url) { if (userInfo != null) { String[] userInfoParts = userInfo.split(":"); if (userInfoParts.length == 2) { - sanitizedUrl = url.replace(userInfoParts[1], "password"); + sanitizedUrl = url.replace(userInfoParts[1], "**********"); } } } catch (URISyntaxException e) { diff --git a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java index 159d0969eb605..3eb8284073f3a 100644 --- a/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java +++ b/addons/binding/org.openhab.binding.squeezebox/src/main/java/org/openhab/binding/squeezebox/internal/handler/SqueezeBoxServerHandler.java @@ -340,7 +340,7 @@ private synchronized void sendCommand(String command) { String sanitizeCommand(String command) { String sanitizedCommand = command; if (command.startsWith("login")) { - sanitizedCommand = command.replace(password, "password"); + sanitizedCommand = command.replace(password, "**********"); } return sanitizedCommand; } From 3de238c823fdae13e781d3a7e3e5f79e1f4f37f4 Mon Sep 17 00:00:00 2001 From: Mark Hilbush Date: Thu, 24 Jan 2019 09:21:24 -0500 Subject: [PATCH 3/3] Update known issues Signed-off-by: Mark Hilbush --- addons/binding/org.openhab.binding.squeezebox/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/binding/org.openhab.binding.squeezebox/README.md b/addons/binding/org.openhab.binding.squeezebox/README.md index 4976954931d02..ccb1846835af4 100644 --- a/addons/binding/org.openhab.binding.squeezebox/README.md +++ b/addons/binding/org.openhab.binding.squeezebox/README.md @@ -202,3 +202,6 @@ Therefore, it is recommended that the LMS be on a more current version than 7.7. - There have been reports that the LMS does not play some WAV files reliably. If you're using a TTS service that produces WAV files, and the notifications are not playing, try using an MP3-formatted TTS notification. + +- The LMS treats player MAC addresses as case-sensitive. +Therefore, the case of MAC addresses in the Squeeze Player thing configuration must match the case displayed on the *Information* tab in the LMS Settings.