예제 #1
0
def test_users():
    userc = User('cdent')
    userc.set_password('foobar')
    userc.add_role('ADMIN')
    userc.note = 'A simple programmer of matter'

    store.put(userc)

    userf = User('FND')
    userf.set_password('I<3whitespace')

    store.put(userf)

    user2 = store.get(User('cdent'))
    assert user2.usersign == userc.usersign
    assert user2.check_password('foobar')
    assert user2.list_roles() == userc.list_roles()
    assert user2.note == userc.note

    users = list(store.list_users())
    assert len(users) == 2
    assert ['FND', 'cdent'] == sorted([user.usersign for user in users])

    store.delete(User('FND'))

    users = list(store.list_users())
    assert len(users) == 1

    py.test.raises(NoUserError, "store.get(User('FND'))")
예제 #2
0
파일: fixtures.py 프로젝트: BillSeitz/tank
def establish_user_auth(config, store, host, username):
    user = User(username)
    mapping_username = '******' % username
    mapping_tiddler = Tiddler(mapping_username, 'MAPUSER')
    mapping_tiddler.fields['mapped_user'] = username

    try:
        store.delete(user)
    except StoreError:
        pass
    try:
        store.delete(mapping_tiddler)
    except IOError:
        pass

    user.add_role('MEMBER')
    user.note = '{}'
    store.put(user)
    ensure_bag('MAPUSER', store)
    store.put(mapping_tiddler)
    stamp = datetime.utcnow().strftime('%Y%m%d%H')
    csrf = gen_nonce(username, host, stamp, config['secret'])
    cookie = make_cookie('tiddlyweb_user', mapping_username,
            mac_key=config['secret'], httponly=False)

    return cookie, csrf
예제 #3
0
def establish_user_auth(config, store, host, username):
    user = User(username)
    mapping_username = '******' % username
    mapping_tiddler = Tiddler(mapping_username, 'MAPUSER')
    mapping_tiddler.fields['mapped_user'] = username

    try:
        store.delete(user)
    except StoreError:
        pass
    try:
        store.delete(mapping_tiddler)
    except IOError:
        pass

    user.add_role('MEMBER')
    user.note = '{}'
    store.put(user)
    ensure_bag('MAPUSER', store)
    store.put(mapping_tiddler)
    stamp = datetime.utcnow().strftime('%Y%m%d%H')
    csrf = gen_nonce(username, host, stamp, config['secret'])
    cookie = make_cookie('tiddlyweb_user',
                         mapping_username,
                         mac_key=config['secret'],
                         httponly=False)

    return cookie, csrf
예제 #4
0
def handle(environ, start_response):
    """
    Handle a posted request for registration.

    If the provided username is blacklisted, ask them to
    log in as someone else. Otherwise send closing
    material with a link to get started.
    """
    pretty_name = environ['tiddlyweb.query'].get('pretty_name', [None])[0]
    target_role = environ['tiddlyweb.config'].get('register_role', 'MEMBER')
    store = environ['tiddlyweb.store']
    username = environ['tiddlyweb.usersign']['name']
    if _blacklisted(environ, username):
        return _send_start(environ, start_response,
                message='That user has been blocked')
    user = User(username)
    try:
        user = store.get(user)
    except NoUserError:
        pass # is cool if they don't exist yet
    user.add_role('%s' % target_role)
    if pretty_name:
        user.note = pretty_name
    store.put(user)
    environ['tiddlyweb.usersign'] = {'name': user.usersign,
            'roles': user.list_roles()}
    return _send_finish(environ, start_response)
예제 #5
0
    def _init_store(self, struct):
        """
        creates basic store structure with bags, recipes and users

        (no support for user passwords for security reasons)
        """
        store = get_store(self.init_config)

        bags = struct.get("bags", {})
        for name, data in bags.items():
            desc = data.get("desc")
            bag = Bag(name, desc=desc)
            constraints = data.get("policy", {})
            _set_policy(bag, constraints)
            store.put(bag)

        recipes = struct.get("recipes", {})
        for name, data in recipes.items():  # TODO: DRY
            desc = data.get("desc")
            recipe = Recipe(name, desc=desc)
            recipe.set_recipe(data["recipe"])
            constraints = data.get("policy", {})
            _set_policy(recipe, constraints)
            store.put(recipe)

        users = struct.get("users", {})
        for name, data in users.items():
            note = data.get("note")
            user = User(name, note=note)
            password = data.get("_password")
            if password:
                user.set_password(password)
            for role in data.get("roles", []):
                user.add_role(role)
            store.put(user)
예제 #6
0
def handle(environ, start_response):
    """
    Handle a posted request for registration.

    If the provided username is blacklisted, ask them to
    log in as someone else. Otherwise send closing
    material with a link to get started.
    """
    pretty_name = environ["tiddlyweb.query"].get("pretty_name", [None])[0]
    target_role = environ["tiddlyweb.config"].get("register_role", "MEMBER")
    store = environ["tiddlyweb.store"]
    username = environ["tiddlyweb.usersign"]["name"]
    if _blacklisted(environ, username):
        return _send_start(environ, start_response, message="That user has been blocked")
    user = User(username)
    try:
        user = store.get(user)
    except NoUserError:
        pass  # is cool if they don't exist yet
    user.add_role("%s" % target_role)
    if pretty_name:
        user.note = pretty_name
    store.put(user)
    environ["tiddlyweb.usersign"] = {"name": user.usersign, "roles": user.list_roles()}
    return _send_finish(environ, start_response)
