]> gitweb @ CieloNegro.org - Lucu.git/commitdiff
Added a configuration flag -fssl to enable SSL support. (default: off)
authorPHO <pho@cielonegro.org>
Sat, 12 Nov 2011 16:13:32 +0000 (01:13 +0900)
committerPHO <pho@cielonegro.org>
Sat, 12 Nov 2011 16:13:32 +0000 (01:13 +0900)
Ditz-issue: a5e6a89da31d2ca0a69d89ad1d579fee8d0c131f

13 files changed:
GNUmakefile
Lucu.cabal
Network/HTTP/Lucu.hs
Network/HTTP/Lucu/Config.hs
Network/HTTP/Lucu/HandleLike.hs
Network/HTTP/Lucu/Httpd.hs
Network/HTTP/Lucu/Interaction.hs
Network/HTTP/Lucu/RequestReader.hs
Network/HTTP/Lucu/Resource.hs
Network/HTTP/Lucu/Resource/Internal.hs
Network/HTTP/Lucu/SocketLike.hs
bugs/issue-a5e6a89da31d2ca0a69d89ad1d579fee8d0c131f.yaml
examples/Makefile

index 1f0eaf74ddc8e1c43966fed668c6b4d18e165554..bd70335cac6ba3bf2fd19d75ddc414dbbdbb52a6 100644 (file)
@@ -1,5 +1,6 @@
 RUN_COMMAND = $(MAKE) -C examples run
 
 CONFIGURE_ARGS = -O
+#CONFIGURE_ARGS = -O -fssl
 
 include cabal-package.mk
index e254dbdf59daa200f90e8bec3a0602fd82e96275..a1a22795c7be8a3753398eae71894e6b46246799 100644 (file)
@@ -44,9 +44,12 @@ Flag build-lucu-implant-file
     Description: Build the lucu-implant-file program.
     Default:     True
 
+Flag ssl
+    Description: Enable SSL support.
+    Default:     False
+
 Library
     Build-Depends:
-        HsOpenSSL                  == 0.10.*,
         ascii                      == 0.0.*,
         attoparsec                 == 0.9.*,
         base                       == 4.*,
@@ -70,6 +73,12 @@ Library
         time-http                  == 0.2.*,
         transformers               == 0.2.*
 
+    if flag(ssl)
+        Build-Depends:
+            HsOpenSSL == 0.10.*
+        CPP-Options:
+            -DHAVE_SSL
+
     Exposed-Modules:
         Network.HTTP.Lucu
         Network.HTTP.Lucu.Abortion
index b2c78952c9b202253b1be4f29160aedc4219dd0a..682e91f04d163ca2af6a6e691611350b4ffa8f79 100644 (file)
@@ -9,7 +9,7 @@
 --   chunked I\/O, ETag comparison and \"100 Continue\".
 --
 --   [/SSL connections/] Lucu can handle HTTP connections over Secure
---   Socket Layer.
+--   Socket Layer when configured with -fssl flag.
 --
 -- Lucu is not a replacement for Apache or lighttpd. It is intended to
 -- be used to build an efficient web-based RESTful application which
