Free cookie consent management tool by TermsFeed Policy Generator

source: branches/ClientUserManagement/HeuristicLab.Services.Access/3.3/AccessService.cs @ 7651

Last change on this file since 7651 was 7651, checked in by ascheibe, 12 years ago

#1648 added reset password and update user operations to the ui

File size: 34.3 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.ServiceModel;
26using System.ServiceModel.Channels;
27using System.Web.Security;
28using HeuristicLab.GeoIP;
29using DA = HeuristicLab.Services.Access.DataAccess;
30using DT = HeuristicLab.Services.Access.DataTransfer;
31
32namespace HeuristicLab.Services.Access {
33  [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
34  public class AccessService : IAccessService {
35    private IUserManager userManager;
36    private IUserManager UserManager {
37      get {
38        if (userManager == null) userManager = AccessServiceLocator.Instance.UserManager;
39        return userManager;
40      }
41    }
42
43    private IRoleVerifier roleVerifier;
44    private IRoleVerifier RoleVerifier {
45      get {
46        if (roleVerifier == null) roleVerifier = AccessServiceLocator.Instance.RoleVerifier;
47        return roleVerifier;
48      }
49    }
50
51    #region Client Members
52    public bool ClientExists(Guid id) {
53      if (id != Guid.Empty) {
54        using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
55          return (context.Resources.Where(x => x.Id == id).Count() != 0);
56        }
57      }
58      return false;
59    }
60
61    public DT.Client GetClient(Guid id) {
62      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
63        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
64                    where c.Id == id
65                    select c;
66        if (query.Count() > 0) {
67          return Convert.ToDto(query.FirstOrDefault());
68        } else {
69          return null;
70        }
71      }
72    }
73
74    public IEnumerable<DT.Client> GetClients(IEnumerable<Guid> ids) {
75      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
76        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
77                    where ids.Contains(c.Id)
78                    select Convert.ToDto(c);
79        return query.ToList();
80      }
81    }
82
83    public IEnumerable<DT.Client> GetAllClients() {
84      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
85        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
86                    select Convert.ToDto(c);
87        return query.ToList();
88      }
89    }
90
91    public void AddClient(DT.Client client) {
92      string country = string.Empty;
93
94      OperationContext opContext = OperationContext.Current;
95
96      if (opContext != null) {
97        MessageProperties properties = opContext.IncomingMessageProperties;
98        RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
99        string ipAdr = endpoint.Address;
100        country = GeoIPLookupService.Instance.GetCountryName(ipAdr);
101      }
102
103      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
104        DA.Client entity = Convert.ToEntity(client);
105
106        if (country != string.Empty) {
107          var query = from c in context.GetTable<DA.Country>()
108                      where c.Name == country
109                      select c;
110          if (query.Count() > 0) {
111            entity.CountryId = query.First().Id;
112          }
113        }
114
115        if (entity.OperatingSystem != null) {
116          string osversion = entity.OperatingSystem.Name;
117          var query = from os in context.GetTable<DA.OperatingSystem>()
118                      where os.Name == osversion
119                      select os;
120          if (query.Count() > 0) {
121            entity.OperatingSystem = query.First();
122          }
123        }
124
125        if (entity.ClientType != null) {
126          string cType = entity.ClientType.Name;
127          var query = from t in context.GetTable<DA.ClientType>()
128                      where t.Name == cType
129                      select t;
130          if (query.Count() > 0) {
131            entity.ClientType = query.First();
132          }
133        }
134
135        context.Resources.InsertOnSubmit(entity);
136        context.SubmitChanges();
137      }
138    }
139
140    public void UpdateClient(DT.Client client) {
141      AddClient(client);
142    }
143
144    public void DeleteClient(DT.Client client) {
145      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
146
147      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
148        //load client because we could get a detached object
149        var query = from c in context.GetTable<DA.Resource>().OfType<DA.Client>()
150                    where c.Id == client.Id
151                    select c;
152        if (query.Count() > 0) {
153
154          //delete affiliation first
155          var queryMapping = context.ResourceResourceGroups.Where(x => x.ResourceId == client.Id);
156          if (queryMapping.Count() > 0) {
157            context.ResourceResourceGroups.DeleteAllOnSubmit(queryMapping);
158          }
159
160          context.Resources.DeleteOnSubmit(query.First());
161          context.SubmitChanges();
162        }
163      }
164    }
165    #endregion
166
167    #region ClientGroup
168    public IEnumerable<DT.ClientGroup> GetAllClientGroups() {
169      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
170        var query = from c in context.GetTable<DA.Resource>().OfType<DA.ClientGroup>()
171                    select Convert.ToDto(c);
172        return query.ToList();
173      }
174    }
175
176    public IEnumerable<DT.ClientGroup> GetClientGroups(IEnumerable<Guid> ids) {
177      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
178        var query = from c in context.GetTable<DA.Resource>().OfType<DA.ClientGroup>()
179                    where ids.Contains(c.Id)
180                    select Convert.ToDto(c);
181        return query.ToList();
182      }
183    }
184
185    public Guid AddClientGroup(DT.ClientGroup group) {
186      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
187        if (group.Id == Guid.Empty)
188          group.Id = Guid.NewGuid();
189
190        var entity = Convert.ToEntity(group);
191        context.Resources.InsertOnSubmit(entity);
192        context.SubmitChanges();
193        return entity.Id;
194      }
195    }
196
197    public void UpdateClientGroup(DT.ClientGroup group) {
198      AddClientGroup(group);
199    }
200
201    public void DeleteClientGroup(DT.ClientGroup clientGroup) {
202      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
203
204      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
205        //load clientGroup because we could get a detached object
206        var query = from c in context.GetTable<DA.Resource>().OfType<DA.ClientGroup>()
207                    where c.Id == clientGroup.Id
208                    select c;
209        if (query.Count() > 0) {
210          context.Resources.DeleteOnSubmit(query.First());
211          context.SubmitChanges();
212        }
213      }
214    }
215
216    public void AddResourceToGroup(DT.Resource resource, DT.ClientGroup group) {
217      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
218        DA.ResourceResourceGroup rrg = new DA.ResourceResourceGroup() {
219          ResourceId = resource.Id,
220          ResourceGroupId = group.Id
221        };
222
223        context.ResourceResourceGroups.InsertOnSubmit(rrg);
224        context.SubmitChanges();
225      }
226    }
227
228    public void RemoveResourceFromGroup(DT.Resource resource, DT.ClientGroup group) {
229      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
230        var query = context.ResourceResourceGroups.Where(x => x.ResourceId == resource.Id && x.ResourceGroupId == group.Id);
231        if (query.Count() > 0) {
232          context.ResourceResourceGroups.DeleteOnSubmit(query.First());
233          context.SubmitChanges();
234        }
235      }
236    }
237    #endregion
238
239    #region ClientGroupMapping
240    public IEnumerable<DT.ClientGroupMapping> GetClientGroupMapping() {
241      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
242        var query = from c in context.GetTable<DA.ResourceResourceGroup>()
243                    select Convert.ToDto(c);
244        return query.ToList();
245      }
246    }
247    #endregion
248
249    #region Resource
250    public IEnumerable<DT.Resource> GetResources() {
251      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
252        var query = from r in context.Resources
253                    select Convert.ToDto(r);
254        return query.ToList();
255      }
256    }
257    #endregion
258
259    #region ClientLog
260    public DT.ClientLog GetLastClientLog(Guid clientId) {
261      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
262        var query = from r in context.ClientLogs
263                    where r.ResourceId == clientId
264                    select r;
265        return Convert.ToDto(query.OrderBy(x => x.Timestamp).LastOrDefault());
266      }
267    }
268
269    public IEnumerable<DT.ClientLog> GetClientLogs(Guid clientId) {
270      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
271        var query = from r in context.ClientLogs
272                    where r.ResourceId == clientId
273                    select Convert.ToDto(r);
274        return query.ToList();
275      }
276    }
277
278    public IEnumerable<DT.ClientLog> GetClientLogsSince(DateTime startDate) {
279      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
280        var query = from r in context.ClientLogs
281                    where r.Timestamp >= startDate
282                    select Convert.ToDto(r);
283        return query.ToList();
284      }
285    }
286
287    public void AddClientLog(DT.ClientLog log) {
288      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
289        context.ClientLogs.InsertOnSubmit(Convert.ToEntity(log));
290        context.SubmitChanges();
291      }
292    }
293
294    public void DeleteClientLog(DT.ClientLog log) {
295      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
296
297      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
298        context.ClientLogs.DeleteOnSubmit(Convert.ToEntity(log));
299        context.SubmitChanges();
300      }
301    }
302    #endregion
303
304    #region User
305    private DT.User BuildUserDto(Guid userId) {
306      DA.aspnet_User aspUser = null;
307      DA.aspnet_Membership aspMembership = null;
308      DA.User accessUser = null;
309
310      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
311        var userQuery = from u in context.aspnet_Users
312                        where u.UserId == userId
313                        select u;
314        if (userQuery.Count() == 1) {
315          aspUser = userQuery.First();
316        }
317
318        var memQuery = from u in context.aspnet_Memberships
319                       where u.UserId == userId
320                       select u;
321        if (memQuery.Count() == 1) {
322          aspMembership = memQuery.First();
323        }
324      }
325
326      if (aspUser != null || aspMembership != null) {
327        using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
328          var query = from u in context.UserGroupBases.OfType<DA.User>()
329                      where u.Id == userId
330                      select u;
331          if (query.Count() == 1) {
332            accessUser = query.First();
333          } else {
334            //if the user is not in the access db add it (this makes it easy to upgrade with an existing asp.net authentication db)
335            DA.User user = new DA.User();
336            user.Id = userId;
337            user.FullName = "Not set";
338            context.UserGroupBases.InsertOnSubmit(user);
339            context.SubmitChanges();
340            accessUser = user;
341          }
342        }
343      }
344
345      if (aspUser == null || aspMembership == null || accessUser == null) {
346        throw new Exception("User with id " + userId + " not found.");
347      } else {
348        return Convert.ToDto(accessUser, aspUser, aspMembership);
349      }
350    }
351
352    private DT.LightweightUser BuildLightweightUserDto(Guid userId) {
353      DA.aspnet_User aspUser = null;
354      DA.User accessUser = null;
355      List<DA.aspnet_Role> roles = new List<DA.aspnet_Role>();
356      List<DA.UserGroup> groups = new List<DA.UserGroup>();
357
358
359      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
360        var userQuery = from u in context.aspnet_Users
361                        where u.UserId == userId
362                        select u;
363        if (userQuery.Count() == 1) {
364          aspUser = userQuery.First();
365          roles = (from ur in context.aspnet_UsersInRoles
366                   where ur.UserId == aspUser.UserId
367                   join r in context.aspnet_Roles on ur.RoleId equals r.RoleId
368                   select r).ToList();
369        }
370      }
371
372      if (aspUser != null) {
373        using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
374          var query = from u in context.UserGroupBases.OfType<DA.User>()
375                      where u.Id == userId
376                      select u;
377          if (query.Count() == 1) {
378            accessUser = query.First();
379            groups = (from ug in context.UserGroupUserGroups
380                      where ug.UserGroupUserGroupId == accessUser.Id
381                      join g in context.UserGroupBases.OfType<DA.UserGroup>() on ug.UserGroupId equals g.Id
382                      select g).ToList();
383          } else {
384            //if the user is not in the access db add it (this makes it easy to upgrade with an existing asp.net authentication db)
385            DA.User user = new DA.User();
386            user.Id = userId;
387            user.FullName = "Not set";
388            context.UserGroupBases.InsertOnSubmit(user);
389            context.SubmitChanges();
390            accessUser = user;
391          }
392        }
393      }
394
395      if (aspUser == null || accessUser == null) {
396        throw new Exception("User with id " + userId + " not found.");
397      } else {
398        return Convert.ToDto(accessUser, aspUser, roles, groups);
399      }
400    }
401
402    public DT.LightweightUser Login() {
403      Guid userId = UserManager.CurrentUserId;
404      return BuildLightweightUserDto(userId);
405    }
406
407    public IEnumerable<DT.UserGroup> GetGroupsOfCurrentUser() {
408      Guid userId = UserManager.CurrentUserId;
409
410      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
411        //TODO: this has to be done recursive, so check if a group is in another
412        //group because then the user is also in this group...
413        var query = from g in context.UserGroupUserGroups
414                    from ug in context.UserGroupBases.OfType<DA.UserGroup>()
415                    where g.UserGroupId == userId && g.UserGroupUserGroupId == ug.Id
416                    select Convert.ToDto(ug);
417        return query.ToList();
418      }
419    }
420
421    public IEnumerable<DT.Role> GetRolesOfCurrentUser() {
422      Guid userId = UserManager.CurrentUserId;
423
424      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
425        var query = from ur in context.aspnet_UsersInRoles
426                    from r in context.aspnet_Roles
427                    where ur.UserId == userId && ur.RoleId == r.RoleId
428                    select Convert.ToDto(r);
429        return query.ToList();
430      }
431    }
432
433
434    public IEnumerable<DT.LightweightUser> GetAllLightweightUsers() {
435      List<Guid> accessUserGuids = null;
436
437      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
438        var query = from u in context.aspnet_Users
439                    select u.UserId;
440        accessUserGuids = query.ToList();
441      }
442      return accessUserGuids.Select(x => BuildLightweightUserDto(x));
443    }
444
445    public IEnumerable<DT.User> GetAllUsers() {
446      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
447
448      List<Guid> accessUserGuids = null;
449
450      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
451        var query = from u in context.aspnet_Users
452                    select u.UserId;
453        accessUserGuids = query.ToList();
454      }
455
456      return accessUserGuids.Select(x => BuildUserDto(x));
457    }
458
459    public IEnumerable<DT.User> GetUsers(IEnumerable<Guid> ids) {
460      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
461
462      List<Guid> accessUserGuids = null;
463
464      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
465        var query = from u in context.UserGroupBases.OfType<DA.User>()
466                    where ids.Contains(u.Id)
467                    select u.Id;
468        accessUserGuids = query.ToList();
469      }
470
471      if (accessUserGuids.Count() != ids.Count()) {
472        throw new Exception("Couldn't find one or more users for the given user ids.");
473      }
474
475      return accessUserGuids.Select(x => BuildUserDto(x));
476    }
477
478    public IEnumerable<DT.LightweightUser> GetLightweightUsers(IEnumerable<Guid> ids) {
479      List<Guid> accessUserGuids = null;
480
481      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
482        var query = from u in context.UserGroupBases.OfType<DA.User>()
483                    where ids.Contains(u.Id)
484                    select u.Id;
485        accessUserGuids = query.ToList();
486      }
487
488      if (accessUserGuids.Count() != ids.Count()) {
489        throw new Exception("Couldn't find one or more users for the given user ids.");
490      }
491
492      return accessUserGuids.Select(x => BuildLightweightUserDto(x));
493    }
494
495    public DT.User AddUser(DT.User user) {
496      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
497
498      DA.User accessUser;
499      DA.aspnet_User aspUser;
500      DA.aspnet_Membership aspMembership;
501      bool userExistsInASP;
502
503      Convert.ToEntity(user, out accessUser, out aspUser, out aspMembership, out userExistsInASP);
504
505      if (userExistsInASP) {
506        if (accessUser.Id == null || accessUser.Id == Guid.Empty) {
507          accessUser.Id = aspMembership.UserId;
508        }
509        using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
510          context.UserGroupBases.InsertOnSubmit(accessUser);
511          context.SubmitChanges();
512        }
513        MembershipUser membershipUser = Membership.GetUser((object)accessUser.Id);
514        if (membershipUser != null) {
515          membershipUser.Email = aspMembership.Email;
516          membershipUser.IsApproved = aspMembership.IsApproved;
517          membershipUser.Comment = aspMembership.Comment;
518          Membership.UpdateUser(membershipUser);
519        }
520      } else {
521        MembershipUser membershipUser = Membership.CreateUser(aspUser.UserName, aspUser.UserName, aspMembership.Email);
522        membershipUser.IsApproved = aspMembership.IsApproved;
523        membershipUser.Comment = aspMembership.Comment;
524        Membership.UpdateUser(membershipUser);
525
526        Guid userId = (Guid)membershipUser.ProviderUserKey;
527        accessUser.Id = userId;
528
529        using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
530          context.UserGroupBases.InsertOnSubmit(accessUser);
531          context.SubmitChanges();
532        }
533      }
534
535      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
536        var newAspUser = context.aspnet_Users.Where(x => x.UserId == accessUser.Id).FirstOrDefault();
537        var newAspMembership = context.aspnet_Memberships.Where(x => x.UserId == accessUser.Id).FirstOrDefault();
538        return Convert.ToDto(accessUser, newAspUser, newAspMembership);
539      }
540    }
541
542    public void DeleteUser(DT.User user) {
543      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
544
545      if (user.Id != null && user.Id != Guid.Empty) {
546        //delete asp.net user
547        Membership.DeleteUser(user.UserName);
548        using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
549          var query = context.UserGroupBases.OfType<DA.User>().Where(x => x.Id == user.Id);
550          if (query.Count() > 0) {
551
552            //delete affiliation first
553            var queryMapping = context.UserGroupUserGroups.Where(x => x.UserGroupId == user.Id);
554            if (queryMapping.Count() > 0) {
555              context.UserGroupUserGroups.DeleteAllOnSubmit(queryMapping);
556            }
557
558            //delete user from access db
559            context.UserGroupBases.DeleteOnSubmit(query.First());
560            context.SubmitChanges();
561          }
562        }
563      }
564    }
565
566    public void UpdateUser(DT.User user) {
567      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
568
569      MembershipUser membershipUser = Membership.GetUser((object)user.Id);
570      if (membershipUser != null) {
571        membershipUser.Email = user.Email;
572        membershipUser.IsApproved = user.IsApproved;
573        membershipUser.Comment = user.Comment;
574        Membership.UpdateUser(membershipUser);
575      }
576
577      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
578        var query = from u in context.UserGroupBases.OfType<DA.User>()
579                    where u.Id == user.Id
580                    select u;
581        if (query.Count() > 0) {
582          DA.User u = query.First();
583          u.FullName = user.FullName;
584          context.SubmitChanges();
585        }
586      }
587    }
588
589    public void AddUserToRole(DT.Role role, DT.User user) {
590      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
591
592      //TODO: usernames and rolenames have to be unique!
593      MembershipUser msUser = Membership.GetUser((object)user.Id);
594      if (msUser != null) {
595        Roles.AddUserToRole(msUser.UserName, role.Name);
596      }
597    }
598
599    public void RemoveUserFromRole(DT.Role role, DT.User user) {
600      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
601
602      MembershipUser msUser = Membership.GetUser((object)user.Id);
603      if (msUser != null) {
604        Roles.RemoveUserFromRole(msUser.UserName, role.Name);
605      }
606    }
607
608    public bool ChangePassword(Guid userId, string oldPassword, string newPassword) {
609      MembershipUser msUser = Membership.GetUser(userId);
610      if (msUser != null) {
611        return msUser.ChangePassword(oldPassword, newPassword);
612      }
613      return false;
614    }
615
616    public string ResetPassword(Guid userId) {
617      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
618
619      MembershipUser msUser = Membership.GetUser(userId);
620      if (msUser != null) {
621        return msUser.ResetPassword();
622      } else {
623        throw new Exception("Password reset failed.");
624      }
625    }
626    #endregion
627
628    #region UserGroup
629    public IEnumerable<DT.UserGroup> GetAllUserGroups() {
630      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
631        var query = from u in context.UserGroupBases.OfType<DA.UserGroup>()
632                    select Convert.ToDto(u);
633        return query.ToList();
634      }
635    }
636
637    public IEnumerable<DT.UserGroup> GetUserGroupsOfUser(Guid userId) {
638
639      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
640        var groupIds = from g in context.UserGroupUserGroups
641                       where g.UserGroupId == userId
642                       select g.UserGroupUserGroupId;
643
644        var query = from g in context.UserGroupBases.OfType<DA.UserGroup>()
645                    where groupIds.Contains(g.Id)
646                    select Convert.ToDto(g);
647
648        return query.ToList();
649      }
650    }
651
652    public IEnumerable<DT.UserGroup> GetUserGroups(IEnumerable<Guid> ids) {
653      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
654        var query = from u in context.UserGroupBases.OfType<DA.UserGroup>()
655                    where ids.Contains(u.Id)
656                    select Convert.ToDto(u);
657        return query.ToList();
658      }
659    }
660
661    public Guid AddUserGroup(DT.UserGroup group) {
662      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
663        //because id is not automatically set because of user, we have to do it here manually for group   
664        group.Id = Guid.NewGuid();
665
666        context.UserGroupBases.InsertOnSubmit(Convert.ToEntity(group));
667        context.SubmitChanges();
668        return group.Id;
669      }
670    }
671
672    public void UpdateUserGroup(DT.UserGroup group) {
673      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
674        DA.UserGroup entity = context.UserGroupBases.OfType<DA.UserGroup>().FirstOrDefault(x => x.Id == group.Id);
675        Convert.ToEntity(group, entity);
676        context.SubmitChanges();
677      }
678    }
679
680    public void DeleteUserGroup(DT.UserGroup group) {
681      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
682      var g = group; //linq does not like vars called group
683
684      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
685        var query = from ug in context.UserGroupBases.OfType<DA.UserGroup>()
686                    where ug.Id == g.Id
687                    select ug;
688        if (query.Count() > 0) {
689          context.UserGroupBases.DeleteOnSubmit(query.First());
690          context.SubmitChanges();
691        } else {
692          throw new Exception("UserGroup with id " + g.Id + " does not exist.");
693        }
694      }
695    }
696
697    public void AddUserGroupBaseToGroup(DT.UserGroupBase resource, DT.UserGroup group) {
698      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
699        DA.UserGroupUserGroup ugug = new DA.UserGroupUserGroup();
700        ugug.UserGroupId = resource.Id;
701        ugug.UserGroupUserGroupId = group.Id;
702        context.UserGroupUserGroups.InsertOnSubmit(ugug);
703        context.SubmitChanges();
704      }
705    }
706
707    public void RemoveUserGroupBaseFromGroup(DT.UserGroupBase resource, DT.UserGroup userGroup) {
708      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
709        var query = from u in context.UserGroupUserGroups
710                    where u.UserGroupId == resource.Id && u.UserGroupUserGroupId == userGroup.Id
711                    select u;
712
713        if (query.Count() == 1) {
714          context.UserGroupUserGroups.DeleteOnSubmit(query.First());
715          context.SubmitChanges();
716        }
717      }
718    }
719
720    public IEnumerable<DT.UserGroupBase> GetUsersAndGroups() {
721      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
722        var query = from u in context.UserGroupBases
723                    select Convert.ToDto(u);
724        return query.ToList();
725      }
726    }
727
728    public IEnumerable<DT.UserGroupMapping> GetUserGroupMapping() {
729      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
730        var query = from u in context.UserGroupUserGroups
731                    select Convert.ToDto(u);
732        return query.ToList();
733      }
734    }
735
736    public IEnumerable<Guid> GetUserGroupIdsOfGroup(Guid groupId) {
737      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
738        var query = from u in context.UserGroupUserGroups
739                    where u.UserGroupUserGroupId == groupId
740                    select u.UserGroupId;
741        return query.ToList();
742      }
743    }
744    #endregion
745
746    #region UserGroupBase
747    public IEnumerable<DT.UserGroupBase> GetAllLeightweightUsersAndGroups() {
748      //TODO: it must be possible to include a role so not all users are returned but only the ones who are allowed to use a certain service
749      List<DT.UserGroup> userGroups = new List<DT.UserGroup>();
750      List<DT.UserGroupBase> result = new List<DT.UserGroupBase>();
751
752      // this is just for generating users from asp.net authenticaton db; we should maybe provide an updatescript instead
753      List<Guid> accessUserGuids = null;
754      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
755        var query = from u in context.aspnet_Users
756                    select u.UserId;
757        accessUserGuids = query.ToList();
758      }
759      var lightweightUsers = accessUserGuids.Select(x => BuildLightweightUserDto(x));
760
761      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
762        var query = from u in context.UserGroupBases.OfType<DA.UserGroup>()
763                    select Convert.ToDto(u);
764        userGroups = query.ToList();
765      }
766
767      result.AddRange(lightweightUsers);
768      result.AddRange(userGroups);
769
770      return result;
771    }
772
773    public IEnumerable<DT.UserGroupBase> GetLeightweightUsersAndGroups(IEnumerable<Guid> ids) {
774      List<DA.UserGroupBase> dbUserGroupsBases = new List<DA.UserGroupBase>();
775      List<DT.UserGroupBase> result = new List<DT.UserGroupBase>();
776
777      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
778        var query = from u in context.UserGroupBases
779                    where ids.Contains(u.Id)
780                    select u;
781        dbUserGroupsBases = query.ToList();
782      }
783
784      foreach (var ugb in dbUserGroupsBases) {
785        if (ugb.GetType() == typeof(DA.User)) {
786          var user = BuildLightweightUserDto(ugb.Id);
787          result.Add(user);
788        } else if (ugb.GetType() == typeof(DA.UserGroup)) {
789          var group = Convert.ToDto(ugb as DA.UserGroup);
790          result.Add(group);
791        }
792      }
793      return result;
794    }
795    #endregion
796
797    #region Roles
798    public IEnumerable<DT.Role> GetRoles() {
799      using (DA.ASPNETAuthenticationDataContext context = new DA.ASPNETAuthenticationDataContext()) {
800        var query = from u in context.aspnet_Roles
801                    select Convert.ToDto(u);
802        return query.ToList();
803      }
804    }
805
806    public DT.Role AddRole(DT.Role role) {
807      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
808
809      Roles.CreateRole(role.Name);
810      return role;
811    }
812
813    public void DeleteRole(DT.Role role) {
814      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
815
816      Roles.DeleteRole(role.Name);
817    }
818
819    public IEnumerable<DT.Role> GetUserRoles(DT.User user) {
820      var roles = Roles.GetRolesForUser(user.UserName);
821      return roles.Select(x => new DT.Role() { Name = x });
822    }
823
824    public void AddRoleToGroup(DT.UserGroup userGroup, DT.Role role) {
825      Guid[] userIds;
826      string[] aspUsers;
827
828      using (DA.AccessServiceDataContext accessContext = new DA.AccessServiceDataContext()) {
829        userIds = (from u in accessContext.UserGroupUserGroups
830                   where u.UserGroupUserGroupId == userGroup.Id
831                   select u.UserGroupId).ToArray();
832      }
833
834      using (DA.ASPNETAuthenticationDataContext aspContext = new DA.ASPNETAuthenticationDataContext()) {
835        aspUsers = (from u in aspContext.aspnet_Users
836                    where userIds.Contains(u.UserId)
837                    select u.UserName).ToArray();
838      }
839
840      Roles.AddUsersToRole(aspUsers, role.Name);
841
842    }
843
844    public void RemoveRoleFromGroup(DT.UserGroup userGroup, DT.Role role) {
845      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
846
847      Guid[] userIds;
848      string[] aspUsers;
849
850      using (DA.AccessServiceDataContext accessContext = new DA.AccessServiceDataContext()) {
851        userIds = (from u in accessContext.UserGroupUserGroups
852                   where u.UserGroupUserGroupId == userGroup.Id
853                   select u.UserGroupId).ToArray();
854      }
855
856      using (DA.ASPNETAuthenticationDataContext aspContext = new DA.ASPNETAuthenticationDataContext()) {
857        aspUsers = (from u in aspContext.aspnet_Users
858                    where userIds.Contains(u.UserId)
859                    select u.UserName).ToArray();
860      }
861
862      Roles.RemoveUsersFromRole(aspUsers.ToArray(), role.Name);
863    }
864    #endregion
865
866    #region Error Reporting
867    public void ReportError(DT.ClientError error) {
868      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
869        context.ClientErrors.InsertOnSubmit(Convert.ToEntity(error));
870        context.SubmitChanges();
871      }
872    }
873
874    public IEnumerable<DT.ClientError> GetClientErrors() {
875      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
876
877      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
878        var query = from c in context.ClientErrors
879                    select Convert.ToDto(c);
880        return query.ToList();
881      }
882    }
883
884    public IEnumerable<DT.ClientError> GetLastClientErrors(DateTime startDate) {
885      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
886
887      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
888        var query = from c in context.ClientErrors
889                    where c.Timestamp >= startDate
890                    select Convert.ToDto(c);
891        return query.ToList();
892      }
893    }
894
895    public void DeleteError(DT.ClientError error) {
896      RoleVerifier.AuthenticateForAllRoles(AccessServiceRoles.Administrator);
897
898      using (DA.AccessServiceDataContext context = new DA.AccessServiceDataContext()) {
899        var query = context.ClientErrors.Where(x => x.Id == error.Id);
900        if (query.Count() > 0) {
901          context.ClientErrors.DeleteOnSubmit(query.First());
902          context.SubmitChanges();
903        }
904      }
905    }
906    #endregion
907  }
908}
Note: See TracBrowser for help on using the repository browser.