예제 #7
0
def handle(environ, start_response):
    """
    Handle a posted request for registration.

    If the provided username is blacklisted, ask them to
    log in as someone else. Otherwise send closing
    material with a link to get started.
    """
    pretty_name = environ['tiddlyweb.query'].get('pretty_name', [None])[0]
    target_role = environ['tiddlyweb.config'].get('register_role', 'MEMBER')
    store = environ['tiddlyweb.store']
    username = environ['tiddlyweb.usersign']['name']
    if _blacklisted(environ, username):
        return _send_start(environ,
                           start_response,
                           message='That user has been blocked')
    user = User(username)
    try:
        user = store.get(user)
    except NoUserError:
        pass  # is cool if they don't exist yet
    user.add_role('%s' % target_role)
    if pretty_name:
        user.note = pretty_name
    store.put(user)
    environ['tiddlyweb.usersign'] = {
        'name': user.usersign,
        'roles': user.list_roles()
    }
    return _send_finish(environ, start_response)
예제 #8
0
def setup_module(module):
    try:
        shutil.rmtree('store')
    except:
        pass # !!!
    config['server_host'] = {
            'host': 'our_test_domain',
            'port': '8001',
            'scheme': 'http',
            }
    from tiddlyweb.web import serve
    # we have to have a function that returns the callable,
    # Selector just _is_ the callable
    def app_fn():
        return serve.load_app()
    #wsgi_intercept.debuglevel = 1
    httplib2_intercept.install()
    wsgi_intercept.add_wsgi_intercept('our_test_domain', 8001, app_fn)

    environ = {'tiddlyweb.config': config}
    module.store = Store(config['server_store'][0], config['server_store'][1], environ)

    admin = User('admin')
    admin.add_role('ADMIN')
    admin.set_password('spank')
    module.store.put(admin)
    module.admin_authorization = b64encode('admin:spank')
    module.user_authorization = b64encode('cdent:pigdog')
def test_multi_role_user():
    user = User(u'cdent')
    user.add_role(u'cow')
    user.add_role(u'cow')
    store.put(user)

    user2 = store.get(User(u'cdent'))
    assert list(user2.roles) == ['cow']
예제 #10
0
def test_multi_role_user():
    user = User(u'cdent')
    user.add_role('cow')
    user.add_role('cow')
    store.put(user)

    user2 = store.get(User(u'cdent'))
    assert list(user2.roles) == ['cow']
예제 #11
0
def test_simple_put():
    user = User('cdent', note='foo')
    user.set_password('cowpig')
    user.add_role('ADMIN')
    user.add_role('BOSS')
    store.put(user)

    assert os.path.exists(expected_stored_filename)
예제 #12
0
파일: __init__.py 프로젝트: cdent/wiki-data
def _create_user(environ, start_response, creation=0, expiration=0, role='tier1'):
    domain = get_domain(environ['HTTP_HOST'])
    if creation == 0:
        creation = time.time()
    store = environ['tiddlyweb.store']
    query = environ['tiddlyweb.query']
    name = query.get('name', [None])[0]
    email = query.get('email', [None])[0]
    company = query.get('company', [None])[0]
    country = query.get('country', [None])[0]
    if not (name and email):
        # The form has not been filled out
        return _user_form(environ, start_response, role=role, message='Missing Data!',
                formdata={'name': name, 'email': email,
                    'company': company, 'country': country})
    user = User(email)
    try:
        user = store.get(user)
        # User exists!
        return _user_form(environ, start_response, role=role, message='That account already exists!',
                formdata={'name': name, 'email': email,
                    'company': company, 'country': country})
    except NoUserError:
        password = _random_pass()
        user.set_password(password)
        user.add_role(role)
        store.put(user)

    bag_name = environ['tiddlyweb.config'].get('magicuser.bag', 'MAGICUSER')
    ensure_bag(bag_name, store, policy_dict={
        'read': ['NONE'], 'write': ['NONE'],
        'create': ['NONE'], 'manage': ['NONE']})
    tiddler = Tiddler(email, bag_name)
    tiddler.fields['country'] = country
    tiddler.fields['company'] = company
    tiddler.fields['name'] = name
    # Set the creation and expiration times.
    now = time.time()
    tiddler.fields['creation'] = '%s' % creation
    tiddler.fields['expiry'] = '%s' % expiration
    store.put(tiddler)

    to_address = email
    subject = domain+" user info"
    body = """
Here's your info:
Username: %s
Password: %s
""" % (email, password)
    query_string = '?email=%s' % to_address
    try:
        send_email(to_address, subject=subject, body=body, from_='avox@'+domain)
        query_string += '&success=1&role=%s' % role
        raise HTTP303(server_base_url(environ)+'/pages/new_account'+query_string)
    except socket.error:
        logging.debug('failed to send: %s:%s:%s', to_address, subject, body)
        query_string += '&failure=1&role=%s' % role
        raise HTTP302(server_base_url(environ)+'/pages/new_account'+query_string)
예제 #13
0
def test_put_get_user():
    user = User('testone')
    user.add_role('monkey')
    store.put(user)

    read_user = User('testone')
    read_user = store.get(read_user)

    assert read_user.list_roles() == ['monkey']
예제 #14
0
def test_put_get_user():
    user = User('testone')
    user.add_role('monkey')
    store.put(user)

    read_user = User('testone')
    read_user = store.get(read_user)

    assert read_user.list_roles() == ['monkey']
