167 lines
4.3 KiB
Factor
167 lines
4.3 KiB
Factor
! Copyright (C) 2008 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: kernel sequences accessors namespaces combinators words
|
|
assocs db.tuples arrays splitting strings validators urls
|
|
html.forms
|
|
html.elements
|
|
html.components
|
|
furnace
|
|
furnace.boilerplate
|
|
furnace.auth.providers
|
|
furnace.auth.providers.db
|
|
furnace.auth.login
|
|
furnace.auth
|
|
furnace.actions
|
|
furnace.redirection
|
|
furnace.utilities
|
|
http.server
|
|
http.server.dispatchers ;
|
|
IN: webapps.user-admin
|
|
|
|
TUPLE: user-admin < dispatcher ;
|
|
|
|
: <user-list-action> ( -- action )
|
|
<page-action>
|
|
[ f <user> select-tuples "users" set-value ] >>init
|
|
{ user-admin "user-list" } >>template ;
|
|
|
|
: init-capabilities ( -- )
|
|
capabilities get words>strings "capabilities" set-value ;
|
|
|
|
: validate-capabilities ( -- )
|
|
"capabilities" value
|
|
[ [ param empty? not ] keep set-value ] each ;
|
|
|
|
: selected-capabilities ( -- seq )
|
|
"capabilities" value [ value ] filter [ string>word ] map ;
|
|
|
|
: validate-user ( -- )
|
|
{
|
|
{ "username" [ v-username ] }
|
|
{ "realname" [ [ v-one-line ] v-optional ] }
|
|
{ "email" [ [ v-email ] v-optional ] }
|
|
} validate-params ;
|
|
|
|
: <new-user-action> ( -- action )
|
|
<page-action>
|
|
[
|
|
"username" param <user> from-object
|
|
init-capabilities
|
|
] >>init
|
|
|
|
{ user-admin "new-user" } >>template
|
|
|
|
[
|
|
init-capabilities
|
|
validate-capabilities
|
|
|
|
validate-user
|
|
|
|
{
|
|
{ "new-password" [ v-password ] }
|
|
{ "verify-password" [ v-password ] }
|
|
} validate-params
|
|
|
|
same-password-twice
|
|
|
|
user new "username" value >>username select-tuple
|
|
[ user-exists ] when
|
|
] >>validate
|
|
|
|
[
|
|
"username" value <user>
|
|
"realname" value >>realname
|
|
"email" value >>email
|
|
"new-password" value >>encoded-password
|
|
H{ } clone >>profile
|
|
selected-capabilities >>capabilities
|
|
|
|
insert-tuple
|
|
|
|
URL" $user-admin" <redirect>
|
|
] >>submit ;
|
|
|
|
: validate-username ( -- )
|
|
{ { "username" [ v-username ] } } validate-params ;
|
|
|
|
: select-capabilities ( seq -- )
|
|
[ t swap word>string set-value ] each ;
|
|
|
|
: <edit-user-action> ( -- action )
|
|
<page-action>
|
|
[
|
|
validate-username
|
|
|
|
"username" value <user> select-tuple
|
|
[ from-object ] [ capabilities>> select-capabilities ] bi
|
|
|
|
init-capabilities
|
|
] >>init
|
|
|
|
{ user-admin "edit-user" } >>template
|
|
|
|
[
|
|
"username" value <user> select-tuple
|
|
[ from-object ] [ capabilities>> select-capabilities ] bi
|
|
|
|
init-capabilities
|
|
validate-capabilities
|
|
|
|
validate-user
|
|
|
|
{
|
|
{ "new-password" [ [ v-password ] v-optional ] }
|
|
{ "verify-password" [ [ v-password ] v-optional ] }
|
|
} validate-params
|
|
|
|
"new-password" "verify-password"
|
|
[ value empty? not ] either? [
|
|
same-password-twice
|
|
] when
|
|
] >>validate
|
|
|
|
[
|
|
"username" value <user> select-tuple
|
|
"realname" value >>realname
|
|
"email" value >>email
|
|
selected-capabilities >>capabilities
|
|
|
|
"new-password" value empty? [
|
|
"new-password" value >>encoded-password
|
|
] unless
|
|
|
|
update-tuple
|
|
|
|
URL" $user-admin" <redirect>
|
|
] >>submit ;
|
|
|
|
: <delete-user-action> ( -- action )
|
|
<action>
|
|
[
|
|
validate-username
|
|
"username" value <user> delete-tuples
|
|
URL" $user-admin" <redirect>
|
|
] >>submit ;
|
|
|
|
SYMBOL: can-administer-users?
|
|
|
|
can-administer-users? define-capability
|
|
|
|
: <user-admin> ( -- responder )
|
|
user-admin new-dispatcher
|
|
<user-list-action> "" add-responder
|
|
<new-user-action> "new" add-responder
|
|
<edit-user-action> "edit" add-responder
|
|
<delete-user-action> "delete" add-responder
|
|
<boilerplate>
|
|
{ user-admin "user-admin" } >>template
|
|
<protected>
|
|
"administer users" >>description
|
|
{ can-administer-users? } >>capabilities ;
|
|
|
|
: make-admin ( username -- )
|
|
<user>
|
|
select-tuple
|
|
[ can-administer-users? suffix ] change-capabilities
|
|
update-tuple ;
|