示例#1
0
 def _recipe_list(self, tiddlers, recipe_name):
     representation_link = '%s/recipes/%s/tiddlers' % (
             self._server_prefix(), encode_name(recipe_name))
     representations = self._tiddler_list_header(representation_link)
     user_object = get_user_object(self.environ)
     recipe = self.environ['tiddlyweb.store'].get(Recipe(recipe_name))
     publicity = ''
     try:
         recipe.policy.allows(user_object, 'manage')
         policy = recipe.policy
         if policy.read == [user_object['name']]:
             publicity = 'private'
         elif policy.read == []:
             publicity = 'public'
         else:
             publicity = 'custom'
         delete = True
     except (UserRequiredError, ForbiddenError):
         policy = None
         delete = False
     data = {'title': 'TiddlyHoster Recipe %s' % recipe.name,
             'policy': policy,
             'publicity': publicity,
             'delete': delete,
             'recipe': recipe,
             'tiddlers': tiddlers,
             'representations': representations}
     del self.environ['tiddlyweb.title']
     return send_template(self.environ, 'recipelist.html', data)
示例#2
0
def post_createbag(environ, start_response):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    bag_name = environ["tiddlyweb.query"].get("bag", [""])[0]
    publicity = environ["tiddlyweb.query"].get("publicity", [""])[0]
    description = environ["tiddlyweb.query"].get("description", [""])[0]

    if not bag_name:
        raise HTTP400("missing data")

    bag = Bag(bag_name)

    try:
        bag = store.get(bag)
        raise HTTP400("bag exists")
    except NoBagError:
        pass
    if publicity == "public":
        bag = ensure_public_bag(store, user["name"], desc=description, name=bag_name)
    elif publicity == "protected":
        bag = ensure_protected_bag(store, user["name"], desc=description, name=bag_name)
    else:
        bag = ensure_private_bag(store, user["name"], desc=description, name=bag_name)

    # the bag has already been stored

    raise HTTP303("%s/tiddlers" % bag_url(environ, bag))
示例#3
0
    def list_tiddlers(self, bag):
        """
        If the URL is a list of bag tiddlers, we present a bag
        editing interface. Otherwise we use the parent serialization.
        """
        if (self.environ['wsgiorg.routing_args'][1].get('tiddler_name')):
            return HTMLSerialization.list_tiddlers(self, bag)

        try:
            name = self.environ['wsgiorg.routing_args'][1]['bag_name']
        except KeyError: # not a bag link
            return HTMLSerialization.list_tiddlers(self, bag)

        representation_link = '%s/bags/%s/tiddlers' % (
                self._server_prefix(), encode_name(bag.name))
        representations = self._tiddler_list_header(representation_link)
        user_object = get_user_object(self.environ)
        publicity = ''
        try:
            bag.policy.allows(user_object, 'manage')
            policy = bag.policy
            publicity = determine_publicity(user_object, policy)
        except (UserRequiredError, ForbiddenError):
            policy = None
        try:
            bag.policy.allows(user_object, 'delete')
            delete = True
        except (UserRequiredError, ForbiddenError):
            delete = False
        data = {'title': 'TiddlyHoster Bag %s' % bag.name, 'policy': policy,
                'publicity': publicity, 'delete': delete,
                'bag': bag, 'representations': representations}
        del self.environ['tiddlyweb.title']
        return send_template(self.environ, 'baglist.html', data)
示例#4
0
def send_template(environ, template_name, template_data=None):
    if template_data == None:
        template_data = {}
    template = get_template(environ, template_name)
    server_prefix = environ['tiddlyweb.config']['server_prefix']
    user = get_user_object(environ)
    template_defaults = {
            #'message': 'test me you are a message',
            'version': VERSION,
            'user': user,
            'member_role': 'MEMBER',
            'title': 'TiddlyHoster',
            'userpage': {
                'link': '%s/home' % server_prefix,
                'title': 'homepage',
                },
            'login': {
                'link': '%s/challenge' % server_prefix,
                'title': 'Login',
                },
            'help': {
                'link': '%s/help' % server_prefix,
                'title': 'Help',
                },
            'register': {
                'link': '%s/register' % server_prefix,
                'title': 'Register',
                },
            'server_prefix': server_prefix,
            'main_css': environ['tiddlyweb.config'].get(
                'hoster.main_css', 'main.css'),
            }
    template_defaults.update(template_data)
    return template.generate(template_defaults)
