From 5bae9bf6efcf64c9d864e623c777d2fc7daf004d Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 1 May 2008 20:03:02 -0500 Subject: [PATCH] Implemented user capabilities --- extra/http/http-tests.factor | 6 +++ extra/http/http.factor | 38 ++++++++++---- extra/http/server/auth/admin/admin.factor | 36 ++++++++++--- extra/http/server/auth/admin/admin.xml | 2 +- extra/http/server/auth/admin/edit-user.xml | 5 ++ extra/http/server/auth/admin/new-user.xml | 5 ++ extra/http/server/auth/basic/basic.factor | 2 +- extra/http/server/auth/login/login.factor | 4 +- .../auth/providers/assoc/assoc-tests.factor | 4 +- extra/http/server/auth/providers/db/db.factor | 1 + .../server/auth/providers/providers.factor | 5 +- .../http/server/components/components.factor | 43 ++++++++++++---- extra/http/server/static/static.factor | 16 ++++-- extra/webapps/factor-website/page.css | 48 +++++++++++++++++ extra/webapps/factor-website/page.xml | 51 +------------------ extra/webapps/planet/planet.xml | 5 +- extra/webapps/todo/todo.xml | 2 +- 17 files changed, 183 insertions(+), 90 deletions(-) create mode 100644 extra/webapps/factor-website/page.css diff --git a/extra/http/http-tests.factor b/extra/http/http-tests.factor index 1f1ce361b2..831becd264 100755 --- a/extra/http/http-tests.factor +++ b/extra/http/http-tests.factor @@ -24,6 +24,12 @@ IN: http.tests [ "/bar" ] [ "http://foo.com/bar" url>path ] unit-test [ "/bar" ] [ "/bar" url>path ] unit-test +[ "a=b&a=c" ] [ { { "a" { "b" "c" } } } assoc>query ] unit-test + +[ H{ { "a" "b" } } ] [ "a=b" query>assoc ] unit-test + +[ H{ { "a" { "b" "c" } } } ] [ "a=b&a=c" query>assoc ] unit-test + : lf>crlf "\n" split "\r\n" join ; STRING: read-request-test-1 diff --git a/extra/http/http.factor b/extra/http/http.factor index c5f57d4c04..315250692b 100755 --- a/extra/http/http.factor +++ b/extra/http/http.factor @@ -119,21 +119,41 @@ IN: http header-value>string check-header-string write crlf ] assoc-each crlf ; +: add-query-param ( value key assoc -- ) + [ + at [ + { + { [ dup string? ] [ swap 2array ] } + { [ dup array? ] [ swap suffix ] } + { [ dup not ] [ drop ] } + } cond + ] when* + ] 2keep set-at ; + : query>assoc ( query -- assoc ) dup [ - "&" split [ - "=" split1 [ dup [ url-decode ] when ] bi@ - ] H{ } map>assoc + "&" split H{ } clone [ + [ + >r "=" split1 [ dup [ url-decode ] when ] bi@ swap r> + add-query-param + ] curry each + ] keep ] when ; : assoc>query ( hash -- str ) [ - [ url-encode ] - [ dup number? [ number>string ] when url-encode ] - bi* - "=" swap 3append - ] { } assoc>map - "&" join ; + { + { [ dup number? ] [ number>string ] } + { [ dup string? ] [ 1array ] } + { [ dup sequence? ] [ ] } + } cond + ] assoc-map + [ + [ + >r url-encode r> + [ url-encode "=" swap 3append , ] with each + ] assoc-each + ] { } make "&" join ; TUPLE: cookie name value path domain expires max-age http-only ; diff --git a/extra/http/server/auth/admin/admin.factor b/extra/http/server/auth/admin/admin.factor index 0dc5d3560e..e762103d7b 100644 --- a/extra/http/server/auth/admin/admin.factor +++ b/extra/http/server/auth/admin/admin.factor @@ -1,7 +1,8 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel sequences accessors namespaces combinators -locals db.tuples +USING: kernel sequences accessors namespaces combinators words +assocs locals db.tuples arrays splitting strings qualified + http.server.templating.chloe http.server.boilerplate http.server.auth.providers @@ -10,17 +11,26 @@ http.server.auth.login http.server.auth http.server.forms http.server.components.inspector -http.server.components http.server.validators http.server.sessions http.server.actions http.server.crud http.server ; +EXCLUDE: http.server.components => string? number? ; IN: http.server.auth.admin : admin-template ( name -- template ) "resource:extra/http/server/auth/admin/" swap ".xml" 3append ; +: words>strings ( seq -- seq' ) + [ [ word-vocabulary ] [ drop ":" ] [ word-name ] tri 3append ] map ; + +: strings>words ( seq -- seq' ) + [ ":" split1 swap lookup ] map ; + +: ( id -- component ) + capabilities get words>strings ; + : ( -- form ) "user"
"new-user" admin-template >>edit-template @@ -28,8 +38,8 @@ IN: http.server.auth.admin "realname" add-field "new-password" t >>required add-field "verify-password" t >>required add-field - "email" add-field ; - ! "capabilities" add-field ; + "email" add-field + "capabilities" add-field ; : ( -- form ) "user" @@ -40,8 +50,8 @@ IN: http.server.auth.admin "new-password" add-field "verify-password" add-field "email" add-field - "profile" add-field ; - ! "capabilities" add-field ; + "profile" add-field + "capabilities" add-field ; : ( -- form ) "user-list" @@ -102,6 +112,7 @@ IN: http.server.auth.admin [ realname>> "realname" set-value ] [ email>> "email" set-value ] [ profile>> "profile" set-value ] + [ capabilities>> words>strings "capabilities" set-value ] } cleave ] >>init @@ -122,6 +133,11 @@ IN: http.server.auth.admin "new-password" value >>encoded-password ] unless + "capabilities" value { + { [ dup string? ] [ 1array ] } + { [ dup array? ] [ ] } + } cond strings>words >>capabilities + update-tuple next f @@ -157,3 +173,9 @@ can-administer-users? define-capability "admin" admin-template >>template { can-administer-users? } ] ; + +: make-admin ( username -- ) + + select-tuple + [ can-administer-users? suffix ] change-capabilities + update-tuple ; diff --git a/extra/http/server/auth/admin/admin.xml b/extra/http/server/auth/admin/admin.xml index d3c0ff4c90..1864c3c4bf 100644 --- a/extra/http/server/auth/admin/admin.xml +++ b/extra/http/server/auth/admin/admin.xml @@ -2,7 +2,7 @@ - +