Ejemplo n.º 1
0
    def test_login_details_from_auditlog(self):
        user = M.User(username='******')

        assert_equal(
            self.provider.login_details_from_auditlog(M.AuditLog(message='')),
            None)

        detail = self.provider.login_details_from_auditlog(
            M.AuditLog(message='IP Address: 1.2.3.4\nFoo', user=user))
        assert_equal(detail.user_id, user._id)
        assert_equal(detail.ip, '1.2.3.4')
        assert_equal(detail.ua, None)

        detail = self.provider.login_details_from_auditlog(
            M.AuditLog(message='Foo\nIP Address: 1.2.3.4\nFoo', user=user))
        assert_equal(detail.ip, '1.2.3.4')
        assert_equal(detail.ua, None)

        assert_equal(
            self.provider.login_details_from_auditlog(
                M.AuditLog(message='blah blah IP Address: 1.2.3.4\nFoo',
                           user=user)), None)

        detail = self.provider.login_details_from_auditlog(
            M.AuditLog(message='User-Agent: Mozilla/Firefox\nFoo', user=user))
        assert_equal(detail.ip, None)
        assert_equal(detail.ua, 'Mozilla/Firefox')

        detail = self.provider.login_details_from_auditlog(
            M.AuditLog(
                message='IP Address: 1.2.3.4\nUser-Agent: Mozilla/Firefox\nFoo',
                user=user))
        assert_equal(detail.ip, '1.2.3.4')
        assert_equal(detail.ua, 'Mozilla/Firefox')
Ejemplo n.º 2
0
 def setUp(self):
     super(TestUsersSearch, self).setUp()
     # Create user that matches TEST_HIT id
     _id = ObjectId('540efdf2100d2b1483155d39')
     u = M.User.query.get(_id=_id)
     if not u:
         M.User(_id=_id, username='******')
         ThreadLocalORMSession().flush_all()
Ejemplo n.º 3
0
    def test_get_login_detail(self):
        user = M.User(username='******')
        detail = self.provider.get_login_detail(Request.blank('/'), user)
        assert_equal(detail.user_id, user._id)
        assert_equal(detail.ip, None)
        assert_equal(detail.ua, None)

        detail = self.provider.get_login_detail(
            Request.blank('/',
                          headers={'User-Agent': 'mybrowser'},
                          environ={'REMOTE_ADDR': '3.3.3.3'}), user)
        assert_equal(detail.user_id, user._id)
        assert_equal(detail.ip, '3.3.3.3')
        assert_equal(detail.ua, 'mybrowser')
Ejemplo n.º 4
0
 def register_user(self, user_doc):
     from allura import model as M
     password = user_doc['password'].encode('utf-8')
     result = M.User(**user_doc)
     dn_u = 'uid=%s,%s' % (user_doc['username'], config['auth.ldap.suffix'])
     uid = str(M.AuthGlobals.get_next_uid())
     try:
         con = ldap.initialize(config['auth.ldap.server'])
         con.bind_s(config['auth.ldap.admin_dn'],
                    config['auth.ldap.admin_password'])
         uname = user_doc['username'].encode('utf-8')
         display_name = user_doc['display_name'].encode('utf-8')
         ldif_u = modlist.addModlist(
             dict(uid=uname,
                  userPassword=password,
                  objectClass=['account', 'posixAccount'],
                  cn=display_name,
                  uidNumber=uid,
                  gidNumber='10001',
                  homeDirectory='/home/' + uname,
                  loginShell='/bin/bash',
                  gecos=uname,
                  description='SCM user account'))
         try:
             con.add_s(dn_u, ldif_u)
         except ldap.ALREADY_EXISTS:
             log.exception('Trying to create existing user %s', uname)
             raise
         con.unbind_s()
         argv = ('schroot -d / -c %s -u root /ldap-userconfig.py init %s' %
                 (config['auth.ldap.schroot_name'],
                  user_doc['username'])).split()
         p = subprocess.Popen(argv,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.STDOUT)
         rc = p.wait()
         if rc != 0:
             log.error('Error creating home directory for %s',
                       user_doc['username'])
     except:
         raise
     return result
Ejemplo n.º 5
0
 def register_user(self, user_doc):
     from allura import model as M
     u = M.User(**user_doc)
     if 'password' in user_doc:
         u.set_password(user_doc['password'])
     return u
