added a page to list the platforms plugged into MySlice, need to be improved...
[myslice.git] / portal / views.py
index d55fc17..abbb36e 100644 (file)
@@ -43,23 +43,28 @@ from unfold.page                 import Page
 from myslice.viewutils           import topmenu_items, the_user
 from django.http                 import HttpResponseRedirect, HttpResponse
 
+from M2Crypto                    import Rand, RSA, BIO
+import os, re
+
 class DashboardView(TemplateView):
     template_name = "dashboard.html"
 
     def get_context_data(self, **kwargs):
-        user_hrn = 'ple.upmc.jordan_auge'
-        #user_hrn = 'iotlab.auge'
+        # We might have slices on different registries with different user accounts 
+        # We note that this portal could be specific to a given registry, to which we register users, but i'm not sure that simplifies things
+        # Different registries mean different identities, unless we identify via SFA HRN or have associated the user email to a single hrn
 
         #messages.info(self.request, 'You have logged in')
         page = Page(self.request)
 
         # Slow...
         #slice_query = Query().get('slice').filter_by('user.user_hrn', 'contains', user_hrn).select('slice_hrn')
-        slice_query = Query().get('user').filter_by('user_hrn', '==', user_hrn).select('user_hrn', 'slice.slice_hrn')
+        slice_query = Query().get('user').filter_by('user_hrn', '==', '$user_hrn').select('user_hrn', 'slice.slice_hrn')
         auth_query  = Query().get('network').select('network_hrn')
         page.enqueue_query(slice_query)
         page.enqueue_query(auth_query)
 