예제 #15
0
def test_simple_put():
    user = User("cdent", note="foo")
    user.set_password("cowpig")
    user.add_role("ADMIN")
    user.add_role("BOSS")
    store.put(user)

    if type(store.storage) != tiddlyweb.stores.text.Store:
        py.test.skip("skipping this test for non-text store")

    assert os.path.exists(expected_stored_filename)
예제 #16
0
def test_simple_put():
    user = User('cdent', note='foo')
    user.set_password('cowpig')
    user.add_role('ADMIN')
    user.add_role('BOSS')
    store.put(user)

    if type(store.storage) != tiddlyweb.stores.text.Store:
        py.test.skip('skipping this test for non-text store')

    assert os.path.exists(expected_stored_filename)
예제 #17
0
def test_simple_put():
    user = User('cdent', note='foo')
    user.set_password('cowpig')
    user.add_role('ADMIN')
    user.add_role('BOSS')
    store.put(user)

    if type(store.storage) != tiddlyweb.stores.text.Store:
        py.test.skip('skipping this test for non-text store')

    assert os.path.exists(expected_stored_filename)
예제 #18
0
파일: register.py 프로젝트: FND/tank
def register(environ, start_response):
    """
    register the user
    """
    config = environ['tiddlyweb.config']
    store = environ['tiddlyweb.store']
    query = environ['tiddlyweb.query']
    try:
        username = query['login'][0]
        name = query['name'][0]
        email = query['email'][0]
        extra = query['extra'][0]
        redirect = query['redirect'][0]
    except (KeyError, ValueError) as exc:
        raise HTTP400('Incomplete form submission: %s' % exc)

    announcements = query.get('announcements', [None])[0]

    user = User(username)
    try:
        store.get(user)
        raise HTTP400('That username is not available.')
    except StoreError:  # we expect and want this
        pass

    user.add_role(DEFAULT_ROLE)
    user.note = simplejson.dumps({
        'registered': time(),
        'name': name,
        'email': email,
        'extra': extra,
        'announcements': announcements is not None
    })

    store.put(user)

    create_wiki(environ, '_%s-data' % username, mode='private',
            username=username, desc='Data Files', validate=False)
    create_wiki(environ, '%s-notebook' % username, mode='private',
            username=username, desc='Private Notebook', validate=False)
    create_wiki(environ, '%s' % username, mode='protected',
            username=username, desc='Share Stuff', validate=False)

    redirect_uri = '%s%s' % (server_base_url(environ), redirect)
    secret = config['secret']
    cookie_age = config.get('cookie_age', None)
    cookie_header_string = make_cookie('tiddlyweb_user', user.usersign,
            mac_key=secret, path='/', expires=cookie_age)
    start_response('303 See Other',
            [('Set-Cookie', cookie_header_string),
                ('Content-Type', 'text/plain'),
                ('Location', str(redirect_uri))])
    return [redirect_uri]
예제 #19
0
def test_store_user():
    user = User('testuser')
    user.set_password('testpass')
    user.add_role('testrole')

    store.put(user)

    assert os.path.exists('store/testuser.user')

    loaded_user = User('testuser')
    loaded_user = store.get(loaded_user)

    assert loaded_user.check_password('testpass')
예제 #20
0
def test_store_user():
    user = User('testuser')
    user.set_password('testpass')
    user.add_role('testrole')

    store.put(user)

    assert os.path.exists('store/testuser.user')

    loaded_user = User('testuser')
    loaded_user = store.get(loaded_user)

    assert loaded_user.check_password('testpass')
예제 #21
0
def test_users():
    userc = User(name)
    userc.set_password(name)
    userc.add_role('ADMIN')
    userc.note = 'A simple programmer of matter'

    store.put(userc)

    user2 = store.get(User(name))
    assert user2.usersign == userc.usersign
    assert user2.check_password(name)
    assert user2.list_roles() == userc.list_roles()
    assert user2.note == userc.note
예제 #22
0
파일: __init__.py 프로젝트: cdent/wiki-data
def update_user(environ, start_response):
    query = environ['tiddlyweb.query']
    store = environ['tiddlyweb.store']
    username = query.get('email', [None])[0]
    if not username:
        return update_user_form(environ, start_response,
                message='Must have username/email')
    name = query.get('name', [''])[0]
    country = query.get('country', [''])[0]
    company = query.get('company', [''])[0]
    password = query.get('password', [''])[0]
    tier = query.get('tier', [''])[0]

    expiry = query.get('expiry', ['0'])[0]
    now = time.time()
    expiry = now + (float(expiry) * 24 * 60 * 60)

    user = User(username)
    user_new = False
    try:
        user = store.get(user)
    except NoUserError:
        user_new = True
    roles = [role for role in user.list_roles() if not role.startswith('tier')]
    for role in user.list_roles():
        user.del_role(role)
    roles.append(tier)
    for role in roles:
        user.add_role(role) # it's a set dupes are handled
    if password:
        user.set_password(password)
    store.put(user)

    bag_name = environ['tiddlyweb.config'].get('magicuser.bag', 'MAGICUSER')
    tiddler = Tiddler(username, bag_name)
    tiddler.fields['country'] = country
    tiddler.fields['company'] = company
    tiddler.fields['name'] = name
    # Set the creation and expiration times.
    if user_new:
        tiddler.fields['creation'] = '%s' % now
    tiddler.fields['expiry'] = '%s' % expiry
    store.put(tiddler)

    # XXX need to go somewhere useful?
    #raise HTTP303(server_base_url(environ))
    message = "Update successful"
    success = True
    logging.debug('going to update_user_form with message: '+message)
    return update_user_form(environ, start_response, message, success)
