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')
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()
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')
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
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
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()
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()
def test_that_it_can_be_approved(self): with h.push_config(c, user=M.User()): self.post.approve() assert self.post.status == 'ok'
def mock_user(self): return M.User(username='******')