/extra/webapps/user-admin/user-admin.factor

http://github.com/x6j8x/factor · Factor · 167 lines · 128 code · 37 blank · 2 comment · 3 complexity · 6b3f91d78d0db68c381369f246ac1cfe MD5 · raw file

  1. ! Copyright (C) 2008 Slava Pestov.
  2. ! See http://factorcode.org/license.txt for BSD license.
  3. USING: kernel sequences accessors namespaces combinators words
  4. assocs db.tuples arrays splitting strings validators urls fry
  5. html.forms
  6. html.components
  7. furnace
  8. furnace.boilerplate
  9. furnace.auth.providers
  10. furnace.auth.providers.db
  11. furnace.auth.login
  12. furnace.auth
  13. furnace.actions
  14. furnace.redirection
  15. furnace.utilities
  16. http.server
  17. http.server.dispatchers ;
  18. IN: webapps.user-admin
  19. TUPLE: user-admin < dispatcher ;
  20. : <user-list-action> ( -- action )
  21. <page-action>
  22. [ f <user> select-tuples "users" set-value ] >>init
  23. { user-admin "user-list" } >>template ;
  24. : init-capabilities ( -- )
  25. capabilities get words>strings "capabilities" set-value ;
  26. : validate-capabilities ( -- )
  27. "capabilities" value
  28. [ [ param empty? not ] keep set-value ] each ;
  29. : selected-capabilities ( -- seq )
  30. "capabilities" value [ value ] filter strings>words ;
  31. : validate-user ( -- )
  32. {
  33. { "username" [ v-username ] }
  34. { "realname" [ [ v-one-line ] v-optional ] }
  35. { "email" [ [ v-email ] v-optional ] }
  36. } validate-params ;
  37. : <new-user-action> ( -- action )
  38. <page-action>
  39. [
  40. "username" param <user> from-object
  41. init-capabilities
  42. ] >>init
  43. { user-admin "new-user" } >>template
  44. [
  45. init-capabilities
  46. validate-capabilities
  47. validate-user
  48. {
  49. { "new-password" [ v-password ] }
  50. { "verify-password" [ v-password ] }
  51. } validate-params
  52. same-password-twice
  53. user new "username" value >>username select-tuple
  54. [ user-exists ] when
  55. ] >>validate
  56. [
  57. "username" value <user>
  58. "realname" value >>realname
  59. "email" value >>email
  60. "new-password" value >>encoded-password
  61. H{ } clone >>profile
  62. selected-capabilities >>capabilities
  63. insert-tuple
  64. URL" $user-admin" <redirect>
  65. ] >>submit ;
  66. : validate-username ( -- )
  67. { { "username" [ v-username ] } } validate-params ;
  68. : select-capabilities ( seq -- )
  69. [ t swap word>string set-value ] each ;
  70. : <edit-user-action> ( -- action )
  71. <page-action>
  72. [
  73. validate-username
  74. "username" value <user> select-tuple
  75. [ from-object ] [ capabilities>> select-capabilities ] bi
  76. init-capabilities
  77. ] >>init
  78. { user-admin "edit-user" } >>template
  79. [
  80. "username" value <user> select-tuple
  81. [ from-object ] [ capabilities>> select-capabilities ] bi
  82. init-capabilities
  83. validate-capabilities
  84. validate-user
  85. {
  86. { "new-password" [ [ v-password ] v-optional ] }
  87. { "verify-password" [ [ v-password ] v-optional ] }
  88. } validate-params
  89. "new-password" "verify-password"
  90. [ value empty? not ] either? [
  91. same-password-twice
  92. ] when
  93. ] >>validate
  94. [
  95. "username" value <user> select-tuple
  96. "realname" value >>realname
  97. "email" value >>email
  98. selected-capabilities >>capabilities
  99. "new-password" value empty? [
  100. "new-password" value >>encoded-password
  101. ] unless
  102. update-tuple
  103. URL" $user-admin" <redirect>
  104. ] >>submit ;
  105. : <delete-user-action> ( -- action )
  106. <action>
  107. [
  108. validate-username
  109. "username" value <user> delete-tuples
  110. URL" $user-admin" <redirect>
  111. ] >>submit ;
  112. SYMBOL: can-administer-users?
  113. can-administer-users? define-capability
  114. : <user-admin> ( -- responder )
  115. user-admin new-dispatcher
  116. <user-list-action> "" add-responder
  117. <new-user-action> "new" add-responder
  118. <edit-user-action> "edit" add-responder
  119. <delete-user-action> "delete" add-responder
  120. <boilerplate>
  121. { user-admin "user-admin" } >>template
  122. <protected>
  123. "administer users" >>description
  124. { can-administer-users? } >>capabilities ;
  125. : give-capability ( username capability -- )
  126. [ <user> select-tuple ] dip
  127. '[ _ suffix ] change-capabilities
  128. update-tuple ;
  129. : make-admin ( username -- )
  130. can-administer-users? give-capability ;