예제 #23
0
def update_user(environ, start_response):
    query = environ["tiddlyweb.query"]
    store = environ["tiddlyweb.store"]
    username = query.get("email", [None])[0]
    if not username:
        return update_user_form(environ, start_response, message="Must have username/email")
    name = query.get("name", [""])[0]
    country = query.get("country", [""])[0]
    company = query.get("company", [""])[0]
    password = query.get("password", [""])[0]
    tier = query.get("tier", [""])[0]

    expiry = query.get("expiry", ["0"])[0]
    now = time.time()
    expiry = now + (float(expiry) * 24 * 60 * 60)

    user = User(username)
    user_new = False
    try:
        user = store.get(user)
    except NoUserError:
        user_new = True
    roles = [role for role in user.list_roles() if not role.startswith("tier")]
    for role in user.list_roles():
        user.del_role(role)
    roles.append(tier)
    for role in roles:
        user.add_role(role)  # it's a set dupes are handled
    if password:
        user.set_password(password)
    store.put(user)

    bag_name = environ["tiddlyweb.config"].get("magicuser.bag", "MAGICUSER")
    tiddler = Tiddler(username, bag_name)
    tiddler.fields["country"] = country
    tiddler.fields["company"] = company
    tiddler.fields["name"] = name
    # Set the creation and expiration times.
    if user_new:
        tiddler.fields["creation"] = "%s" % now
    tiddler.fields["expiry"] = "%s" % expiry
    store.put(tiddler)

    # XXX need to go somewhere useful?
    # raise HTTP303(server_base_url(environ))
    message = "Update successful"
    success = True
    logging.debug("going to update_user_form with message: " + message)
    return update_user_form(environ, start_response, message, success)
예제 #24
0
def test_user_role():
    user = User('paper')
    assert user.list_roles() == []

    user.add_role('ADMIN')
    assert user.list_roles() == ['ADMIN']

    user.del_role('ADMIN')
    assert user.list_roles() == []

    # add twice to confirm set-ness
    user.add_role('ADMIN')
    user.add_role('ADMIN')

    assert user.list_roles() == ['ADMIN']
예제 #25
0
파일: test_user.py 프로젝트: sgml/tiddlyweb
def test_user_role():
    user = User('paper')
    assert user.list_roles() == []

    user.add_role('ADMIN')
    assert user.list_roles() == ['ADMIN']

    user.del_role('ADMIN')
    assert user.list_roles() == []

    # add twice to confirm set-ness
    user.add_role('ADMIN')
    user.add_role('ADMIN')

    assert user.list_roles() == ['ADMIN']
예제 #26
0
    def addrole(args):
        """Add a role to an existing user. <username> [role] [role] [role]"""
        try:
            username = args.pop(0)
            roles = args[0:]
        except (IndexError, ValueError) as exc:
            usage('you must provide a user and at least one ' 'role: %s' % exc)

        try:
            store = _store()
            user = User(username)
            user = store.get(user)
            for role in roles:
                user.add_role(role)
            store.put(user)
        except Exception as exc:
            usage('unable to add role to user: %s' % exc)

        return True
예제 #27
0
    def addrole(args):
        """Add a role to an existing user. <username> [role] [role] [role]"""
        try:
            username = args.pop(0)
            roles = args[0:]
        except (IndexError, ValueError) as exc:
            usage('you must provide a user and at least one '
                'role: %s' % exc)

        try:
            store = _store()
            user = User(username)
            user = store.get(user)
            for role in roles:
                user.add_role(role)
            store.put(user)
        except Exception as exc:
            usage('unable to add role to user: %s' % exc)

        return True
예제 #28
0
파일: __init__.py 프로젝트: FND/tiddlyweb
    def adduser(args):
        """Add or update a user to the database: <username> <password> [[role] [role] ...]"""
        try:
            username, password = args[0:2]
        except (IndexError, ValueError):
            usage('you must include at least a username and password')

        try:
            roles = args[2:]
        except IndexError:
            roles = []

        # this will raise an except to be caught by the handler
        store = _store()
        user = User(username)
        user.set_password(password)
        for role in roles:
            user.add_role(role)
        store.put(user)

        return True
예제 #29
0
    def adduser(args):
        """Add or update a user to the database: <username> <password> [[role] [role] ...]"""
        try:
            username, password = args[0:2]
        except (IndexError, ValueError):
            usage('you must include at least a username and password')

        try:
            roles = args[2:]
        except IndexError:
            roles = []

        # this will raise an except to be caught by the handler
        store = _store()
        user = User(username)
        user.set_password(password)
        for role in roles:
            user.add_role(role)
        store.put(user)

        return True
예제 #30
0
    def _downgrade_to_tier1(self, environ, userinfo):
        store = environ['tiddlyweb.store'] 
        expiration = (time.time() + DEFAULT_EXPIRE_DAYS * 24 * 60 * 60)
        userinfo['roles'].remove('tier2')
        userinfo['roles'].append('tier1')
        userinfo['fields']['expiry'] = expiration

        bag_name = environ['tiddlyweb.config'].get('magicuser.bag', 'MAGICUSER')
        username = userinfo['name']
        tiddler = Tiddler(username, bag_name)
        try:
            tiddler = store.get(tiddler)
        except StoreError:
            pass # tiddler is empty
        tiddler.fields['expiry'] = '%s' % expiration
        store.put(tiddler)

        user = User(username)
        user = store.get(user)
        user.del_role('tier2')
        user.add_role('tier1')
        store.put(user)
        return userinfo
