Example #1
0
        public RepositoryModel GetRepositoryModel(string name, bool withShipment = false)
        {
            using (var ctx = new GitCandyContext())
            {
                var repo = ctx.Repositories.FirstOrDefault(s => s.Name == name);
                if (repo == null)
                    return null;

                var model = new RepositoryModel
                {
                    Name = repo.Name,
                    Description = repo.Description,
                    IsPrivate = repo.IsPrivate,
                    AllowAnonymousRead = repo.AllowAnonymousRead,
                    AllowAnonymousWrite = repo.AllowAnonymousWrite,
                };
                if (withShipment)
                {
                    model.Collaborators = repo.UserRepositoryRoles
                        .Select(s => s.User.Name)
                        .OrderBy(s => s, new StringLogicalComparer())
                        .ToArray();
                    model.Teams = repo.TeamRepositoryRoles
                        .Select(s => s.Team.Name)
                        .OrderBy(s => s, new StringLogicalComparer())
                        .ToArray();
                }
                return model;
            }
        }
Example #2
0
        public UserModel GetUserModel(string name, bool withMembers = false, string viewUser = null)
        {
            using (var ctx = new GitCandyContext())
            {
                var user = ctx.Users.FirstOrDefault(s => s.Name == name);

                if (user == null)
                    return null;

                var model = new UserModel
                {
                    Name = user.Name,
                    Nickname = user.Nickname,
                    Email = user.Email,
                    Description = user.Description,
                    IsSystemAdministrator = user.IsSystemAdministrator,
                };
                if (withMembers)
                {
                    model.Teams = ctx.UserTeamRoles
                        .Where(s => s.User.ID == user.ID)
                        .Select(s => s.Team.Name)
                        .AsEnumerable()
                        .OrderBy(s => s, new StringLogicalComparer())
                        .ToArray();

                    model.Respositories = ctx.UserRepositoryRoles
                        // belong user
                        .Where(s => s.User.ID == user.ID && s.IsOwner)
                        // can view for viewUser
                        .Where(s => !s.Repository.IsPrivate
                            || viewUser != null &&
                                (ctx.Users.Any(t => t.Name == viewUser && t.IsSystemAdministrator)
                                || ctx.UserRepositoryRoles.Any(t => t.RepositoryID == s.RepositoryID
                                    && t.User.Name == viewUser
                                    && t.AllowRead)
                                || ctx.TeamRepositoryRoles.Any(t => t.RepositoryID == s.RepositoryID
                                    && t.Team.UserTeamRoles.Any(r => r.User.Name == viewUser)
                                    && t.AllowRead)))
                        .Select(s => s.Repository.Name)
                        .AsEnumerable()
                        .OrderBy(s => s, new StringLogicalComparer())
                        .ToArray();
                }
                return model;
            }
        }
Example #3
0
        public User CreateAccount(string name, string nickname, string password, string email, string description, out bool badName, out bool badEmail)
        {
            badName = false;
            badEmail = false;

            using (var ctx = new GitCandyContext())
            //using (TransactionScope transaction = new TransactionScope()) // I don't know why Sqlite not support for TransactionScope
            {
                try
                {
                    var list = ctx.Users.Where(s => s.Name == name || s.Email == email).ToList();
                    badName = list.Any(s => string.Equals(s.Name, name, StringComparison.OrdinalIgnoreCase));
                    badEmail = list.Any(s => string.Equals(s.Email, email, StringComparison.OrdinalIgnoreCase));

                    if (badName || badEmail)
                        return null;

                    var user = new User
                    {
                        Name = name,
                        Nickname = nickname,
                        Email = email,
                        PasswordVersion = -1,
                        Password = "",
                        Description = description,
                        CreationDate = DateTime.UtcNow,
                    };
                    ctx.Users.Add(user);
                    ctx.SaveChanges();

                    using (var pp = PasswordProviderPool.Take())
                    {
                        user.PasswordVersion = pp.Version;
                        user.Password = pp.Compute(user.ID, name, password);
                    }
                    ctx.SaveChanges();

                    //transaction.Complete();
                    return user;
                }
                catch
                {
                    return null;
                }
            }
        }
