tuscany-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jsdelf...@apache.org
Subject svn commit: r1517420 - /tuscany/sca-cpp/trunk/hosting/server/
Date Mon, 26 Aug 2013 05:18:11 GMT
Author: jsdelfino
Date: Mon Aug 26 05:18:10 2013
New Revision: 1517420

URL: http://svn.apache.org/r1517420
Log:
Improvements to the hosting management app server side logic.

Added:
    tuscany/sca-cpp/trunk/hosting/server/delete-account
      - copied, changed from r1517415, tuscany/sca-cpp/trunk/hosting/server/delete-auth
    tuscany/sca-cpp/trunk/hosting/server/get-account
      - copied, changed from r1517415, tuscany/sca-cpp/trunk/hosting/server/get-auth
    tuscany/sca-cpp/trunk/hosting/server/imgutil.py
    tuscany/sca-cpp/trunk/hosting/server/put-account   (with props)
Modified:
    tuscany/sca-cpp/trunk/hosting/server/accounts.py
    tuscany/sca-cpp/trunk/hosting/server/apps.py
    tuscany/sca-cpp/trunk/hosting/server/dashboards.py
    tuscany/sca-cpp/trunk/hosting/server/delete-auth
    tuscany/sca-cpp/trunk/hosting/server/get-auth
    tuscany/sca-cpp/trunk/hosting/server/icons.py
    tuscany/sca-cpp/trunk/hosting/server/imapd.py
    tuscany/sca-cpp/trunk/hosting/server/load-authn
    tuscany/sca-cpp/trunk/hosting/server/pictures.py
    tuscany/sca-cpp/trunk/hosting/server/put-auth
    tuscany/sca-cpp/trunk/hosting/server/ratings.py
    tuscany/sca-cpp/trunk/hosting/server/search.py
    tuscany/sca-cpp/trunk/hosting/server/ssl-proxy-start
    tuscany/sca-cpp/trunk/hosting/server/ssl-start
    tuscany/sca-cpp/trunk/hosting/server/test.py
    tuscany/sca-cpp/trunk/hosting/server/user.py
    tuscany/sca-cpp/trunk/hosting/server/util.py

Modified: tuscany/sca-cpp/trunk/hosting/server/accounts.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/accounts.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/accounts.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/accounts.py Mon Aug 26 05:18:10 2013
@@ -21,22 +21,70 @@ from atomutil import *
 from sys import debug
 
 # Convert a particular user id to an account id
-def accountid(user):
-    return ('accounts', user.get(()), 'user.account')
+def accountid(uid):
+    return ('accounts', uid, 'user.account')
 
-# Get the current user's account
+# Get a user account
 def get(id, user, cache):
     debug('accounts.py::get::id', id)
-    account = cache.get(accountid(user))
+
+    # Default to the current user's account
+    uid = user.get(()) if isNull(id) else car(id)
+
+    # Get the account
+    account = cache.get(accountid(uid))
     if isNull(account):
-        return mkentry(user.get(()), user.get(()), user.get(()), now(), ())
+        return mkentry(uid, uid, uid, now(), ())
+
+    # Strip private info from account
+    if uid != user.get(()) and user.get(()) != 'admin':
+        desc = assoc("'description", content(account))
+        return mkentry(title(account), uid, uid, now(), ("'account",) + (() if isNull(desc) else (desc,)))
+
     return account
 
-# Update the user's account
+# Update a user account
 def put(id, account, user, cache):
     debug('accounts.py::put::id', id)
     debug('accounts.py::put::account', account)
 
-    accountentry = mkentry(title(account), user.get(()), user.get(()), now(), content(account))
-    return cache.put(accountid(user), accountentry)
+    # Default to the current user's account
+    uid = user.get(()) if isNull(id) else car(id)
+
+    # Only the admin can create or update somebody else's account
+    if uid != user.get(()) and user.get(()) != 'admin':
+        debug('accounts.py::put', 'not owner or admin', user.get(()))
+        return False
+
+    # Get existing account
+    eaccount = cache.get(accountid(uid))
+    if isNull(eaccount) and user.get(()) != 'admin':
+        # Only the admin can create a new account
+        debug('accounts.py::put', 'account not found', (uid,))
+        return False
+
+    # Merge new account info
+    email = assoc("'email", content(account)) if isNull(eaccount) else assoc("'email", content(eaccount))
+    desc = assoc("'description", content(account))
+    accountentry = mkentry(title(account), uid, uid, now(), ("'account",) + (() if isNull(email) else (email,)) + (() if isNull(desc) else (desc,)))
+
+    return cache.put(accountid(uid), accountentry)
+
+def delete(id, user, cache):
+    debug('accounts.py::delete::id', id)
+    uid = car(id)
+
+    # Only the admin can delete an account
+    if user.get(()) != 'admin':
+        debug('accounts.py::delete', 'not admin', user.get(()))
+        return False
+
+    # Get the requested id
+    account = cache.get(accountid(uid))
+    if isNull(account):
+        debug('accounts.py::delete', 'account not found', (uid,))
+        return False
+
+    # Delete the account
+    return cache.delete(accountid(uid))
 