示例#5
0
def post_createbag(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    bag_name = environ['tiddlyweb.query'].get('bag', [''])[0]
    publicity = environ['tiddlyweb.query'].get('publicity', [''])[0]
    description = environ['tiddlyweb.query'].get('description', [''])[0]

    if not bag_name:
        raise HTTP400('missing data')

    bag = Bag(bag_name)

    try:
        bag = store.get(bag)
        raise HTTP400('bag exists')
    except NoBagError:
        pass
    if publicity == 'public':
        bag = ensure_public_bag(
                store, user['name'], desc=description, name=bag_name)
    elif publicity == 'protected':
        bag = ensure_protected_bag(
                store, user['name'], desc=description, name=bag_name)
    else:
        bag = ensure_private_bag(
                store, user['name'], desc=description, name=bag_name)

    # the bag has already been stored

    raise HTTP303('%s/tiddlers' % bag_url(environ, bag))
示例#6
0
 def _recipe_list(self, tiddlers, recipe_name):
     representation_link = '%s/recipes/%s/tiddlers' % (
         self._server_prefix(), encode_name(recipe_name))
     representations = self._tiddler_list_header(representation_link)
     user_object = get_user_object(self.environ)
     recipe = self.environ['tiddlyweb.store'].get(Recipe(recipe_name))
     publicity = ''
     try:
         recipe.policy.allows(user_object, 'manage')
         policy = recipe.policy
         if policy.read == [user_object['name']]:
             publicity = 'private'
         elif policy.read == []:
             publicity = 'public'
         else:
             publicity = 'custom'
         delete = True
     except (UserRequiredError, ForbiddenError):
         policy = None
         delete = False
     data = {
         'title': 'TiddlyHoster Recipe %s' % recipe.name,
         'policy': policy,
         'publicity': publicity,
         'delete': delete,
         'recipe': recipe,
         'tiddlers': tiddlers,
         'representations': representations
     }
     del self.environ['tiddlyweb.title']
     return send_template(self.environ, 'recipelist.html', data)
示例#7
0
def send_template(environ, template_name, template_data=None):
    if template_data is None:
        template_data = {}
    template = get_template(environ, template_name)
    server_prefix = environ['tiddlyweb.config']['server_prefix']
    user = get_user_object(environ)
    template_defaults = {
        #'message': 'test me you are a message',
        'version': VERSION,
        'user': user,
        'member_role': 'MEMBER',
        'title': '',
        'userpage': {
            'link': '%s/home' % server_prefix,
            'title': 'homepage',
        },
        'login': {
            'link': '%s/login' % server_prefix,
            'title': 'Login',
        },
        'help': {
            'link': '%s/help' % server_prefix,
            'title': 'Help',
        },
        'register': {
            'link': '%s/register' % server_prefix,
            'title': 'Register',
        },
        'server_prefix': server_prefix,
        'main_css': environ['tiddlyweb.config'].get('hoster.main_css',
                                                    'main.css'),
    }
    template_defaults.update(template_data)
    return template.generate(template_defaults)
示例#8
0
 def _bag_list(self, tiddlers):
     if '/feedbag' in self.environ['selector.matches'][0]:
         representation_link = '%s/feedbag' % (self._server_prefix())
         bag = Bag('feedbag')
         bag.policy.manage = ["NONE"]
         bag.policy.delete = ["NONE"]
         bag.desc = 'Recent Public Stuff'
     else:
         name = self.environ['wsgiorg.routing_args'][1]['bag_name']
         name = urllib.unquote(name)
         name = name.decode('utf-8')
         representation_link = '%s/bags/%s/tiddlers' % (
                 self._server_prefix(), encode_name(name))
         bag = self.environ['tiddlyweb.store'].get(Bag(name))
     representations = self._tiddler_list_header(representation_link)
     user_object = get_user_object(self.environ)
     publicity = ''
     try:
         bag.policy.allows(user_object, 'manage')
         policy = bag.policy
         publicity = determine_publicity(user_object, policy)
     except (UserRequiredError, ForbiddenError):
         policy = None
     try:
         bag.policy.allows(user_object, 'delete')
         delete = True
     except (UserRequiredError, ForbiddenError):
         delete = False
     data = {'title': 'TiddlyHoster Bag %s' % bag.name, 'policy': policy,
             'publicity': publicity, 'delete': delete,
             'bag': bag, 'tiddlers': tiddlers, 'representations': representations}
     del self.environ['tiddlyweb.title']
     return send_template(self.environ, 'baglist.html', data)
示例#9
0
def user_page(environ, start_response):
    userpage = environ['wsgiorg.routing_args'][1]['userpage']
    user = environ['tiddlyweb.usersign']

    userpage = _decode_name(userpage)

    first_time_check(environ, user)

    store = environ['tiddlyweb.store']

    # If we try to go to a user page that doesn't exist,
    # just go to the home page. XXX maybe should 404 instead.
    try:
        userpage_user = User(userpage)
        userpage_user = store.get(userpage_user)
    except NoUserError:
        pass  # roles will be empty
    if 'MEMBER' not in userpage_user.list_roles():
        raise HTTP404('%s has no page' % userpage)

    user_friend_names = get_friends(store, user['name'])
    friend_names = sorted(get_friends(store, userpage))
    friends = []
    for name in friend_names:
        email = get_email_tiddler(store, name)
        email_md5 = md5(email.lower()).hexdigest()
        friends.append((name, email_md5))

    profile_tiddler = get_profile(store, user, userpage)
    profile_html = render_wikitext(profile_tiddler, environ)
    notice_tiddler = get_notice(environ)
    notice_html = render_wikitext(notice_tiddler, environ)
    kept_recipes = get_stuff(store, store.list_recipes(), user, userpage)
    kept_bags = get_stuff(store, store.list_bags(), user, userpage)
    kept_favorites = get_stuff(store, get_favorited_bags(store, userpage),
                               user)
    kept_bookmarks = get_stuff(store, get_bookmarked_recipes(store, userpage),
                               user)
    email = get_email_tiddler(store, userpage)
    email_md5 = md5(email.lower()).hexdigest()
    data = {
        'bags': kept_bags,
        'user_friends': user_friend_names,
        'friends': friends,
        'recipes': kept_recipes,
        'favorites': kept_favorites,
        'bookmarks': kept_bookmarks,
        'home': userpage,
        'profile': profile_html,
        'notice': {
            'html': notice_html,
            'modified': notice_tiddler.modified
        },
        'title': userpage,
        'email': email,
        'email_md5': email_md5,
        'user': get_user_object(environ)
    }

    return send_template(environ, 'profile.html', data)
示例#10
0
def add_email(environ, start_response):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    ensure_user_bag(store, user["name"])
    tiddler = Tiddler("email", user["name"])
    email = environ["tiddlyweb.query"].get("email", [""])[0]
    tiddler.text = email
    store.put(tiddler)
    raise HTTP303("%s/home" % server_base_url(environ))
示例#11
0
def add_email(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    tiddler = Tiddler('email', user['name'])
    email = environ['tiddlyweb.query'].get('email', [''])[0]
    tiddler.text = email
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#12
0
def user_page(environ, start_response):
    userpage = environ['wsgiorg.routing_args'][1]['userpage']
    user = environ['tiddlyweb.usersign']

    userpage = _decode_name(userpage)

    first_time_check(environ, user)

    store = environ['tiddlyweb.store']

    # If we try to go to a user page that doesn't exist,
    # just go to the home page. XXX maybe should 404 instead.
    try:
        userpage_user = User(userpage)
        userpage_user = store.get(userpage_user)
    except NoUserError:
        pass # roles will be empty
    if 'MEMBER' not in userpage_user.list_roles():
        raise HTTP404('%s has no page' % userpage)

    user_friend_names = get_friends(store, user['name'])
    friend_names = sorted(get_friends(store, userpage))
    friends = []
    for name in friend_names:
        email = get_email_tiddler(store, name)
        email_md5 = md5(email.lower()).hexdigest()
        friends.append((name, email_md5))

    profile_tiddler = get_profile(store, user, userpage)
    profile_html = render_wikitext(profile_tiddler, environ)
    notice_tiddler = get_notice(environ)
    notice_html = render_wikitext(notice_tiddler, environ)
    kept_recipes = get_stuff(store, store.list_recipes(), user, userpage)
    kept_bags = get_stuff(store, store.list_bags(), user, userpage)
    kept_favorites = get_stuff(store, get_favorited_bags(store, userpage),
            user)
    kept_bookmarks = get_stuff(store, get_bookmarked_recipes(store, userpage),
            user)
    email = get_email_tiddler(store, userpage)
    email_md5 = md5(email.lower()).hexdigest()
    data = {'bags': kept_bags,
            'user_friends': user_friend_names,
            'friends': friends,
            'recipes': kept_recipes,
            'favorites': kept_favorites,
            'bookmarks': kept_bookmarks,
            'home': userpage,
            'profile': profile_html,
            'notice': {'html': notice_html,
                'modified': notice_tiddler.modified},
            'title': userpage,
            'email': email,
            'email_md5': email_md5,
            'user': get_user_object(environ)}

    return send_template(environ, 'profile.html', data)
示例#13
0
def add_email(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    tiddler = Tiddler('email', user['name'])
    email = environ['tiddlyweb.query'].get('email', [''])[0]
    tiddler.text = email
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#14
0
def user_page(environ, start_response):
    userpage = environ["wsgiorg.routing_args"][1]["userpage"]
    user = environ["tiddlyweb.usersign"]

    userpage = _decode_name(userpage)

    first_time_check(environ, user)

    store = environ["tiddlyweb.store"]

    # If we try to go to a user page that doesn't exist,
    # just go to the home page. XXX maybe should 404 instead.
    try:
        userpage_user = User(userpage)
        userpage_user = store.get(userpage_user)
    except NoUserError:
        pass  # roles will be empty
    if "MEMBER" not in userpage_user.list_roles():
        raise HTTP404("%s has no page" % userpage)

    user_friend_names = get_friends(store, user["name"])
    friend_names = sorted(get_friends(store, userpage))
    friends = []
    for name in friend_names:
        email = get_email_tiddler(store, name)
        email_md5 = md5(email.lower()).hexdigest()
        friends.append((name, email_md5))

    profile_tiddler = get_profile(store, user, userpage)
    profile_html = render_wikitext(profile_tiddler, environ)
    notice_tiddler = get_notice(environ)
    notice_html = render_wikitext(notice_tiddler, environ)
    kept_recipes = get_stuff(store, store.list_recipes(), user, userpage)
    kept_bags = get_stuff(store, store.list_bags(), user, userpage)
    kept_favorites = get_stuff(store, get_favorited_bags(store, userpage), user)
    kept_bookmarks = get_stuff(store, get_bookmarked_recipes(store, userpage), user)
    email = get_email_tiddler(store, userpage)
    email_md5 = md5(email.lower()).hexdigest()
    data = {
        "bags": kept_bags,
        "user_friends": user_friend_names,
        "friends": friends,
        "recipes": kept_recipes,
        "favorites": kept_favorites,
        "bookmarks": kept_bookmarks,
        "home": userpage,
        "profile": profile_html,
        "notice": {"html": notice_html, "modified": notice_tiddler.modified},
        "title": userpage,
        "email": email,
        "email_md5": email_md5,
        "user": get_user_object(environ),
    }

    return send_template(environ, "profile.html", data)
示例#15
0
def add_friend(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_friend = environ['tiddlyweb.query'].get('name', [''])[0]
    friends = get_friends(store, user['name'])
    if new_friend and new_friend not in friends:
        friends.append(new_friend)
    tiddler = store.get(Tiddler('friends', user['name']))
    tiddler.text = '\n'.join(friends)
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#16
0
def bag_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_favorite = environ['tiddlyweb.query'].get('bag', [''])[0]
    favorites = get_favorites(store, user['name'])
    # XXX I suppose a set would be okay here.
    if new_favorite and new_favorite not in favorites:
        favorites.append(new_favorite)
    tiddler = store.get(Tiddler('favorites', user['name']))
    tiddler.text = '\n'.join(favorites)
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#17
0
def public_stuff(environ, start_response):
    """
    A collection of the most recent stuff.
    A place where _all_ the content readable
    by the current user can be viewed.
    """
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    kept_bags = get_stuff(store, store.list_bags(), user)
    tiddlers = Tiddlers()
    for bag in kept_bags:
        bag = store.get(bag)
        for tiddler in store.list_bag_tiddlers(bag):
            tiddlers.add(tiddler)
    return send_tiddlers(environ, start_response, tiddlers=tiddlers)
示例#18
0
def public_stuff(environ, start_response):
    """
    A collection of the most recent stuff.
    A place where _all_ the content readable
    by the current user can be viewed.
    """
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    kept_bags = get_stuff(store, store.list_bags(), user)
    tiddlers = Tiddlers()
    for bag in kept_bags:
        bag = store.get(bag)
        for tiddler in store.list_bag_tiddlers(bag):
            tiddlers.add(tiddler)
    return send_tiddlers(environ, start_response, tiddlers=tiddlers)
示例#19
0
def add_friend(environ, start_response):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    ensure_user_bag(store, user["name"])
    new_friend = environ["tiddlyweb.query"].get("name", [""])[0]
    friends = get_friends(store, user["name"])
    if new_friend and new_friend not in friends:
        friends.append(new_friend)
    tiddler = Tiddler("friends", user["name"])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass  # is okay if tiddler doesn't exist yet
    tiddler.text = "\n".join(friends)
    store.put(tiddler)
    raise HTTP303("%s/home" % server_base_url(environ))
示例#20
0
def _recipe_policy(environ, recipe_name, publicity):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    recipe = Recipe(recipe_name)
    recipe = store.get(recipe)
    recipe.policy.allows(user, "manage")

    if publicity == "custom":
        raise HTTP303(recipe_url(environ, recipe) + "/tiddlers")

    if publicity == "public":
        recipe.policy.read = []
    else:
        recipe.policy.read = [user["name"]]

    store.put(recipe)
    raise HTTP303(recipe_url(environ, recipe) + "/tiddlers")
示例#21
0
def recipe_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    ensure_user_bag(store, user["name"])
    new_bookmark = environ["tiddlyweb.query"].get("recipe", [""])[0]
    bookmarks = get_bookmarks(store, user["name"])
    # XXX I suppose a set would be okay here.
    if new_bookmark and new_bookmark not in bookmarks:
        bookmarks.append(new_bookmark)
    tiddler = Tiddler("bookmarks", user["name"])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass  # is okay if tiddler doesn't exist yet
    tiddler.text = "\n".join(bookmarks)
    store.put(tiddler)
    raise HTTP303("%s/home" % server_base_url(environ))
示例#22
0
def bag_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    ensure_user_bag(store, user["name"])
    new_favorite = environ["tiddlyweb.query"].get("bag", [""])[0]
    favorites = get_favorites(store, user["name"])
    # XXX I suppose a set would be okay here.
    if new_favorite and new_favorite not in favorites:
        favorites.append(new_favorite)
    tiddler = Tiddler("favorites", user["name"])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass  # is okay if tiddler doesn't exist yet
    tiddler.text = "\n".join(favorites)
    store.put(tiddler)
    raise HTTP303("%s/home" % server_base_url(environ))
示例#23
0
def add_friend(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_friend = environ['tiddlyweb.query'].get('name', [''])[0]
    friends = get_friends(store, user['name'])
    if new_friend and new_friend not in friends:
        friends.append(new_friend)
    tiddler = Tiddler('friends', user['name'])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass # is okay if tiddler doesn't exist yet
    tiddler.text = '\n'.join(friends)
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#24
0
def add_friend(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_friend = environ['tiddlyweb.query'].get('name', [''])[0]
    friends = get_friends(store, user['name'])
    if new_friend and new_friend not in friends:
        friends.append(new_friend)
    tiddler = Tiddler('friends', user['name'])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass  # is okay if tiddler doesn't exist yet
    tiddler.text = '\n'.join(friends)
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#25
0
def _recipe_policy(environ, recipe_name, publicity):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    recipe = Recipe(recipe_name)
    recipe = store.get(recipe)
    recipe.policy.allows(user, 'manage')

    if publicity == 'custom':
        raise HTTP303(recipe_url(environ, recipe) + '/tiddlers')

    if publicity == 'public':
        recipe.policy.read = []
    else:
        recipe.policy.read = [user['name']]

    store.put(recipe)
    raise HTTP303(recipe_url(environ, recipe) + '/tiddlers')
示例#26
0
def _recipe_policy(environ, recipe_name, publicity):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    recipe = Recipe(recipe_name)
    recipe = store.get(recipe)
    recipe.policy.allows(user, 'manage')

    if publicity == 'custom':
        raise HTTP303(recipe_url(environ, recipe) + '/tiddlers')

    if publicity == 'public':
        recipe.policy.read = []
    else:
        recipe.policy.read = [user['name']]

    store.put(recipe)
    raise HTTP303(recipe_url(environ, recipe) + '/tiddlers')
示例#27
0
def post_createrecipe(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    recipe_name = environ['tiddlyweb.query'].get('recipe', [''])[0]
    bag_name = environ['tiddlyweb.query'].get('bag', [''])[0]
    publicity = environ['tiddlyweb.query'].get('publicity', [''])[0]
    description = environ['tiddlyweb.query'].get('description', [''])[0]
    if not bag_name or not recipe_name:
        raise HTTP400('missing data')

    recipe = Recipe(recipe_name)
    bag = Bag(bag_name)
    try:
        recipe = store.get(recipe)
        raise HTTP400('recipe exists')
    except NoRecipeError:
        pass

    try:
        bag.skinny = True
        bag = store.get(bag)
        try:
            bag.policy.allows(user, 'read')
        except (UserRequiredError, ForbiddenError):
            raise HTTP400('bag not readable')
    except NoBagError:
        bag.policy.owner = user['name']
        for constraint in ['read', 'write', 'create', 'delete', 'manage']:
            setattr(bag.policy, constraint, [user['name']])
        store.put(bag)

    if publicity == 'private':
        recipe.policy.read = [user['name']]
    else:
        recipe.policy.read = []
    recipe.policy.manage = [user['name']]
    recipe.policy.owner = user['name']
    recipe.desc = description
    recipe.set_recipe([
        ('system', ''),
        (bag.name, ''),
        ])
    store.put(recipe)

    raise HTTP303('%s/home' % server_base_url(environ))
示例#28
0
def bag_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_favorite = environ['tiddlyweb.query'].get('bag', [''])[0]
    favorites = get_favorites(store, user['name'])
    # XXX I suppose a set would be okay here.
    if new_favorite and new_favorite not in favorites:
        favorites.append(new_favorite)
    tiddler = Tiddler('favorites', user['name'])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass  # is okay if tiddler doesn't exist yet
    tiddler.text = '\n'.join(favorites)
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#29
0
def recipe_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_bookmark = environ['tiddlyweb.query'].get('recipe', [''])[0]
    bookmarks = get_bookmarks(store, user['name'])
    # XXX I suppose a set would be okay here.
    if new_bookmark and new_bookmark not in bookmarks:
        bookmarks.append(new_bookmark)
    tiddler = Tiddler('bookmarks', user['name'])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass  # is okay if tiddler doesn't exist yet
    tiddler.text = '\n'.join(bookmarks)
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#30
0
def recipe_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_bookmark = environ['tiddlyweb.query'].get('recipe', [''])[0]
    bookmarks = get_bookmarks(store, user['name'])
    # XXX I suppose a set would be okay here.
    if new_bookmark and new_bookmark not in bookmarks:
        bookmarks.append(new_bookmark)
    tiddler = Tiddler('bookmarks', user['name'])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass # is okay if tiddler doesn't exist yet
    tiddler.text = '\n'.join(bookmarks)
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#31
0
def bag_favor(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    ensure_user_bag(store, user['name'])
    new_favorite = environ['tiddlyweb.query'].get('bag', [''])[0]
    favorites = get_favorites(store, user['name'])
    # XXX I suppose a set would be okay here.
    if new_favorite and new_favorite not in favorites:
        favorites.append(new_favorite)
    tiddler = Tiddler('favorites', user['name'])
    try:
        tiddler = store.get(tiddler)
    except NoTiddlerError:
        pass # is okay if tiddler doesn't exist yet
    tiddler.text = '\n'.join(favorites)
    tiddler.modifier = user['name']
    store.put(tiddler)
    raise HTTP303('%s/home' % server_base_url(environ))
示例#32
0
def post_createrecipe(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    recipe_name = environ['tiddlyweb.query'].get('recipe', [''])[0]
    bag_name = environ['tiddlyweb.query'].get('bag', [''])[0]
    publicity = environ['tiddlyweb.query'].get('publicity', [''])[0]
    description = environ['tiddlyweb.query'].get('description', [''])[0]
    if not bag_name or not recipe_name:
        raise HTTP400('missing data')

    recipe = Recipe(recipe_name)
    bag = Bag(bag_name)
    try:
        recipe = store.get(recipe)
        raise HTTP400('recipe exists')
    except NoRecipeError:
        pass

    try:
        bag = store.get(bag)
        try:
            bag.policy.allows(user, 'read')
        except (UserRequiredError, ForbiddenError):
            raise HTTP400('bag not readable')
    except NoBagError:
        bag.policy.owner = user['name']
        for constraint in ['read', 'write', 'create', 'delete', 'manage']:
            setattr(bag.policy, constraint, [user['name']])
        store.put(bag)

    if publicity == 'private':
        recipe.policy.read = [user['name']]
    else:
        recipe.policy.read = []
    recipe.policy.manage = [user['name']]
    recipe.policy.owner = user['name']
    recipe.desc = description
    recipe.set_recipe([
        ('system', ''),
        (bag.name, ''),
    ])
    store.put(recipe)

    raise HTTP303('%s/home' % server_base_url(environ))
示例#33
0
def _bag_policy(environ, bag_name, publicity):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    bag = Bag(bag_name)
    bag = store.get(bag)
    bag.policy.allows(user, 'manage')

    if publicity == 'custom':
        raise HTTP303(bag_url(environ, bag) + '/tiddlers')

    if publicity == 'public':
        bag.policy = public_policy(user['name'])
    elif publicity == 'protected':
        bag.policy = protected_policy(user['name'])
    else:
        bag.policy = private_policy(user['name'])

    store.put(bag)
    raise HTTP303(bag_url(environ, bag) + '/tiddlers')
示例#34
0
def _bag_policy(environ, bag_name, publicity):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    bag = Bag(bag_name)
    bag = store.get(bag)
    bag.policy.allows(user, 'manage')

    if publicity == 'custom':
        raise HTTP303(bag_url(environ, bag) + '/tiddlers')

    if publicity == 'public':
        bag.policy = public_policy(user['name'])
    elif publicity == 'protected':
        bag.policy = protected_policy(user['name'])
    else:
        bag.policy = private_policy(user['name'])

    store.put(bag)
    raise HTTP303(bag_url(environ, bag) + '/tiddlers')
示例#35
0
def _bag_policy(environ, bag_name, publicity):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    bag = Bag(bag_name)
    bag = store.get(bag)
    bag.policy.allows(user, "manage")

    if publicity == "custom":
        raise HTTP303(bag_url(environ, bag) + "/tiddlers")

    if publicity == "public":
        bag.policy = public_policy(user["name"])
    elif publicity == "protected":
        bag.policy = protected_policy(user["name"])
    else:
        bag.policy = private_policy(user["name"])

    store.put(bag)
    raise HTTP303(bag_url(environ, bag) + "/tiddlers")
示例#36
0
def post_createrecipe(environ, start_response):
    user = get_user_object(environ)
    store = environ["tiddlyweb.store"]
    recipe_name = environ["tiddlyweb.query"].get("recipe", [""])[0]
    bag_name = environ["tiddlyweb.query"].get("bag", [""])[0]
    publicity = environ["tiddlyweb.query"].get("publicity", [""])[0]
    description = environ["tiddlyweb.query"].get("description", [""])[0]
    if not bag_name or not recipe_name:
        raise HTTP400("missing data")

    recipe = Recipe(recipe_name)
    bag = Bag(bag_name)
    try:
        recipe = store.get(recipe)
        raise HTTP400("recipe exists")
    except NoRecipeError:
        pass

    try:
        bag = store.get(bag)
        try:
            bag.policy.allows(user, "read")
        except (UserRequiredError, ForbiddenError):
            raise HTTP400("bag not readable")
    except NoBagError:
        bag.policy.owner = user["name"]
        for constraint in ["read", "write", "create", "delete", "manage"]:
            setattr(bag.policy, constraint, [user["name"]])
        store.put(bag)

    if publicity == "private":
        recipe.policy.read = [user["name"]]
    else:
        recipe.policy.read = []
    recipe.policy.manage = [user["name"]]
    recipe.policy.owner = user["name"]
    recipe.desc = description
    recipe.set_recipe([("system", ""), (bag.name, "")])
    store.put(recipe)

    raise HTTP303("%s/home" % server_base_url(environ))
示例#37
0
 def _bag_list(self, tiddlers):
     if '/feedbag' in self.environ['selector.matches'][0]:
         representation_link = '%s/feedbag' % (self._server_prefix())
         bag = Bag('feedbag')
         bag.policy.manage = ["NONE"]
         bag.policy.delete = ["NONE"]
         bag.desc = 'Recent Public Stuff'
     else:
         name = self.environ['wsgiorg.routing_args'][1]['bag_name']
         name = urllib.unquote(name)
         name = name.decode('utf-8')
         representation_link = '%s/bags/%s/tiddlers' % (
             self._server_prefix(), encode_name(name))
         bag = self.environ['tiddlyweb.store'].get(Bag(name))
     representations = self._tiddler_list_header(representation_link)
     user_object = get_user_object(self.environ)
     publicity = ''
     try:
         bag.policy.allows(user_object, 'manage')
         policy = bag.policy
         publicity = determine_publicity(user_object, policy)
     except (UserRequiredError, ForbiddenError):
         policy = None
     try:
         bag.policy.allows(user_object, 'delete')
         delete = True
     except (UserRequiredError, ForbiddenError):
         delete = False
     data = {
         'title': 'TiddlyHoster Bag %s' % bag.name,
         'policy': policy,
         'publicity': publicity,
         'delete': delete,
         'bag': bag,
         'tiddlers': tiddlers,
         'representations': representations
     }
     del self.environ['tiddlyweb.title']
     return send_template(self.environ, 'baglist.html', data)
示例#38
0
def bag_policy(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    publicity = environ['tiddlyweb.query'].get('publicity', [''])[0]
    bag_name = environ['tiddlyweb.query'].get('bag', [''])[0]

    bag = Bag(bag_name)
    bag.skinny = True
    bag = store.get(bag)
    bag.policy.allows(user, 'manage')

    if publicity == 'custom':
        raise HTTP303(bag_url(environ, bag) + '/tiddlers')

    if publicity == 'public':
        bag.policy = public_policy(user['name'])
    elif publicity == 'protected':
        bag.policy = protected_policy(user['name'])
    else:
        bag.policy = private_policy(user['name'])

    store.put(bag)
    raise HTTP303(bag_url(environ, bag) + '/tiddlers')
示例#39
0
def post_createbag(environ, start_response):
    user = get_user_object(environ)
    store = environ['tiddlyweb.store']
    bag_name = environ['tiddlyweb.query'].get('bag', [''])[0]
    publicity = environ['tiddlyweb.query'].get('publicity', [''])[0]
    description = environ['tiddlyweb.query'].get('description', [''])[0]

    if not bag_name:
        raise HTTP400('missing data')

    bag = Bag(bag_name)

    try:
        bag = store.get(bag)
        raise HTTP400('bag exists')
    except NoBagError:
        pass
    if publicity == 'public':
        bag = ensure_public_bag(store,
                                user['name'],
                                desc=description,
                                name=bag_name)
    elif publicity == 'protected':
        bag = ensure_protected_bag(store,
                                   user['name'],
                                   desc=description,
                                   name=bag_name)
    else:
        bag = ensure_private_bag(store,
                                 user['name'],
                                 desc=description,
                                 name=bag_name)

    # the bag has already been stored

    raise HTTP303('%s/tiddlers' % bag_url(environ, bag))