Free cookie consent management tool by TermsFeed Policy Generator

source: branches/WebJobManager/HeuristicLab.Clients.Hive.WebJobManager/Controllers/UserController.cs @ 13847

Last change on this file since 13847 was 13847, checked in by jlodewyc, 8 years ago

#2582 Security access implemented, directory renaming and choosing, adding more partials

File size: 21.1 KB
Line 
1using HeuristicLab.Clients.Access.Administration;
2using HeuristicLab.Clients.Hive.WebJobManager.Services;
3using HeuristicLab.Clients.Hive.WebJobManager.ViewModels.User;
4using Microsoft.AspNet.Hosting;
5using Microsoft.AspNet.Http;
6using Microsoft.AspNet.Mvc;
7using System;
8using System.Collections.Generic;
9using System.Linq;
10using System.Net.Mail;
11using System.ServiceModel.Security;
12using System.Threading.Tasks;
13
14namespace HeuristicLab.Clients.Hive.WebJobManager.Controllers
15{
16    /// <summary>
17    /// Handles all the actions for user management
18    /// </summary>
19    public class UserController : Controller
20    {
21        private WebLoginService weblog;
22        private HiveServiceLocatorWeb serviceLocator;
23        private AccessAdministrationClient accessClient;
24        private Guid userId;
25
26        private UserViewModel vm;
27        private IHostingEnvironment _environment;
28
29        public UserController(IHostingEnvironment env)
30        {
31            weblog = WebLoginService.Instance;
32            _environment = env;
33        }
34        /// <summary>
35        /// Init required services and checks login
36        /// </summary>
37        /// <returns></returns>
38        private bool init()
39        {
40            var u = HttpContext.Session.GetString("UserId");
41            if (u == null || u == "" || Guid.Parse(u) == Guid.Empty)
42            {
43                return false;
44            }
45            else
46            {
47                userId = Guid.Parse(u);
48                serviceLocator = weblog.getServiceLocator(userId);
49                accessClient = weblog.getAccessAdminClient(userId);
50                vm = new UserViewModel(accessClient, weblog.getCurrentUser(userId));
51                if (weblog.getCurrentUser(userId).HasUserAdminAccess())
52                    return serviceLocator.CheckLogin();
53                else
54                    return false;
55                 
56            }
57        }
58        #region Users
59        /// <summary>
60        /// Show users page
61        /// </summary>
62        /// <returns></returns>
63        public IActionResult Index()
64        {
65            if (init())
66            {
67                ViewBag.Title = "Users";
68                vm.refreshAll() ;
69                //Refreshall for users, groups and roles
70                ViewBag.SessionId = HttpContext.Session.GetString("UserId");
71                return View("Index", vm);
72            }
73            else
74            {
75                return RedirectToAction("Index", "Job");
76            }
77        }
78
79        public IActionResult SelectUser(string id)
80        {
81            if (init())
82            {
83                Guid curr = Guid.Parse(id);
84
85                vm.refreshAll();
86                if (curr == Guid.Empty)
87                {//new user
88                    ViewBag.Title = "Add User";
89                }
90                else
91                {//View an existing user
92                    vm.SelectedUser = vm.getUserById(curr);
93                    vm.SelectedUserSubscriptions = accessClient.getSubscribedGroups(curr);
94                    vm.SelectedUserRoles = accessClient.getRoles(vm.SelectedUser);
95                    ViewBag.title = vm.SelectedUser.UserName;
96                }
97                ViewBag.Title += " - Users";
98                ViewBag.SessionId = HttpContext.Session.GetString("UserId");
99                return View("Index", vm);
100                //Uses Index page too, with the additional info in the Viewmodel
101            }
102            else
103            {
104                return RedirectToAction("Index", "Job");
105            }
106        }
107        /// <summary>
108        /// Saves an existing user or adds a new user
109        /// </summary>
110        /// <param name="inpusername">Username</param>
111        /// <param name="inpfullname">Full name </param>
112        /// <param name="inpemail">Email</param>
113        /// <param name="u">User ID</param>
114        /// <param name="rolestoadd">Roles to add to the user</param>
115        /// <param name="groupstoadd">Groups to subscribe the user to</param>
116        /// <returns></returns>
117        [HttpPost]
118        public IActionResult saveUser(string inpusername, string inpfullname, string inpemail, string u, string[] rolestoadd, string[] groupstoadd)
119        {
120
121            if (init())
122            {
123                var uid = Guid.Parse(u);
124                Access.User user;
125                if (uid == Guid.Empty)//checks if user is new or exists
126                    user = new Access.User();
127                else
128                    user = accessClient.Users.Find(x => x.Id == uid);
129
130
131                user.FullName = inpfullname;
132                user.Email = inpemail;
133
134
135                if (uid == Guid.Empty)
136                {//New user
137                    user.UserName = inpusername;
138                    uid = accessClient.addUser(user);
139                    accessClient.RefreshUsers();
140                    var newpass = accessClient.resetPassword(uid);
141                    sendPassmail(accessClient.Users.Find(x => x.Id == uid), newpass);
142                    //password received through mail
143                    ViewBag.Title = user.UserName + " added - User";
144                }
145                else
146                {//Existing user
147                    accessClient.updateUser(user);
148                    ViewBag.Title = user.UserName + " updated - User";
149                }
150                accessClient.RefreshUsers();//Refresh data from user
151                user = accessClient.Users.Find(x => x.Id == uid);
152                foreach (var s in rolestoadd)
153                {//Loop to add roles
154                    var role = accessClient.Roles.Find(x => x.Name == s);
155
156                    accessClient.addRoleToUser(user, role);
157                }
158                accessClient.RefreshUserGroups();
159                foreach(var g in groupstoadd)
160                {//loop to subscribe to groups
161                    var gid = Guid.Parse(g);
162                    var group = accessClient.Groups.Find(x => x.Id == gid);
163                    accessClient.addMember(user, group);
164                }
165                return RedirectToAction("SelectUser", new { id = uid.ToString() });
166            }
167            else
168            {
169                return RedirectToAction("Index", "Job");
170            }
171
172        }
173        /// <summary>
174        /// Sends email for a specific user, containg a password
175        /// </summary>
176        /// <param name="u">User to mail</param>
177        /// <param name="pass">Password to send</param>
178        public static void sendPassmail(Access.User u, string pass)
179        {/*
180            SmtpClient smtpClient = new SmtpClient("smtp.gmail.com",587);
181            smtpClient.UseDefaultCredentials = true;
182            smtpClient.Credentials = new System.Net.NetworkCredential("trac.heuristiclab@gmail.com", "||||||||||||");
183            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
184            smtpClient.EnableSsl = true;
185            MailMessage mail = new MailMessage();
186
187            //Setting From , To and CC
188            mail.From = new MailAddress("trac.heuristiclab@gmail.com", "HeuristicLab");
189            mail.Subject = "Password changed - HeuristicLab Hive";
190            mail.Body = "Hello " + u.FullName + ", " + Environment.NewLine + Environment.NewLine+
191                "Your password was changed through the HeuristicLab Hive web application." + Environment.NewLine+
192                "The new password for " + u.UserName + " is ' " + pass + " '." + Environment.NewLine + Environment.NewLine +
193                "HeuristicLab Hive";
194            mail.To.Add(new MailAddress(u.Email));
195
196            smtpClient.Send(mail);
197            */
198        }
199
200        public IActionResult ApproveUser(string id)
201        {
202            if (init())
203            {
204                Guid curr = Guid.Parse(id);
205
206                vm.refreshAll();
207               
208                    var us = vm.getUserById(curr);
209                us.IsApproved = true;
210                accessClient.updateUser(us);
211                return RedirectToAction("SelectUser", new { id = id });
212
213            }
214            else
215            {
216                return RedirectToAction("Index", "Job");
217            }
218        }
219        /// <summary>
220        /// Delete a user
221        /// </summary>
222        /// <param name="id">User ID to delete</param>
223        /// <returns></returns>
224        public IActionResult deleteUser(string id)
225        {
226            if (init())
227            {
228                var uid = Guid.Parse(id);
229                vm.refreshUsers();
230
231                if (uid == Guid.Empty)
232                {//check for empty Guid, should not happen but still
233                    vm.message = "Something went wrong, user is not deleted";
234                    return View("Index", vm);
235                }
236                else
237                {
238                    var user = vm.getUserById(uid);
239                    vm.message = user.UserName + " (" + user.FullName + ") has been deleted";
240                    accessClient.DeleteUser(user);
241                    vm.refreshAll();//refreshAll for index view
242                    ViewBag.Title = "Users";
243                    return View("Index", vm);//No redirect to save the viewbag message
244                }
245            }
246            else
247            {
248                return RedirectToAction("Index", "Job");
249            }
250
251        }
252        /// <summary>
253        /// Deletes a role from a user
254        /// </summary>
255        /// <param name="id">User Id</param>
256        /// <param name="role">Role name</param>
257        /// <returns></returns>
258        public IActionResult deleteUserRole(string id, string role)
259        {
260            if (init())
261            {
262                var uid = Guid.Parse(id);
263                vm.refreshAll();
264
265                var user = vm.getUserById(uid);
266                var r = vm.getRoleByName(role);
267
268                accessClient.deleteUserRole(user, r);
269                return RedirectToAction("SelectUser", new { id = id });
270            }
271            else
272            {
273                return RedirectToAction("Index", "Job");
274            }
275        }
276        /// <summary>
277        /// Delete user from a group
278        /// </summary>
279        /// <param name="id">User Id</param>
280        /// <param name="group">Group Id</param>
281        /// <returns></returns>
282        public IActionResult deleteUserGroup(string id, string group)
283        {
284            if (init())
285            {
286                var gid = Guid.Parse(group);
287                var mid = Guid.Parse(id);
288                vm.refreshGroups().refreshUsers();
289
290                var user = vm.getUserById(mid);
291                var gr = vm.getGroupById(gid);
292               
293                accessClient.deleteMember(user, gr);
294                return RedirectToAction("SelectUser", new { id = id});
295            }
296            else
297            {
298                return RedirectToAction("Index", "Job");
299            }
300
301        }
302        #endregion
303
304        #region Groups
305        /// <summary>
306        /// Shows the groups overview, opening up with "Add group"
307        /// </summary>
308        /// <returns></returns>
309        public IActionResult Groups()
310        {
311            if (init())
312            {
313
314                ViewBag.Title = "Groups";
315                vm.refreshGroups().refreshUsers();
316                return View("Groups", vm);
317            }
318            else
319            {
320                return RedirectToAction("Index", "Job");
321            }
322        }
323        /// <summary>
324        /// Show information for a specific group (Guid.empty = new group)
325        /// </summary>
326        /// <param name="id">Group ID</param>
327        /// <returns></returns>
328        public IActionResult SelectGroup(string id)
329        {
330            if (init())
331            {
332                Guid curr = Guid.Parse(id);
333
334                vm
335                    .refreshGroups()
336                    .refreshUsers();
337                if (curr == Guid.Empty)
338                {//Add group
339                    ViewBag.Title = "Add group";
340                }
341                else
342                {//Show existing group info and possibility to edit
343                    vm.SelectedGroup = vm.getGroupById(curr);
344                    vm.SelectedGroupMembers = accessClient.getGroupMembers(curr);
345                    ViewBag.title = vm.SelectedGroup.Name;
346                }
347                ViewBag.Title += " - Group";
348                return View("Groups", vm);
349            }
350            else
351            {
352                return RedirectToAction("Index", "Job");
353            }
354        }
355        /// <summary>
356        /// Saves an exisiting group or adds a new one.
357        /// </summary>
358        /// <param name="inpgroupname">Group name</param>
359        /// <param name="u">Group id (empty for new)</param>
360        /// <param name="userstoadd">Users to add to group</param>
361        /// <param name="groupstoadd">Groups to add to group</param>
362        /// <returns></returns>
363        [HttpPost]
364        public IActionResult saveGroup(string inpgroupname, string u, string[] userstoadd, string[] groupstoadd)
365        {
366            if (init())
367            {
368                var uid = Guid.Parse(u);
369                vm.refreshGroups().refreshUsers();
370
371                Access.UserGroup group;
372
373                if (uid == Guid.Empty)//Create new group
374                    group = new Access.UserGroup();
375                else//Find existing group
376                    group = accessClient.Groups.Find(x => x.Id == uid);
377
378                group.Name = inpgroupname;
379
380                if (uid == Guid.Empty)
381                {//New Group add
382                    uid = accessClient.addGroup(group);
383                    ViewBag.Title = group.Name + " added - Group";
384                }
385                else
386                {//Existing group update
387                    accessClient.updateGroup(group);
388                    ViewBag.Title = group.Name + " updated - Group";
389                }
390                vm.refreshGroups();
391                group = vm.getGroupById(uid);
392                //refresh group info
393                foreach (var s in userstoadd)
394                {//Subscribes members to group
395                    var tempid = Guid.Parse(s);
396                    var member = vm.getUserById(tempid);
397                    accessClient.addMember(member, group);
398                }
399                foreach (var g in groupstoadd)
400                {//Subscribes groups to group
401                    var tempid = Guid.Parse(g);
402                    var member = vm.getGroupById(tempid);
403                    accessClient.addMember(member, group);
404                }
405
406                return RedirectToAction("SelectGroup", new { id = uid.ToString() });
407            }
408            else
409            {
410                return RedirectToAction("Index", "Job");
411            }
412        }
413        /// <summary>
414        /// Delete an existing group
415        /// </summary>
416        /// <param name="id">Group to delete</param>
417        /// <returns></returns>
418        public IActionResult deleteGroup(string id)
419        {
420            if (init())
421            {
422                var uid = Guid.Parse(id);
423                vm.refreshGroups();
424
425                if (uid == Guid.Empty)
426                {//Check for empty ID, should not happen but still..
427                    vm.message = "Something went wrong, group is not deleted";
428                    return View("Groups", vm);
429                }
430                else
431                {//Deletes the user group
432                    var group = vm.getGroupById(uid);
433                    vm.message = group.Name + " has been deleted";
434                    accessClient.deleteUserGroup(group);
435                    vm.refreshGroups();
436                    return View("Groups", vm);
437                }
438            }
439            else
440            {
441                return RedirectToAction("Index", "Job");
442            }
443
444        }
445        /// <summary>
446        /// Delete a member from a group 
447        /// </summary>
448        /// <param name="g">Group id</param>
449        /// <param name="m">User id</param>
450        /// <returns>Group selected</returns>
451        public IActionResult deleteMember(string g, string m)
452        {
453            if (init())
454            {
455                var gid = Guid.Parse(g);
456                var mid = Guid.Parse(m);
457                vm.refreshGroups().refreshUsers();
458
459                if (gid == Guid.Empty || mid == Guid.Empty)
460                {//Should not be empty but still..
461                    vm.message = "Something went wrong, member is not deleted";
462                    return View("Groups", vm);
463                }
464                else
465                {//Deletes the member
466                    var group = vm.getGroupById(gid);
467                    Access.UserGroupBase member = vm.getUserById(mid);
468                    if (member == null)
469                    {
470                        member = vm.getGroupById(mid);
471                    }
472                    vm.message = " Member deleted";
473                    accessClient.deleteMember(member, group);
474                    vm.refreshGroups();
475                    return RedirectToAction("SelectGroup", new { id = g });
476                }
477            }
478            else
479            {
480                return RedirectToAction("Index", "Job");
481            }
482
483        }
484        #endregion
485
486        #region Roles
487        /// <summary>
488        /// Shows roles overview, opening with "Add role"
489        /// </summary>
490        /// <returns></returns>
491        public IActionResult Roles()
492        {
493            if (init())
494            {
495
496                ViewBag.Title = "Roles";
497                vm.refreshRoles();
498
499                return View("Roles", vm);
500            }
501            else
502            {
503                return RedirectToAction("Index", "Job");
504            }
505        }
506        /// <summary>
507        /// Shows information for a specific role
508        /// </summary>
509        /// <param name="name">Role name</param>
510        /// <returns></returns>
511        public IActionResult SelectRole(string name)
512        {
513            if (init())
514            {
515
516                vm.refreshRoles();
517                if (name == "" || name == null)
518                {//Add role
519                    ViewBag.Title = "Add Role";
520                }
521                else
522                {//Edit/view role
523                    vm.SelectedRole = vm.getRoleByName(name);
524                    vm.SelectedRoleEnrolled = accessClient.getEnrolled(vm.SelectedRole);
525
526                    ViewBag.title = vm.SelectedRole.Name;
527                }
528                ViewBag.Title += " - Roles";
529                return View("Roles", vm);
530            }
531            else
532            {
533                return RedirectToAction("Index", "Job");
534            }
535        }
536        /// <summary>
537        /// Saves a role or adds a new one
538        /// </summary>
539        /// <param name="inprolename">Role name</param>
540        /// <returns></returns>
541        [HttpPost]
542        public IActionResult saveRole(string inprolename)
543        {
544            if (init())
545            {
546                Access.Role role = accessClient.Roles.Find(x => x.Name == inprolename);
547                if (role == null)
548                {
549                    role = new Access.Role();
550                    role.Name = inprolename;
551                    accessClient.addRole(role);
552                }
553
554                accessClient.RefreshRoles();
555                return RedirectToAction("SelectRole", new { name = inprolename });
556            }
557            else
558            {
559                return RedirectToAction("Index", "Job");
560            }
561        }
562        /// <summary>
563        /// Delete a role
564        /// </summary>
565        /// <param name="name">Role name</param>
566        /// <returns></returns>
567        public IActionResult deleteRole(string name)
568        {
569            if (init())
570            {
571                accessClient.deleteRole(name);
572                return RedirectToAction("Roles");
573            }
574            else
575            {
576                return RedirectToAction("Index", "Job");
577            }
578        }
579        /// <summary>
580        /// Deletes a user from a role
581        /// </summary>
582        /// <param name="id">User id</param>
583        /// <param name="role">Role name</param>
584        /// <returns></returns>
585        public IActionResult deleteRoleUser(string id, string role)
586        {
587            if (init())
588            {
589                var uid = Guid.Parse(id);
590                vm.refreshAll();
591
592                var user = vm.getUserById(uid);
593                var r = vm.getRoleByName(role);
594                vm.message = role + " role has been deleted from " + user.FullName;
595                accessClient.deleteUserRole(user, r);
596                return RedirectToAction("SelectRole", new { name = role });
597            }
598            else
599            {
600                return RedirectToAction("Index", "Job");
601            }
602        }
603        #endregion
604    }
605}
Note: See TracBrowser for help on using the repository browser.