Example #4
0
        public bool Update(RepositoryModel model)
        {
            using (var ctx = new GitCandyContext())
            {
                var repo = ctx.Repositories.FirstOrDefault(s => s.Name == model.Name);
                if (repo != null)
                {
                    repo.IsPrivate = model.IsPrivate;
                    repo.AllowAnonymousRead = model.AllowAnonymousRead;
                    repo.AllowAnonymousWrite = model.AllowAnonymousWrite;
                    repo.Description = model.Description;

                    ctx.SaveChanges();
                    return true;
                }
                return false;
            }
        }
Example #5
0
        public Repository Create(RepositoryModel model, long managerID, out bool badName)
        {
            using (var ctx = new GitCandyContext())
            //using (TransactionScope transaction = new TransactionScope())
            {
                badName = ctx.Repositories.Any(s => s.Name == model.Name);
                if (badName)
                    return null;

                var repo = new Repository
                {
                    Name = model.Name,
                    Description = model.Description,
                    CreationDate = DateTime.UtcNow,
                    IsPrivate = model.IsPrivate,
                    AllowAnonymousRead = model.AllowAnonymousRead,
                    AllowAnonymousWrite = model.AllowAnonymousWrite,
                };
                ctx.Repositories.Add(repo);
                ctx.SaveChanges();

                if (managerID > 0)
                {
                    repo.UserRepositoryRoles.Add(new UserRepositoryRole
                    {
                        Repository = repo,
                        UserID = managerID,
                        IsOwner = true,
                        AllowRead = true,
                        AllowWrite = true
                    });
                }
                ctx.SaveChanges();

                //transaction.Complete();
                return repo;
            }
        }
Example #6
0
        public UserListModel GetUserList(string keyword, int page, int pagesize = 20)
        {
            using (var ctx = new GitCandyContext())
            {
                var query = ctx.Users.AsQueryable();
                if (!string.IsNullOrEmpty(keyword))
                    query = query.Where(s => s.Name.Contains(keyword)
                        || s.Nickname.Contains(keyword)
                        || s.Email.Contains(keyword)
                        || s.Description.Contains(keyword));
                query = query.OrderBy(s => s.Name);

                var model = new UserListModel
                {
                    Users = query
                        .Skip((page - 1) * pagesize)
                        .Take(pagesize)
                        .Select(user => new UserModel
                        {
                            Name = user.Name,
                            Nickname = user.Nickname,
                            Email = user.Email,
                            Description = user.Description,
                            IsSystemAdministrator = user.IsSystemAdministrator,
                        })
                        .ToArray(),
                    CurrentPage = page,
                    ItemCount = query.Count(),
                };
                return model;
            }
        }
Example #7
0
        public Team CreateTeam(string name, string description, long managerID, out bool badName)
        {
            badName = false;

            using (var ctx = new GitCandyContext())
            //using (TransactionScope transaction = new TransactionScope())
            {
                try
                {
                    badName = ctx.Teams.Count(s => s.Name == name) != 0;

                    if (badName)
                        return null;

                    var team = new Team
                    {
                        Name = name,
                        Description = description,
                        CreationDate = DateTime.UtcNow,
                    };
                    ctx.Teams.Add(team);

                    if (managerID > 0)
                    {
                        team.UserTeamRoles.Add(new UserTeamRole { Team = team, UserID = managerID, IsAdministrator = true });
                    }
                    ctx.SaveChanges();

                    //transaction.Complete();
                    return team;
                }
                catch
                {
                    return null;
                }
            }
        }
Example #8
0
        public TeamListModel GetTeamList(string keyword, int page, int pagesize = 20)
        {
            using (var ctx = new GitCandyContext())
            {
                var query = ctx.Teams.AsQueryable();
                if (!string.IsNullOrEmpty(keyword))
                    query = query.Where(s => s.Name.Contains(keyword)
                        || s.Description.Contains(keyword));
                query = query.OrderBy(s => s.Name);

                var model = new TeamListModel
                {
                    Teams = query
                        .Skip((page - 1) * pagesize)
                        .Take(pagesize)
                        .Select(s => new TeamModel
                        {
                            Name = s.Name,
                            Description = s.Description,
                        })
                        .ToArray(),
                    CurrentPage = page,
                    ItemCount = query.Count(),
                };
                return model;
            }
        }