Modified: tuscany/sca-cpp/trunk/hosting/server/apps.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/apps.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/apps.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/apps.py Mon Aug 26 05:18:10 2013
@@ -83,12 +83,12 @@ def get(id, user, cache, db, dashboard, 
 
     # Return the newest apps
     if isNull(id):
-        newentries = db.get((("'regex", '("apps" .* "app.info")'), ("'rank", "(regexp_matches(value, '(.*\(updated )([^\)]+)(\).*)'))[2]::timestamp"), ("'limit", 25)))
-        flatentries = tuple(map(lambda v: car(v), () if isNull(newentries) else newentries))
-        def sortkey(e):
-            return updated((e,))
-        sortedentries = tuple(sorted(flatentries, key = sortkey, reverse = True))[0:25]
-        newapps = ((("'feed", ("'title", "Apps"), ("'id", 'apps')) + sortedentries),)
+        newentries = db.get((("'regex", '("apps" .* "app.info")'), ("'rank", "(regexp_matches(value, '(.*\\(updated )([^\\)]+)(\\).*)'))[2]::timestamp"), ("'limit", 50)))
+        entries = tuple(map(lambda v: car(v), () if isNull(newentries) else newentries))
+        #def sortkey(e):
+        #    return updated((e,))
+        #sortedentries = tuple(sorted(entries, key = sortkey, reverse = True))
+        newapps = ((("'feed", ("'title", "Apps"), ("'id", 'apps')) + entries),)
         debug('apps.py::get::newapps', newapps)
         return newapps
 

Modified: tuscany/sca-cpp/trunk/hosting/server/dashboards.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/dashboards.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/dashboards.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/dashboards.py Mon Aug 26 05:18:10 2013
@@ -97,8 +97,11 @@ def get(id, user, cache, apps, ratings):
         return findapp(id, cdr(dashboard))
 
     if isNull(id):
-        dashboardapps = mergeapps(getdashboard(dashboardid(user), cache), apps, ratings)
-        dashboard = ((("'feed", ("'title", "Your Apps"), ("'id", user.get(()))) + dashboardapps),)
+        entries = mergeapps(getdashboard(dashboardid(user), cache), apps, ratings)
+        def sortkey(e):
+            return updated((e,))
+        sortedentries = tuple(sorted(entries, key = sortkey, reverse = True))
+        dashboard = ((("'feed", ("'title", "Your Apps"), ("'id", user.get(()))) + sortedentries),)
         debug('dashboards.py::get::dashboard', dashboard)
         return dashboard
 

Copied: tuscany/sca-cpp/trunk/hosting/server/delete-account (from r1517415, tuscany/sca-cpp/trunk/hosting/server/delete-auth)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/delete-account?p2=tuscany/sca-cpp/trunk/hosting/server/delete-account&p1=tuscany/sca-cpp/trunk/hosting/server/delete-auth&r1=1517415&r2=1517420&rev=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/delete-auth (original)
+++ tuscany/sca-cpp/trunk/hosting/server/delete-account Mon Aug 26 05:18:10 2013
@@ -18,44 +18,40 @@
 #  under the License.
 
 here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
-mkdir -p $1
+mkdir -p $1/conf
 root=`echo "import os; print os.path.realpath('$1')" | python`
 admin=$2
 apass=$3
 user=$4
+host=$5
 
 httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
 
-conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
-sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
-if [ "$sslconf" = "" ]; then
-    scheme="http"
-    addr=`echo $conf | awk '{ print $7 }'`
-    host=`$here/../../modules/http/httpd-addr ip $addr`
-    if [ "$host" = "" ]; then
-        host="localhost"
+if [ "$host" = "" ]; then
+    conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
+    sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
+    if [ "$sslconf" = "" ]; then
+        scheme="http"
+        addr=`echo $conf | awk '{ print $7 }'`
+        host=`$here/../../modules/http/httpd-addr ip $addr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $addr`
+    else
+        scheme="https"
+        ssladdr=`echo $sslconf | awk '{ print $6 }'`
+        host=`$here/../../modules/http/httpd-addr ip $ssladdr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $ssladdr`
     fi
-    port=`$here/../../modules/http/httpd-addr port $addr`
 else
     scheme="https"
-    ssladdr=`echo $sslconf | awk '{ print $6 }'`
-    host=`$here/../../modules/http/httpd-addr ip $ssladdr`
-    if [ "$host" = "" ]; then
-        host="localhost"
-    fi
-    port=`$here/../../modules/http/httpd-addr port $ssladdr`
-fi
-
-# Compute user id
-slash=`echo $user | grep "/"`
-if [ "$slash" = "" ]; then
-    id="\"$user\""
-    upath=$user
-else
-    id=`echo $user | awk -F "/" '{ printf "\"%s\" \"%s\"", $2, $3 }'`
-    upath=`echo $user | awk -F "/" '{ printf "%s/%s", $2, $3 }'`
+    port="443"
 fi
 
-# Delete user auth
-curl -k -L -u $admin:$apass -X DELETE -H "X-Forwarded-Server: $host" $scheme://$host:$port/c/Authenticator/$upath
+# Delete user account
+curl -k -L -u $admin:$apass -X DELETE -H "X-Forwarded-Server: $host" $scheme://$host:$port/c/Accounts/$user
 

Modified: tuscany/sca-cpp/trunk/hosting/server/delete-auth
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/delete-auth?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/delete-auth (original)
+++ tuscany/sca-cpp/trunk/hosting/server/delete-auth Mon Aug 26 05:18:10 2013
@@ -18,43 +18,42 @@
 #  under the License.
 
 here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
-mkdir -p $1
+mkdir -p $1/conf
 root=`echo "import os; print os.path.realpath('$1')" | python`
 admin=$2
 apass=$3
-user=$4
+email=$4
+host=$5
 
 httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
 
-conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
-sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
-if [ "$sslconf" = "" ]; then
-    scheme="http"
-    addr=`echo $conf | awk '{ print $7 }'`
-    host=`$here/../../modules/http/httpd-addr ip $addr`
-    if [ "$host" = "" ]; then
-        host="localhost"
+if [ "$host" = "" ]; then
+    conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
+    sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
+    if [ "$sslconf" = "" ]; then
+        scheme="http"
+        addr=`echo $conf | awk '{ print $7 }'`
+        host=`$here/../../modules/http/httpd-addr ip $addr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $addr`
+    else
+        scheme="https"
+        ssladdr=`echo $sslconf | awk '{ print $6 }'`
+        host=`$here/../../modules/http/httpd-addr ip $ssladdr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $ssladdr`
     fi
-    port=`$here/../../modules/http/httpd-addr port $addr`
 else
     scheme="https"
-    ssladdr=`echo $sslconf | awk '{ print $6 }'`
-    host=`$here/../../modules/http/httpd-addr ip $ssladdr`
-    if [ "$host" = "" ]; then
-        host="localhost"
-    fi
-    port=`$here/../../modules/http/httpd-addr port $ssladdr`
+    port="443"
 fi
 
-# Compute user id
-slash=`echo $user | grep "/"`
-if [ "$slash" = "" ]; then
-    id="\"$user\""
-    upath=$user
-else
-    id=`echo $user | awk -F "/" '{ printf "\"%s\" \"%s\"", $2, $3 }'`
-    upath=`echo $user | awk -F "/" '{ printf "%s/%s", $2, $3 }'`
-fi
+# Compute user URI
+upath=$email
 
 # Delete user auth
 curl -k -L -u $admin:$apass -X DELETE -H "X-Forwarded-Server: $host" $scheme://$host:$port/c/Authenticator/$upath

Copied: tuscany/sca-cpp/trunk/hosting/server/get-account (from r1517415, tuscany/sca-cpp/trunk/hosting/server/get-auth)
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/get-account?p2=tuscany/sca-cpp/trunk/hosting/server/get-account&p1=tuscany/sca-cpp/trunk/hosting/server/get-auth&r1=1517415&r2=1517420&rev=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/get-auth (original)
+++ tuscany/sca-cpp/trunk/hosting/server/get-account Mon Aug 26 05:18:10 2013
@@ -18,45 +18,40 @@
 #  under the License.
 
 here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
-mkdir -p $1
+mkdir -p $1/conf
 root=`echo "import os; print os.path.realpath('$1')" | python`
 admin=$2
 apass=$3
 user=$4
+host=$5
 
 httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
 
-conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
-
-sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
-if [ "$sslconf" = "" ]; then
-    scheme="http"
-    addr=`echo $conf | awk '{ print $7 }'`
-    host=`$here/../../modules/http/httpd-addr ip $addr`
-    if [ "$host" = "" ]; then
-        host="localhost"
+if [ "$host" = "" ]; then
+    conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
+    sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
+    if [ "$sslconf" = "" ]; then
+        scheme="http"
+        addr=`echo $conf | awk '{ print $7 }'`
+        host=`$here/../../modules/http/httpd-addr ip $addr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $addr`
+    else
+        scheme="https"
+        ssladdr=`echo $sslconf | awk '{ print $6 }'`
+        host=`$here/../../modules/http/httpd-addr ip $ssladdr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $ssladdr`
     fi
-    port=`$here/../../modules/http/httpd-addr port $addr`
 else
     scheme="https"
-    ssladdr=`echo $sslconf | awk '{ print $6 }'`
-    host=`$here/../../modules/http/httpd-addr ip $ssladdr`
-    if [ "$host" = "" ]; then
-        host="localhost"
-    fi
-    port=`$here/../../modules/http/httpd-addr port $ssladdr`
-fi
-
-# Compute user id
-slash=`echo $user | grep "/"`
-if [ "$slash" = "" ]; then
-    id="\"$user\""
-    upath=$user
-else
-    id=`echo $user | awk -F "/" '{ printf "\"%s\" \"%s\"", $2, $3 }'`
-    upath=`echo $user | awk -F "/" '{ printf "%s/%s", $2, $3 }'`
+    port="443"
 fi
 
-# Get user auth
-curl -k -L -u $admin:$apass -H "X-Forwarded-Server: $host" $scheme://$host:$port/c/Authenticator/$upath
+# Get user account
+curl -k -L -u $admin:$apass -H "X-Forwarded-Server: $host" $scheme://$host:$port/c/Accounts/$user
 

Modified: tuscany/sca-cpp/trunk/hosting/server/get-auth
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/get-auth?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/get-auth (original)
+++ tuscany/sca-cpp/trunk/hosting/server/get-auth Mon Aug 26 05:18:10 2013
@@ -18,44 +18,42 @@
 #  under the License.
 
 here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
-mkdir -p $1
+mkdir -p $1/conf
 root=`echo "import os; print os.path.realpath('$1')" | python`
 admin=$2
 apass=$3
-user=$4
+email=$4
+host=$5
 
 httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
 
-conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
-
-sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
-if [ "$sslconf" = "" ]; then
-    scheme="http"
-    addr=`echo $conf | awk '{ print $7 }'`
-    host=`$here/../../modules/http/httpd-addr ip $addr`
-    if [ "$host" = "" ]; then
-        host="localhost"
+if [ "$host" = "" ]; then
+    conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
+    sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
+    if [ "$sslconf" = "" ]; then
+        scheme="http"
+        addr=`echo $conf | awk '{ print $7 }'`
+        host=`$here/../../modules/http/httpd-addr ip $addr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $addr`
+    else
+        scheme="https"
+        ssladdr=`echo $sslconf | awk '{ print $6 }'`
+        host=`$here/../../modules/http/httpd-addr ip $ssladdr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $ssladdr`
     fi
-    port=`$here/../../modules/http/httpd-addr port $addr`
 else
     scheme="https"
-    ssladdr=`echo $sslconf | awk '{ print $6 }'`
-    host=`$here/../../modules/http/httpd-addr ip $ssladdr`
-    if [ "$host" = "" ]; then
-        host="localhost"
-    fi
-    port=`$here/../../modules/http/httpd-addr port $ssladdr`
+    port="443"
 fi
 
-# Compute user id
-slash=`echo $user | grep "/"`
-if [ "$slash" = "" ]; then
-    id="\"$user\""
-    upath=$user
-else
-    id=`echo $user | awk -F "/" '{ printf "\"%s\" \"%s\"", $2, $3 }'`
-    upath=`echo $user | awk -F "/" '{ printf "%s/%s", $2, $3 }'`
-fi
+# Compute user URI
+upath=$email
 
 # Get user auth
 curl -k -L -u $admin:$apass -H "X-Forwarded-Server: $host" $scheme://$host:$port/c/Authenticator/$upath

Modified: tuscany/sca-cpp/trunk/hosting/server/icons.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/icons.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/icons.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/icons.py Mon Aug 26 05:18:10 2013
@@ -16,32 +16,15 @@
 #  under the License.
 
 # App icons collection implementation
-from StringIO import StringIO
-try:
-    from PIL import Image
-except:
-    Image = None
-from base64 import b64encode, b64decode
-from urllib import urlopen
 from util import *
 from atomutil import *
+from imgutil import *
 from sys import debug
 
 # Convert an id to an icon id
 def iconid(id):
     return ("apps", car(id), "app.icon")
 
-# Convert image to a 50x50 PNG image
-def to50x50png(url):
-    debug('icons.py::to50x50png::url', url)
-    if Image is None:
-        return url
-    img = Image.open(StringIO(b64decode(url.split(',')[1])) if url.startswith('data:') else StringIO(urlopen(url).read()))
-    t = img.resize((50, 50))
-    obuf = StringIO()
-    t.save(obuf, 'PNG')
-    return 'data:image/png;base64,' + b64encode(obuf.getvalue()).replace('\n', '')
-
 # Put an icon
 def put(id, icon, user, cache, apps):
     debug('icons.py::put::id', id)
@@ -61,7 +44,7 @@ def put(id, icon, user, cache, apps):
     # Get image and token from input icon
     def image(c):
         img = assoc("'image", c)
-        return None if isNull(img) else to50x50png(cadr(img))
+        return None if isNull(img) else urlto50x50jpeg(cadr(img))
     def token(c):
         tok = assoc("'token", c)
         return None if isNull(tok) else cadr(tok)

Modified: tuscany/sca-cpp/trunk/hosting/server/imapd.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/imapd.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/imapd.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/imapd.py Mon Aug 26 05:18:10 2013
@@ -20,12 +20,11 @@ from imaplib2 import IMAP4_SSL
 from threading import Thread, Event
 from email import message_from_string
 import re
-from StringIO import StringIO
-from PIL import Image
 from base64 import b64encode, b64decode
 from httplib import HTTPConnection, HTTPSConnection
 from urlparse import urlparse
 from util import *
+from imgutil import *
 from sys import stderr, argv, exit
 from traceback import print_exc
 
@@ -64,12 +63,8 @@ def fetchmail(id, imap):
     if len(parts) == 0:
         return (None, 'Email doesn\'t contain an image')
 
-    # Convert image to a 50x50 PNG image
-    img = Image.open(StringIO(parts[0]))
-    t = img.resize((50, 50))
-    obuf = StringIO()
-    t.save(obuf, 'PNG')
-    dataurl = 'data:image/png;base64,' + b64encode(obuf.getvalue()).replace('\n', '')
+    # Convert image to a 50x50 JPEG image
+    dataurl = bufto50x50jpeg(parts[0])
 
     # Return address, image url pair
     return (address, dataurl)

Added: tuscany/sca-cpp/trunk/hosting/server/imgutil.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/imgutil.py?rev=1517420&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/imgutil.py (added)
+++ tuscany/sca-cpp/trunk/hosting/server/imgutil.py Mon Aug 26 05:18:10 2013
@@ -0,0 +1,106 @@
+#  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.
+
+# Image processing functions
+from StringIO import StringIO
+try:
+    from PIL import Image
+    from PIL import ImageOps
+    from PIL import ExifTags
+except:
+    Image = None
+from base64 import b64encode, b64decode
+from urllib import urlopen
+from util import *
+from sys import debug
+
+# Rotate image if needed
+def rotateimg(img):
+    debug('imgutil.py::rotateimg')
+    if not hasattr(img, '_getexif'):
+        return img
+    exif = img._getexif()
+    if exif is None:
+        return img
+    for tag, value in exif.items():
+        decoded = ExifTags.TAGS.get(tag, tag)
+        if decoded == 'Orientation':
+            if value == 3: return img.rotate(180)
+            if value == 6: return img.rotate(270)
+            if value == 8: return img.rotate(90)
+    return img
+
+# Convert image to a cropped thumbnail
+def thumbnail(img, size):
+    def intsz(*nums):
+        return tuple(int(round(n)) for n in nums)
+
+    class imgsz(object):
+        def __init__(self, pair):
+            self.width = float(pair[0])
+            self.height = float(pair[1])
+            self.aspect_ratio = self.width / self.height
+            self.size = intsz(self.width, self.height)
+
+    osz = imgsz(img.size)
+    tsz = imgsz(size)
+
+    if tsz.aspect_ratio > osz.aspect_ratio:
+        scale = tsz.width / osz.width
+        crop = imgsz((osz.width, tsz.height / scale))
+        cut = (osz.height - crop.height) / 2
+        img = img.crop(intsz(0, cut, crop.width, cut + crop.height))
+    elif tsz.aspect_ratio < osz.aspect_ratio:
+        scale = tsz.height / osz.height
+        crop = imgsz((tsz.width / scale, osz.height))
+        cut = (osz.width - crop.width) / 2
+        img = img.crop(intsz(cut, 0,  cut + crop.width, crop.height))
+
+    return img.resize(tsz.size, Image.ANTIALIAS)
+
+# Convert image URL to a 50x50 JPEG
+def urlto50x50jpeg(url):
+    debug('imgutil.py::urlto50x50jpeg::url', url)
+    if Image is None:
+        return url
+    img = Image.open(StringIO(b64decode(url.split(',')[1])) if url.startswith('data:') else StringIO(urlopen(url).read()))
+    if img.size == (50, 50):
+        debug('imgutil.py::urlto50x50jpeg::res', url)
+        return url
+    thumb = thumbnail(rotateimg(img), (50, 50))
+    obuf = StringIO()
+    thumb.save(obuf, 'JPEG')
+    res = 'data:image/jpeg;base64,' + b64encode(obuf.getvalue()).replace('\n', '')
+    debug('imgutil.py::urlto50x50jpeg::res', res)
+    return res;
+
+# Convert image to a 50x50 JPEG
+def bufto50x50jpeg(buf):
+    debug('imgutil.py::bufto50x50jpeg')
+    if Image is None:
+        return ''
+    img = Image.open(StringIO(buf))
+    if img.size == (50, 50):
+        debug('imgutil.py::urlto50x50jpeg::res', url)
+        return url
+    thumb = thumbnail(rotateimg(img), (50, 50))
+    obuf = StringIO()
+    thumb.save(obuf, 'JPEG')
+    res = 'data:image/jpeg;base64,' + b64encode(obuf.getvalue()).replace('\n', '')
+    debug('imgutil.py::bufto50x50jpeg::res', res)
+    return res
+

Modified: tuscany/sca-cpp/trunk/hosting/server/load-authn
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/load-authn?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/load-authn (original)
+++ tuscany/sca-cpp/trunk/hosting/server/load-authn Mon Aug 26 05:18:10 2013
@@ -19,17 +19,19 @@
 
 here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
 cd $here
-var=$HOME/var
 httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
 
-user=$1
-pass=$2
+email=$1
+user=$2
+pass=$3
 
-tmp=$3
+tmp=$4
 if [ "$tmp" = "" ]; then
     tmp="$here/tmp"
 fi
-host=$4
+mkdir -p $tmp/sqldb
+
+host=$5
 if [ "$host" = "" ]; then
     host="localhost"
 fi
@@ -37,21 +39,16 @@ fi
 # Get password hash
 rm -f $tmp/sqldb/load-authn.passwd
 touch $tmp/sqldb/load-authn.passwd
-$httpd_prefix/bin/htpasswd -b $tmp/sqldb/load-authn.passwd "$user" "$pass" 2>/dev/null
+$httpd_prefix/bin/htpasswd -b $tmp/sqldb/load-authn.passwd "$email" "$pass" 2>/dev/null
 hash=`cat $tmp/sqldb/load-authn.passwd | awk -F ":" '{ print $2 }'`
 rm -f $tmp/sqldb/load-authn.passwd
 
 # Compute user id
-slash=`echo $user | grep "/"`
-if [ "$slash" = "" ]; then
-    id="\"$user\""
-else
-    id=`echo $user | awk -F "/" '{ printf "\"%s\" \"%s\"", $2, $3 }'`
-fi
+id="\"$email\""
 
 # Load into database
 cat >$tmp/sqldb/load-authn.sql <<EOF
-insert into data values('("authn" $id "user.authn")', '((entry (title "$user") (id "$user") (content (hash "$hash"))))');
+insert into data values('("authn" $id "user.authn")', '((entry (title "$email") (id "$email") (content (user "$user") (hash "$hash"))))');
 EOF
 
 $here/../../components/sqldb/pgsql <$tmp/sqldb/load-authn.sql

Modified: tuscany/sca-cpp/trunk/hosting/server/pictures.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/pictures.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/pictures.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/pictures.py Mon Aug 26 05:18:10 2013
@@ -16,32 +16,16 @@
 #  under the License.
 
 # Pictures collection implementation
-from StringIO import StringIO
-try:
-    from PIL import Image
-except:
-    Image = None
-from base64 import b64encode, b64decode
 from urllib import urlopen
 from util import *
 from atomutil import *
+from imgutil import *
 from sys import debug
 
 # Convert a particular user id to a picture id
 def pictureid(id):
     return ('accounts', id, 'user.picture')
 
-# Convert image to a 50x50 PNG image
-def to50x50png(url):
-    debug('pictures.py::to50x50png::url', url)
-    if Image is None:
-        return url
-    img = Image.open(StringIO(b64decode(url.split(',')[1])) if url.startswith('data:') else StringIO(urlopen(url).read()))
-    t = img.resize((50, 50))
-    obuf = StringIO()
-    t.save(obuf, 'PNG')
-    return 'data:image/png;base64,' + b64encode(obuf.getvalue()).replace('\n', '')
-
 # Update the user's picture
 def put(id, picture, user, cache):
     debug('pictures.py::put::id', id)
@@ -57,7 +41,7 @@ def put(id, picture, user, cache):
     # Get image and token from input picture
     def image(c):
         img = assoc("'image", c)
-        return None if isNull(img) else to50x50png(cadr(img))
+        return None if isNull(img) else urlto50x50jpeg(cadr(img))
     def token(c):
         tok = assoc("'token", c)
         return None if isNull(tok) else cadr(tok)

Added: tuscany/sca-cpp/trunk/hosting/server/put-account
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/put-account?rev=1517420&view=auto
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/put-account (added)
+++ tuscany/sca-cpp/trunk/hosting/server/put-account Mon Aug 26 05:18:10 2013
@@ -0,0 +1,72 @@
+#!/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=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
+mkdir -p $1/conf
+root=`echo "import os; print os.path.realpath('$1')" | python`
+admin=$2
+apass=$3
+user=$4
+email=$5
+host=$6
+
+httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
+
+if [ "$host" = "" ]; then
+    conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
+    sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
+    if [ "$sslconf" = "" ]; then
+        scheme="http"
+        addr=`echo $conf | awk '{ print $7 }'`
+        host=`$here/../../modules/http/httpd-addr ip $addr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $addr`
+    else
+        scheme="https"
+        ssladdr=`echo $sslconf | awk '{ print $6 }'`
+        host=`$here/../../modules/http/httpd-addr ip $ssladdr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $ssladdr`
+    fi
+else
+    scheme="https"
+    port="443"
+fi
+
+# Put user account
+cat >$root/conf/account.entry <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<entry xmlns="http://www.w3.org/2005/Atom">
+ <title type="text"></title>
+ <id>$user</id>
+ <content type="application/xml">
+  <account>
+   <email>$email</email>
+   <description></description>
+  </account>
+ </content>
+</entry>
+EOF
+curl -k -L -u $admin:$apass -X PUT -H "X-Forwarded-Server: $host" --data-binary @$root/conf/account.entry $scheme://$host:$port/c/Accounts/$user
+rm $root/conf/account.entry
+

Propchange: tuscany/sca-cpp/trunk/hosting/server/put-account
------------------------------------------------------------------------------
    svn:executable = *

Modified: tuscany/sca-cpp/trunk/hosting/server/put-auth
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/put-auth?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/put-auth (original)
+++ tuscany/sca-cpp/trunk/hosting/server/put-auth Mon Aug 26 05:18:10 2013
@@ -18,60 +18,63 @@
 #  under the License.
 
 here=`echo "import os; print os.path.realpath('$0')" | python`; here=`dirname $here`
-mkdir -p $1
+mkdir -p $1/conf
 root=`echo "import os; print os.path.realpath('$1')" | python`
 admin=$2
 apass=$3
-user=$4
-upass=$5
+email=$4
+user=$5
+upass=$6
+host=$7
 
 httpd_prefix=`cat $here/../../modules/http/httpd.prefix`
 
-conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
-sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
-if [ "$sslconf" = "" ]; then
-    scheme="http"
-    addr=`echo $conf | awk '{ print $7 }'`
-    host=`$here/../../modules/http/httpd-addr ip $addr`
-    if [ "$host" = "" ]; then
-        host="localhost"
+if [ "$host" = "" ]; then
+    conf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-conf"`
+    sslconf=`cat $root/conf/httpd.conf | grep "# Generated by: httpd-ssl-conf"`
+    if [ "$sslconf" = "" ]; then
+        scheme="http"
+        addr=`echo $conf | awk '{ print $7 }'`
+        host=`$here/../../modules/http/httpd-addr ip $addr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $addr`
+    else
+        scheme="https"
+        ssladdr=`echo $sslconf | awk '{ print $6 }'`
+        host=`$here/../../modules/http/httpd-addr ip $ssladdr`
+        if [ "$host" = "" ]; then
+            host="localhost"
+        fi
+        port=`$here/../../modules/http/httpd-addr port $ssladdr`
     fi
-    port=`$here/../../modules/http/httpd-addr port $addr`
 else
     scheme="https"
-    ssladdr=`echo $sslconf | awk '{ print $6 }'`
-    host=`$here/../../modules/http/httpd-addr ip $ssladdr`
-    if [ "$host" = "" ]; then
-        host="localhost"
-    fi
-    port=`$here/../../modules/http/httpd-addr port $ssladdr`
+    port="443"
 fi
 
 # Get password hash
 rm -f $root/conf/auth.passwd
 touch $root/conf/auth.passwd
-$httpd_prefix/bin/htpasswd -b $root/conf/auth.passwd "$user" "$upass" 2>/dev/null
+$httpd_prefix/bin/htpasswd -b $root/conf/auth.passwd "$email" "$upass" 2>/dev/null
 hash=`cat $root/conf/auth.passwd | awk -F ":" '{ print $2 }'`
 rm -f $root/conf/auth.passwd
 
-# Compute user id
-slash=`echo $user | grep "/"`
-if [ "$slash" = "" ]; then
-    id="\"$user\""
-    upath=$user
-else
-    id=`echo $user | awk -F "/" '{ printf "\"%s\" \"%s\"", $2, $3 }'`
-    upath=`echo $user | awk -F "/" '{ printf "%s/%s", $2, $3 }'`
-fi
+# Compute user URI
+upath=$email
 
 # Put user auth
 cat >$root/conf/auth.entry <<EOF
 <?xml version="1.0" encoding="UTF-8"?>
 <entry xmlns="http://www.w3.org/2005/Atom">
- <title type="text">$user</title>
- <id>$user</id>
+ <title type="text">$email</title>
+ <id>$email</id>
  <content type="application/xml">
-  <hash>$hash</hash>
+  <authn>
+   <user>$user</user>
+   <hash>$hash</hash>
+  </authn>
  </content>
 </entry>
 EOF

Modified: tuscany/sca-cpp/trunk/hosting/server/ratings.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/ratings.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/ratings.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/ratings.py Mon Aug 26 05:18:10 2013
@@ -108,12 +108,12 @@ def get(id, user, cache, db, apps):
 
     # Return the top ratings
     if isNull(id):
-        topentries = db.get((("'regex", '("ratings" .* "app.ratings")'), ("'rank", "(regexp_matches(value, '(.*\(rating )([^\)]+)(\).*)'))[2]::float"), ("'limit", 25)))
-        flatentries = tuple(map(lambda v: car(v), () if isNull(topentries) else topentries))
-        def sortkey(e):
-            return cadr(assoc("'rating", assoc("'ratings", assoc("'content", e))))
-        sortedentries = tuple(sorted(flatentries, key = sortkey, reverse = True))[0:25]
-        topratings = ((("'feed", ("'title", "Ratings"), ("'id", 'ratings')) + sortedentries),)
+        topentries = db.get((("'regex", '("ratings" .* "app.ratings")'), ("'rank", "(regexp_matches(value, '(.*\\(rating )([^\\)]+)(\\).*)'))[2]::float"), ("'limit", 50)))
+        entries = tuple(map(lambda v: car(v), () if isNull(topentries) else topentries))
+        #def sortkey(e):
+        #    return cadr(assoc("'rating", assoc("'ratings", assoc("'content", e))))
+        #sortedentries = tuple(sorted(entries, key = sortkey, reverse = True))
+        topratings = ((("'feed", ("'title", "Ratings"), ("'id", 'ratings')) + entries),)
         debug('ratings.py::get::topratings', topratings)
         return topratings
 

Modified: tuscany/sca-cpp/trunk/hosting/server/search.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/search.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/search.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/search.py Mon Aug 26 05:18:10 2013
@@ -45,7 +45,7 @@ def get(id, user, cache, db, apps, ratin
         return None
 
     # Run the search
-    foundentries = db.get((("'regex", '("apps" .* "app.info")'), ("'textsearch", cadr(q)), ("'limit", 25)))
+    foundentries = db.get((("'regex", '("apps" .* "app.info")'), ("'textsearch", cadr(q)), ("'limit", 50)))
     debug('search.py::get::foundentries', foundentries)
 
     # Merge app ratings

Modified: tuscany/sca-cpp/trunk/hosting/server/ssl-proxy-start
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/ssl-proxy-start?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/ssl-proxy-start (original)
+++ tuscany/sca-cpp/trunk/hosting/server/ssl-proxy-start Mon Aug 26 05:18:10 2013
@@ -173,12 +173,9 @@ EOF
 sleep 2
 
 # Configure authorized users
-./put-auth tmp admin admin admin admin
-./put-auth tmp admin admin john john
-./put-auth tmp admin admin jane jane
-# Configure the email addresses associated with your OAuth ids here
-./put-auth tmp admin admin /oauth1/john@example.com password
-./put-auth tmp admin admin /oauth2/jane@example.com password
+./put-auth tmp admin admin admin@example.com admin admin
+./put-auth tmp admin admin john@example.com john john
+./put-auth tmp admin admin jane@example.com jane jane
 
 # Clear document cache
 rm -rf tmp/proxy/cache

Modified: tuscany/sca-cpp/trunk/hosting/server/ssl-start
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/ssl-start?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/ssl-start (original)
+++ tuscany/sca-cpp/trunk/hosting/server/ssl-start Mon Aug 26 05:18:10 2013
@@ -209,10 +209,7 @@ EOF
 sleep 2
 
 # Configure authorized users
-./put-auth tmp admin admin admin admin
-./put-auth tmp admin admin john john
-./put-auth tmp admin admin jane jane
-# Configure the email addresses associated with your OAuth ids here
-./put-auth tmp admin admin /oauth1/john@example.com password
-./put-auth tmp admin admin /oauth2/jane@example.com password
+./put-auth tmp admin admin admin@example.com admin admin
+./put-auth tmp admin admin john@example.com john john
+./put-auth tmp admin admin jane@example.com jane jane
 

Modified: tuscany/sca-cpp/trunk/hosting/server/test.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/test.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/test.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/test.py Mon Aug 26 05:18:10 2013
@@ -51,7 +51,7 @@ import search
 
 def testUser():
     # Return current user
-    assert user.get((), mkprop('user', lambda: 'johndoe'), mkprop('email', lambda: 'jdoe@example.com'), mkprop('nick', lambda: 'jdoe'), mkprop('full', lambda: 'john doe'), mkprop('first', lambda: 'john'), mkprop('last', lambda: 'doe'), mkprop('realm', lambda: 'example.com'), mkprop('host', lambda: 'localhost')) == 'jdoe@example.com'
+    assert user.get((), mkprop('user', lambda: 'jdoe'), mkprop('email', lambda: 'jdoe@example.com'), mkprop('nick', lambda: 'jdoe'), mkprop('full', lambda: 'john doe'), mkprop('first', lambda: 'john'), mkprop('last', lambda: 'doe'), mkprop('realm', lambda: 'example.com'), mkprop('host', lambda: 'localhost')) == 'jdoe'
     return True
 
 def testAccounts():
@@ -60,20 +60,24 @@ def testAccounts():
     assert accounts.get((), mkref('user', lambda id: 'jdoe@example.com'), mkcache('cache', {})) == defaccount
 
     # Get user's account
-    jdoe = (("'entry", ("'title", 'John Doe'), ("'id", 'jdoe@example.com'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'key", 'value'))),)
+    jdoe = (("'entry", ("'title", 'John Doe'), ("'id", 'jdoe@example.com'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'account", ("'email", 'jdoe@example.com'), ("'description", 'This is joe')))),)
     assert accounts.get((), mkref('user', lambda id: 'jdoe@example.com'), mkcache('cache', {('accounts', 'jdoe@example.com', 'user.account') : jdoe})) == jdoe
 
     # Put and get account
-    cache1 = mkcache('cache', {})
-    assert accounts.put((), jdoe, mkref('user', lambda id: 'jdoe@example.com'), cache1) == True
+    cache1 = mkcache('cache', {('accounts', 'jdoe@example.com', 'user.account') : jdoe})
+    jdoe1 = (("'entry", ("'title", 'John Doe'), ("'id", 'jdoe@example.com'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'account", ("'email", 'bad@example.com'), ("'description", 'This is joe')))),)
+    jdoe2 = (("'entry", ("'title", 'John Doe'), ("'id", 'jdoe@example.com'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'account", ("'email", 'jdoe@example.com'), ("'description", 'This is joe again')))),)
+    assert accounts.put((), jdoe1, mkref('user', lambda id: 'jdoe@example.com'), cache1) == True
     assert accounts.get((), mkref('user', lambda id: 'jdoe@example.com'), cache1) == jdoe
+    assert accounts.put((), jdoe2, mkref('user', lambda id: 'jdoe@example.com'), cache1) == True
+    assert accounts.get((), mkref('user', lambda id: 'jdoe@example.com'), cache1) == jdoe2
     return True
 
 def testPictures():
     if PIL is None:
         return True
-    img16 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOUlEQVQ4y2N0b3/7nwEH2FkpzGg7hQGn/OEcBkYmBgrBqAFUMIBiQDCeL3qY4ZTX33FqNB0Mj3QAAFC7Dhs7i7zzAAAAAElFTkSuQmCC'
-    img50 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAg0lEQVR4nO3YsRVFUBAG4Xu1oBCZTEwxGlDBa0AxxDKZQtRARAfrzWG+aLP/TLq5/e1HCjAPZb7uZkwhG0uf7o0iYuAfDKExhMYQGkNoDKExhMYQGkNoDKExRPqI/MTzbOvqkI1qWn3QYRlCYwiNITSG0BhCYwiNITSG0BhC85oQKcgJzukOV+8REuQAAAAASUVORK5CYII='
+    img16 = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOUlEQVQ4y2N0b3/7nwEH2FkpzGg7hQGn/OEcBkYmBgrBqAFUMIBiQDCeL3qY4ZTX33FqNB0Mj3QAAFC7Dhs7i7zzAAAAAElFTkSuQmCC'
+    img50 = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACV0lEQVR4nO2YPU8UURSG3zMzO2wiIrguXwmthSEkJtBZmFgYG6n5Rf4VKmlILIw/YIstNgoVJhICy8zuyrIzy97vY6F8aH2LG3Of8hbnzZOZM5P70tsPI4ZHjKyr8ujwoN/7uD86+fK5tYXd9jb2WlvYpQSZjwwrUA17OBh0sX91jE8AkPgYHAJRJDSiSGhEkdCIIqERRUIjioRGFAmNKBIaUSQ0MiPryudAK+vaGSHYWQMA7GCcxsxKVESe7uwStdMQ7GBuz7Ly6PDAx/C7ECPF5LzXVXVZgMFqjPPqBzpsoUFIfWSwhqjP0NUTFLdn9Oz5m3c+ht+FOGtUXRayKvrqZjTMH2MlX8BaYwHL8PUqOxg1QaEm6OsaAwAgXxXNPzAzHBhMABFRQgB5DQCYmR0DDABZawu7XgMcjBzjQo1xpico2s18fbWZb7TnGutE5EXGOjalVBeXQp2NpL4EgKy9jT0fw29xCrPqFJ3r7zCmosFqM994uTj/anNxfieBnx0Rzs2+jacd6ypzJ+L7iViBylnoWYkTAVC7ma9vPnm083p58X1K5OU1nhpbWcf69Eac4M83N/O9I5QgowQp6PdOEEAJUZoSZb5EUqIsIUof7t1/80OMIqERRUIjioRGFAmNKBIaUSQ0okhoRJHQyKyA54Lu7/LMMhvp3GxqbOXrhnhjbS2dE5b5vqAb9uC1oHtYnjHApVDnX8fTjmHWCchL+SCdE8fX0+5I6fuCbukFvBZ0D8szU2P4dK6x0p5rrLXyhreCzjLMT6WLgVT9K2UGPmZGfPMLWsI5A943r6EAAAAASUVORK5CYII='
 
     # Put and get picture
     pic16 = (("'entry", ("'title", 'jdoe@example.com'), ("'id", 'jdoe@example.com'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'picture", ("'image", img16)))),)
@@ -120,8 +124,8 @@ def testPages():
 def testIcons():
     if PIL is None:
         return True
-    img16 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOUlEQVQ4y2N0b3/7nwEH2FkpzGg7hQGn/OEcBkYmBgrBqAFUMIBiQDCeL3qY4ZTX33FqNB0Mj3QAAFC7Dhs7i7zzAAAAAElFTkSuQmCC'
-    img50 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAg0lEQVR4nO3YsRVFUBAG4Xu1oBCZTEwxGlDBa0AxxDKZQtRARAfrzWG+aLP/TLq5/e1HCjAPZb7uZkwhG0uf7o0iYuAfDKExhMYQGkNoDKExhMYQGkNoDKExRPqI/MTzbOvqkI1qWn3QYRlCYwiNITSG0BhCYwiNITSG0BhC85oQKcgJzukOV+8REuQAAAAASUVORK5CYII='
+    img16 = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOUlEQVQ4y2N0b3/7nwEH2FkpzGg7hQGn/OEcBkYmBgrBqAFUMIBiQDCeL3qY4ZTX33FqNB0Mj3QAAFC7Dhs7i7zzAAAAAElFTkSuQmCC'
+    img50 = 'data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAACV0lEQVR4nO2YPU8UURSG3zMzO2wiIrguXwmthSEkJtBZmFgYG6n5Rf4VKmlILIw/YIstNgoVJhICy8zuyrIzy97vY6F8aH2LG3Of8hbnzZOZM5P70tsPI4ZHjKyr8ujwoN/7uD86+fK5tYXd9jb2WlvYpQSZjwwrUA17OBh0sX91jE8AkPgYHAJRJDSiSGhEkdCIIqERRUIjioRGFAmNKBIaUSQ0MiPryudAK+vaGSHYWQMA7GCcxsxKVESe7uwStdMQ7GBuz7Ly6PDAx/C7ECPF5LzXVXVZgMFqjPPqBzpsoUFIfWSwhqjP0NUTFLdn9Oz5m3c+ht+FOGtUXRayKvrqZjTMH2MlX8BaYwHL8PUqOxg1QaEm6OsaAwAgXxXNPzAzHBhMABFRQgB5DQCYmR0DDABZawu7XgMcjBzjQo1xpico2s18fbWZb7TnGutE5EXGOjalVBeXQp2NpL4EgKy9jT0fw29xCrPqFJ3r7zCmosFqM994uTj/anNxfieBnx0Rzs2+jacd6ypzJ+L7iViBylnoWYkTAVC7ma9vPnm083p58X1K5OU1nhpbWcf69Eac4M83N/O9I5QgowQp6PdOEEAJUZoSZb5EUqIsIUof7t1/80OMIqERRUIjioRGFAmNKBIaUSQ0okhoRJHQyKyA54Lu7/LMMhvp3GxqbOXrhnhjbS2dE5b5vqAb9uC1oHtYnjHApVDnX8fTjmHWCchL+SCdE8fX0+5I6fuCbukFvBZ0D8szU2P4dK6x0p5rrLXyhreCzjLMT6WLgVT9K2UGPmZGfPMLWsI5A943r6EAAAAASUVORK5CYII='
 
     # Get default icon
     deficon = (("'entry", ("'title", 'app1'), ("'id", 'app1'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content",)),)
@@ -137,6 +141,7 @@ def testIcons():
     # Put and get a icon
     cache1 = mkcache('cache', {})
     icon1updated = (("'entry", ("'title", 'app1'), ("'id", 'app1'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'icon", ("'image", img50)))),)
+
     assert icons.put(('app1',), icon1, mkref('user', lambda id: 'jdoe@example.com'), cache1, mkref('apps', lambda id, app = None: app1 if app is None else True)) == True
     assert icons.get(('app1',), mkref('user', lambda id: 'jdoe@example.com'), cache1, mkref('apps', lambda id: app1)) == icon1updated
     
@@ -153,8 +158,10 @@ def testIcons():
 
     # Put an upload token in an icon 
     icon1token = (("'entry", ("'title", 'app1'), ("'id", 'app1'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'icon", ("'token", '1234')))),)
+
     assert icons.put(('app1',), icon1token, mkref('user', lambda id: 'jdoe@example.com'), cache1, mkref('apps', lambda id: app1)) == True
     assert icons.get(('app1',), mkref('user', lambda id: 'another@example.com'), cache1, mkref('apps', lambda id: app1)) == icon1updated
+
     icon1updatedwithtoken = (("'entry", ("'title", 'app1'), ("'id", 'app1'), ("'author", 'jdoe@example.com'), ("'updated", '2012-01-01T00:00:00+00:00'), ("'content", ("'icon", ("'image", img50), ("'token", '1234')))),)
     assert icons.get(('app1',), mkref('user', lambda id: 'jdoe@example.com'), cache1, mkref('apps', lambda id: app1)) == icon1updatedwithtoken
 

Modified: tuscany/sca-cpp/trunk/hosting/server/user.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/user.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/user.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/user.py Mon Aug 26 05:18:10 2013
@@ -19,8 +19,6 @@
 
 # Return the current user id
 def get(i, user, email, nick, full, first, last, realm, host):
-    if email.eval() != '?':
-        return email.eval()
     if user.eval() != '?':
         return user.eval()
     return 'anonymous'

Modified: tuscany/sca-cpp/trunk/hosting/server/util.py
URL: http://svn.apache.org/viewvc/tuscany/sca-cpp/trunk/hosting/server/util.py?rev=1517420&r1=1517419&r2=1517420&view=diff
==============================================================================
--- tuscany/sca-cpp/trunk/hosting/server/util.py (original)
+++ tuscany/sca-cpp/trunk/hosting/server/util.py Mon Aug 26 05:18:10 2013
@@ -132,7 +132,8 @@ def cons_stream(car, cdr):
 def assoc(k, l):
     if l == ():
         return ()
-    if k == car(car(l)):
+    a = car(l)
+    if isTaggedList(a, k):
         return car(l)
     return assoc(k, cdr(l))
 



Mime
View raw message