Webanwendung mit FastCGI und Haskell
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

85 lignes
2.7KB

  1. module App.Login (
  2. Login(..)
  3. ) where
  4. import Control.Monad.State (gets)
  5. import Request
  6. import Template
  7. import Network.FastCGI
  8. import AppMonad (numVisited, App)
  9. import Database
  10. import Shared
  11. data Login = Login
  12. | Register
  13. instance RequestHandler Login where
  14. handle Login = do
  15. loginStatus <- isLoggedIn
  16. if loginStatus then alreadyLoggedIn else login
  17. handle Register = do
  18. loginStatus <- isLoggedIn
  19. if loginStatus then alreadyLoggedIn else register
  20. loginSucceeded :: App CGIResult
  21. loginSucceeded = do
  22. mayFrom <- getInput "from"
  23. case mayFrom of
  24. Just from -> redirect from
  25. Nothing ->
  26. render "logged_in" [ ("pagetitle", "Angemeldet")
  27. , ("kind", "jetzt") ] >>= output
  28. loginFailed :: App CGIResult
  29. loginFailed = do
  30. result <- render "login" [("pagetitle", "Anmelden"),
  31. ("errormsg", "Ungültige Anmeldedaten")]
  32. output result
  33. alreadyLoggedIn :: App CGIResult
  34. alreadyLoggedIn = do
  35. result <- render "logged_in" [ ("pagetitle", "Angemeldet")
  36. , ("kind", "bereits") ]
  37. output result
  38. login :: App CGIResult
  39. login = do
  40. mayLogin <- sequence <$> sequence [getInput "username", getInput "password"]
  41. case mayLogin of
  42. Just [username, password] ->
  43. validate username password <: loginSucceeded <-> loginFailed
  44. Nothing -> do
  45. result <- render "login" [ ("pagetitle", "Anmelden")
  46. , ("errormsg", "") ]
  47. output result
  48. register :: App CGIResult
  49. register = do
  50. mayRegister <- sequence <$> sequence [ getInput "username"
  51. , getInput "password"
  52. , getInput "confirm_password" ]
  53. case mayRegister of
  54. Just [username, password, password_confirm]
  55. | password /= password_confirm ->
  56. registerFailed "Passwörter stimmen nicht überein!"
  57. | otherwise -> isAvailable username <:
  58. goRegister username password <->
  59. registerFailed "Benutername wird schon verwendet!"
  60. Nothing -> do
  61. res <- render "register" [ ("pagetitle", "Registrierung")
  62. , ("errormsg", "") ]
  63. output res
  64. goRegister :: Username -> Password -> App CGIResult
  65. goRegister username password = do
  66. addUser username password
  67. res <- render "registered" [("pagetitle", "Registrierung abgeschlossen")]
  68. output res
  69. registerFailed :: String -> App CGIResult
  70. registerFailed reason = do
  71. res <- render "register" [ ("pagetitle", "Registrierung")
  72. , ("errormsg", reason ) ]
  73. output res