Author: titmuss
Date: Fri Apr 18 10:19:07 2008
New Revision: 2277

URL: http://svn.slimdevices.com?rev=2277&root=Jive&view=rev
Log:
 [EMAIL PROTECTED] (orig r2274):  awy | 2008-04-18 18:01:07 +0100
 Fix horrible typo
 [EMAIL PROTECTED] (orig r2276):  titmuss | 2008-04-18 18:18:33 +0100
  [EMAIL PROTECTED] (orig r2275):  titmuss | 2008-04-18 18:14:31 +0100
  Bug: 5887
  Description:
  Add support for password protected SqueezeCenters.
  
  
 

Modified:
    7.2/trunk/   (props changed)
    
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthApplet.lua
    
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthMeta.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/strings.txt
    
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/Scanner.lua
    
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/strings.txt
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/CometRequest.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/RequestHttp.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SocketHttp.lua
    7.2/trunk/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua

Propchange: 7.2/trunk/
------------------------------------------------------------------------------
--- svk:merge (original)
+++ svk:merge Fri Apr 18 10:19:07 2008
@@ -1,5 +1,5 @@
-bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.0/trunk:2269
-bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.1/trunk:2270
+bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.0/trunk:2275
+bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/7.1/trunk:2276
 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/7.0:2013
 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/SN:1083
 bbe22326-0783-4b3a-ac2b-7ab96b24c8d9:/branches/scrolling:1378

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthApplet.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthApplet.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthApplet.lua 
(original)
+++ 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthApplet.lua 
Fri Apr 18 10:19:07 2008
@@ -34,63 +34,68 @@
 local Choice          = require("jive.ui.Choice")
 local Textarea        = require("jive.ui.Textarea")
 local Textinput       = require("jive.ui.Textinput")
+
+local SocketHttp      = require("jive.net.SocketHttp")
+
 local log             = require("jive.utils.log").logger("applets.setup")
 
 module(...)
 oo.class(_M, Applet)
 
 
-function settingsShow(self)
-       -- setup menu
-       local window = Window("window", self:string("HTTP_AUTH", 
'settingstitle'))
-       local menu = SimpleMenu("menu",
-       {
-               -- username
-               {       
-                       text = self:string("HTTP_AUTH_USERNAME"),
-                       sound = "WINDOWSHOW",
-                       callback = function(event, menuItem)
-                               self:enterTextWindow('username', menuItem)
-                       end
-               },
-               -- password
-               {
-                       text = self:string("HTTP_AUTH_PASSWORD"),
-                       sound = "WINDOWSHOW",
-                       callback = function(event, menuItem)
-                               self:enterTextWindow('password', menuItem)
-                       end
-               }
-       })
-               
-       window:addWidget(Textarea("help", self:string("HTTP_AUTH_HELP")))
-       window:addWidget(menu)
+function squeezeCenterPassword(self, server)
+       self.server = server
 
-       self:tieAndShowWindow(window)
-       return window
+       self.topWindow = self:_enterTextWindow("username", 
"HTTP_AUTH_USERNAME", "HTTP_AUTH_USERNAME_HELP", _enterPassword)
 end
 
-function enterTextWindow(self, userOrPass, menuItem)
-       local window = Window("window", menuItem.text)
 
-       local helpText = self:string("HTTP_AUTH_ENTER_HELP", userOrPass)
+function _enterPassword(self)
+       self:_enterTextWindow("password", "HTTP_AUTH_PASSWORD", 
"HTTP_AUTH_PASSWORD_HELP", _enterDone)
+end
 
-       local defaultText = self:getSettings()[userOrPass]
-       if defaultText == nil then
-               defaultText = ""
-       end
 
