Webanwendung mit FastCGI und Haskell
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

85 wiersze
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