Example #9
0
        public RepositoryListModel GetRepositories(string username, bool showAll = false)
        {
            using (var ctx = new GitCandyContext())
            {
                var model = new RepositoryListModel();

                if (string.IsNullOrEmpty(username))
                {
                    model.Collaborations = new RepositoryModel[0];
                    model.Repositories = ToRepositoryArray(ctx.Repositories.Where(s => !s.IsPrivate).OrderBy(s => s.Name));
                }
                else
                {
                    var q1 = ctx.UserRepositoryRoles.Where(s => s.User.Name == username && s.AllowRead && s.AllowWrite).Select(s => s.Repository);
                    var q2 = ctx.UserTeamRoles.Where(s => s.User.Name == username).SelectMany(s => s.Team.TeamRepositoryRoles.Where(t => t.AllowRead && t.AllowWrite).Select(t => t.Repository));
                    var q3 = q1.Union(q2);

                    model.Collaborations = ToRepositoryArray(q3.OrderBy(s => s.Name));
                    model.Repositories = ToRepositoryArray(ctx.Repositories.Where(s => showAll || (!s.IsPrivate)).Except(q3).OrderBy(s => s.Name));
                }

                return model;
            }
        }
Example #10
0
        public bool TeamUserSetAdministrator(string teamname, string username, bool isAdmin)
        {
            using (var ctx = new GitCandyContext())
            {
                var role = ctx.UserTeamRoles.FirstOrDefault(s => s.Team.Name == teamname && s.User.Name == username);
                if (role == null)
                    return false;

                role.IsAdministrator = isAdmin;

                ctx.SaveChanges();
                return true;
            }
        }
Example #11
0
 public bool IsTeamAdministrator(string teamname, string username)
 {
     using (var ctx = new GitCandyContext())
     {
         var role = ctx.UserTeamRoles.FirstOrDefault(s => s.Team.Name == teamname && s.User.Name == username);
         return role != null && role.IsAdministrator;
     }
 }
Example #12
0
        public bool UpdateUser(UserModel model)
        {
            using (var ctx = new GitCandyContext())
            {
                var user = ctx.Users.FirstOrDefault(s => s.Name == model.Name);
                if (user != null)
                {
                    user.Nickname = model.Nickname;
                    user.Email = model.Email;
                    user.Description = model.Description;
                    user.IsSystemAdministrator = model.IsSystemAdministrator;

                    ctx.SaveChanges();
                    return true;
                }
                return false;
            }
        }
Example #13
0
        public bool TeamAddUser(string teamname, string username)
        {
            using (var ctx = new GitCandyContext())
            {
                var pair = (from t in ctx.Teams
                            from u in ctx.Users
                            where t.Name == teamname && u.Name == username
                                && t.UserTeamRoles.All(r => r.UserID != u.ID)
                            select new { TeamID = t.ID, UserID = u.ID })
                            .FirstOrDefault();
                if (pair == null)
                    return false;

                ctx.UserTeamRoles.Add(new UserTeamRole { TeamID = pair.TeamID, UserID = pair.UserID, IsAdministrator = false });

                ctx.SaveChanges();
                return true;
            }
        }
Example #14
0
        public void SetPassword(string name, string newPassword)
        {
            using (var ctx = new GitCandyContext())
            {
                var user = ctx.Users.FirstOrDefault(s => s.Name == name);
                if (user != null)
                {
                    using (var pp = PasswordProviderPool.Take())
                    {
                        user.Password = pp.Compute(user.ID, user.Name, newPassword);
                        user.PasswordVersion = pp.Version;
                    }

                    var auths = ctx.AuthorizationLogs.Where(s => s.UserID == user.ID);
                    foreach (var auth in auths)
                    {
                        auth.IsValid = false;
                    }
                    ctx.SaveChanges();
                }
            }
        }
Example #15
0
        public bool RepositoryTeamSetValue(string reponame, string teamname, string field, bool value)
        {
            using (var ctx = new GitCandyContext())
            {
                var role = ctx.TeamRepositoryRoles.FirstOrDefault(s => s.Repository.Name == reponame && s.Team.Name == teamname);
                if (role == null)
                    return false;

                if (field == "read")
                    role.AllowRead = value;
                else if (field == "write")
                    role.AllowWrite = value;
                else
                    return false;

                ctx.SaveChanges();
                return true;
            }
        }
