diff options
Diffstat (limited to 'sandbox/sebastien/cpp/apr-2/modules/openid')
12 files changed, 582 insertions, 0 deletions
diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/Makefile.am b/sandbox/sebastien/cpp/apr-2/modules/openid/Makefile.am new file mode 100644 index 0000000000..a46dd56743 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/Makefile.am @@ -0,0 +1,32 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + + +if WANT_OPENID + +dist_mod_SCRIPTS = openid-conf openid-step2-conf openid-memcached-conf +moddir = $(prefix)/modules/openid + +mod_DATA = openid.prefix +openid.prefix: $(top_builddir)/config.status + echo ${MODAUTHOPENID_PREFIX} >openid.prefix + +EXTRA_DIST = openid.composite user-info.scm htdocs/index.html htdocs/login/index.html htdocs/logout/index.html htdocs/public/index.html + +dist_noinst_SCRIPTS = start-test stop-test + +endif diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/index.html b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/index.html new file mode 100644 index 0000000000..98bbac0c57 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/index.html @@ -0,0 +1,46 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html> +<head> +<script type="text/javascript" src="/component.js"></script> +<script type="text/javascript"> +var protected = sca.component("Protected"); +var userInfo = sca.defun(sca.reference(protected, "userInfo"), "getuser", "getemail", "getrealm"); +var user = userInfo.getuser(); +var email = userInfo.getemail(); +var realm = userInfo.getrealm(); +</script> +</head> +<body> +<h1>Protected area - It works!</h1> +<p>The following info is returned by a JSONRPC service:</p> +<div id="user"></div> +<div id="email"></div> +<div id="realm"></div> +<script type="text/javascript"> +document.getElementById('user').innerHTML="User: " + user; +document.getElementById('email').innerHTML="Email: " + email; +document.getElementById('realm').innerHTML="Realm: " + realm; +</script> +<p><a href="info">User info</a></p> +<p><a href="login">Sign in</a></p> +<p><a href="logout">Sign out</a></p> +<p><a href="public">Public area</a></p> +</body></html> diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/login/index.html b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/login/index.html new file mode 100644 index 0000000000..493227addc --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/login/index.html @@ -0,0 +1,129 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body><h1>Sign in with an OpenID provider</h1> + +<script type="text/javascript"> +function queryParams() { + qp = new Array(); + qs = window.location.search.substring(1).split('&'); + for (i = 0; i < qs.length; i++) { + e = qs[i].indexOf('='); + if (e > 0) + qp[qs[i].substring(0, e)] = unescape(qs[i].substring(e + 1)); + } + return qp; +} + +function openidReferrer() { + r = queryParams()['openauth_referrer']; + if (typeof(r) == 'undefined') + return r; + q = r.indexOf('?'); + if (q > 0) + return r.substring(0, q); + return r; +} + +if (typeof(openidReferrer()) == 'undefined') { + document.location = '/'; +} + +function submitSignin(w) { + document.cookie = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';path=/;secure=TRUE'; + document.signin.openid_identifier.value = w(); + document.signin.action = openidReferrer(); + document.signin.submit(); +} + + +function withGoogle() { + return 'https://www.google.com/accounts/o8/id'; +} + +function withYahoo() { + return 'https://me.yahoo.com/'; +} + +function withMyOpenID() { + return 'http://www.myopenid.com/xrds'; +} + +function withVerisign() { + return 'https://pip.verisignlabs.com/'; +} + +function withMySpace() { + return 'https://api.myspace.com/openid'; +} + +function withGoogleApps() { + return 'https://www.google.com/accounts/o8/site-xrds?ns=2&hd=' + document.fields.domain.value; +} + +function withLivejournal() { + return 'http://' + document.fields.ljuser.value + '.livejournal.com'; +} + +function withBlogspot() { + return 'http://' + document.fields.bsuser.value + '.blogspot.com'; +} + +function withBlogger() { + return 'http://' + document.fields.bguser.value + '.blogger.com'; +} + +function withXRDSEndpoint() { + return document.fields.endpoint.value; +} +</script> + +<form name="signin" action="/" method="GET"> +<input type="hidden" name="openid_identifier" value="https://www.google.com/accounts/o8/id"/> +</form> + +<form name="fields"> +<p>Sign in with your Google account<br/><input type="button" onclick="submitSignin(withGoogle)" value="Sign in"/></p> +<p>Sign in with your Yahoo account<br/><input type="button" onclick="submitSignin(withYahoo)" value="Sign in"/></p> +<p>Sign in with your MyOpenID account<br/><input type="button" onclick="submitSignin(withMyOpenID)" value="Sign in"/></p> +<p>Sign in with your Verisign account<br/><input type="button" onclick="submitSignin(withVerisign)" value="Sign in"/></p> +<p>Sign in with your MySpace account<br/><input type="button" onclick="submitSignin(withMySpace)" value="Sign in"/></p> + +<p>Sign in with a Google apps domain<br/> +<input type="text" size="20" name="domain" value="example.com"/><br/> +<input type="button" onclick="submitSignin(withGoogleApps)" value="Sign in"/></p> + +<p>Sign in with your Livejournal account<br/> +<input type="text" size="10" name="ljuser" value=""/><br/> +<input type="button" onclick="submitSignin(withLivejournal)" value="Sign in"/></p> + +<p>Sign in with your Blogspot account<br/> +<input type="text" size="10" name="bsuser" value=""/><br/> +<input type="button" onclick="submitSignin(withBlogspot)" value="Sign in"/></p> + +<p>Sign in with your Blogger account<br/> +<input type="text" size="10" name="bguser" value=""/><br/> +<input type="button" onclick="submitSignin(withBlogger)" value="Sign in"/></p> + +<p>Sign in with an OpenID endpoint<br/> +<input type="text" size="50" name="endpoint" value="https://www.google.com/accounts/o8/id"/><br/> +<input type="button" onclick="submitSignin(withXRDSEndpoint)" value="Sign in"/></p> +</form> + +</body></html> diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/logout/index.html b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/logout/index.html new file mode 100644 index 0000000000..02a92d1b31 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/logout/index.html @@ -0,0 +1,33 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html><body> +<h1>Sign out</h1> + +<form name="signout" action="/login" method="GET"> +<script type="text/javascript"> +function submitSignout() { + document.cookie = 'TuscanyOpenAuth=;expires=' + new Date(1970,01,01).toGMTString() + ';path=/;secure=TRUE'; + document.signout.submit(); + return true; +} +</script> +<input type="button" onclick="submitSignout()" value="Sign out"/> +</form> +</body></html> diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/public/index.html b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/public/index.html new file mode 100644 index 0000000000..af2cd7ca19 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/htdocs/public/index.html @@ -0,0 +1,27 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<html> +<body> +<h1>Unprotected area - It works!</h1> +<p><a href="/info">User info</a></p> +<p><a href="/login">Sign in</a></p> +<p><a href="/logout">Sign out</a></p> +<p><a href="/">Protected area</a></p> +</body></html> diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/openid-conf b/sandbox/sebastien/cpp/apr-2/modules/openid/openid-conf new file mode 100755 index 0000000000..797f8b0607 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/openid-conf @@ -0,0 +1,67 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Generate an OpenID server conf +here=`readlink -f $0`; here=`dirname $here` +mkdir -p $1 +root=`readlink -f $1` + +conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"` +host=`echo $conf | awk '{ print $6 }'` +openid_prefix=`cat $here/openid.prefix` + +# Configure OpenID authentication +cat >>$root/conf/modules.conf <<EOF +# Generated by: openid-conf $* +# Load support for OpenID authentication +LoadModule authopenid_module $openid_prefix/modules/mod_auth_openid.so + +EOF + +cat >>$root/conf/auth.conf <<EOF +# Generated by: openid-conf $* +# Enable OpenID authentication +<Location /> +AuthType Open +AuthName "$host" +Require valid-user +AuthOpenIDEnabled On +AuthOpenIDCookiePath / +AuthOpenIDCookieName TuscanyOpenAuth +AuthOpenIDSecureCookie On +AuthOpenIDLoginPage /login +AuthOpenIDAXAdd EMAIL http://axschema.org/contact/email +AuthOpenIDAXAdd FULLNAME http://axschema.org/namePerson +AuthOpenIDAXAdd NICKNAME http://axschema.org/namePerson/friendly +AuthOpenIDAXAdd FIRSTNAME http://axschema.org/namePerson/first +AuthOpenIDAXAdd LASTNAME http://axschema.org/namePerson/last +</Location> + +EOF + +cat >>$root/conf/httpd.conf <<EOF +# Generated by: openid-conf $* +# Allow access to /openid location +<Location /openid> +AuthType None +Require all granted +</Location> + +EOF + diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/openid-memcached-conf b/sandbox/sebastien/cpp/apr-2/modules/openid/openid-memcached-conf new file mode 100755 index 0000000000..1717b3ce92 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/openid-memcached-conf @@ -0,0 +1,32 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +here=`readlink -f $0`; here=`dirname $here` +mkdir -p $1 +root=`readlink -f $1` +host=$2 +port=$3 + +# Configure HTTPD mod_auth_openid module cache +cat >>$root/conf/auth.conf <<EOF +# Generated by: openid-cache-conf $* +AddAuthOpenIDMemcached $host:$port + +EOF + diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/openid-step2-conf b/sandbox/sebastien/cpp/apr-2/modules/openid/openid-step2-conf new file mode 100755 index 0000000000..559a62d20b --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/openid-step2-conf @@ -0,0 +1,78 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Generate an OpenID Step2 server conf +here=`readlink -f $0`; here=`dirname $here` +mkdir -p $1 +root=`readlink -f $1` + +conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"` +host=`echo $conf | awk '{ print $6 }'` + +# Configure HTTPD to serve OpenID XRDS and LRDD documents +cat >>$root/conf/auth.conf <<EOF +# Generated by: openid-step2-conf $* +# Serve OpenID XRDS document +Alias /openid $root/conf/openid.xrds +<Location /openid> +ForceType application/xrds+xml +</Location> + +# Serve OpenID LRDD document +Alias /.well-known/host-meta $root/conf/openid.lrdd +<Location /.well-known/host-meta> +ForceType text/plain +</Location> + +EOF + +cat >>$root/conf/httpd.conf <<EOF +# Generated by: openid-conf $* +# Allow access to /.well-known/host-meta location +<Location /.well-known/host-meta> +AuthType None +Require all granted +</Location> + +EOF + +# Generate OpenID XRDS document +cat >$root/conf/openid.xrds <<EOF +<?xml version="1.0" encoding="UTF-8"?> +<xrds:XRDS xmlns:xrds="xri://\$xrds" xmlns="xri://\$xrd*(\$v*2.0)"> +<XRD> +<CanonicalID>$host</CanonicalID> +<Service priority="0"> +<Type>http://specs.openid.net/auth/2.0/server</Type> +<Type>http://specs.openid.net/auth/2.0/signon</Type> +<Type>http://openid.net/srv/ax/1.0</Type> +<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type> +<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type> +<Type>http://specs.openid.net/extensions/pape/1.0</Type> +<URI>https://www.google.com/a/$host/o8/ud?be=o8</URI> +</Service> +</XRD> +</xrds:XRDS> +EOF + +# Generate OpenID LRDD document +cat >$root/conf/openid.lrdd <<EOF +Link: <https://www.google.com/accounts/o8/site-xrds?hd=$host>; rel="describedby http://reltype.google.com/openid/xrd-op"; type="application/xrds+xml" +EOF + diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/openid.composite b/sandbox/sebastien/cpp/apr-2/modules/openid/openid.composite new file mode 100644 index 0000000000..08bb74b7c7 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/openid.composite @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. +--> +<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912" + xmlns:t="http://tuscany.apache.org/xmlns/sca/1.1" + targetNamespace="http://tuscany.apache.org/xmlns/sca/components" + name="openid"> + + <component name="Protected"> + <t:implementation.widget location="protected/index.html"/> + <reference name="userInfo" target="UserInfo"/> + </component> + + <component name="UserInfo"> + <t:implementation.scheme script="user-info.scm"/> + <service name="info"> + <t:binding.jsonrpc uri="info"/> + </service> + <property name="user">anonymous</property> + <property name="email">anonymous@example.com</property> + <property name="realm">example.com</property> + </component> + +</composite> diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/start-test b/sandbox/sebastien/cpp/apr-2/modules/openid/start-test new file mode 100755 index 0000000000..7ae27c57cd --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/start-test @@ -0,0 +1,46 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Setup +../../components/cache/memcached-start 11212 +../../components/cache/memcached-start 11213 + +../../modules/http/ssl-ca-conf tmp localhost +../../modules/http/ssl-cert-conf tmp localhost +../../modules/http/httpd-conf tmp localhost 8090 htdocs +../../modules/http/httpd-ssl-conf tmp 8453 + +./openid-conf tmp +./openid-memcached-conf tmp localhost 11212 +./openid-memcached-conf tmp localhost 11213 +./openid-step2-conf tmp + +# For this test to work you need to add your openid to the +# the authorized user group +../../modules/http/group-auth-conf tmp https://www.google.com/accounts/o8/id?id=1234567 + +../../modules/server/server-conf tmp +../../modules/server/scheme-conf tmp +cat >>tmp/conf/httpd.conf <<EOF +SCAContribution `pwd`/ +SCAComposite openid.composite +EOF + +../../modules/http/httpd-start tmp + diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/stop-test b/sandbox/sebastien/cpp/apr-2/modules/openid/stop-test new file mode 100755 index 0000000000..a0587f8cb7 --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/stop-test @@ -0,0 +1,24 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Cleanup +../../modules/http/httpd-stop tmp + +../../components/cache/memcached-stop 11212 +../../components/cache/memcached-stop 11213 diff --git a/sandbox/sebastien/cpp/apr-2/modules/openid/user-info.scm b/sandbox/sebastien/cpp/apr-2/modules/openid/user-info.scm new file mode 100644 index 0000000000..b1ef74c6bd --- /dev/null +++ b/sandbox/sebastien/cpp/apr-2/modules/openid/user-info.scm @@ -0,0 +1,28 @@ +; Licensed to the Apache Software Foundation (ASF) under one +; or more contributor license agreements. See the NOTICE file +; distributed with this work for additional information +; regarding copyright ownership. The ASF licenses this file +; to you under the Apache License, Version 2.0 (the +; "License"); you may not use this file except in compliance +; with the License. You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, +; software distributed under the License is distributed on an +; "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +; KIND, either express or implied. See the License for the +; specific language governing permissions and limitations +; under the License. + +; OpenID support test case + +(define (get id user email realm) (list "text/html" (list + "<html><body><p>The following info is generated on the server:</p><div>User: " (user) "</div><div>Email: " (email) "</div><div>Realm: " (realm) "</div></body></html>"))) + +(define (getuser user email realm) (user)) + +(define (getemail user email realm) (email)) + +(define (getrealm user email realm) (realm)) + |