예제 #31
0
    @make_command()
    def addrole(args):
        """Add a role to an existing user. <username> [role] [role] [role]"""
        try:
            username = args.pop(0)
            roles = args[0:]
        except (IndexError, ValueError), exc:
            usage('you must provide a user and at least one ' 'role: %s' % exc)

        try:
            store = _store()
            user = User(username)
            user = store.get(user)
            for role in roles:
                user.add_role(role)
            store.put(user)
        except Exception, exc:
            usage('unable to add role to user: %s' % exc)

        return True

    @make_command()
    def adduser(args):
        """Add or update a user to the database: <username> <password> [[role] [role] ...]"""
        try:
            username, password = args[0:2]
        except (IndexError, ValueError):
            usage('you must include at least a username and password')

        try:
예제 #32
0
def test_make_a_bunch():
    for x in xrange(RANGE):
        bag_name = u'bag%s' % x
        recipe_name = u'recipe%s' % x
        tiddler_name = u'tiddler%s' % x
        recipe_list = [(bag_name, '')]
        tiddler_text = u'hey ho %s' % x
        field_name = u'field%s' % x
        field_name2 = u'fieldone%s' % x
        tag_name = u'tag%s' % x
        user_name = u'user%s' % x
        user_pass = u'pass%s' % x
        user_note = u'note%s' % x
        user_roles = [u'rolehold', u'role%s' % x]

        bag = Bag(bag_name)
        bag.policy.owner = u'owner%s' % x
        bag.policy.read = [u'hi%s' % x, u'andextra']
        bag.policy.manage = [u'R:hi%s' % x, u'andmanage']
        store.put(bag)
        recipe = Recipe(recipe_name)
        recipe.policy.owner = u'owner%s' % x
        recipe.policy.read = [u'hi%s' % x, u'andextra']
        recipe.policy.manage = [u'R:hi%s' % x, u'andmanage']
        recipe.set_recipe(recipe_list)
        store.put(recipe)
        tiddler = Tiddler(tiddler_name, bag_name)
        tiddler.text = tiddler_text
        tiddler.fields[field_name] = field_name
        tiddler.fields[field_name2] = field_name2
        tiddler.fields['server.host'] = 'gunky'
        tiddler.tags = [tag_name]
        store.put(tiddler)
        store.put(tiddler)
        user = User(user_name)
        user.set_password(user_pass)
        user.note = user_note
        for role in user_roles:
            user.add_role(role)
        store.put(user)

    bags = [bag.name for bag in store.list_bags()]
    recipes = [recipe.name for recipe in store.list_recipes()]
    users = [user.usersign for user in store.list_users()]
    assert len(bags) == RANGE
    assert len(recipes) == RANGE
    assert len(users) == RANGE
    for x in xrange(RANGE):
        bname = 'bag%s' % x
        rname = 'recipe%s' % x
        uname = 'user%s' % x
        assert bname in bags
        assert rname in recipes
        assert uname in users

    tiddler = store.get(Tiddler(u'tiddler0', u'bag0'))
    assert tiddler.fields['field0'] == 'field0'
    assert tiddler.fields['fieldone0'] == 'fieldone0'

    bag = Bag(u'bag0')
    bag = store.get(bag)
    tiddlers = []
    for tiddler in store.list_bag_tiddlers(bag):
        tiddlers.append(store.get(tiddler))
    assert len(tiddlers) == 1
    assert tiddlers[0].title == 'tiddler0'
    assert tiddlers[0].fields['field0'] == 'field0'
    assert tiddlers[0].fields['fieldone0'] == 'fieldone0'
    assert tiddlers[0].tags == ['tag0']
    assert sorted(bag.policy.read) == ['andextra', 'hi0']
    assert sorted(bag.policy.manage) == ['R:hi0', u'andmanage']
    assert bag.policy.owner == 'owner0'

    user = User(u'user1')
    user = store.get(user)
    assert user.usersign == 'user1'
    assert user.check_password('pass1')
    assert user.note == 'note1'
    assert 'role1' in user.list_roles()
    assert 'rolehold' in user.list_roles()

    recipe = Recipe(u'recipe2')
    recipe = store.get(recipe)
    assert recipe.name == 'recipe2'
    bags = [bag_name for bag_name, filter in recipe.get_recipe()]
    assert len(bags) == 1
    assert 'bag2' in bags
    assert sorted(recipe.policy.read) == ['andextra', 'hi2']
    assert sorted(recipe.policy.manage) == ['R:hi2', u'andmanage']
    assert recipe.policy.owner == 'owner2'

    recipe.policy.manage = [u'andmanage']
    store.put(recipe)

    recipe = Recipe (u'recipe2')
    recipe = store.get(recipe)
    assert recipe.policy.manage == [u'andmanage']

    # delete the above things
    store.delete(bag)
    py.test.raises(NoBagError, 'store.delete(bag)')
    py.test.raises(NoBagError, 'store.get(bag)')
    store.delete(recipe)
    py.test.raises(NoRecipeError, 'store.delete(recipe)')
    py.test.raises(NoRecipeError, 'store.get(recipe)')
    store.delete(user)
    py.test.raises(NoUserError, 'store.delete(user)')
    py.test.raises(NoUserError, 'store.get(user)')

    tiddler = Tiddler(u'tiddler9', u'bag9')
    store.get(tiddler)
    assert tiddler.bag == 'bag9'
    assert tiddler.text == 'hey ho 9'
    assert tiddler.tags == ['tag9']
    assert tiddler.fields['field9'] == 'field9'
    assert 'server.host' not in tiddler.fields
    store.delete(tiddler)
    py.test.raises(NoTiddlerError, 'store.delete(tiddler)')
    py.test.raises(NoTiddlerError, 'store.get(tiddler)')