index 2ea2055de853c35faa89f4d2e21cf3d3c2d74d83..7549ae5c0e07d33886b6cb5ed64b741f45ecde7f 100644 (file)
@@ -1,11 +1,14 @@
 {-# LANGUAGE
-    OverloadedStrings
+    CPP
+  , OverloadedStrings
   , UnicodeSyntax
   #-}
 -- |Configurations for the Lucu httpd.
 module Network.HTTP.Lucu.Config
     ( Config(..)
+#if defined(HAVE_SSL)
     , SSLConfig(..)
+#endif
     , defaultConfig
     )
     where
@@ -16,7 +19,9 @@ import Network
 import Network.BSD
 import Network.HTTP.Lucu.MIMEType.Guess
 import Network.HTTP.Lucu.MIMEType.DefaultExtensionMap
+#if defined(HAVE_SSL)
 import OpenSSL.Session
+#endif
 import System.IO.Unsafe
 
 -- |Configuration record for to run the httpd.
@@ -46,9 +51,11 @@ data Config = Config {
     -- problem.)
     , cnfServerV6Addr ∷ !(Maybe HostName)
 
+#if defined(HAVE_SSL)
     -- |Configuration for HTTPS connections. Set this 'Nothing' to
     -- disable HTTPS.
     , cnfSSLConfig ∷ !(Maybe SSLConfig)
+#endif
 
     -- |The maximum number of requests to simultaneously accept in one
     -- connection. If a client exceeds this limitation, its last
@@ -77,6 +84,7 @@ data Config = Config {
     , cnfExtToMIMEType ∷ !ExtMap
     }
 
+#if defined(HAVE_SSL)
 -- |Configuration record for HTTPS connections.
 data SSLConfig
     = SSLConfig {
@@ -89,6 +97,7 @@ data SSLConfig
         -- up yourself with at least a server certification.
       , sslContext ∷ !SSLContext
       }
+#endif
 
 -- |The default configuration. Generally you can use this value as-is,
 -- or possibly you just want to replace the 'cnfServerSoftware' and
@@ -100,7 +109,9 @@ defaultConfig = Config {
                 , cnfServerPort                  = "http"
                 , cnfServerV4Addr                = Just "0.0.0.0"
                 , cnfServerV6Addr                = Just "::"
+#if defined(HAVE_SSL)
                 , cnfSSLConfig                   = Nothing
+#endif
                 , cnfMaxPipelineDepth            = 100
                 , cnfMaxEntityLength             = 16 * 1024 * 1024 -- 16 MiB
                 , cnfDumpTooLateAbortionToStderr = True
index a45ce6cbf066f3d0a6bac21335b4b16dbef6cca1..cc90cd6746ed7a74e8a1ed979e4f343423585863 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    DoAndIfThenElse
+    CPP
+  , DoAndIfThenElse
   , UnicodeSyntax
   #-}
 -- |Type class for things behaves like a 'I.Handle'.
@@ -12,8 +13,10 @@ import Blaze.ByteString.Builder (Builder)
 import qualified Blaze.ByteString.Builder as BB
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Lazy.Char8 as L
+#if defined(HAVE_SSL)
 import qualified OpenSSL.Session as SSL
 import OpenSSL.X509
+#endif
 import Prelude.Unicode
 import qualified System.IO as I
 
@@ -23,8 +26,10 @@ class HandleLike h where
     hGetBS  ∷ h → Int → IO B.ByteString
     hPutBS  ∷ h → B.ByteString → IO ()
 
+#if defined(HAVE_SSL)
     hGetPeerCert ∷ h → IO (Maybe X509)
     hGetPeerCert = const $ return Nothing
+#endif
 
     hFlush  ∷ h → IO ()
     hClose  ∷ h → IO ()
@@ -38,6 +43,7 @@ instance HandleLike I.Handle where
     hFlush  = I.hFlush
     hClose  = I.hClose
 
+#if defined(HAVE_SSL)
 instance HandleLike SSL.SSL where
     hGetLBS = SSL.lazyRead
 
@@ -53,6 +59,7 @@ instance HandleLike SSL.SSL where
 
     hFlush _ = return () -- No need to do anything.
     hClose s = SSL.shutdown s SSL.Bidirectional
+#endif
 
 hPutBuilder ∷ HandleLike h ⇒ h → Builder → IO ()
 {-# INLINE hPutBuilder #-}
index c8a21b7d256d8c0d7128205c18e747dd0b52246f..883a9a651f4999a893811670ebb114badc5e4bad 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    UnicodeSyntax
+    CPP
+  , UnicodeSyntax
   #-}
 -- |The entry point of Lucu httpd.
 module Network.HTTP.Lucu.Httpd
@@ -48,7 +49,14 @@ runHttpd cnf tree fbs
     = withSocketsDo $
       do let launchers
                  = catMaybes
-                   [ do scnf ← cnfSSLConfig    cnf
+                   [ do addr ← cnfServerV4Addr cnf
+                        return ( launchListener =≪ listenOn AF_INET addr (cnfServerPort cnf)
+                               )
+                   , do addr ← cnfServerV6Addr cnf
+                        return ( launchListener =≪ listenOn AF_INET6 addr (cnfServerPort cnf)
+                               )
+#if defined(HAVE_SSL)
+                   , do scnf ← cnfSSLConfig    cnf
                         addr ← cnfServerV4Addr cnf
                         return ( do so ← listenOn AF_INET addr (sslServerPort scnf)
                                     launchListener (sslContext scnf, so)
@@ -58,12 +66,7 @@ runHttpd cnf tree fbs
                         return ( do so ← listenOn AF_INET6 addr (sslServerPort scnf)
                                     launchListener (sslContext scnf, so)
                                )
-                   , do addr ← cnfServerV4Addr cnf
-                        return ( launchListener =≪ listenOn AF_INET addr (cnfServerPort cnf)
-                               )
-                   , do addr ← cnfServerV6Addr cnf
-                        return ( launchListener =≪ listenOn AF_INET6 addr (cnfServerPort cnf)
-                               )
+#endif
                    ]
          sequence_ launchers
          waitForever
index abc1cf550bca44dcfe692f275f35767b6aa8bedf..018ee00d0eaa65e197c508a8d8d7c968d2fb3fe2 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    DeriveDataTypeable
+    CPP
+  , DeriveDataTypeable
   , ExistentialQuantification
   , OverloadedStrings
   , RecordWildCards
@@ -44,7 +45,9 @@ import Network.HTTP.Lucu.Headers
 import Network.HTTP.Lucu.Preprocess
 import Network.HTTP.Lucu.Request
 import Network.HTTP.Lucu.Response
+#if defined(HAVE_SSL)
 import OpenSSL.X509
+#endif
 
 class Typeable i ⇒ Interaction i where
     toInteraction ∷ i → SomeInteraction
@@ -132,7 +135,9 @@ data NormalInteraction
     = NI {
         niConfig           ∷ !Config
       , niRemoteAddr       ∷ !SockAddr
+#if defined(HAVE_SSL)
       , niRemoteCert       ∷ !(Maybe X509)
+#endif
       , niRequest          ∷ !Request
       , niResourcePath     ∷ ![Strict.ByteString]
       , niExpectedContinue ∷ !Bool
@@ -172,11 +177,17 @@ data InteractionState
 
 mkNormalInteraction ∷ Config
                     → SockAddr
+#if defined(HAVE_SSL)
                     → Maybe X509
+#endif
                     → AugmentedRequest
                     → [Strict.ByteString]
                     → IO NormalInteraction
+#if defined(HAVE_SSL)
 mkNormalInteraction config remoteAddr remoteCert (AugmentedRequest {..}) rsrcPath
+#else
+mkNormalInteraction config remoteAddr (AugmentedRequest {..}) rsrcPath
+#endif
     = do receiveBodyReq   ← newEmptyTMVarIO
          receivedBody     ← newEmptyTMVarIO
 
@@ -192,7 +203,9 @@ mkNormalInteraction config remoteAddr remoteCert (AugmentedRequest {..}) rsrcPat
          return NI {
                   niConfig           = config
                 , niRemoteAddr       = remoteAddr
+#if defined(HAVE_SSL)
                 , niRemoteCert       = remoteCert
+#endif
                 , niRequest          = arRequest
                 , niResourcePath     = rsrcPath
                 , niExpectedContinue = arExpectedContinue
index b5feafe4f07ed624191e74c34c3d4f73129e8c82..5ef7acc296ed18f68736d4cc802ce6730ce4e70e 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    DoAndIfThenElse
+    CPP
+  , DoAndIfThenElse
   , OverloadedStrings
   , RecordWildCards
   , ScopedTypeVariables
@@ -143,8 +144,13 @@ acceptRequestForResource ∷ HandleLike h
                          → ResourceDef
                          → IO ()
 acceptRequestForResource ctx@(Context {..}) ar@(AugmentedRequest {..}) input rsrcPath rsrcDef
-    = do cert ← hGetPeerCert cHandle
+    = do
+#if defined(HAVE_SSL)
+         cert ← hGetPeerCert cHandle
          ni   ← mkNormalInteraction cConfig cAddr cert ar rsrcPath
+#else
+         ni   ← mkNormalInteraction cConfig cAddr ar rsrcPath
+#endif
          tid  ← spawnResource rsrcDef ni
          enqueue ctx ni
          if reqMustHaveBody arRequest then
index d1420ba5e5ba8d11433b2f902a881aceb34fee19..ec3447e7f488585570b4e8891b4da5abdbdad0f0 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    BangPatterns
+    CPP
+  , BangPatterns
   , GeneralizedNewtypeDeriving
   , DoAndIfThenElse
   , OverloadedStrings
@@ -82,7 +83,9 @@ module Network.HTTP.Lucu.Resource
     , getRemoteAddr
     , getRemoteAddr'
     , getRemoteHost
+#if defined(HAVE_SSL)
     , getRemoteCertificate
+#endif
     , getRequest
     , getMethod
     , getRequestURI
index e066fa9074e8eaf4173ce60f715dc2b2bbdb3bdd..e34512dd449614562ec9783d362a62182284aa95 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    DoAndIfThenElse
+    CPP
+  , DoAndIfThenElse
   , GeneralizedNewtypeDeriving
   , OverloadedStrings
   , RecordWildCards
@@ -13,7 +14,9 @@ module Network.HTTP.Lucu.Resource.Internal
 
     , getConfig
     , getRemoteAddr
+#if defined(HAVE_SSL)
     , getRemoteCertificate
+#endif
     , getRequest
     , getResourcePath
 
@@ -54,7 +57,9 @@ import Network.HTTP.Lucu.Postprocess
 import Network.HTTP.Lucu.Request
 import Network.HTTP.Lucu.Response
 import Network.Socket
+#if defined(HAVE_SSL)
 import OpenSSL.X509
+#endif
 import Prelude hiding (catch)
 import Prelude.Unicode
 import System.IO
@@ -230,6 +235,7 @@ getConfig = niConfig <$> getInteraction
 getRemoteAddr ∷ Resource SockAddr
 getRemoteAddr = niRemoteAddr <$> getInteraction
 
+#if defined(HAVE_SSL)
 -- | Return the X.509 certificate of the client, or 'Nothing' if:
 --
 --   * This request didn't came through an SSL stream.
@@ -241,6 +247,7 @@ getRemoteAddr = niRemoteAddr <$> getInteraction
 --   'OpenSSL.Session.VerifyPeer'.
 getRemoteCertificate ∷ Resource (Maybe X509)
 getRemoteCertificate = niRemoteCert <$> getInteraction
+#endif
 
 -- |Return the 'Request' value representing the request header. You
 -- usually don't need to call this function directly.
index b9668e067d47a281516c9fc1cc0c6835a693a20a..998e4490761bfb6324f6d5bb03a47073ec5c25c4 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    FlexibleContexts
+    CPP
+  , FlexibleContexts
   , FlexibleInstances
   , TypeFamilies
   , UnicodeSyntax
@@ -11,8 +12,10 @@ module Network.HTTP.Lucu.SocketLike
     where
 import qualified Network.Socket as So
 import Network.HTTP.Lucu.HandleLike
+#if defined(HAVE_SSL)
 import qualified OpenSSL.Session as SSL
 import Prelude.Unicode
+#endif
 import qualified System.IO as I
 
 class (HandleLike (Handle s)) ⇒ SocketLike s where
@@ -30,6 +33,7 @@ instance SocketLike So.Socket where
 
     socketPort = So.socketPort
 
+#if defined(HAVE_SSL)
 instance SocketLike (SSL.SSLContext, So.Socket) where
     type Handle (SSL.SSLContext, So.Socket) = SSL.SSL
 
@@ -40,3 +44,4 @@ instance SocketLike (SSL.SSLContext, So.Socket) where
              return (ssl, addr)
 
     socketPort = So.socketPort ∘ snd
+#endif
index 43cf56d460681ce457e910138c71d43fc35f07ef..71ab9c51f1e1e2c040c8e17134fb467d40f7bc71 100644 (file)
@@ -7,8 +7,8 @@ type: :task
 component: Lucu
 release: Lucu-1.0
 reporter: PHO <pho@cielonegro.org>
-status: :unstarted
-disposition: 
+status: :closed
+disposition: :fixed
 creation_time: 2011-10-26 23:04:33.719311 Z
 references: []
 
@@ -22,4 +22,8 @@ log_events:
   - PHO <pho@cielonegro.org>
   - edited title
   - Should be defaulted to off!
+- - 2011-11-12 16:13:20.813907 Z
+  - PHO <pho@cielonegro.org>
+  - closed with disposition fixed
+  - Done.
 git_branch: 
index 37c59cb9ab74d6169cb31ac88dfd7e946ed29006..606117f31f43ffcd6489b0d3370668265979d997 100644 (file)
@@ -10,6 +10,9 @@ IMPLANT ?= ../dist/build/lucu-implant-file/lucu-implant-file
 
 build: $(TARGETS)
 
+SSL: SSL.hs
+       -ghc -Wall --make $@ -threaded -O3 -idist -odir dist -hidir dist
+
 %: %.hs
        ghc -Wall --make $@ -threaded -O3 -idist -odir dist -hidir dist