81935424b5c825c477e0603a8b76e148b4928ad2
[myslice.git] / portal / accountview.py
1 from unfold.loginrequired               import LoginRequiredAutoLogoutView
2 #
3 from sfa.trust.credential               import Credential
4 from sfa.trust.certificate              import Keypair
5 #
6 from manifold.core.query                import Query
7 from manifoldapi.manifoldapi            import execute_query
8 from portal.actions                     import manifold_update_user, manifold_update_account, manifold_add_account, manifold_delete_account, sfa_update_user, sfa_get_user, clear_user_creds
9 #
10 from unfold.page                        import Page    
11 from ui.topmenu                         import topmenu_items_live, the_user
12 #
13 from django.http                        import HttpResponse, HttpResponseRedirect
14 from django.contrib                     import messages
15 from django.contrib.auth.decorators     import login_required
16
17 from myslice.theme import ThemeView
18
19 from portal.account                     import Account, get_expiration
20 #
21 import json, os, re, itertools, time
22 from OpenSSL import crypto
23 from Crypto.PublicKey import RSA
24
25 # requires login
26 class AccountView(LoginRequiredAutoLogoutView, ThemeView):
27     template_name = "account-view.html"
28     def dispatch(self, *args, **kwargs):
29         return super(AccountView, self).dispatch(*args, **kwargs)
30
31
32     def get_context_data(self, **kwargs):
33         self.template_name = self.template
34         page = Page(self.request)
35         metadata = page.get_metadata()
36         page.expose_js_metadata()
37
38         page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/my_account.edit_profile.js","js/jquery-ui.js" ] )
39         page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css" ] )
40
41         # Execute a Query to delegate credentials if necessary
42         sfa_user_query  = Query().get('myslice:user').select('user_hrn').filter_by('user_hrn','==','$user_hrn')
43         sfa_user_result = execute_query(self.request, sfa_user_query)
44
45         user_query  = Query().get('local:user').select('config','email','status')
46         user_details = execute_query(self.request, user_query)
47         
48         # not always found in user_details...
49         config={}
50         for user_detail in user_details:
51             # different significations of user_status
52             if user_detail['status'] == 0: 
53                 user_status = 'Disabled'
54             elif user_detail['status'] == 1:
55                 user_status = 'Validation Pending'
56             elif user_detail['status'] == 2:
57                 user_status = 'Enabled'
58             else:
59                 user_status = 'N/A'
60             #email = user_detail['email']
61             if user_detail['config']:
62                 config = json.loads(user_detail['config'])
63
64         platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
65         account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
66         platform_details = execute_query(self.request, platform_query)
67         account_details = execute_query(self.request, account_query)
68        
69         # initial assignment needed for users having account.config = {} 
70         platform_name = ''
71         account_type = ''
72         account_usr_hrn = ''
73         account_pub_key = ''
74         account_priv_key = ''
75         account_reference = ''
76         my_users = ''
77         my_slices = ''
78         my_auths = ''
79         ref_acc_list = ''
80         principal_acc_list = ''
81         user_status_list = []
82         platform_name_list = []
83         platform_name_secondary_list = []
84         platform_access_list = []
85         platform_no_access_list = []
86         total_platform_list = []
87         account_type_list = []
88         account_type_secondary_list = []
89         account_reference_list = []
90         delegation_type_list = []
91         user_cred_exp_list = []
92         slice_list = []
93         auth_list = []
94         slice_cred_exp_list = []
95         auth_cred_exp_list = []
96         usr_hrn_list = []
97         pub_key_list = []
98           
99         for platform_detail in platform_details:
100             if 'sfa' in platform_detail['gateway_type']:
101                 total_platform = platform_detail['platform']
102                 total_platform_list.append(total_platform)
103                 
104             for account_detail in account_details:
105                 if platform_detail['platform_id'] == account_detail['platform_id']:
106                     platform_name = platform_detail['platform']
107                     if 'config' in account_detail and account_detail['config'] is not '':
108                         account_config = json.loads(account_detail['config'])
109                         account_usr_hrn = account_config.get('user_hrn','N/A')
110                         account_pub_key = account_config.get('user_public_key','N/A')
111                         account_reference = account_config.get ('reference_platform','N/A')
112                     # credentials of myslice platform
113                     if 'myslice' in platform_detail['platform']:
114                         acc_user_cred = account_config.get('delegated_user_credential','N/A')
115                         acc_slice_cred = account_config.get('delegated_slice_credentials','N/A')
116                         acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
117
118                         if 'N/A' not in acc_user_cred:
119                             exp_date = re.search('<expires>(.*)</expires>', acc_user_cred)
120                             if exp_date:
121                                 user_exp_date = exp_date.group(1)
122                                 user_cred_exp_list.append(user_exp_date)
123
124                             my_users = [{'cred_exp': t[0]}
125                                 for t in zip(user_cred_exp_list)]
126                        
127
128                         if 'N/A' not in acc_slice_cred:
129                             for key, value in acc_slice_cred.iteritems():
130                                 slice_list.append(key)
131                                 # get cred_exp date
132                                 exp_date = re.search('<expires>(.*)</expires>', value)
133                                 if exp_date:
134                                     exp_date = exp_date.group(1)
135                                     slice_cred_exp_list.append(exp_date)
136
137                             my_slices = [{'slice_name': t[0], 'cred_exp': t[1]}
138                                 for t in zip(slice_list, slice_cred_exp_list)]
139
140                         if 'N/A' not in acc_auth_cred:
141                             for key, value in acc_auth_cred.iteritems():
142                                 auth_list.append(key)
143                                 #get cred_exp date
144                                 exp_date = re.search('<expires>(.*)</expires>', value)
145                                 if exp_date:
146                                     exp_date = exp_date.group(1)
147                                     auth_cred_exp_list.append(exp_date)
148
149                             my_auths = [{'auth_name': t[0], 'cred_exp': t[1]}
150                                 for t in zip(auth_list, auth_cred_exp_list)]
151
152
153                     # for reference accounts
154                     if 'reference' in account_detail['auth_type']:
155                         account_type = 'Reference'
156                         delegation = 'N/A'
157                         platform_name_secondary_list.append(platform_name)
158                         account_type_secondary_list.append(account_type)
159                         account_reference_list.append(account_reference)
160                         ref_acc_list = [{'platform_name': t[0], 'account_type': t[1], 'account_reference': t[2]} 
161                             for t in zip(platform_name_secondary_list, account_type_secondary_list, account_reference_list)]
162                        
163                     elif 'managed' in account_detail['auth_type']:
164                         account_type = 'Principal'
165                         delegation = 'Automatic'
166                     else:
167                         account_type = 'Principal'
168                         delegation = 'Manual'
169                     # for principal (auth_type=user/managed) accounts
170                     if 'reference' not in account_detail['auth_type']:
171                         platform_name_list.append(platform_name)
172                         account_type_list.append(account_type)
173                         delegation_type_list.append(delegation)
174                         usr_hrn_list.append(account_usr_hrn)
175                         pub_key_list.append(account_pub_key)
176                         user_status_list.append(user_status)
177                         # combining 5 lists into 1 [to render in the template] 
178                         principal_acc_list = [{'platform_name': t[0], 'account_type': t[1], 'delegation_type': t[2], 'usr_hrn':t[3], 'usr_pubkey':t[4], 'user_status':t[5],} 
179                             for t in zip(platform_name_list, account_type_list, delegation_type_list, usr_hrn_list, pub_key_list, user_status_list)]
180                     # to hide private key row if it doesn't exist    
181                     if 'myslice' in platform_detail['platform']:
182                         account_config = json.loads(account_detail['config'])
183                         account_priv_key = account_config.get('user_private_key','N/A')
184                     if 'sfa' in platform_detail['gateway_type']:
185                         platform_access = platform_detail['platform']
186                         platform_access_list.append(platform_access)
187        
188         # Removing the platform which already has access
189         for platform in platform_access_list:
190             total_platform_list.remove(platform)
191         # we could use zip. this one is used if columns have unequal rows 
192         platform_list = [{'platform_no_access': t[0]}
193             for t in itertools.izip_longest(total_platform_list)]
194
195
196         ## check user is pi or not
197       #  platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
198       #  account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
199       #  platform_details = execute_query(self.request, platform_query)
200       #  account_details = execute_query(self.request, account_query)
201       #  for platform_detail in platform_details:
202       #      for account_detail in account_details:
203       #          if platform_detail['platform_id'] == account_detail['platform_id']:
204       #              if 'config' in account_detail and account_detail['config'] is not '':
205       #                  account_config = json.loads(account_detail['config'])
206       #                  if 'myslice' in platform_detail['platform']:
207       #                      acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
208         # assigning values
209         if acc_auth_cred == {} or acc_auth_cred == 'N/A':
210             pi = "is_not_pi"
211         else:
212             pi = "is_pi"
213
214         # check if the user has creds or not
215         if acc_user_cred == {} or acc_user_cred == 'N/A':
216             user_cred = 'no_creds'
217         else:
218             exp_date = get_expiration(acc_user_cred, 'timestamp')
219             if exp_date < time.time():
220                 user_cred = 'creds_expired'
221             else:
222                 user_cred = 'has_creds'
223
224         context = super(AccountView, self).get_context_data(**kwargs)
225         context['principal_acc'] = principal_acc_list
226         context['ref_acc'] = ref_acc_list
227         context['platform_list'] = platform_list
228         context['my_users'] = my_users
229         context['pi'] = pi
230         context['user_cred'] = user_cred
231         context['my_slices'] = my_slices
232         context['my_auths'] = my_auths
233         context['user_status'] = user_status
234         context['person']   = self.request.user
235         context['firstname'] = config.get('firstname',"?")
236         context['lastname'] = config.get('lastname',"?")
237         context['fullname'] = context['firstname'] +' '+ context['lastname']
238         context['authority'] = config.get('authority',"Unknown Authority")
239         context['user_private_key'] = account_priv_key
240         
241         # XXX This is repeated in all pages
242         # more general variables expected in the template
243         context['title'] = 'Platforms connected to MySlice'
244         # the menu items on the top
245         context['topmenu_items'] = topmenu_items_live('My Account', page)
246         # so we can sho who is logged
247         context['username'] = the_user(self.request)
248         context['theme'] = self.theme
249         context['section'] = "User account"
250 #        context ['firstname'] = config['firstname']
251         prelude_env = page.prelude_env()
252         context.update(prelude_env)
253         return context
254
255
256 @login_required
257 #my_acc form value processing
258 def account_process(request):
259     user_query  = Query().get('local:user').select('user_id','email','password','config')
260     user_details = execute_query(request, user_query)
261     
262     account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
263     account_details = execute_query(request, account_query)
264
265     platform_query  = Query().get('local:platform').select('platform_id','platform')
266     platform_details = execute_query(request, platform_query)
267     
268     # getting the user_id from the session                                            
269     for user_detail in user_details:                                                  
270         user_id = user_detail['user_id']                                              
271         user_email = user_detail['email']                                             
272         try:
273             if user_email == request.user.email:                                          
274                 authorize_query = True                                                    
275             else:                                                                         
276                 print "SECURITY: %s tried to update %s" % (user_email, request.user.email)
277                 messages.error(request, 'You are not authorized to modify another user.') 
278                 return HttpResponseRedirect("/portal/account/")                               
279         except Exception,e:
280             print "Exception = %s" % e
281
282     for account_detail in account_details:
283         for platform_detail in platform_details:
284             # Add reference account to the platforms
285             if 'add_'+platform_detail['platform'] in request.POST:
286                 platform_id = platform_detail['platform_id']
287                 user_params = {'platform_id': platform_id, 'user_id': user_id, 'auth_type': "reference", 'config': '{"reference_platform": "myslice"}'}
288                 manifold_add_account(request,user_params)
289                 messages.info(request, 'Reference Account is added to the selected platform successfully!')
290                 return HttpResponseRedirect("/portal/account/")
291
292             # Delete reference account from the platforms
293             if 'delete_'+platform_detail['platform'] in request.POST:
294                 platform_id = platform_detail['platform_id']
295                 user_params = {'user_id':user_id}
296                 manifold_delete_account(request,platform_id, user_id, user_params)
297                 messages.info(request, 'Reference Account is removed from the selected platform')
298                 return HttpResponseRedirect("/portal/account/")
299
300             if platform_detail['platform_id'] == account_detail['platform_id']:
301                 if 'myslice' in platform_detail['platform']:
302                     account_config = json.loads(account_detail['config'])
303                     acc_slice_cred = account_config.get('delegated_slice_credentials','N/A')
304                     acc_auth_cred = account_config.get('delegated_authority_credentials','N/A')
305                 
306
307                     
308     
309     # adding the slices and corresponding credentials to list
310     if 'N/A' not in acc_slice_cred:
311         slice_list = []
312         slice_cred = [] 
313         for key, value in acc_slice_cred.iteritems():
314             slice_list.append(key)       
315             slice_cred.append(value)
316         # special case: download each slice credentials separately 
317         for i in range(0, len(slice_list)):
318             if 'dl_'+slice_list[i] in request.POST:
319                 slice_detail = "Slice name: " + slice_list[i] +"\nSlice Credentials: \n"+ slice_cred[i]
320                 response = HttpResponse(slice_detail, content_type='text/plain')
321                 response['Content-Disposition'] = 'attachment; filename="slice_credential.txt"'
322                 return response
323
324     # adding the authority and corresponding credentials to list
325     if 'N/A' not in acc_auth_cred:
326         auth_list = []
327         auth_cred = [] 
328         for key, value in acc_auth_cred.iteritems():
329             auth_list.append(key)       
330             auth_cred.append(value)
331         # special case: download each slice credentials separately
332         for i in range(0, len(auth_list)):
333             if 'dl_'+auth_list[i] in request.POST:
334                 auth_detail = "Authority: " + auth_list[i] +"\nAuthority Credentials: \n"+ auth_cred[i]
335                 response = HttpResponse(auth_detail, content_type='text/plain')
336                 response['Content-Disposition'] = 'attachment; filename="auth_credential.txt"'
337                 return response
338
339
340              
341     if 'submit_name' in request.POST:
342         edited_first_name =  request.POST['fname']
343         edited_last_name =  request.POST['lname']
344         
345         config={}
346         for user_config in user_details:
347             if user_config['config']:
348                 config = json.loads(user_config['config'])
349                 config['firstname'] = edited_first_name
350                 config['lastname'] = edited_last_name
351                 config['authority'] = config.get('authority','Unknown Authority')
352                 updated_config = json.dumps(config)
353                 user_params = {'config': updated_config}
354             else: # it's needed if the config is empty 
355                 user_config['config']= '{"firstname":"' + edited_first_name + '", "lastname":"'+ edited_last_name + '", "authority": "Unknown Authority"}'
356                 user_params = {'config': user_config['config']} 
357         # updating config local:user in manifold       
358         manifold_update_user(request, request.user.email,user_params)
359         # this will be depricated, we will show the success msg in same page
360         # Redirect to same page with success message
361         messages.success(request, 'Sucess: First Name and Last Name Updated.')
362         return HttpResponseRedirect("/portal/account/")       
363     
364     elif 'submit_pass' in request.POST:
365         edited_password = request.POST['password']
366         
367         for user_pass in user_details:
368             user_pass['password'] = edited_password
369         #updating password in local:user
370         user_params = { 'password': user_pass['password']}
371         manifold_update_user(request,request.user.email,user_params)
372 #        return HttpResponse('Success: Password Changed!!')
373         messages.success(request, 'Sucess: Password Updated.')
374         return HttpResponseRedirect("/portal/account/")
375
376 # XXX TODO: Factorize with portal/registrationview.py
377 # XXX TODO: Factorize with portal/registrationview.py
378 # XXX TODO: Factorize with portal/joinview.py
379
380     elif 'generate' in request.POST:
381         for account_detail in account_details:
382             for platform_detail in platform_details:
383                 if platform_detail['platform_id'] == account_detail['platform_id']:
384                     if 'myslice' in platform_detail['platform']:
385                         private = RSA.generate(1024)
386                         private_key = json.dumps(private.exportKey())
387                         public  = private.publickey()
388                         public_key = json.dumps(public.exportKey(format='OpenSSH'))
389                         # updating manifold local:account table
390                         account_config = json.loads(account_detail['config'])
391                         # preserving user_hrn
392                         user_hrn = account_config.get('user_hrn','N/A')
393                         keypair = '{"user_public_key":'+ public_key + ', "user_private_key":'+ private_key + ', "user_hrn":"'+ user_hrn + '"}'
394                         #updated_config = json.dumps(account_config) 
395                         # updating manifold
396                         #user_params = { 'config': keypair, 'auth_type':'managed'}
397                         #manifold_update_account(request, user_id, user_params)
398                         # updating sfa
399                         public_key = public_key.replace('"', '');
400                         user_pub_key = {'keys': public_key}
401
402                         sfa_update_user(request, user_hrn, user_pub_key)
403                         result_sfa_user = sfa_get_user(request, user_hrn, public_key)
404                         try:
405                             result_sfa_user = result_sfa_user[0]
406                             if 'keys' in result_sfa_user and result_sfa_user['keys'][0] == public_key:
407                                 # updating manifold
408                                 updated_config = json.dumps(account_config) 
409                                 user_params = { 'config': keypair, 'auth_type':'managed'}
410                                 manifold_update_account(request, user_id, user_params)
411                                 messages.success(request, 'Sucess: New Keypair Generated! Delegation of your credentials will be automatic.')
412                             else:
413                                 raise Exception,"Keys are not matching"
414                         except Exception,e:
415                             messages.error(request, 'Error: An error occured during the update of your public key at the Registry, or your public key is not matching the one stored.')
416                             print "Exception in accountview ", e
417                         return HttpResponseRedirect("/portal/account/")
418         else:
419             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
420             return HttpResponseRedirect("/portal/account/")
421                        
422     elif 'upload_key' in request.POST:
423         for account_detail in account_details:
424             for platform_detail in platform_details:
425                 if platform_detail['platform_id'] == account_detail['platform_id']:
426                     if 'myslice' in platform_detail['platform']:
427                         up_file = request.FILES['pubkey']
428                         file_content =  up_file.read()
429                         file_name = up_file.name
430                         file_extension = os.path.splitext(file_name)[1] 
431                         allowed_extension =  ['.pub','.txt']
432                         if file_extension in allowed_extension and re.search(r'ssh-rsa',file_content):
433                             account_config = json.loads(account_detail['config'])
434                             # preserving user_hrn
435                             user_hrn = account_config.get('user_hrn','N/A')
436                             file_content = '{"user_public_key":"'+ file_content + '", "user_hrn":"'+ user_hrn +'"}'
437                             #file_content = re.sub("\r", "", file_content)
438                             #file_content = re.sub("\n", "\\n",file_content)
439                             file_content = ''.join(file_content.split())
440                             #update manifold local:account table
441                             user_params = { 'config': file_content, 'auth_type':'user'}
442                             manifold_update_account(request, user_id, user_params)
443                             # updating sfa
444                             user_pub_key = {'keys': file_content}
445                             sfa_update_user(request, user_hrn, user_pub_key)
446                             messages.success(request, 'Publickey uploaded! Please delegate your credentials using SFA: http://trac.myslice.info/wiki/DelegatingCredentials')
447                             return HttpResponseRedirect("/portal/account/")
448                         else:
449                             messages.error(request, 'RSA key error: Please upload a valid RSA public key [.txt or .pub].')
450                             return HttpResponseRedirect("/portal/account/")
451         else:
452             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
453             return HttpResponseRedirect("/portal/account/")
454
455     elif 'dl_pubkey' in request.POST:
456         for account_detail in account_details:
457             for platform_detail in platform_details:
458                 if platform_detail['platform_id'] == account_detail['platform_id']:
459                     if 'myslice' in platform_detail['platform']:
460                         account_config = json.loads(account_detail['config'])
461                         public_key = account_config['user_public_key'] 
462                         response = HttpResponse(public_key, content_type='text/plain')
463                         response['Content-Disposition'] = 'attachment; filename="pubkey.txt"'
464                         return response
465                         break
466         else:
467             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
468             return HttpResponseRedirect("/portal/account/")
469                
470     elif 'dl_pkey' in request.POST:
471         for account_detail in account_details:
472             for platform_detail in platform_details:
473                 if platform_detail['platform_id'] == account_detail['platform_id']:
474                     if 'myslice' in platform_detail['platform']:
475                         account_config = json.loads(account_detail['config'])
476                         if 'user_private_key' in account_config:
477                             private_key = account_config['user_private_key']
478                             response = HttpResponse(private_key, content_type='text/plain')
479                             response['Content-Disposition'] = 'attachment; filename="privkey.txt"'
480                             return response
481                         else:
482                             messages.error(request, 'Download error: Private key is not stored in the server')
483                             return HttpResponseRedirect("/portal/account/")
484
485         else:
486             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
487             return HttpResponseRedirect("/portal/account/")
488     
489     elif 'delete' in request.POST:
490         for account_detail in account_details:
491             for platform_detail in platform_details:
492                 if platform_detail['platform_id'] == account_detail['platform_id']:
493                     if 'myslice' in platform_detail['platform']:
494                         account_config = json.loads(account_detail['config'])
495                         if 'user_private_key' in account_config:
496                             for key in account_config.keys():
497                                 if key == 'user_private_key':    
498                                     del account_config[key]
499                                 
500                             updated_config = json.dumps(account_config)
501                             user_params = { 'config': updated_config, 'auth_type':'user'}
502                             manifold_update_account(request, user_id, user_params)
503                             messages.success(request, 'Private Key deleted. You need to delegate credentials manually once it expires.')
504                             messages.success(request, 'Once your credentials expire, Please delegate manually using SFA: http://trac.myslice.info/wiki/DelegatingCredentials')
505                             return HttpResponseRedirect("/portal/account/")
506                         else:
507                             messages.error(request, 'Delete error: Private key is not stored in the server')
508                             return HttpResponseRedirect("/portal/account/")
509                            
510         else:
511             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')    
512             return HttpResponseRedirect("/portal/account/")
513     
514     # download identity for jfed
515     elif 'dl_identity' in request.POST:
516         for account_detail in account_details:
517             for platform_detail in platform_details:
518                 if platform_detail['platform_id'] == account_detail['platform_id']:
519                     if 'myslice' in platform_detail['platform']:
520                         account_config = json.loads(account_detail['config'])
521                         if 'user_private_key' in account_config:
522                             private_key = account_config['user_private_key']
523                             user_hrn = account_config.get('user_hrn','N/A')
524                             registry = 'http://sfa-fed4fire.pl.sophia.inria.fr:12345/'
525                             jfed_identity = user_hrn + '\n' + registry + '\n' + private_key 
526                             response = HttpResponse(jfed_identity, content_type='text/plain')
527                             response['Content-Disposition'] = 'attachment; filename="jfed_identity.txt"'
528                             return response
529                         else:
530                             messages.error(request, 'Download error: Private key is not stored in the server')
531                             return HttpResponseRedirect("/portal/account/")
532
533         else:
534             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
535             return HttpResponseRedirect("/portal/account/")
536
537     #clear all creds
538     elif 'clear_cred' in request.POST:
539         try:
540             result = clear_user_creds(request, user_email)
541             if result is not None: 
542                 messages.success(request, 'All Credentials cleared')
543             else:
544                 messages.error(request, 'Delete error: Credentials are not stored in the server')
545         except Exception,e:
546             print "Exception in accountview.py in clear_user_creds %s" % e
547             messages.error(request, 'Account error: You need an account in myslice platform to perform this action')
548         return HttpResponseRedirect("/portal/account/")
549
550     # Download delegated_user_cred
551     elif 'dl_user_cred' in request.POST:
552         if 'delegated_user_credential' in account_config:
553             user_cred = account_config['delegated_user_credential']
554             response = HttpResponse(user_cred, content_type='text/plain')
555             response['Content-Disposition'] = 'attachment; filename="user_cred.txt"'
556             return response
557         else:
558             messages.error(request, 'Download error: User credential is not stored in the server')
559             return HttpResponseRedirect("/portal/account/")
560
561     # Download user_cert
562     elif 'dl_user_cert' in request.POST:
563         if 'user_credential' in account_config:
564             user_cred = account_config['user_credential']
565             obj_cred = Credential(string=user_cred)
566             obj_gid = obj_cred.get_gid_object()
567             str_cert = obj_gid.save_to_string()
568             response = HttpResponse(str_cert, content_type='text/plain')
569             response['Content-Disposition'] = 'attachment; filename="user_certificate.pem"'
570             return response
571
572         elif 'delegated_user_credential' in account_config:
573             user_cred = account_config['delegated_user_credential']
574             obj_cred = Credential(string=user_cred)
575             obj_gid = obj_cred.get_gid_object()
576             str_cert = obj_gid.save_to_string()
577             response = HttpResponse(str_cert, content_type='text/plain')
578             response['Content-Disposition'] = 'attachment; filename="user_certificate.pem"'
579             return response
580         else:
581             messages.error(request, 'Download error: User credential is not stored in the server')
582             return HttpResponseRedirect("/portal/account/")
583
584     # Download user p12 = private_key + Certificate
585     elif 'dl_user_p12' in request.POST:
586         if 'user_credential' in account_config and 'user_private_key' in account_config:
587             user_cred = account_config['user_credential']
588             obj_cred = Credential(string=user_cred)
589             obj_gid = obj_cred.get_gid_object()
590             str_cert = obj_gid.save_to_string()
591             cert = crypto.load_certificate(crypto.FILETYPE_PEM, str_cert)
592
593             user_private_key = account_config['user_private_key'].encode('ascii')
594             pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, user_private_key)
595
596             p12 = crypto.PKCS12()
597             p12.set_privatekey(pkey)
598             p12.set_certificate(cert)       
599             pkcs12 = p12.export()
600
601             response = HttpResponse(pkcs12, content_type='text/plain')
602             response['Content-Disposition'] = 'attachment; filename="user_pkcs.p12"'
603             return response
604
605         elif 'delegated_user_credential' in account_config and 'user_private_key' in account_config:
606             user_cred = account_config['delegated_user_credential']
607             obj_cred = Credential(string=user_cred)
608             obj_gid = obj_cred.get_gid_object()
609             str_cert = obj_gid.save_to_string()
610             cert = crypto.load_certificate(crypto.FILETYPE_PEM, str_cert)
611
612             user_private_key = account_config['user_private_key'].encode('ascii')
613             pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, user_private_key)
614
615             p12 = crypto.PKCS12()
616             p12.set_privatekey(pkey)
617             p12.set_certificate(cert)       
618             pkcs12 = p12.export()
619
620             response = HttpResponse(pkcs12, content_type='text/plain')
621             response['Content-Disposition'] = 'attachment; filename="user_pkcs.p12"'
622             return response
623         else:
624             messages.error(request, 'Download error: User private key or credential is not stored in the server')
625             return HttpResponseRedirect("/portal/account/")
626
627
628
629     else:
630         messages.info(request, 'Under Construction. Please try again later!')
631         return HttpResponseRedirect("/portal/account/")
632
633