예제 #33
0
파일: __init__.py 프로젝트: FND/tiddlyweb
    @make_command()
    def addrole(args):
        """Add a role to an existing user. <username> [role] [role] [role]"""
        try:
            username = args.pop(0)
            roles = args[0:]
        except (IndexError, ValueError), exc:
            usage('you must provide a user and at least one '
                'role: %s' % exc)

        try:
            store = _store()
            user = User(username)
            user = store.get(user)
            for role in roles:
                user.add_role(role)
            store.put(user)
        except Exception, exc:
            usage('unable to add role to user: %s' % exc)

        return True

    @make_command()
    def adduser(args):
        """Add or update a user to the database: <username> <password> [[role] [role] ...]"""
        try:
            username, password = args[0:2]
        except (IndexError, ValueError):
            usage('you must include at least a username and password')

        try:
예제 #34
0
def test_make_a_bunch():
    for x in xrange(RANGE):
        bag_name = u"bag%s" % x
        recipe_name = u"recipe%s" % x
        tiddler_name = u"tiddler%s" % x
        recipe_list = [(bag_name, "")]
        tiddler_text = u"hey ho %s" % x
        field_name = u"field%s" % x
        tag_name = u"tag%s" % x
        user_name = u"user%s" % x
        user_pass = u"pass%s" % x
        user_note = u"note%s" % x
        user_roles = [u"rolehold", u"role%s" % x]

        bag = Bag(bag_name)
        bag.policy.owner = u"owner%s" % x
        bag.policy.read = [u"hi%s" % x, u"andextra"]
        bag.policy.manage = [u"R:hi%s" % x, u"andmanage"]
        store.put(bag)
        recipe = Recipe(recipe_name)
        recipe.policy.owner = u"owner%s" % x
        recipe.policy.read = [u"hi%s" % x, u"andextra"]
        recipe.policy.manage = [u"R:hi%s" % x, u"andmanage"]
        recipe.set_recipe(recipe_list)
        store.put(recipe)
        tiddler = Tiddler(tiddler_name, bag_name)
        tiddler.text = tiddler_text
        tiddler.fields[field_name] = field_name
        tiddler.fields["server.host"] = u"gunky"
        tiddler.tags = [tag_name]
        store.put(tiddler)
        user = User(user_name)
        user.set_password(user_pass)
        user.note = user_note
        for role in user_roles:
            user.add_role(role)
        store.put(user)

    bags = [bag.name for bag in store.list_bags()]
    recipes = [recipe.name for recipe in store.list_recipes()]
    users = [user.usersign for user in store.list_users()]
    assert len(bags) == RANGE
    assert len(recipes) == RANGE
    assert len(users) == RANGE
    for x in xrange(RANGE):
        bname = u"bag%s" % x
        rname = u"recipe%s" % x
        uname = u"user%s" % x
        assert bname in bags
        assert rname in recipes
        assert uname in users

    bag = Bag("bag0")
    bag = store.get(bag)
    tiddlers = []
    for tiddler in store.list_bag_tiddlers(bag):
        tiddlers.append(store.get(tiddler))
    assert len(tiddlers) == 1
    assert tiddlers[0].title == "tiddler0"
    assert tiddlers[0].fields["field0"] == "field0"
    assert tiddlers[0].tags == ["tag0"]
    assert sorted(bag.policy.read) == ["andextra", "hi0"]
    assert sorted(bag.policy.manage) == ["R:hi0", "andmanage"]
    assert bag.policy.owner == "owner0"

    bag = Bag("bag0")
    bag = store.get(bag)
    bag.policy.read.remove("hi0")
    store.put(bag)
    bag = Bag("bag0")
    bag = store.get(bag)
    assert bag.policy.read == [u"andextra"]

    bag = Bag("bag0")
    bag = store.get(bag)
    bag.policy.read.append(u"hi0")
    store.put(bag)
    bag = Bag("bag0")
    bag = store.get(bag)
    assert sorted(bag.policy.read) == ["andextra", "hi0"]

    user = User("user1")
    user = store.get(user)
    assert user.usersign == "user1"
    assert user.check_password("pass1")
    assert user.note == "note1"
    assert "role1" in user.list_roles()
    assert "rolehold" in user.list_roles()

    recipe = Recipe("recipe2")
    recipe = store.get(recipe)
    assert recipe.name == "recipe2"
    bags = [bag_name for bag_name, filter in recipe.get_recipe()]
    assert len(bags) == 1
    assert "bag2" in bags
    assert sorted(recipe.policy.read) == ["andextra", "hi2"]
    assert sorted(recipe.policy.manage) == ["R:hi2", "andmanage"]
    assert recipe.policy.owner == "owner2"

    recipe.policy.manage = [u"andmanage"]
    store.put(recipe)

    recipe = Recipe("recipe2")
    recipe = store.get(recipe)
    assert recipe.policy.manage == ["andmanage"]

    # delete the above things
    store.delete(bag)
    py.test.raises(NoBagError, "store.delete(bag)")
    py.test.raises(NoBagError, "store.get(bag)")
    store.delete(recipe)
    py.test.raises(NoRecipeError, "store.delete(recipe)")
    py.test.raises(NoRecipeError, "store.get(recipe)")
    store.delete(user)
    py.test.raises(NoUserError, "store.delete(user)")
    py.test.raises(NoUserError, "store.get(user)")

    tiddler = Tiddler("tiddler9", "bag9")
    store.get(tiddler)
    assert tiddler.bag == "bag9"
    assert tiddler.text == "hey ho 9"
    assert tiddler.tags == ["tag9"]
    assert tiddler.fields["field9"] == "field9"
    assert "server.host" not in tiddler.fields
    store.delete(tiddler)
    py.test.raises(NoTiddlerError, "store.delete(tiddler)")
    py.test.raises(NoTiddlerError, "store.get(tiddler)")