Example #16
0
 public User Login(string id, string password)
 {
     using (var ctx = new GitCandyContext())
     {
         var user = ctx.Users.FirstOrDefault(s => s.Name == id || s.Email == id);
         if (user != null)
         {
             using (var pp1 = PasswordProviderPool.Take(user.PasswordVersion))
                 if (user.Password == pp1.Compute(user.ID, user.Name, password))
                 {
                     if (user.PasswordVersion != PasswordProviderPool.LastVersion)
                         using (var pp2 = PasswordProviderPool.Take())
                         {
                             user.Password = pp2.Compute(user.ID, user.Name, password);
                             user.PasswordVersion = pp2.Version;
                             ctx.SaveChanges();
                         }
                     return user;
                 }
         }
         return null;
     }
 }
Example #17
0
 public void Delete(string name)
 {
     using (var ctx = new GitCandyContext())
     {
         var repo = ctx.Repositories.FirstOrDefault(s => s.Name == name);
         if (repo != null)
         {
             repo.TeamRepositoryRoles.Clear();
             repo.UserRepositoryRoles.Clear();
             ctx.Repositories.Remove(repo);
             ctx.SaveChanges();
         }
     }
 }
Example #18
0
 public bool IsRepositoryAdministrator(string reponame, string username)
 {
     using (var ctx = new GitCandyContext())
     {
         var role = ctx.UserRepositoryRoles.FirstOrDefault(s => s.Repository.Name == reponame && s.User.Name == username);
         return role != null && role.IsOwner;
     }
 }
Example #19
0
 public bool UpdateTeam(TeamModel model)
 {
     using (var ctx = new GitCandyContext())
     {
         var team = ctx.Teams.FirstOrDefault(s => s.Name == model.Name);
         if (team != null)
         {
             team.Description = model.Description;
             ctx.SaveChanges();
             return true;
         }
         return false;
     }
 }
Example #20
0
 public AuthorizationLog CreateAuthorization(long userID, DateTime expires, string ip)
 {
     using (var ctx = new GitCandyContext())
     {
         var auth = new AuthorizationLog
         {
             AuthCode = Guid.NewGuid(),
             UserID = userID,
             IssueDate = DateTime.Now,
             Expires = expires,
             IssueIp = ip,
             LastIp = ip,
             IsValid = true,
         };
         ctx.AuthorizationLogs.Add(auth);
         ctx.SaveChanges();
         return auth;
     }
 }
Example #21
0
        public TeamModel GetTeamModel(string name, bool withMembers = false, string viewUser = null)
        {
            using (var ctx = new GitCandyContext())
            {
                var team = ctx.Teams.FirstOrDefault(s => s.Name == name);
                if (team == null)
                    return null;

                var model = new TeamModel
                {
                    Name = team.Name,
                    Description = team.Description,
                };
                if (withMembers)
                {
                    model.MembersRole = ctx.UserTeamRoles
                        .Where(s => s.TeamID == team.ID)
                        .Select(s => new TeamModel.UserRole
                        {
                            Name = s.User.Name,
                            IsAdministrator = s.IsAdministrator
                        })
                        .AsEnumerable()
                        .OrderBy(s => s.Name, new StringLogicalComparer())
                        .ToArray();
                    model.Members = model.MembersRole
                        .Select(s => s.Name)
                        .ToArray();

                    model.RepositoriesRole = ctx.TeamRepositoryRoles
                        // belong team
                        .Where(s => s.TeamID == team.ID)
                        // can view for viewUser
                        .Where(s => !s.Repository.IsPrivate
                            || viewUser != null &&
                                (ctx.Users.Any(t => t.Name == viewUser && t.IsSystemAdministrator)
                                || ctx.UserRepositoryRoles.Any(t => t.RepositoryID == s.RepositoryID
                                    && t.User.Name == viewUser
                                    && t.AllowRead)
                                || ctx.TeamRepositoryRoles.Any(t => t.RepositoryID == s.RepositoryID
                                    && t.Team.UserTeamRoles.Any(r => r.User.Name == viewUser)
                                    && t.AllowRead)))
                        .Select(s => new TeamModel.RepositoryRole
                        {
                            Name = s.Repository.Name,
                            AllowRead = s.AllowRead,
                            AllowWrite = s.AllowWrite,
                        })
                        .AsEnumerable()
                        .OrderBy(s => s.Name, new StringLogicalComparer())
                        .ToArray();
                    model.Repositories = model.RepositoriesRole
                        .Select(s => s.Name)
                        .ToArray();
                }
                return model;
            }
        }
