From fc73a99025ba9125c5d3aa2264179af0646e6568 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jordan=20Aug=C3=A9?= Date: Fri, 18 Oct 2013 17:42:00 +0200 Subject: [PATCH] manifold.api : fixed authentication as admin portal.registration, portal.slicerequest: improved authority queries portal.slicerequest: added help messages --- manifold/manifoldapi.py | 19 ++++++++++----- myslice/config.py | 18 ++++++++++++++ portal/forms.py | 30 ++++++++++++++++++------ portal/registrationview.py | 15 ++++++++---- portal/slicerequestview.py | 19 ++++++++++----- portal/templates/slice-request-view.html | 3 ++- 6 files changed, 80 insertions(+), 24 deletions(-) diff --git a/manifold/manifoldapi.py b/manifold/manifoldapi.py index 2a64a498..c00882ae 100644 --- a/manifold/manifoldapi.py +++ b/manifold/manifoldapi.py @@ -78,12 +78,7 @@ class ManifoldAPI: return func -def execute_query(request, query): - if not 'manifold' in request.session or not 'auth' in request.session['manifold']: - print "W: Using hardcoded demo account for execute_query" - manifold_api_session_auth = {'AuthMethod': 'password', 'Username': 'demo', 'AuthString': 'demo'} - else: - manifold_api_session_auth = request.session['manifold']['auth'] +def _execute_query(request, query, manifold_api_session_auth): manifold_api = ManifoldAPI(auth=manifold_api_session_auth) print "-"*80 print query @@ -97,3 +92,15 @@ def execute_query(request, query): #Error running query: {'origin': [0, 'XMLRPCAPI'], 'code': 2, 'description': 'No such session: No row was found for one()', 'traceback': 'Traceback (most recent call last):\n File "/usr/local/lib/python2.7/dist-packages/manifold/core/xmlrpc_api.py", line 68, in xmlrpc_forward\n user = Auth(auth).check()\n File "/usr/local/lib/python2.7/dist-packages/manifold/auth/__init__.py", line 245, in check\n return self.auth_method.check()\n File "/usr/local/lib/python2.7/dist-packages/manifold/auth/__init__.py", line 95, in check\n raise AuthenticationFailure, "No such session: %s" % e\nAuthenticationFailure: No such session: No row was found for one()\n', 'type': 2, 'ts': None, 'value': None} return result['value'] + +def execute_query(request, query): + if not 'manifold' in request.session or not 'auth' in request.session['manifold']: + raise Exception, "User not authenticated" + manifold_api_session_auth = request.session['manifold']['auth'] + return _execute_query(request, query, manifold_api_session_auth) + +def execute_admin_query(request, query): + config = Config() + admin_user, admin_password = config.manifold_admin_user_password() + admin_auth = {'AuthMethod': 'password', 'Username': admin_user, 'AuthString': admin_password} + return _execute_query(request, query, admin_auth) diff --git a/myslice/config.py b/myslice/config.py index 9cf24072..51bf4b79 100644 --- a/myslice/config.py +++ b/myslice/config.py @@ -16,11 +16,15 @@ class Config: # if you use a development backend running on this box, use "http://localhost:7080/" # the INRIA setup is with "http://manifold.pl.sophia.inria.fr:7080/" + default_manifold_admin_user = 'admin' + default_manifold_admin_password = None + _config_parser = None # having grown tired of screwing up with git stashes # taking away my local config, we now more properly use # an external config file to override teh default + # XXX we might use support from manifold util classes --jordan @staticmethod def manifold_url (): if Config._config_parser: @@ -32,6 +36,20 @@ class Config: Config._config_parser=config return Config.manifold_url() + @staticmethod + def manifold_admin_user_password(): + if Config._config_parser: + admin_user = Config._config_parser.get('manifold','admin_user') + admin_password = Config._config_parser.get('manifold','admin_password') + return (admin_user, admin_password) + config = RawConfigParser () + config.add_section('manifold') + config.set ('manifold', 'admin_user', Config.default_manifold_admin_user) + config.set ('manifold', 'admin_password', Config.default_manifold_admin_password) + config.read (os.path.join(ROOT,'myslice/myslice.ini')) + Config._config_parser=config + return Config.manifold_admin_user_password() + # exporting these details to js @staticmethod def manifold_js_export (): diff --git a/portal/forms.py b/portal/forms.py index 109d9669..075f9427 100644 --- a/portal/forms.py +++ b/portal/forms.py @@ -62,13 +62,29 @@ class SliceRequestForm(forms.Form): # email = forms.EmailField() # cc_myself = forms.BooleanField(required=False) - slice_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'})) - authority_hrn = forms.ChoiceField(choices=[(1, 'un')],widget=forms.Select(attrs={'class':'form-control'})) - number_of_nodes = forms.DecimalField(widget=forms.TextInput(attrs={'class':'form-control'})) - type_of_nodes = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'})) - purpose = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control'})) - email = forms.EmailField(widget=forms.TextInput(attrs={'class':'form-control'})) - cc_myself = forms.BooleanField(required=False,widget=forms.CheckboxInput(attrs={'class':'form-control'})) + slice_name = forms.CharField( + widget=forms.TextInput(attrs={'class':'form-control'}), + help_text="Enter a name for the slice you wish to create") + authority_hrn = forms.ChoiceField( + widget = forms.Select(attrs={'class':'form-control'}), + choices = [], + help_text = "Please select an authority responsible for vetting your slice") + number_of_nodes = forms.DecimalField( + widget = forms.TextInput(attrs={'class':'form-control'}), + help_text = "Enter the number of nodes you expect to request (informative only)") + type_of_nodes = forms.CharField( + widget = forms.TextInput(attrs={'class':'form-control'}), + help_text = "Enter the type of nodes you expect to request (informative only)") + purpose = forms.CharField( + widget = forms.Textarea(attrs={'class':'form-control'}), + help_text = "Enter the purpose of your experiment (informative only)") + email = forms.EmailField( + widget = forms.TextInput(attrs={'class':'form-control'}), + help_text = "Enter your email address") + cc_myself = forms.BooleanField( + widget = forms.CheckboxInput(attrs={'class':'form-control'}), + required = False, + help_text = "Please indicate whether you would like to be CC'ed to the request email") def __init__(self, *args, **kwargs): initial = kwargs.get('initial', {}) diff --git a/portal/registrationview.py b/portal/registrationview.py index aefdaa71..1f8ab8b8 100644 --- a/portal/registrationview.py +++ b/portal/registrationview.py @@ -9,7 +9,7 @@ from django.shortcuts import render from unfold.page import Page from ui.topmenu import topmenu_items -from manifold.manifoldapi import execute_query +from manifold.manifoldapi import execute_admin_query from manifold.core.query import Query from portal.models import PendingUser @@ -30,10 +30,17 @@ class RegistrationView (View): errors = [] authorities_query = Query.get('authority').\ - filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']).\ select('name', 'authority_hrn') - #authorities_query = Query.get('authority').select('authority_hrn') - authorities = execute_query(request, authorities_query) + + onelab_enabled_query = Query.get('local:platform').filter_by('platform', '==', 'ple-onelab').filter_by('disabled', '==', 'False') + onelab_enabled = not not execute_admin_query(request, onelab_enabled_query) + if onelab_enabled: + print "ONELAB ENABLED" + authorities_query = authorities_query.filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']) + else: + print "FIREXP ENABLED" + + authorities = execute_admin_query(request, authorities_query) # xxx tocheck - if authorities is empty, it's no use anyway # (users won't be able to validate the form anyway) diff --git a/portal/slicerequestview.py b/portal/slicerequestview.py index de1f83df..5f6c7861 100644 --- a/portal/slicerequestview.py +++ b/portal/slicerequestview.py @@ -3,7 +3,7 @@ from django.shortcuts import render from django.core.mail import send_mail from manifold.core.query import Query -from manifold.manifoldapi import execute_query +from manifold.manifoldapi import execute_admin_query, execute_query from portal.models import PendingSlice from portal.actions import authority_get_pi_emails @@ -14,12 +14,19 @@ from ui.topmenu import topmenu_items, the_user class SliceRequestView (LoginRequiredAutoLogoutView): def authority_hrn_initial (self, request): -# authorities_query = Query.get('authority').filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']).select('name', 'authority_hrn') - authorities_query = Query.get('authority').select('authority_hrn') - authorities = execute_query(request, authorities_query) - authorities = sorted(authorities) + authorities_query = Query.get('authority').\ + select('name', 'authority_hrn') - authority_hrn_tuples = [ (authority['authority_hrn'], authority['name'],) for authority in authorities ] + onelab_enabled_query = Query.get('local:platform').filter_by('platform', '==', 'ple-onelab').filter_by('disabled', '==', 'False') + onelab_enabled = not not execute_admin_query(request, onelab_enabled_query) + if onelab_enabled: + authorities_query = authorities_query.filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']) + + authorities = execute_admin_query(request, authorities_query) + #authorities = sorted(authorities) + + authority_hrn_tuples = [ (authority['authority_hrn'], authority['name'] if authority['name'] else authority['authority_hrn'],) for authority in authorities ] + print "authority_hrn_tuples=", authority_hrn_tuples return {'authority_hrn': authority_hrn_tuples} # because we inherit LoginRequiredAutoLogoutView that is implemented by redefining 'dispatch' diff --git a/portal/templates/slice-request-view.html b/portal/templates/slice-request-view.html index 6983354b..f437ae00 100644 --- a/portal/templates/slice-request-view.html +++ b/portal/templates/slice-request-view.html @@ -21,7 +21,8 @@ {% for field in form %}
-
{{ field.errors }} {{ field }}

{{ field.help_text }}

+
{{ field.errors }} {{ field }}
+

{{ field.help_text }}

{% endfor %}
-- 2.43.0