Ejemplo n.º 6
0
def bootstrap(command, conf, vars):
    """Place any commands to setup allura here"""
    # are we being called by the test suite?
    test_run = conf.get('__file__', '').endswith('test.ini')

    # if this is a test_run, skip user project creation to save time
    make_user_projects = not test_run

    def make_user(*args, **kw):
        kw.update(make_project=make_user_projects)
        return create_user(*args, **kw)

    # Our bootstrap doesn't play nicely with SFX project and user APIs
    tg.config['auth.method'] = tg.config['registration.method'] = 'local'
    assert tg.config['auth.method'] == 'local'
    conf['auth.method'] = conf['registration.method'] = 'local'

    # Clean up all old stuff
    ThreadLocalORMSession.close_all()
    c.queued_messages = defaultdict(list)
    c.user = c.project = c.app = None
    database = conf.get('db_prefix', '') + 'project:test'
    wipe_database()
    try:
        g.solr.delete(q='*:*')
    except:  # pragma no cover
        log.error('SOLR server is %s', g.solr_server)
        log.error('Error clearing solr index')
    if asbool(conf.get('cache_test_data')):
        if restore_test_data():
            from allura.lib import helpers as h
            h.set_context('test', neighborhood='Projects')
            return
    log.info('Initializing search')

    log.info('Registering root user & default neighborhoods')
    anonymous = M.User(_id=None,
                       username='******',
                       display_name='Anonymous')

    # never make a user project for the root user
    root = create_user('Root', make_project=False)

    n_projects = M.Neighborhood(name='Projects',
                                url_prefix='/p/',
                                features=dict(private_projects=True,
                                              max_projects=None,
                                              css='none',
                                              google_analytics=False))
    n_users = M.Neighborhood(
        name='Users',
        url_prefix='/u/',
        shortname_prefix='u/',
        anchored_tools='profile:Profile,userstats:Statistics',
        features=dict(private_projects=True,
                      max_projects=None,
                      css='none',
                      google_analytics=False))
    n_adobe = M.Neighborhood(name='Adobe',
                             url_prefix='/adobe/',
                             project_list_url='/adobe/',
                             features=dict(private_projects=True,
                                           max_projects=None,
                                           css='custom',
                                           google_analytics=True))
    assert tg.config['auth.method'] == 'local'
    project_reg = plugin.ProjectRegistrationProvider.get()
    p_projects = project_reg.register_neighborhood_project(n_projects, [root],
                                                           allow_register=True)
    p_users = project_reg.register_neighborhood_project(n_users, [root])
    p_adobe = project_reg.register_neighborhood_project(n_adobe, [root])
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()

    # add the adobe icon
    file_name = 'adobe_icon.png'
    file_path = os.path.join(allura.__path__[0], 'public', 'nf', 'images',
                             file_name)
    M.NeighborhoodFile.from_path(file_path, neighborhood_id=n_adobe._id)

    # Add some test users
    for unum in range(10):
        make_user('Test User %d' % unum)

    log.info('Creating basic project categories')
    cat1 = M.ProjectCategory(name='clustering', label='Clustering')

    cat2 = M.ProjectCategory(name='communications', label='Communications')
    cat2_1 = M.ProjectCategory(name='synchronization',
                               label='Synchronization',
                               parent_id=cat2._id)
    cat2_2 = M.ProjectCategory(name='streaming',
                               label='Streaming',
                               parent_id=cat2._id)
    cat2_3 = M.ProjectCategory(name='fax', label='Fax', parent_id=cat2._id)
    cat2_4 = M.ProjectCategory(name='bbs', label='BBS', parent_id=cat2._id)

    cat3 = M.ProjectCategory(name='database', label='Database')
    cat3_1 = M.ProjectCategory(name='front_ends',
                               label='Front-Ends',
                               parent_id=cat3._id)
    cat3_2 = M.ProjectCategory(name='engines_servers',
                               label='Engines/Servers',
                               parent_id=cat3._id)

    log.info('Registering "regular users" (non-root) and default projects')
    # since this runs a lot for tests, separate test and default users and
    # do the minimal needed
    if asbool(conf.get('load_test_data')):
        u_admin = make_user('Test Admin')
        u_admin.preferences = dict(email_address='*****@*****.**')
        u_admin.email_addresses = ['*****@*****.**']
        u_admin.set_password('foo')
        u_admin.claim_address('*****@*****.**')
    else:
        u_admin = make_user('Admin 1', username='******')
        # Admin1 is almost root, with admin access for Users and Projects neighborhoods
        p_projects.add_user(u_admin, ['Admin'])
        p_users.add_user(u_admin, ['Admin'])

        p_allura = n_projects.register_project('allura', u_admin)
    u1 = make_user('Test User')
    p_adobe1 = n_adobe.register_project('adobe-1', u_admin)
    p_adobe.add_user(u_admin, ['Admin'])
    p0 = n_projects.register_project('test', u_admin)
    p1 = n_projects.register_project('test2', u_admin)
    p0._extra_tool_status = ['alpha', 'beta']

    sess = session(M.Neighborhood)  # all the sessions are the same
    for x in (n_adobe, n_projects, n_users, p_projects, p_users, p_adobe):
        # Ming doesn't detect substructural changes in newly created objects (vs loaded from DB)
        state(x).status = 'dirty'
        # TODO: Hope that Ming can be improved to at least avoid stuff below
        sess.flush(x)

    c.project = p0
    c.user = u_admin
    p1 = p0.new_subproject('sub1')
    ThreadLocalORMSession.flush_all()
    if asbool(conf.get('load_test_data')):
        if asbool(conf.get('cache_test_data')):
            cache_test_data()
    else:  # pragma no cover
        # regular first-time setup
        p0.add_user(u_admin, ['Admin'])
        log.info('Registering initial apps')
        for ep_name, app in g.entry_points['tool'].iteritems():
            if not app.installable:
                continue
            p0.install_app(ep_name)
    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