Example #22
0
 public Token GetToken(Guid authCode)
 {
     using (var ctx = new GitCandyContext())
     {
         var meta = ctx.AuthorizationLogs
             .Where(s => s.AuthCode == authCode && s.IsValid)
             .Select(s => new
             {
                 s.AuthCode,
                 s.Expires,
                 s.User.ID,
                 s.User.Name,
                 s.User.Nickname,
                 s.User.IsSystemAdministrator,
                 s.LastIp,
             })
             .FirstOrDefault();
         return meta == null
             ? null
             : new Token(meta.AuthCode, meta.ID, meta.Name, meta.Nickname, meta.IsSystemAdministrator, meta.Expires)
             {
                 LastIp = meta.LastIp
             };
     }
 }
Example #23
0
        public bool TeamRemoveUser(string teamname, string username)
        {
            using (var ctx = new GitCandyContext())
            {
                var role = ctx.UserTeamRoles.FirstOrDefault(s => s.Team.Name == teamname && s.User.Name == username);
                if (role == null)
                    return false;

                ctx.UserTeamRoles.Remove(role);

                ctx.SaveChanges();
                return true;
            }
        }
Example #24
0
        public bool RepositoryRemoveTeam(string reponame, string teamname)
        {
            using (var ctx = new GitCandyContext())
            {
                var role = ctx.TeamRepositoryRoles.FirstOrDefault(s => s.Repository.Name == reponame && s.Team.Name == teamname);
                if (role == null)
                    return false;

                ctx.TeamRepositoryRoles.Remove(role);
                ctx.SaveChanges();
                return true;
            }
        }
Example #25
0
 public string[] SearchTeam(string query)
 {
     using (var ctx = new GitCandyContext())
     {
         var length = query.Length + 0.5;
         return ctx.Teams
             .Where(s => s.Name.Contains(query))
             .OrderByDescending(s => length / s.Name.Length)
             .ThenBy(s => s.Name)
             .Take(10)
             .Select(s => s.Name)
             .ToArray();
     }
 }
Example #26
0
 public void SetAuthorizationAsInvalid(Guid authCode)
 {
     using (var ctx = new GitCandyContext())
     {
         var auth = ctx.AuthorizationLogs.FirstOrDefault(s => s.AuthCode == authCode);
         if (auth != null)
         {
             auth.IsValid = false;
             ctx.SaveChanges();
         }
     }
 }
Example #27
0
 public void DeleteTeam(string name)
 {
     using (var ctx = new GitCandyContext())
     {
         var team = ctx.Teams.FirstOrDefault(s => s.Name == name);
         if (team != null)
         {
             team.UserTeamRoles.Clear();
             team.TeamRepositoryRoles.Clear();
             ctx.Teams.Remove(team);
             ctx.SaveChanges();
         }
     }
 }
Example #28
0
 public void DeleteUser(string name)
 {
     using (var ctx = new GitCandyContext())
     {
         var user = ctx.Users.FirstOrDefault(s => s.Name == name);
         if (user != null)
         {
             user.UserTeamRoles.Clear();
             user.UserRepositoryRoles.Clear();
             user.AuthorizationLogs.Clear();
             ctx.Users.Remove(user);
             ctx.SaveChanges();
         }
     }
 }
Example #29
0
 public void UpdateAuthorization(Guid authCode, DateTime expires, string lastIp)
 {
     using (var ctx = new GitCandyContext())
     {
         var auth = ctx.AuthorizationLogs.FirstOrDefault(s => s.AuthCode == authCode);
         if (auth != null)
         {
             auth.Expires = expires;
             auth.LastIp = lastIp;
             ctx.SaveChanges();
         }
     }
 }
Example #30
0
        public bool CanWriteRepository(string reponame, string username)
        {
            using (var ctx = new GitCandyContext())
            {
                var q0 = ctx.Repositories.Where(s => s.Name == reponame && s.AllowAnonymousRead && s.AllowAnonymousWrite).Select(s => 0);
                if (string.IsNullOrEmpty(username))
                    return q0.Any();

                var q1 = ctx.UserRepositoryRoles.Where(s => s.Repository.Name == reponame && s.User.Name == username && s.AllowRead && s.AllowWrite).Select(s => 0);
                var q2 = ctx.TeamRepositoryRoles.Where(s => s.Repository.Name == reponame && s.Team.UserTeamRoles.Any(t => t.User.Name == username) && s.AllowRead && s.AllowWrite).Select(s => 0);
                return q0.Concat(q1).Concat(q2).Any();
            }
        }