Пример #1
0
        public UserRepositoryRole RepositoryAddUser(string reponame, string username)
        {
            using (var ctx = new GitCandyContext())
            {
                var pair = (from r in ctx.Repositories
                            from u in ctx.Users
                            where r.Name == reponame && u.Name == username &&
                            r.UserRepositoryRoles.All(s => s.User.Name != username)
                            select new { RepoID = r.ID, UserID = u.ID })
                           .FirstOrDefault();
                if (pair == null)
                {
                    return(null);
                }

                var role = new UserRepositoryRole
                {
                    RepositoryID = pair.RepoID,
                    UserID       = pair.UserID,
                    AllowRead    = true,
                    AllowWrite   = true,
                    IsOwner      = false,
                };
                ctx.UserRepositoryRoles.Add(role);
                ctx.SaveChanges();
                return(role);
            }
        }
Пример #2
0
        public TeamRepositoryRole RepositoryAddTeam(string reponame, string teamname)
        {
            using (var ctx = new GitCandyContext())
            {
                var pair = (from r in ctx.Repositories
                            from t in ctx.Teams
                            where r.Name == reponame && t.Name == teamname &&
                            r.TeamRepositoryRoles.All(s => s.Team.Name != teamname)
                            select new { RepoID = r.ID, TeamID = t.ID })
                           .FirstOrDefault();
                if (pair == null)
                {
                    return(null);
                }

                var role = new TeamRepositoryRole
                {
                    RepositoryID = pair.RepoID,
                    TeamID       = pair.TeamID,
                    AllowRead    = true,
                    AllowWrite   = true,
                };
                ctx.TeamRepositoryRoles.Add(role);
                ctx.SaveChanges();
                return(role);
            }
        }
Пример #3
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);
            }
        }
Пример #4
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);
     }
 }
Пример #5
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);
            }
        }
Пример #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);
            }
        }
Пример #7
0
 public bool HasSshKey(string fingerprint)
 {
     using (var ctx = new GitCandyContext())
     {
         return(ctx.SshKeys.Any(s => s.Fingerprint == fingerprint));
     }
 }
Пример #8
0
        public string AddSshKey(string name, string sshkey)
        {
            var seg  = sshkey.Split();
            var type = seg[0];

            sshkey = seg[1];
            var fingerprint = KeyUtils.GetFingerprint(sshkey);

            using (var ctx = new GitCandyContext())
            {
                var user = ctx.Users.FirstOrDefault(s => s.Name == name);
                if (user == null)
                {
                    return(null);
                }

                var key = new SshKey
                {
                    UserID      = user.ID,
                    KeyType     = type,
                    Fingerprint = fingerprint,
                    PublicKey   = sshkey,
                    ImportData  = DateTime.UtcNow,
                    LastUse     = DateTime.UtcNow,
                };

                ctx.SshKeys.Add(key);
                ctx.SaveChanges();
            }
            return(fingerprint);
        }
Пример #9
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);
            }
        }
Пример #10
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);
            }
        }
Пример #11
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
         });
     }
 }
Пример #12
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);
     }
 }
Пример #13
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);
     }
 }
Пример #14
0
 public void DeleteSshKey(string name, string sshkey)
 {
     using (var ctx = new GitCandyContext())
     {
         var key = ctx.SshKeys.FirstOrDefault(s => s.User.Name == name && s.Fingerprint == sshkey);
         ctx.SshKeys.Remove(key);
         ctx.SaveChanges();
     }
 }
Пример #15
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();
         }
     }
 }
Пример #16
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();
         }
     }
 }
Пример #17
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());
     }
 }
Пример #18
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);
     }
 }
Пример #19
0
        public RepositoryModel GetRepositoryModel(string reponame, bool withShipment = false, string username = null)
        {
            using (var ctx = new GitCandyContext())
            {
                var repo = ctx.Repositories.FirstOrDefault(s => s.Name == reponame);
                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 || username != null)
                {
                    var tempList = ctx.UserRepositoryRoles
                                   .Where(s => s.Repository.Name == reponame)
                                   .Select(s => new { s.User.Name, s.IsOwner, Kind = true })
                                   .Concat(ctx.TeamRepositoryRoles
                                           .Where(s => s.Repository.Name == reponame)
                                           .Select(s => new { s.Team.Name, IsOwner = false, Kind = false }))
                                   .ToList();

                    if (withShipment)
                    {
                        model.Collaborators = tempList
                                              .Where(s => s.Kind)
                                              .Select(s => s.Name)
                                              .OrderBy(s => s, new StringLogicalComparer())
                                              .ToArray();
                        model.Teams = tempList
                                      .Where(s => !s.Kind)
                                      .Select(s => s.Name)
                                      .OrderBy(s => s, new StringLogicalComparer())
                                      .ToArray();
                    }
                    if (username != null)
                    {
                        model.CurrentUserIsOwner = tempList
                                                   .Any(s => s.Kind && s.IsOwner && s.Name == username);
                    }
                }
                return(model);
            }
        }
Пример #20
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();
         }
     }
 }
Пример #21
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();
         }
     }
 }
Пример #22
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);
            }
        }
Пример #23
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());
            }
        }
Пример #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);
            }
        }
Пример #25
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();
         }
     }
 }
Пример #26
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);
                }
            }
        }
Пример #27
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);
            }
        }
Пример #28
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);
            }
        }
Пример #29
0
        public SshModel GetSshList(string name)
        {
            using (var ctx = new GitCandyContext())
            {
                var keys = ctx.SshKeys
                           .Where(s => s.User.Name == name)
                           .Select(s => new SshModel.SshKey {
                    Name = s.Fingerprint
                })
                           .ToArray();

                return(new SshModel {
                    Username = name, SshKeys = keys
                });
            }
        }
Пример #30
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);
            }
        }