Ejemplo n.º 7
0
def bootstrap(command, conf, vars):
    """Place any commands to setup allura here"""
    # are we being called by the test suite?
    test_run = conf.get('__file__', '').endswith('test.ini')

    if not test_run:
        # when this is run via the `setup-app` cmd, some macro rendering needs this set up
        REGISTRY.register(ew.widget_context,
                          ew.core.WidgetContext('http', ew.ResourceManager()))

    create_test_data = asbool(os.getenv('ALLURA_TEST_DATA', True))

    # if this is a test_run, skip user project creation to save time
    make_user_projects = not test_run

    def make_user(*args, **kw):
        kw.update(make_project=make_user_projects)
        return create_user(*args, **kw)

    # Temporarily disable auth extensions to prevent unintended side-effects
    tg.config['auth.method'] = tg.config['registration.method'] = 'local'
    assert tg.config['auth.method'] == 'local'
    conf['auth.method'] = conf['registration.method'] = 'local'

    # Clean up all old stuff
    ThreadLocalORMSession.close_all()
    c.user = c.project = c.app = None
    wipe_database()
    try:
        g.solr.delete(q='*:*')
    except:  # pragma no cover
        log.error('SOLR server is %s', g.solr_server)
        log.error('Error clearing solr index')

    # set up mongo indexes
    index = EnsureIndexCommand('ensure_index')
    index.run([''])

    if create_test_data and asbool(conf.get('cache_test_data')):
        if restore_test_data():
            h.set_context('test', neighborhood='Projects')
            return
    log.info('Initializing search')

    log.info('Registering root user & default neighborhoods')
    M.User(
        _id=None,
        username='******',
        display_name='Anonymous')

    # never make a user project for the root user
    if create_test_data:
        root = create_user('Root', make_project=False)
    else:
        from getpass import getpass
        root_name = raw_input('Enter username for root user (default "root"): ').strip()
        if not root_name:
            root_name = 'root'
        ok = False
        while not ok:
            root_password1 = getpass('Enter password: '******'Password must not be empty')
                continue
            root_password2 = getpass('Confirm password: '******'t match")
                continue
            root = create_user(root_name, password=root_password1, make_project=False)
            ok = True

    n_projects = M.Neighborhood(name='Projects', url_prefix='/p/',
                                features=dict(private_projects=True,
                                              max_projects=None,
                                              css='none',
                                              google_analytics=False))
    n_users = M.Neighborhood(name='Users', url_prefix='/u/',
                             shortname_prefix='u/',
                             anchored_tools='profile:Profile,userstats:Statistics',
                             features=dict(private_projects=True,
                                           max_projects=None,
                                           css='none',
                                           google_analytics=False))

    assert tg.config['auth.method'] == 'local'
    project_reg = plugin.ProjectRegistrationProvider.get()
    p_projects = project_reg.register_neighborhood_project(
        n_projects, [root], allow_register=True)
    p_users = project_reg.register_neighborhood_project(n_users, [root])

    def set_nbhd_wiki_content(nbhd_proj, content):
        wiki = nbhd_proj.app_instance('wiki')
        page = WM.Page.query.get(
            app_config_id=wiki.config._id, title=wiki.root_page_name)
        page.text = content

    set_nbhd_wiki_content(p_projects, dedent('''
        Welcome to the "Projects" neighborhood.  It is the default neighborhood in Allura.
        You can edit this wiki page as you see fit.  Here's a few ways to get started:

        [Register a new project](/p/add_project)

        [Neighborhood administration](/p/admin)

        [[projects show_total=yes]]
        '''))
    set_nbhd_wiki_content(p_users, dedent('''
        This is the "Users" neighborhood.
        All users automatically get a user-project created for them, using their username.

        [Neighborhood administration](/u/admin)

        [[projects show_total=yes]]
        '''))
    if create_test_data:
        n_adobe = M.Neighborhood(
            name='Adobe', url_prefix='/adobe/', project_list_url='/adobe/',
            features=dict(private_projects=True,
                          max_projects=None,
                          css='custom',
                          google_analytics=True))
        p_adobe = project_reg.register_neighborhood_project(n_adobe, [root])
        set_nbhd_wiki_content(p_adobe, dedent('''
            This is the "Adobe" neighborhood.  It is just an example of having projects in a different neighborhood.

            [Neighborhood administration](/adobe/admin)

            [[projects show_total=yes]]
            '''))
        # add the adobe icon
        file_name = 'adobe_icon.png'
        file_path = os.path.join(
            allura.__path__[0], 'public', 'nf', 'images', file_name)
        M.NeighborhoodFile.from_path(file_path, neighborhood_id=n_adobe._id)

    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()

    if create_test_data:
        # Add some test users
        for unum in range(10):
            make_user('Test User %d' % unum)

    log.info('Creating basic project categories')
    M.ProjectCategory(name='clustering', label='Clustering')
    cat2 = M.ProjectCategory(name='communications', label='Communications')
    M.ProjectCategory(
        name='synchronization', label='Synchronization', parent_id=cat2._id)
    M.ProjectCategory(
        name='streaming', label='Streaming', parent_id=cat2._id)
    M.ProjectCategory(name='fax', label='Fax', parent_id=cat2._id)
    M.ProjectCategory(name='bbs', label='BBS', parent_id=cat2._id)

    cat3 = M.ProjectCategory(name='database', label='Database')
    M.ProjectCategory(
        name='front_ends', label='Front-Ends', parent_id=cat3._id)
    M.ProjectCategory(
        name='engines_servers', label='Engines/Servers', parent_id=cat3._id)

    if create_test_data:
        log.info('Registering "regular users" (non-root) and default projects')
        # since this runs a lot for tests, separate test and default users and
        # do the minimal needed
        if asbool(conf.get('load_test_data')):
            u_admin = make_user('Test Admin')
            u_admin.preferences = dict(email_address='*****@*****.**')
            u_admin.email_addresses = ['*****@*****.**']
            u_admin.set_password('foo')
            u_admin.claim_address('*****@*****.**')
            ThreadLocalORMSession.flush_all()

            admin_email = M.EmailAddress.get(email='*****@*****.**')
            admin_email.confirmed = True
        else:
            u_admin = make_user('Admin 1', username='******')
            # Admin1 is almost root, with admin access for Users and Projects
            # neighborhoods
            p_projects.add_user(u_admin, ['Admin'])
            p_users.add_user(u_admin, ['Admin'])

            n_projects.register_project('allura', u_admin, 'Allura')
        make_user('Test User')
        n_adobe.register_project('adobe-1', u_admin, 'Adobe project 1')
        p_adobe.add_user(u_admin, ['Admin'])
        p0 = n_projects.register_project('test', u_admin, 'Test Project')
        n_projects.register_project('test2', u_admin, 'Test 2')
        p0._extra_tool_status = ['alpha', 'beta']

    sess = session(M.Neighborhood)  # all the sessions are the same
    _list = (n_projects, n_users, p_projects, p_users)
    if create_test_data:
        _list += (n_adobe, p_adobe)
    for x in _list:
        # Ming doesn't detect substructural changes in newly created objects
        # (vs loaded from DB)
        state(x).status = 'dirty'
        # TODO: Hope that Ming can be improved to at least avoid stuff below
        sess.flush(x)

    ThreadLocalORMSession.flush_all()

    if asbool(conf.get('load_test_data')):
        if asbool(conf.get('cache_test_data')):
            cache_test_data()
    else:  # pragma no cover
        # regular first-time setup

        create_trove_categories = CreateTroveCategoriesCommand('create_trove_categories')
        create_trove_categories.run([''])

        if create_test_data:
            p0.add_user(u_admin, ['Admin'])
            log.info('Registering initial apps')
            with h.push_config(c, user=u_admin):
                p0.install_apps([{'ep_name': ep_name}
                                 for ep_name, app in g.entry_points['tool'].iteritems()
                                 if app._installable(tool_name=ep_name,
                                                     nbhd=n_projects,
                                                     project_tools=[])
                                 ])

    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()

    if create_test_data:
        # reload our p0 project so that p0.app_configs is accurate with all the
        # newly installed apps
        p0 = M.Project.query.get(_id=p0._id)
        sub = p0.new_subproject('sub1', project_name='A Subproject')
        with h.push_config(c, user=u_admin):
            sub.install_app('wiki')

    ThreadLocalORMSession.flush_all()
    ThreadLocalORMSession.close_all()
Ejemplo n.º 8
0
 def test_that_it_can_be_approved(self):
     with h.push_config(c, user=M.User()):
         self.post.approve()
     assert self.post.status == 'ok'
Ejemplo n.º 9
0
 def mock_user(self):
     return M.User(username='******')