예제 #35
0
def register(environ, start_response):
    """
    register the user
    """
    config = environ['tiddlyweb.config']
    store = environ['tiddlyweb.store']
    query = environ['tiddlyweb.query']
    try:
        server_name = query['server_name'][0]
        server_name_sig = query['server_name_sig'][0]
        server_login = query['server_login'][0]
        server_login_sig = query['server_login_sig'][0]
        username = query['login'][0]
        name = query['name'][0]
        email = query['email'][0]
        extra = query['extra'][0]
        redirect = query['redirect'][0]
    except (KeyError, ValueError) as exc:
        raise HTTP400('Incomplete form submission: %s' % exc)

    announcements = query.get('announcements', [None])[0]

    # Bail out if someone corrupted the form input.
    secret = config['secret']
    name_sig = sha('%s%s' % (server_name, secret)).hexdigest()
    login_sig = sha('%s%s' % (server_login, secret)).hexdigest()
    if name_sig != server_name_sig or login_sig != server_login_sig:
        raise HTTP400('Invalid request')

    user = User(username)
    try:
        store.get(user)
        raise HTTP400('That username is not available.')
    except StoreError:  # we expect and want this
        pass

    user.add_role(DEFAULT_ROLE)
    user.note = simplejson.dumps({
        'registered': time(),
        'name': name,
        'email': email,
        'extra': extra,
        'announcements': announcements is not None
    })

    map_bag_name = config.get('magicuser.map', 'MAPUSER')
    ensure_bag(map_bag_name, store, policy_dict=MAP_USER_POLICY)
    tiddler = Tiddler(server_login, map_bag_name)
    try:
        store.get(tiddler)
        raise HTTP400('That remote user is already mapped')
    except StoreError:
        pass
    tiddler.fields['mapped_user'] = username

    store.put(tiddler)
    store.put(user)

    create_wiki(environ,
                '_%s-data' % username,
                mode='private',
                username=username,
                desc='Data Files',
                validate=False)
    create_wiki(environ,
                '%s-notebook' % username,
                mode='private',
                username=username,
                desc='Private Notebook',
                validate=False)
    create_wiki(environ,
                '%s' % username,
                mode='protected',
                username=username,
                desc='Share Stuff',
                validate=False)

    redirect_uri = '%s%s' % (server_base_url(environ), redirect)
    secret = config['secret']
    cookie_age = config.get('cookie_age', None)
    cookie_header_string = make_cookie('tiddlyweb_user',
                                       server_login,
                                       mac_key=secret,
                                       path='/',
                                       expires=cookie_age)
    start_response('303 See Other', [('Set-Cookie', cookie_header_string),
                                     ('Content-Type', 'text/plain'),
                                     ('Location', str(redirect_uri))])
    return [redirect_uri]
예제 #36
0
def _create_user(environ, start_response, creation=0, expiration=0, role="tier1"):
    domain = get_domain(environ["HTTP_HOST"])
    if creation == 0:
        creation = time.time()
    store = environ["tiddlyweb.store"]
    query = environ["tiddlyweb.query"]
    name = query.get("name", [None])[0]
    email = query.get("email", [None])[0]
    company = query.get("company", [None])[0]
    country = query.get("country", [None])[0]
    if not (name and email):
        # The form has not been filled out
        return _user_form(
            environ,
            start_response,
            role=role,
            message="Missing Data!",
            formdata={"name": name, "email": email, "company": company, "country": country},
        )
    user = User(email)
    try:
        user = store.get(user)
        # User exists!
        return _user_form(
            environ,
            start_response,
            role=role,
            message="That account already exists!",
            formdata={"name": name, "email": email, "company": company, "country": country},
        )
    except NoUserError:
        password = _random_pass()
        user.set_password(password)
        user.add_role(role)
        store.put(user)

    bag_name = environ["tiddlyweb.config"].get("magicuser.bag", "MAGICUSER")
    ensure_bag(
        bag_name, store, policy_dict={"read": ["NONE"], "write": ["NONE"], "create": ["NONE"], "manage": ["NONE"]}
    )
    tiddler = Tiddler(email, bag_name)
    tiddler.fields["country"] = country
    tiddler.fields["company"] = company
    tiddler.fields["name"] = name
    # Set the creation and expiration times.
    now = time.time()
    tiddler.fields["creation"] = "%s" % creation
    tiddler.fields["expiry"] = "%s" % expiration
    store.put(tiddler)

    to_address = email
    subject = domain + " user info"
    body = """
Here's your info:
Username: %s
Password: %s
""" % (
        email,
        password,
    )
    query_string = "?email=%s" % to_address
    try:
        send_email(to_address, subject=subject, body=body, from_="avox@" + domain)
        query_string += "&success=1&role=%s" % role
        raise HTTP303(server_base_url(environ) + "/pages/new_account" + query_string)
    except socket.error:
        logging.debug("failed to send: %s:%s:%s", to_address, subject, body)
        query_string += "&failure=1&role=%s" % role
        raise HTTP302(server_base_url(environ) + "/pages/new_account" + query_string)