+        page.expose_js_metadata()
         page.expose_queries()
 
         slicelist = SimpleList(
@@ -468,10 +473,52 @@ class UserValidateView(ActivationView):
 
 # View for my_account form
 def my_account(request):
-    return render(request, 'my_account.html')
+    return render(request, 'my_account.html', {
+        #'form': form,
+        'topmenu_items': topmenu_items('My Account', request),
+        'username': the_user (request)
+    })
+
+# View for platforms
+class PlatformsView(TemplateView):
+    template_name = "platforms.html"
+
+    def get_context_data(self, **kwargs):
+        page = Page(self.request)
+
+        network_query  = Query().get('local:platform').select('platform')
+        page.enqueue_query(network_query)
+
+        page.expose_js_metadata()
+        page.expose_queries()
+
+        networklist = SimpleList(
+            title = None,
+            page  = page,
+            key   = 'platform',
+            query = network_query,
+        )
+
+        context = super(PlatformsView, self).get_context_data(**kwargs)
+        context['person']   = self.request.user
+        context['networks'] = networklist.render(self.request)
+
+        # XXX This is repeated in all pages
+        # more general variables expected in the template
+        context['title'] = 'Platforms connected to MySlice'
+        # the menu items on the top
+        context['topmenu_items'] = topmenu_items('Platforms', self.request)
+        # so we can sho who is logged
+        context['username'] = the_user(self.request)
+
+        context.update(page.prelude_env())
+
+        return context
 
 #my_acc form value processing
 def acc_process(request):
+    # getting the user_id from the session [now hardcoded]
+    get_user = PendingUser.objects.get(id='1') # here we will get the id/email from session e.g., person.email
     if 'submit_name' in request.POST:
         edited_first_name =  request.POST['fname']
         edited_last_name =  request.POST['lname']
@@ -484,12 +531,12 @@ def acc_process(request):
         #approach borrowed from register view     
         #new_user = PendingUser.objects.create_inactive_user(edited_first_name, edited_last_name, email,  password, site) 
         #conventional approach
-        #b = PendingUser(first_name=edited_first_name, edited_last_name=last_name)
+        #b = PendingUser(first_name=edited_first_name, last_name=edited_last_name)
         #b.save()
         
         # select and update [will be used throughout this view]
         # select the logged in user [for the moment hard coded]
-        get_user = PendingUser.objects.get(id='1') # here we will get the id/email from session e.g., person.email
+        #get_user = PendingUser.objects.get(id='1') # here we will get the id/email from session e.g., person.email
         # update first and last name
         get_user.first_name = edited_first_name
         get_user.last_name = edited_last_name
@@ -499,20 +546,145 @@ def acc_process(request):
     elif 'submit_pass' in request.POST:
         edited_password = request.POST['password']
         # select the logged in user [for the moment hard coded]
-        get_user = PendingUser.objects.get(id='1') # here we will get the id/email from session e.g., person.email
+        #get_user = PendingUser.objects.get(id='1') # here we will get the id/email from session e.g., person.email
         # update password
         get_user.password = edited_password
         get_user.save()
         return HttpResponse('Success: Password Changed!!')
     elif 'generate' in request.POST:
-        a =2
-        message = 'Here will generate ssh-rsa keys :D %d' %a
-        return HttpResponse(message)
+        #import os
+        #from M2Crypto import Rand, RSA, BIO
+
+        KEY_LENGTH = 2048
+
+        def blank_callback():
+            "Replace the default dashes"
+            return
+
+        # Random seed
+        Rand.rand_seed (os.urandom (KEY_LENGTH))
+        # Generate key pair
+        key = RSA.gen_key (KEY_LENGTH, 65537, blank_callback)
+        # Create memory buffers
+        pri_mem = BIO.MemoryBuffer()
+        pub_mem = BIO.MemoryBuffer()
+        # Save keys to buffers
+        key.save_key_bio(pri_mem, None)
+        key.save_pub_key_bio(pub_mem)
+
+        # Get keys 
+        public_key = pub_mem.getvalue()
+        private_key = pri_mem.getvalue()
+        # Saving to DB
+        keypair = '{"user_public_key":"'+ public_key + '", "user_private_key":"'+ private_key + '"}'
+        keypair = re.sub("\r", "", keypair)
+        keypair = re.sub("\n", "\\n", keypair)
+        #keypair = keypair.rstrip('\r\n')
+        keypair = ''.join(keypair.split())
+        get_user.keypair = keypair
+        get_user.save()
+        return HttpResponse('Success: New Keypair Generated! %s' % keypair)
+
+    elif 'upload_key' in request.POST:
+        up_file = request.FILES['pubkey']
+        file_content =  up_file.read()
+        file_name = up_file.name
+        file_extension = os.path.splitext(file_name)[1] 
+        allowed_extension =  ['.pub','.txt']
+        if file_extension in allowed_extension and re.search(r'ssh-rsa',file_content):
+            file_content = '{"user_public_key":"'+ file_content +'"}'
+            file_content = re.sub("\r", "", file_content)
+            file_content = re.sub("\n", "\\n",file_content)
+            file_content = ''.join(file_content.split())
+            get_user.keypair = file_content
+            get_user.save()
+            return HttpResponse('Success: Publickey uploaded! Old records overwritten')
+        else:
+            return HttpResponse('Please upload a valid RSA public key [.txt or .pub].')    
+        
     else:
         message = 'You submitted an empty form.'
         return HttpResponse(message)
 
+def register_4m_f4f(request):
+    #return render(request, 'register_4m_f4f.html')
 
+#def reg_4m_f4f_process(request):
+    if 'submit' in request.POST:
+        #get_email = PendingUser.objects.get(email)
+        reg_fname = request.POST['firstname']
+        reg_lname = request.POST['lastname']
+        reg_aff = request.POST['affiliation']
+        reg_email = request.POST['email'].lower()
+        
+        #POST value validation  
+        if (re.search(r'^[\w+\s.@+-]+$', reg_fname)==None):
+            messages.error(request, 'First Name may contain only letters, numbers, spaces and @/./+/-/_ characters.')
+            #return HttpResponse("Only Letters, Numbers, - and _ allowd in First Name")
+            return render(request, 'register_4m_f4f.html')
+        if (re.search(r'^[\w+\s.@+-]+$', reg_lname) == None):
+            messages.error(request, 'Last Name may contain only letters, numbers, spaces and @/./+/-/_ characters.')
+            #return HttpResponse("Only Letters, Numbers, - and _ is allowed in Last name")
+            return render(request, 'register_4m_f4f.html')
+        if (re.search(r'^[\w+\s.@+-]+$', reg_aff) == None):
+            messages.error(request, 'Affiliation may contain only letters, numbers, spaces and @/./+/-/_ characters.')
+            #return HttpResponse("Only Letters, Numbers and _ is allowed in Affiliation")
+            return render(request, 'register_4m_f4f.html')
+        if PendingUser.objects.filter(email__iexact=reg_email):
+            messages.error(request, 'Email already registered.Please provide a new email address.')
+            #return HttpResponse("Email Already exists")
+            return render(request, 'register_4m_f4f.html')
+        if 'generate' in request.POST['question']:
+            #import os
+            #from M2Crypto import Rand, RSA, BIO
+            
+            KEY_LENGTH = 2048
+
+            def blank_callback():
+                "Replace the default dashes"
+                return
+
+            # Random seed
+            Rand.rand_seed (os.urandom (KEY_LENGTH))
+            # Generate key pair
+            key = RSA.gen_key (KEY_LENGTH, 65537, blank_callback)
+            # Create memory buffers
+            pri_mem = BIO.MemoryBuffer()
+            pub_mem = BIO.MemoryBuffer()
+            # Save keys to buffers
+            key.save_key_bio(pri_mem, None)
+            key.save_pub_key_bio(pub_mem)
+            # Get keys 
+            public_key = pub_mem.getvalue()
+            private_key = pri_mem.getvalue()
+            # Saving to DB
+            keypair = '{"user_public_key":"'+ public_key + '", "user_private_key":"'+ private_key + '"}'
+            keypair = re.sub("\r", "", keypair)
+            keypair = re.sub("\n", "\\n", keypair)
+            #keypair = keypair.rstrip('\r\n')
+            keypair = ''.join(keypair.split())
+            #return HttpResponse(keypair)
+        else:
+            up_file = request.FILES['user_public_key']
+            file_content =  up_file.read()
+            file_name = up_file.name
+            file_extension = os.path.splitext(file_name)[1]
+            allowed_extension =  ['.pub','.txt']
+            if file_extension in allowed_extension and re.search(r'ssh-rsa',file_content):
+                keypair = '{"user_public_key":"'+ file_content +'"}'
+                keypair = re.sub("\r", "", keypair)
+                keypair = re.sub("\n", "\\n",keypair)
+                keypair = ''.join(keypair.split())
+            else:
+                return HttpResponse('Please upload a valid RSA public key [.txt or .pub].')
+
+        b = PendingUser(first_name=reg_fname, last_name=reg_lname, affiliation=reg_aff, 
+                        email=reg_email, password=request.POST['password'], keypair=keypair)
+        b.save()
+
+        return render(request, 'user_register_complete.html')
+    return render(request, 'register_4m_f4f.html')        
+    
 
 # view for contact form
 def contact(request):
@@ -537,9 +709,12 @@ def contact(request):
             return render(request,'contact_sent.html') # Redirect after POST
     else:
         form = ContactForm() # An unbound form
-
+    
     return render(request, 'contact.html', {
         'form': form,
+        'topmenu_items': topmenu_items('Contact Us', request),
+        'username': the_user (request)
+
     })