-       local input = Textinput("textinput", defaultText,
+function _enterDone(self)
+       local protected, realm = self.server:isPasswordProtected()
+
+       -- store username/password
+       local settings = self:getSettings()
+       settings[self.server:getName()] = {
+               realm = realm,
+               username = self.username,
+               password = self.password
+       }
+       self:storeSettings()
+
+       -- set authorization
+       self.server:setCredentials({
+               realm = realm,
+               username = self.username,
+               password = self.password,
+       })
+
+       self.username = nil
+       self.password = nil
+
+       -- FIXME delay here to check if the username/password are correct
+
+       self.topWindow:hideToTop(Window.transitionPushLeft)
+end
+
+
+function _enterTextWindow(self, key, title, help, next)
+       local window = Window("window", self:string(title))
+
+       local input = Textinput("textinput", self[key] or "",
                                function(_, value)
-                                       log:warn("Input ", value)
-                                       self:storeInput(userOrPass, value)
+                                       self[key] = value
 
                                        window:playSound("WINDOWSHOW")
-                                       window:hide(Window.transitionPushLeft)
+                                       next(self)
                                        return true
                                end)
 
-       window:addWidget(Textarea("softHelp", helpText))
+       window:addWidget(Textarea("softHelp", self:string(help)))
        window:addWidget(Label("softButton1", "Insert"))
        window:addWidget(Label("softButton2", "Delete"))
        window:addWidget(input)
@@ -99,10 +104,6 @@
        return window
 end
 
-function storeInput(self, userOrPass, value)
-       self:getSettings()[userOrPass] = value
-       self:storeSettings()
-end
 
 --[[
 

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthMeta.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthMeta.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthMeta.lua 
(original)
+++ 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/HttpAuthMeta.lua 
Fri Apr 18 10:19:07 2008
@@ -22,6 +22,8 @@
 local AppletMeta    = require("jive.AppletMeta")
 local Framework     = require("jive.ui.Framework")
 
+local SlimServer    = require("jive.slim.SlimServer")
+
 local appletManager = appletManager
 local jiveMain      = jiveMain
 
@@ -33,17 +35,15 @@
 end
 
 function defaultSettings(meta)
-        return {
-               username = "",
-               password = ""
-       }
+        return { }
 end
 
 function registerApplet(meta)
---[[ FIXME-- this is not implemented correctly, comment for now
-       -- add a menu to load us
-       jiveMain:addItem(meta:menuItem('appletHttpAuth', 'advancedSettings', 
"HTTP_AUTH", function(applet, ...) applet:settingsShow(...) end, 85))
---]]
+       local settings = meta:getSettings()
+
+       for servername, cred in pairs(settings) do
+               SlimServer:setCredentials(cred, servername)
+       end
 end
 
 --[[

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/strings.txt
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/strings.txt?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/strings.txt 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/applets/HttpAuth/strings.txt 
Fri Apr 18 10:19:07 2008
@@ -29,21 +29,21 @@
        IT      Password
        NL      Wachtwoord
 
-HTTP_AUTH_HELP
-       DA      Hvis du har aktiveret kodeord-beskyttelse af SqueezeCenter skal 
du konfigurere brugernavn og kodeord her.
-       DE      Ist der Kennwortschutz für SqueezeCenter konfiguriert, geben 
Sie hier Benutzername und Kennwort ein.
-       EN      If your SqueezeCenter is configured for password protection, 
configure the username and password here
-       ES      Si SqueezeCenter se ha configurado con protección por 
contraseña, configure el nombre de usuario y la contraseña aquí
-       FR      Si le SqueezeCenter est configuré pour la protection par mot 
de passe, spécifiez le nom d'utilisateur et le mot de passe ici.
-       IT      Se SqueezeCenter è configurato con la protezione tramite 
password, configurare qui nome utente e password
-       NL      Als je SqueezeCenter voor wachtwoordbeveiliging geconfigureerd 
is, kun je de gebruikersnaam en het wachtwoord hier instellen.
+HTTP_AUTH_USERNAME_HELP
+       DA      Indtast Brugernavn som er konfigureret for kodeord-beskyttelse 
på dit SqueezeCenter
+       DE      Geben Sie den für den SqueezeCenter-Kennwortschutz 
konfigurierten Benutzername ein.
+       EN      Enter the Username configured for password protection on your 
SqueezeCenter
+       ES      Introduzca Nombre de usuario tal y como se haya configurado 
para protección por contraseña en SqueezeCenter
+       FR      Spécifiez le Nom d'utilisateur configuré pour la protection 
par mot de passe sur le SqueezeCenter.
+       IT      Immettere Nome utente configurato per la protezione con 
password in SqueezeCenter
+       NL      Voer geconfigureerd(e) Gebruikersnaam dat/die voor 
wachtwoordbeveiliging in je SqueezeCenter is ingesteld
 
-HTTP_AUTH_ENTER_HELP
-       DA      Indtast %s som er konfigureret for kodeord-beskyttelse på dit 
SqueezeCenter
-       DE      Geben Sie den für den SqueezeCenter-Kennwortschutz 
konfigurierten %s ein.
-       EN      Enter the %s configured for password protection on your 
SqueezeCenter
-       ES      Introduzca %s tal y como se haya configurado para protección 
por contraseña en SqueezeCenter
-       FR      Spécifiez le %s configuré pour la protection par mot de passe 
sur le SqueezeCenter.
-       IT      Immettere %s configurato per la protezione con password in 
SqueezeCenter
-       NL      Voer geconfigureerd(e) %s dat/die voor wachtwoordbeveiliging in 
je SqueezeCenter is ingesteld
+HTTP_AUTH_PASSWORD_HELP
+       DA      Indtast Kodeord som er konfigureret for kodeord-beskyttelse på 
dit SqueezeCenter
+       DE      Geben Sie den für den SqueezeCenter-Kennwortschutz 
konfigurierten Kennwort ein.
+       EN      Enter the Password configured for password protection on your 
SqueezeCenter
+       ES      Introduzca Contraseña tal y como se haya configurado para 
protección por contraseña en SqueezeCenter
+       FR      Spécifiez le Mot de passe configuré pour la protection par 
mot de passe sur le SqueezeCenter.
+       IT      Immettere Password configurato per la protezione con password 
in SqueezeCenter
+       NL      Voer geconfigureerd(e) Wachtwoord dat/die voor 
wachtwoordbeveiliging in je SqueezeCenter is ingesteld
 

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
 (original)
+++ 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SelectPlayer/SelectPlayerApplet.lua
 Fri Apr 18 10:19:07 2008
@@ -57,8 +57,14 @@
 oo.class(_M, Applet)
 
 
+local PLAYER_WEIGHT = 1
+local SERVER_WEIGHT = 10
+local ACTIVATE_WEIGHT = 20
+
+
 function init(self, ...)
        self.playerItem = {}
+       self.serverItem = {}
        self.scanResults = {}
 
        if hasWireless then
@@ -82,6 +88,8 @@
                self.playerMenu:removeItem(self.playerItem[mac])
                self.playerItem[mac] = nil
        end
+
+       self:_updateServerItem(playerObj:getSlimServer())
 end
 
 
@@ -93,6 +101,8 @@
        if self.playerMenu then
                self:_addPlayerItem(playerObj)
        end
+
+       self:_updateServerItem(playerObj:getSlimServer())
 end
 
 
@@ -105,22 +115,30 @@
 
 
 function notify_serverConnected(self, server)
-       if self.playerMenu then
-               for id, player in server:allPlayers() do
-                       self:_refreshPlayerItem(player)
-               end
-               self:manageSelectPlayerMenu()
-       end
+       if not self.playerMenu then
+               return
+       end
+
+       for id, player in server:allPlayers() do
+               self:_refreshPlayerItem(player)
+       end
+       self:manageSelectPlayerMenu()
+       
+       self:_updateServerItem(server)
 end
 
 
 function notify_serverDisconnected(self, server)
-       if self.playerMenu then
-               for id, player in server:allPlayers() do
-                       self:_refreshPlayerItem(player)
-               end
-               self:manageSelectPlayerMenu()
-       end
+       if not self.playerMenu then
+               return
+       end
+
+       for id, player in server:allPlayers() do
+               self:_refreshPlayerItem(player)
+       end
+       self:manageSelectPlayerMenu()
+
+       self:_updateServerItem(server)
 end
 
 
@@ -160,7 +178,7 @@
 function _addPlayerItem(self, player)
        local mac = player.id
        local playerName = player.name
-       local playerWeight = 1
+       local playerWeight = PLAYER_WEIGHT
 
        -- if waiting for a SN pin modify name
        if player:getPin() then
@@ -170,7 +188,7 @@
                end
 
                playerName = self:string("SQUEEZEBOX_ACTIVATE", player.name)
-               playerWeight = 20
+               playerWeight = ACTIVATE_WEIGHT
        end
 
        local item = {
@@ -263,6 +281,34 @@
 end
 
 
+-- Add password protected servers
+function _updateServerItem(self, server)
+       local id = server:getName()
+
+       if not server:isPasswordProtected() then
+               if self.serverItem[id] then
+                       self.playerMenu:removeItem(self.serverItem[id])
+                       self.serverItem[id] = nil
+               end
+               return
+       end
+
+       local item = {
+               id = id,
+               text = server:getName(),
+               sound = "WINDOWSHOW",
+               callback = function()
+                       local auth = AppletManager:loadApplet("HttpAuth")
+                       auth:squeezeCenterPassword(server)
+               end,
+               weight = SERVER_WEIGHT,
+       }
+
+       self.playerMenu:addItem(item)
+       self.serverItem[id] = item
+end
+
+
 function _showWallpaper(self, playerId)
        log:info("previewing background wallpaper for ", playerId)
        SetupWallpaper:showBackground(nil, playerId)
@@ -294,6 +340,11 @@
                if player:isConnected() then
                        _addPlayerItem(self, player)
                end
+       end
+
+       -- Display password protected servers
+       for id, server in self.discovery:allServers() do
+               _updateServerItem(self, server)
        end
 
        -- Bug 6130 add a Set up Squeezebox option, only in Setup not Settings

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/Scanner.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/Scanner.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/Scanner.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/Scanner.lua 
Fri Apr 18 10:19:07 2008
@@ -279,7 +279,7 @@
                if type == EVENT_KEY_DOWN then
                        if keycode == KEY_FWD then
                                self.delta = 1
-                       elseif keycode == KEY_REW thlocal EVENT_KEY_DOWN        
 = jive.ui.EVENT_KEY_DOWNen
+                       elseif keycode == KEY_REW then
                                self.delta = -1
                        else
                                self.delta = 0

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
 (original)
+++ 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/SlimBrowserApplet.lua
 Fri Apr 18 10:19:07 2008
@@ -2244,6 +2244,17 @@
                                        end,
                     })
 
+       if server:isPasswordProtected() then
+               -- password protection has been enabled
+               menu:addItem({
+                       text = self:string("SLIMBROWSER_ENTER_PASSWORD"),
+                       callback = function()
+                               local auth = 
AppletManager:loadApplet("HttpAuth")
+                               auth:squeezeCenterPassword(server)
+                       end,
+               })
+       end
+
        -- change music source, only for udap players
        if player and player:canUdap() and 
appletManager:hasApplet("SetupSqueezebox") then
                menu:addItem({

Modified: 
7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/strings.txt
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/strings.txt?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/strings.txt 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/applets/SlimBrowser/strings.txt 
Fri Apr 18 10:19:07 2008
@@ -142,3 +142,5 @@
 SLIMBROWSER_SCANNER
        EN      Song Position
 
+SLIMBROWSER_ENTER_PASSWORD
+       EN      Enter Password

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua (original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/Comet.lua Fri Apr 18 
10:19:07 2008
@@ -579,7 +579,7 @@
 
 
 _getHandshakeSink = function(self)
-       return function(chunk, err)
+       return function(chunk, err, cometRequest)
                if self.state ~= CONNECTING then
                        return
                end
@@ -589,7 +589,7 @@
                        log:info(self, ": _handshake error: ", err)
 
                        -- Try to reconnect according to advice
-                       return _handleAdvice(self)
+                       return _handleAdvice(self, cometRequest)
                end
 
                -- If we have data
@@ -711,13 +711,13 @@
 
 -- sink for chunked connection, handle advice on error
 _getEventSink = function(self)
-       return function(chunk, err)
+       return function(chunk, err, cometRequest)
                -- On error, print something...
                if err then
                        log:info(self, ": _getEventSink error: ", err)
                        
                        -- Try to reconnect according to advice
-                       return _handleAdvice(self)
+                       return _handleAdvice(self, cometRequest)
                end
 
                _response(self, chunk)
@@ -727,10 +727,14 @@
 
 -- sink for request connection, resend requests on error
 _getRequestSink = function(self)
-       return function(chunk, err)
+       return function(chunk, err, cometRequest)
                -- On error, print something...
                if err then
                        log:info(self, ": _getRequestSink error: ", err)
+
+                       if cometRequest:t_getResponseStatus() == 401 then
+                               return _handleAdvice(self, cometRequest)
+                       end
 
                        -- Resend any un-acknowledged requests
                        local data = {}
@@ -891,12 +895,20 @@
 
 
 -- Decide what to do if we get disconnected or get an error while 
handshaking/connecting
-_handleAdvice = function(self)
+_handleAdvice = function(self, cometRequest)
        log:info(self, ": handleAdvice state=", self.state)
 
        if self.state == UNCONNECTED then
                -- do nothing 
                return
+       end
+
+       -- FIXME can handle HTTP errors here
+
+       -- HTTP authorization failure?
+       if cometRequest and cometRequest:t_getResponseStatus() == 401 then
+               self.jnt:notify('cometHttpError', self, cometRequest)
+               -- keep trying to connect
        end
 
        -- force connection closed

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/CometRequest.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/CometRequest.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/CometRequest.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/CometRequest.lua Fri 
Apr 18 10:19:07 2008
@@ -132,9 +132,9 @@
                                jsonfilters.decode,
                                sink
                        )
-                       mySink(data)
+                       mySink(data, nil, self)
                else
-                       sink(nil, err)
+                       sink(nil, err, self)
                end
        end
 end

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/RequestHttp.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/RequestHttp.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/RequestHttp.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/RequestHttp.lua Fri 
Apr 18 10:19:07 2008
@@ -338,18 +338,18 @@
                local code, err = self:t_getResponseStatus()
                if code == 200 then
                        if self.t_httpResponse.stream then
-                               sink(data)
+                               sink(data, nil, self)
                        else
                                if data and data ~= "" then
-                                       sink(data)
-                                       sink(nil)
+                                       sink(data, nil, self)
+                                       sink(nil, nil, self)
                                end
                        end
                else
                        if not err then
                                err = "HTTP request failed with code" .. code
                        end
-                       sink(nil, err)
+                       sink(nil, err, self)
                end
        end
 end

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SocketHttp.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SocketHttp.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SocketHttp.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/net/SocketHttp.lua Fri Apr 
18 10:19:07 2008
@@ -39,7 +39,7 @@
 
 local oo          = require("loop.simple")
 local socket      = require("socket")
-local socketHttp  = require("socket.http")
+local mime        = require("mime")
 local ltn12       = require("ltn12")
 
 local Task        = require("jive.ui.Task")
@@ -65,25 +65,41 @@
 local SOCKET_CONNECT_TIMEOUT = 10 -- connect in 10 seconds
 local SOCKET_TIMEOUT = 70 -- response in 70 seconds
 
+-- http authentication credentials
+local credentials = {}
+
+
+-- Class method to set HTTP authentication headers
+function setCredentials(class, cred)
+       _assert(cred.ipport)
+       _assert(cred.realm)
+       _assert(cred.username)
+       _assert(cred.password)
+
+       -- FIXME this only supports one username:password per server
+       local key = table.concat(cred.ipport, ":")
+       credentials[key] = cred
+end
+
 
 --[[
 
-=head2 jive.net.SocketHttp(jnt, address, port, name)
+=head2 jive.net.SocketHttp(jnt, host, port, name)
 
 Creates an HTTP socket named I<name> to interface with the given I<jnt> 
 (a L<jive.net.NetworkThread> instance). I<name> is used for debugging and
-defaults to "". I<address> and I<port> are the hostname/IP address and port of 
the HTTP server.
+defaults to "". I<host> and I<port> are the hostname/IP host and port of the 
HTTP server.
 
 =cut
 --]]
-function __init(self, jnt, address, port, name)
-       log:debug("SocketHttp:__init(", name, ", ", address, ", ", port, ")")
+function __init(self, jnt, host, port, name)
+       log:debug("SocketHttp:__init(", name, ", ", host, ", ", port, ")")
 
        -- init superclass
-       local obj = oo.rawnew(self, SocketTcp(jnt, address, port, name))
+       local obj = oo.rawnew(self, SocketTcp(jnt, host, port, name))
 
        -- hostname
-       obj.address = address
+       obj.host = host
 
        -- init states
        obj.t_httpSendState = 't_sendDequeue'
@@ -185,9 +201,9 @@
 function t_sendResolve(self)
        log:debug(self, ":t_sendResolve()")
 
-       if DNS:isip(self.address) then
+       if DNS:isip(self.host) then
                -- don't lookup an ip address
-               self.t_tcp.address = self.address
+               self.t_tcp.address = self.host
                self:t_nextSendState(true, 't_sendConnect')
                return
        end
@@ -195,12 +211,12 @@
        local t = Task(tostring(self) .. "(D)",
                       self,
                       function()
-                              log:debug(self, " DNS loopup for ", self.address)
-                              local ip, err = DNS:toip(self.address)
+                              log:debug(self, " DNS loopup for ", self.host)
+                              local ip, err = DNS:toip(self.host)
 
                               log:debug(self, " IP=", ip)
                               if not ip then
-                                      self:close(self.address .. " " .. err)
+                                      self:close(self.host .. " " .. err)
                                       return
                               end
 
@@ -240,12 +256,14 @@
                ["User-Agent"] = 'Jive/' .. JIVE_VERSION,
        }
        
+       local ip, port = self:t_getAddressPort()
+
        local req_headers = self.t_httpSendRequest:t_getRequestHeaders()
        if not req_headers["Host"] then
-               local address, port = self:t_getAddressPort()
-               headers["Host"] = address
-               if port != 80 then
-                       headers["Host"] = headers["Host"] .. ':' .. port
+               if port == 80 then
+                       headers["Host"] = self.host
+               else
+                       headers["Host"] = self.host .. ":" .. port
                end
        end
        
@@ -253,7 +271,14 @@
                headers["Content-Length"] = #self.t_httpSendRequest:t_body()
        end
 
-       req_headers["Accept-Language"] = string.lower(locale.getLocale())       
+       req_headers["Accept-Language"] = string.lower(locale.getLocale())
+
+       -- http authentication?
+       local cred = credentials[ip .. ":" .. port]
+       if cred then
+               req_headers["Authorization"] = "Basic " .. 
mime.b64(cred.username .. ":" .. cred.password)
+       end
+
        return headers
 end
 

Modified: 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua
URL: 
http://svn.slimdevices.com/7.2/trunk/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua?rev=2277&root=Jive&r1=2276&r2=2277&view=diff
==============================================================================
--- 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua 
(original)
+++ 7.2/trunk/squeezeplay/src/squeezeplay/share/jive/slim/SlimServer.lua Fri 
Apr 18 10:19:07 2008
@@ -69,6 +69,9 @@
 -- list of servers index by id.
 local servers = {}
 setmetatable(servers, { __mode = 'v' })
+
+-- credential list
+local credentials = {}
 
 
 -- _getSink
@@ -191,6 +194,27 @@
 end
 
 
+-- can be called as a object or class method
+function setCredentials(self, cred, name)
+       if not name then
+               -- object method
+               name = self:getName()
+
+               SocketHttp:setCredentials({
+                       ipport = { self:getIpPort() },
+                       realm = cred.realm,
+                       username = cred.username,
+                       password = cred.password,
+               })
+
+               -- force re-connection
+               self:connect()
+       end
+
+       credentials[name] = cred
+end
+
+
 --[[
 
 =head2 jive.slim.SlimServer(jnt, ip, name)
@@ -263,8 +287,18 @@
        setmetatable(obj.imageCache, { __mode = "kv" })
 
        obj.id = obj:idFor(ip, port, name)
-
        servers[obj.id] = obj
+
+       -- http authentication
+       local cred = credentials[name]
+       if cred then
+               SocketHttp:setCredentials({
+                       ipport = { obj:getIpPort() },
+                       realm = cred.realm,
+                       username = cred.username,
+                       password = cred.password,
+               })
+       end
 
        -- subscribe to comet events
        jnt:subscribe(obj)
@@ -421,6 +455,16 @@
        log:info(self, " disconnected")
        self.active = false
        self.jnt:notify('serverDisconnected', self, numPendingRequests)
+end
+
+
+-- comet http error
+function notify_cometHttpError(self, comet, cometRequest)
+       if cometRequest:t_getResponseStatus() == 401 then
+               local authenticate = 
cometRequest:t_getResponseHeader("WWW-Authenticate")
+
+               self.realm = string.match(authenticate, 'Basic realm="(.*)"')
+       end
 end
 
 
@@ -872,6 +916,16 @@
 end
 
 
+-- returns true if a password is needed
+function isPasswordProtected(self)
+       if self.realm and not self.active then
+               return true, self.realm
+       else
+               return false
+       end
+end
+
+
 --[[
 
 =head2 jive.slim.SlimServer:allPlayers()

_______________________________________________
Jive-checkins mailing list
[email protected]
http://lists.slimdevices.com/cgi-bin/mailman/listinfo/jive-checkins

Reply via email to