예제 #37
0
def test_make_a_bunch():
    for x in xrange(RANGE):
        bag_name = u'bag%s' % x
        recipe_name = u'recipe%s' % x
        tiddler_name = u'tiddler%s' % x
        recipe_list = [(bag_name, '')]
        tiddler_text = u'hey ho %s' % x
        field_name = u'field%s' % x
        field_name2 = u'fieldone%s' % x
        tag_name = u'tag%s' % x
        user_name = u'user%s' % x
        user_pass = u'pass%s' % x
        user_note = u'note%s' % x
        user_roles = [u'rolehold', u'role%s' % x]

        bag = Bag(bag_name)
        bag.policy.owner = u'owner%s' % x
        bag.policy.read = [u'hi%s' % x, u'andextra']
        bag.policy.manage = [u'R:hi%s' % x, u'andmanage']
        store.put(bag)
        recipe = Recipe(recipe_name)
        recipe.policy.owner = u'owner%s' % x
        recipe.policy.read = [u'hi%s' % x, u'andextra']
        recipe.policy.manage = [u'R:hi%s' % x, u'andmanage']
        recipe.set_recipe(recipe_list)
        store.put(recipe)
        tiddler = Tiddler(tiddler_name, bag_name)
        tiddler.text = tiddler_text
        tiddler.fields[field_name] = field_name
        tiddler.fields[field_name2] = field_name2
        tiddler.fields['server.host'] = 'gunky'
        tiddler.tags = [tag_name]
        store.put(tiddler)
        store.put(tiddler)
        user = User(user_name)
        user.set_password(user_pass)
        user.note = user_note
        for role in user_roles:
            user.add_role(role)
        store.put(user)

    bags = [bag.name for bag in store.list_bags()]
    recipes = [recipe.name for recipe in store.list_recipes()]
    users = [user.usersign for user in store.list_users()]
    assert len(bags) == RANGE
    assert len(recipes) == RANGE
    assert len(users) == RANGE
    for x in xrange(RANGE):
        bname = 'bag%s' % x
        rname = 'recipe%s' % x
        uname = 'user%s' % x
        assert bname in bags
        assert rname in recipes
        assert uname in users

    tiddler = store.get(Tiddler(u'tiddler0', u'bag0'))
    assert tiddler.fields[u'field0'] == u'field0'
    assert tiddler.fields[u'fieldone0'] == u'fieldone0'

    bag = Bag(u'bag0')
    bag = store.get(bag)
    tiddlers = []
    for tiddler in store.list_bag_tiddlers(bag):
        tiddlers.append(store.get(tiddler))
    assert len(tiddlers) == 1
    assert tiddlers[0].title == 'tiddler0'
    assert tiddlers[0].fields['field0'] == 'field0'
    assert tiddlers[0].fields['fieldone0'] == 'fieldone0'
    assert tiddlers[0].tags == ['tag0']
    assert sorted(bag.policy.read) == ['andextra', 'hi0']
    assert sorted(bag.policy.manage) == ['R:hi0', u'andmanage']
    assert bag.policy.owner == 'owner0'

    user = User(u'user1')
    user = store.get(user)
    assert user.usersign == 'user1'
    assert user.check_password('pass1')
    assert user.note == 'note1'
    assert 'role1' in user.list_roles()
    assert 'rolehold' in user.list_roles()

    recipe = Recipe(u'recipe2')
    recipe = store.get(recipe)
    assert recipe.name == 'recipe2'
    bags = [bag_name for bag_name, filter in recipe.get_recipe()]
    assert len(bags) == 1
    assert 'bag2' in bags
    assert sorted(recipe.policy.read) == ['andextra', 'hi2']
    assert sorted(recipe.policy.manage) == ['R:hi2', u'andmanage']
    assert recipe.policy.owner == 'owner2'

    recipe.policy.manage = [u'andmanage']
    store.put(recipe)

    recipe = Recipe(u'recipe2')
    recipe = store.get(recipe)
    assert recipe.policy.manage == [u'andmanage']

    # delete the above things
    store.delete(bag)
    py.test.raises(NoBagError, 'store.delete(bag)')
    py.test.raises(NoBagError, 'store.get(bag)')
    store.delete(recipe)
    py.test.raises(NoRecipeError, 'store.delete(recipe)')
    py.test.raises(NoRecipeError, 'store.get(recipe)')
    store.delete(user)
    py.test.raises(NoUserError, 'store.delete(user)')
    py.test.raises(NoUserError, 'store.get(user)')

    tiddler = Tiddler(u'tiddler9', u'bag9')
    store.get(tiddler)
    assert tiddler.bag == 'bag9'
    assert tiddler.text == 'hey ho 9'
    assert tiddler.tags == ['tag9']
    assert tiddler.fields['field9'] == 'field9'
    assert 'server.host' not in tiddler.fields
    store.delete(tiddler)
    py.test.raises(NoTiddlerError, 'store.delete(tiddler)')
    py.test.raises(NoTiddlerError, 'store.get(tiddler)')