def create_wiki(environ, name, mode='private', username=None, desc='', validate=True): """ Create a wiki with the name, name. For now a wiki is just a bag a policy. """ store = environ['tiddlyweb.store'] if username is None: username = environ['tiddlyweb.usersign']['name'] bag = Bag(name) # We want this get to fail. try: store.get(bag) return False except NoBagError: pass try: bag.policy = WIKI_MODES[mode](username) except KeyError: bag.policy = WIKI_MODES['private'](username) bag.desc = desc if validate: validate_bag(bag, environ) store.put(bag) return bag
def setup_module(module): module.TMPDIR = tempfile.mkdtemp() _initialize_app(TMPDIR) module.ADMIN_COOKIE = make_cookie('tiddlyweb_user', 'admin', mac_key=CONFIG['secret']) module.STORE = get_store(CONFIG) # register admin user data = { 'username': '******', 'password': '******', 'password_confirmation': 'secret' } response, content = _req('POST', '/register', urlencode(data), headers={ 'Content-Type': 'application/x-www-form-urlencoded' }) bag = Bag('alpha') bag.policy = Policy(read=['admin'], write=['admin'], create=['admin'], delete=['admin'], manage=['admin']) STORE.put(bag) bag = Bag('bravo') STORE.put(bag) bag = Bag('charlie') bag.policy = Policy(read=['nobody'], write=['nobody'], create=['nobody'], delete=['nobody'], manage=['nobody']) STORE.put(bag) tiddler = Tiddler('index', 'bravo') tiddler.text = 'lorem ipsum\ndolor *sit* amet' tiddler.type = 'text/x-markdown' STORE.put(tiddler)
def test_bag_policy(): bag = Bag('policy_tester') bag.policy = Policy(read=['chris', 'jeremy']) assert bag.policy.allows(chris_info, 'read') py.test.raises(UserRequiredError, 'bag.policy.allows(guest_info, "read")')
def make_space(space_name, store, member): """ The details of creating the bags and recipes that make up a space. """ space = Space(space_name) for bag_name in space.list_bags(): bag = Bag(bag_name) bag.policy = _make_policy(member) if Space.bag_is_public(bag_name): bag.policy.read = [] store.put(bag) info_tiddler = Tiddler('SiteInfo', space.public_bag()) info_tiddler.text = 'Space %s' % space_name store.put(info_tiddler) public_recipe = Recipe(space.public_recipe()) public_recipe.set_recipe(space.public_recipe_list()) private_recipe = Recipe(space.private_recipe()) private_recipe.set_recipe(space.private_recipe_list()) private_recipe.policy = _make_policy(member) public_recipe.policy = _make_policy(member) public_recipe.policy.read = [] store.put(public_recipe) store.put(private_recipe)
def _make_space(environ, space_name): """ The details of creating the bags and recipes that make up a space. """ store = environ['tiddlyweb.store'] member = environ['tiddlyweb.usersign']['name'] # XXX stub out the clumsy way for now # can make this much more declarative space = Space(space_name) for bag_name in space.list_bags(): bag = Bag(bag_name) bag.policy = _make_policy(member) if Space.bag_is_public(bag_name): bag.policy.read = [] store.put(bag) public_recipe = Recipe(space.public_recipe()) public_recipe.set_recipe(space.public_recipe_list()) private_recipe = Recipe(space.private_recipe()) private_recipe.set_recipe(space.private_recipe_list()) private_recipe.policy = _make_policy(member) public_recipe.policy = _make_policy(member) public_recipe.policy.read = [] store.put(public_recipe) store.put(private_recipe)
def remove_user(environ, space_name, user_name): """ remove user_name from space_name while checking the policy allows the logged in user to do it """ store = environ['tiddlyweb.store'] user = User(user_name) user = store.get(user) logged_in_user = environ['tiddlyweb.usersign'] space_definition = environ['tiddlyweb.config']['space'] space = [] for name, values in space_definition['bags'].iteritems(): bag = Bag(name.replace('SPACE_NAME', space_name)) bag = store.get(bag) bag.policy.allows(logged_in_user, 'manage') bag.policy = remove_from_policy(user, bag.policy) space.append(bag) for name, values in space_definition['recipes'].iteritems(): recipe = Recipe(name.replace('SPACE_NAME', space_name)) recipe = store.get(recipe) recipe.policy.allows(logged_in_user, 'manage') recipe.policy = remove_from_policy(user, recipe.policy) space.append(recipe) for thing in space: store.put(thing)
def test_bag_policy(): bag = Bag('policy_tester') bag.policy = Policy(read=['chris','jeremy']) assert bag.policy.allows(chris_info, 'read') py.test.raises(UserRequiredError, 'bag.policy.allows(guest_info, "read")')
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')
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")
def test_reuse_policy_object(): """ Explicitly test a bug fix in policy handling wherein the owner field could get transformed into (and stay) a list thus ruining second use. Not that second use is encourage, but it could happen. """ policy = Policy() policy.owner = u"campy" bag = Bag("policytest1") bag.policy = policy store.put(bag) bag = Bag("policytest2") bag.policy = policy store.put(bag) bag1 = store.get(Bag("policytest1")) bag2 = store.get(Bag("policytest2")) assert bag1.policy.owner == "campy" assert bag2.policy.owner == "campy" assert bag1.policy.owner == bag2.policy.owner
def test_reuse_policy_object(): """ Explicitly test a bug fix in policy handling wherein the owner field could get transformed into (and stay) a list thus ruining second use. Not that second use is encourage, but it could happen. """ policy = Policy() policy.owner = u'campy' bag = Bag('policytest1') bag.policy = policy STORE.put(bag) bag = Bag('policytest2') bag.policy = policy STORE.put(bag) bag1 = STORE.get(Bag('policytest1')) bag2 = STORE.get(Bag('policytest2')) assert bag1.policy.owner == 'campy' assert bag2.policy.owner == 'campy' assert bag1.policy.owner == bag2.policy.owner
def _create_wiki(store, name, owner, private): bag = Bag(name) try: store.get(bag) raise HTTP409('wiki name unavailable') except NoBagError: pass read_constraint = [owner] if private else None bag.policy = Policy(read=read_constraint, write=[owner], create=[owner], delete=[owner], manage=[owner]) # XXX: too limiting!? store.put(bag)
def setup_module(module): instance = make_instance() module.STORE = instance['store'] module.ADMIN_COOKIE = instance['admin_cookie'] bag = Bag('alpha') bag.policy = Policy(read=['admin'], write=['admin'], create=['admin'], delete=['admin'], manage=['admin']) STORE.put(bag) bag = Bag('bravo') STORE.put(bag) bag = Bag('charlie') bag.policy = Policy(read=['nobody'], write=['nobody'], create=['nobody'], delete=['nobody'], manage=['nobody']) STORE.put(bag) tiddler = Tiddler('index', 'bravo') tiddler.text = 'lorem ipsum\ndolor *sit* amet' tiddler.type = 'text/x-markdown' STORE.put(tiddler)
def add_archive(args): """add archive bags to the store: twanager add_archive""" store = get_store(config) bags = store.list_bags() for bag in bags: if bag.name.endswith('_private'): space_name = bag.name.rsplit('_', 1)[0] archive = Bag('%s_archive' % space_name) try: archive = store.get(archive) except NoBagError: archive.policy = bag.policy store.put(archive)
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')
def setup_module(module): cfg = _initialize_app({ 'tagdex_db': 'tagdex_test.sqlite' }) module.STORE = get_store(cfg) database.reset(cfg) module.STORE.put(Bag('alpha')) module.STORE.put(Bag('bravo')) bag = Bag('charlie') bag.policy = Policy(read=['bob']) module.STORE.put(bag) _put_tiddler('HelloWorld', 'alpha', ['foo', 'bar'], 'lorem ipsum') _put_tiddler('HelloWorld', 'bravo', ['foo', 'bar'], 'lorem ipsum') _put_tiddler('Lipsum', 'alpha', ['bar', 'baz'], '...') _put_tiddler('Confidential', 'charlie', ['private', 'secret'], '...') _put_tiddler('1984', 'alpha', ['book', 'scifi', 'political'], 'Orwell, G.') _put_tiddler('Foundation', 'alpha', ['book', 'scifi'], 'Asimov, I.')
def _check_bag(name, environ, user): """ Get the user's bag. Create if required. """ store = environ['tiddlyweb.store'] name = '%s-%s' % (user, name) name = name.replace('.', '_') try: bag = Bag(name) bag = store.get(bag) except NoBagError: uni_user = unicode(user) policy = Policy(owner=uni_user, manage=[uni_user], read=[uni_user], write=[uni_user], delete=[uni_user], create=[uni_user]) bag.policy = policy bag.desc = 'Twotes for %s' % uni_user; store.put(bag) return bag
def make_space(space_name, store, member): """ The details of creating the bags and recipes that make up a space. """ space = Space(space_name) for bag_name in space.list_bags(): bag = Bag(bag_name) bag.policy = _make_policy(member) if Space.bag_is_public(bag_name): bag.policy.read = [] store.put(bag) public_recipe = Recipe(space.public_recipe()) public_recipe.set_recipe(space.public_recipe_list()) private_recipe = Recipe(space.private_recipe()) private_recipe.set_recipe(space.private_recipe_list()) private_recipe.policy = _make_policy(member) public_recipe.policy = _make_policy(member) public_recipe.policy.read = [] store.put(public_recipe) store.put(private_recipe)
def make_space(space_name, store, member): """ The details of creating the bags and recipes that make up a space. """ space = Space(space_name) for bag_name in space.list_bags(): bag = Bag(bag_name) bag.policy = _make_policy(member) if Space.bag_is_public(bag_name): bag.policy.read = [] store.put(bag) info_tiddler = Tiddler('SiteInfo', space.public_bag()) info_tiddler.text = 'Space %s' % space_name info_tiddler.modifier = store.environ.get('tiddlyweb.usersign', {}).get('name', 'GUEST') store.put(info_tiddler) # Duplicate GettingStarted into public bag. getting_started_tiddler = Tiddler(GETTING_STARTED_TIDDLER['title'], GETTING_STARTED_TIDDLER['bag']) try: getting_started_tiddler = store.get(getting_started_tiddler) getting_started_tiddler.bag = space.public_bag() store.put(getting_started_tiddler) except StoreError: pass public_recipe = Recipe(space.public_recipe()) public_recipe.set_recipe(space.public_recipe_list()) private_recipe = Recipe(space.private_recipe()) private_recipe.set_recipe(space.private_recipe_list()) private_recipe.policy = _make_policy(member) public_recipe.policy = _make_policy(member) public_recipe.policy.read = [] store.put(public_recipe) store.put(private_recipe)
def test_permission_handling(): tags, _ = _get_html_data('/tags') assert len(tags) == 6 tag_names = tags.values() assert 'foo' in tag_names assert 'bar' in tag_names assert 'baz' in tag_names assert 'book' in tag_names assert 'scifi' in tag_names assert 'political' in tag_names assert not 'secret' in tag_names tags, tiddlers = _get_html_data('/tags/secret') assert len(tags) == 0 assert len(tiddlers) == 0 tags, tiddlers = _get_html_data('/tags/private') assert len(tags) == 0 assert len(tiddlers) == 0 tags, tiddlers = _get_html_data('/tags/private,secret') assert len(tags) == 0 assert len(tiddlers) == 0 # ensure a single readable tiddler suffices for the tag to show up _put_tiddler('AllEyes', 'bravo', ['secret'], '...') tags, _ = _get_html_data('/tags') assert len(tags) == 7 assert 'secret' in tags.values() tags, tiddlers = _get_html_data('/tags/secret', True) assert len(tags) == 0 assert len(tiddlers) == 1 assert ('/bags/bravo/tiddlers/AllEyes', 'AllEyes') in tiddlers tags, tiddlers = _get_html_data('/tags/private') assert len(tags) == 0 assert len(tiddlers) == 0 tags, tiddlers = _get_html_data('/tags/private,secret') assert len(tags) == 0 assert len(tiddlers) == 0 _put_tiddler('AllEyes', 'bravo', ['private', 'secret'], '...') tags, tiddlers = _get_html_data('/tags/secret', True) assert len(tags) == 1 assert ('/tags/private,secret', 'private') in tags assert len(tiddlers) == 1 assert ('/bags/bravo/tiddlers/AllEyes', 'AllEyes') in tiddlers tags, tiddlers = _get_html_data('/tags/private', True) assert len(tags) == 1 assert ('/tags/private,secret', 'secret') in tags assert len(tiddlers) == 1 assert ('/bags/bravo/tiddlers/AllEyes', 'AllEyes') in tiddlers tags, tiddlers = _get_html_data('/tags/private,secret', True) assert len(tags) == 0 assert len(tiddlers) == 1 assert ('/bags/bravo/tiddlers/AllEyes', 'AllEyes') in tiddlers tags, tiddlers = _get_html_data('/tags/foo,bar', True) assert len(tags) == 0 assert len(tiddlers) == 2 assert ('/bags/alpha/tiddlers/HelloWorld', 'HelloWorld') in tiddlers assert ('/bags/bravo/tiddlers/HelloWorld', 'HelloWorld') in tiddlers bag = Bag('bravo') bag.policy = Policy(read=['bob']) STORE.put(bag) tags, tiddlers = _get_html_data('/tags/foo,bar', True) assert len(tags) == 0 assert len(tiddlers) == 1 assert ('/bags/alpha/tiddlers/HelloWorld', 'HelloWorld') in tiddlers
def setup(store): try: store.delete(Bag(votebag)) except NoBagError: pass snowwhitebag = Bag("snow white") snowwhitebag.policy = Policy("jon",[],['admin'],['admin'],['admin']) mrmenbag = Bag("mr_and_mrs") mrmenbag.policy = Policy("jon",["jon","andrew","martin"],['admin'],['admin'],['admin']) films = Bag("films") films.policy = Policy(accept=["NONE"]) try: store.delete(mrmenbag) except NoBagError: pass try: store.delete(snowwhitebag) except NoBagError: pass try: store.delete(films) except NoBagError: pass voting.setup_store(config) users = ["jon","FND","andrew","martin"] for user in users: store.put(User(user)) mrmendata = [ {"title":u"mr clumbsy","tags":["kitty","pet","cat"],"fields":{}}, {"title":u"mr thin","tags":["dog","pet"],"fields":{}}, {"title":u"mr tickle","tags":["cat","animal","bogof"],"fields":{"%s.total"%votebag:"2"}}, {"title":u"mr messy","tags":["lion"],"fields":{}}, {"title":u"mr strong","tags":["monkey","lolcat"],"fields":{"%s.total"%votebag:"923"}}, {"title":u"mr tall","tags":["dinosaur","kitty","tiger"],"fields":{}}, {"title":u"little miss naughty","tags":["cAt","pet"],"fields":{}}, {"title":u"mr small","tags":["pet","animal","kitty"],"fields":{}} ] snowwhitedata = [ {"title":u"snow white","tags":[],"fields":{}}, {"title":u"grumpy","tags":[],"fields":{}} ] filmdata = [{"title":"Kill Bill","modifier":"Ben"},{"title":"Kill Bill 2","modifier":"Ben"},{"title":"Pulp Fiction","modifier":"Ben"},{"title":"Jackie Brown","modifier":"Ben"}] configSnowWhite = Tiddler("config::snow white",votebag) configSnowWhite.text = """ increment.range::-5,30 increment.limit::2 """ store.put(configSnowWhite) store.put(snowwhitebag) store.put(mrmenbag) store.put(films) tiddlers = [] for tid in mrmendata: tiddler = Tiddler(tid["title"],"mr_and_mrs") tiddler.fields = tid["fields"] tiddler.tags = tid["tags"] tiddlers.append(tiddler) store.put(tiddler) for tid in filmdata: tiddler = Tiddler(tid["title"],"films") if "modifier" in tid: tiddler.modifier = tid["modifier"] tiddlers.append(tiddler) store.put(tiddler) for tid in snowwhitedata: tiddler = Tiddler(tid["title"],"snow white") tiddler.fields = tid["fields"] tiddler.tags = tid["tags"] tiddlers.append(tiddler) store.put(tiddler) return tiddlers