! 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 html.elements html.components html.templates.chloe http.server.boilerplate http.server.auth.providers http.server.auth.providers.db http.server.auth.login http.server.auth http.server.sessions http.server.actions http.server ; IN: webapps.user-admin : admin-template ( name -- template ) "resource:extra/webapps/user-admin/" swap ".xml" 3append ; : words>strings ( seq -- seq' ) [ [ word-vocabulary ] [ drop ":" ] [ word-name ] tri 3append ] map ; : strings>words ( seq -- seq' ) [ ":" split1 swap lookup ] map ; : ( -- action ) [ f select-tuples "users" set-value ] >>init "user-list" admin-template >>template ; : ( -- action ) [ "username" param from-tuple capabilities get words>strings "all-capabilities" set-value ] >>init "new-user" admin-template >>template [ capabilities get words>strings "all-capabilities" set-value { { "username" [ v-username ] } { "realname" [ v-one-line ] } { "new-password" [ v-password ] } { "verify-password" [ v-password ] } { "email" [ [ v-email ] v-optional ] } { "capabilities" [ ] } } validate-params same-password-twice user new "username" value >>username select-tuple [ user-exists ] when ] >>validate [ "username" value "realname" value >>realname "email" value >>email "new-password" value >>encoded-password H{ } clone >>profile insert-tuple "$user-admin" f ] >>submit ; : validate-username ( -- ) { { "username" [ v-username ] } } validate-params ; : ( -- action ) [ validate-username "username" value select-tuple [ from-tuple ] [ capabilities>> words>strings "capabilities" set-value ] bi capabilities get words>strings "all-capabilities" set-value ] >>init "edit-user" admin-template >>template [ capabilities get words>strings "all-capabilities" set-value { { "username" [ v-username ] } { "realname" [ v-one-line ] } { "new-password" [ [ v-password ] v-optional ] } { "verify-password" [ [ v-password ] v-optional ] } { "email" [ [ v-email ] v-optional ] } { "capabilities" [ ] } } validate-params "new-password" "verify-password" [ value empty? not ] either? [ same-password-twice ] when ] >>validate [ "username" value select-tuple "realname" value >>realname "email" value >>email "new-password" value empty? [ "new-password" value >>encoded-password ] unless "capabilities" value { { [ dup string? ] [ 1array ] } { [ dup array? ] [ ] } } cond strings>words >>capabilities update-tuple "$user-admin" f ] >>submit ; : ( -- action ) [ validate-username [ select-tuple 1 >>deleted update-tuple ] [ logout-all-sessions ] bi "$user-admin" f ] >>submit ; TUPLE: user-admin < dispatcher ; SYMBOL: can-administer-users? can-administer-users? define-capability : ( -- responder ) user-admin new-dispatcher "list" add-main-responder "new" add-responder "edit" add-responder "delete" add-responder "user-admin" admin-template >>template { can-administer-users? } ; : make-admin ( username -- ) select-tuple [ can-administer-users? suffix ] change-capabilities update-tuple ;