Free cookie consent management tool by TermsFeed Policy Generator

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

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

#2582 More parameter datatypes, splitting fileopening service, approving users, reopen last file, change name tasks and repetitions

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