// DeleteUser <username>
        public static string Execute(string[] data)
        {
            if (data.Length != 2)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            string username = data[1];

            AuthenticationCheck.CheckUserCredentials(username);

            using (var context = new PhotoShareContext())
            {
                var user = context.Users
                           .FirstOrDefault(u => u.Username == username);

                if (user == null)
                {
                    throw new ArgumentException($"User {username} not found!");
                }

                if (user.IsDeleted.Value == true)
                {
                    throw new InvalidOperationException($"User {username} is already deleted!");
                }

                user.IsDeleted = true;

                context.SaveChanges();
            }

            return($"User {username} was deleted successfully!");
        }
        // AddTown <townName> <countryName>
        public static string Execute(string[] data)
        {
            if (data.Length != 3)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogin();

            string townName = data[1];
            string country  = data[2];

            using (PhotoShareContext context = new PhotoShareContext())
            {
                if (context.Towns.Any(t => t.Name == townName))
                {
                    throw new ArgumentException($"Town {townName} was already added!");
                }

                Town town = new Town
                {
                    Name    = townName,
                    Country = country
                };

                context.Towns.Add(town);
                context.SaveChanges();

                return($"Town {townName} was added successfully!");
            }
        }
예제 #3
0
        // AddTag <tag>
        public static string Execute(string[] data)
        {
            if (data.Length != 2)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogin();

            string tagName = data[1].ValidateOrTransform();

            using (PhotoShareContext context = new PhotoShareContext())
            {
                if (context.Tags.Any(t => t.Name == tagName))
                {
                    throw new ArgumentException($"Tag {tagName} exists!");
                }

                context.Tags.Add(new Tag
                {
                    Name = tagName
                });

                context.SaveChanges();
            }

            return($"Tag {tagName} was added successfully!");
        }
예제 #4
0
        // AcceptFriend <username1> <username2>
        public static string Execute(string[] data)
        {
            if (data.Length != 3)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogin();

            string rqAccepterUsername = data[1];
            string rqSenderUsername   = data[2];

            using (var context = new PhotoShareContext())
            {
                var rqAccepter = context.Users
                                 .Include(u => u.FriendsAdded)
                                 .ThenInclude(fa => fa.Friend)
                                 .FirstOrDefault(u => u.Username == rqAccepterUsername);
                var rqSender = context.Users
                               .Include(u => u.FriendsAdded)
                               .ThenInclude(fa => fa.Friend)
                               .FirstOrDefault(u => u.Username == rqSenderUsername);

                if (rqAccepter == null || rqSender == null)
                {
                    string userDoesNotExist = rqAccepter == null ? rqAccepterUsername : rqSenderUsername;

                    throw new ArgumentException($"{userDoesNotExist} not found!");
                }

                AuthenticationCheck.CheckUserCredentials(rqAccepterUsername);

                bool alreadyFriends = (rqAccepter.FriendsAdded.Any(u => u.Friend == rqSender) &&
                                       (rqSender.FriendsAdded.Any(u => u.Friend == rqAccepter)));
                bool isInvititationSent = rqSender.FriendsAdded.Any(u => u.Friend == rqAccepter);

                if (alreadyFriends)
                {
                    throw new InvalidOperationException($"{rqSenderUsername} is already a friend to {rqAccepterUsername}");
                }

                if (!isInvititationSent)
                {
                    throw new InvalidOperationException($"{rqSenderUsername} has not added {rqAccepterUsername} as a friend");
                }

                rqAccepter.FriendsAdded.Add(
                    new Friendship()
                {
                    User   = rqAccepter,
                    Friend = rqSender
                });

                context.SaveChanges();
            }

            return($"{rqAccepterUsername} accepted {rqSenderUsername} as a friend");
        }
예제 #5
0
        // ShareAlbum <albumId> <username> <permission>
        // For example:
        // ShareAlbum 4 dragon321 Owner
        // ShareAlbum 4 dragon11 Viewer
        public static string Execute(string[] data)
        {
            if (data.Length != 4)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            int    albumId        = int.Parse(data[1]);
            string username       = data[2];
            string permissionType = ConvertToTitleCase(data[3].ToLower());
            string albumTitle     = string.Empty;

            using (var context = new PhotoShareContext())
            {
                var album = context.Albums
                            .Include(a => a.AlbumRoles)
                            .FirstOrDefault(a => a.Id == albumId);

                if (album == null)
                {
                    throw new ArgumentException($"Album {albumId} not found!");
                }

                albumTitle = album.Name;

                var user = context.Users
                           .Include(a => a.AlbumRoles)
                           .FirstOrDefault(u => u.Username == username);

                if (user == null)
                {
                    throw new ArgumentException($"User {username} not found!");
                }

                bool permissionTypeIsValid = Enum.TryParse(permissionType, out Role role);

                if (!permissionTypeIsValid)
                {
                    throw new ArgumentException("Permission must be either “Owner” or “Viewer”!");
                }

                AuthenticationCheck.CheckAlbumOwnership(Session.User.Id, albumId, context);

                context.AlbumRoles.Add(
                    new AlbumRole()
                {
                    AlbumId = albumId,
                    UserId  = user.Id,
                    Role    = role
                });

                context.SaveChanges();
            }

            return($"Username {username} added to album {albumTitle} ({permissionType})");
        }
예제 #6
0
 public SimpleAuthenticator(string realm, AuthenticationCheck authenticationCheck) :
     base(realm)
 {
     if (authenticationCheck != null)
     {
         AuthenticationCheck = authenticationCheck;
     }
     else
     {
         throw new NotImplementedException("No DoCheck delegate was specified for WWWAuthenticator.");
     }
 }
예제 #7
0
        // AddTagTo <albumName> <tag>
        public static string Execute(string[] data)
        {
            if (data.Length != 3)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogin();

            string albumTitle = data[1];
            string tagName    = TagUtilities.ValidateOrTransform(data[2]);

            using (var context = new PhotoShareContext())
            {
                var album = context.Albums
                            .Include(a => a.AlbumTags)
                            .ThenInclude(at => at.Tag)
                            .FirstOrDefault(a => a.Name.ToLower() == albumTitle.ToLower());

                var tag = context.Tags
                          .FirstOrDefault(t => t.Name.ToLower() == tagName.ToLower());

                if (album == null || tag == null)
                {
                    throw new ArgumentException("Either tag or album do not exist!");
                }

                if (album.AlbumTags.Any(at => at.Tag.Name.ToLower() == tagName.ToLower()))
                {
                    throw new ArgumentException($"Tag {tagName} already present in album {albumTitle}");
                }

                var userId = Session.User.Id;

                AuthenticationCheck.CheckAlbumOwnership(userId, album.Id, context);

                context.AlbumTags.Add(
                    new AlbumTag()
                {
                    Album = album,
                    Tag   = tag
                });

                context.SaveChanges();
            }

            return($"Tag {tagName} added to {albumTitle}!");
        }
        // UploadPicture <albumName> <pictureTitle> <pictureFilePath>
        public static string Execute(string[] data)
        {
            if (data.Length != 4)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogin();

            string albumTitle   = data[1];
            string pictureTitle = data[2];
            string filePath     = data[3];

            using (var context = new PhotoShareContext())
            {
                var album = context.Albums
                            .Include(a => a.Pictures)
                            .SingleOrDefault(a => a.Name == albumTitle);

                if (album == null)
                {
                    throw new ArgumentException($"Album {albumTitle} not found!");
                }

                int currentlyLoggedinUserId = Session.User.Id;
                AuthenticationCheck.CheckAlbumOwnership(currentlyLoggedinUserId, album.Id, context);

                if (album.Pictures.Any(p => p.Title.ToLower() == pictureTitle.ToLower()))
                {
                    throw new InvalidOperationException(
                              $"A picture with the name {pictureTitle} is already present in album {albumTitle}");
                }

                album.Pictures.Add(
                    new Picture()
                {
                    Title = pictureTitle,
                    Path  = filePath,
                    Album = album
                });

                context.SaveChanges();
            }

            return($"Picture {pictureTitle} added to {albumTitle}!");
        }
예제 #9
0
        // RegisterUser <username> <password> <repeat-password> <email>
        public static string Execute(string[] data)
        {
            if (data.Length != 5)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogout();

            string username       = data[1];
            string password       = data[2];
            string repeatPassword = data[3];
            string email          = data[4];

            using (var context = new PhotoShareContext())
            {
                if (context.Users.Any(u => u.Username == username))
                {
                    throw new InvalidOperationException($"Username {username} is already taken!");
                }
            }

            if (password != repeatPassword)
            {
                throw new ArgumentException("Passwords do not match!");
            }

            User user = new User
            {
                Username         = username,
                Password         = password,
                Email            = email,
                IsDeleted        = false,
                RegisteredOn     = DateTime.Now,
                LastTimeLoggedIn = DateTime.Now
            };

            using (PhotoShareContext context = new PhotoShareContext())
            {
                context.Users.Add(user);
                context.SaveChanges();
            }

            return($"User {user.Username} was registered successfully!");
        }
        // CreateAlbum <username> <albumTitle> <BgColor> <tag1> <tag2>...<tagN>
        public static string Execute(string[] data)
        {
            if (data.Length < 4)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            AuthenticationCheck.CheckLogin();

            string username   = data[1];
            string albumTitle = data[2];
            string bgColor    = ConvertToTitleCase(data[3].ToLower());
            var    tags       = data
                                .Skip(4)
                                .Select(t => TagUtilities.ValidateOrTransform(t))
                                .ToArray();

            AuthenticationCheck.CheckUserCredentials(username);

            using (var context = new PhotoShareContext())
            {
                var user = context.Users
                           .FirstOrDefault(u => u.Username == username);

                if (user == null)
                {
                    throw new ArgumentException($"User {username} not found!");
                }

                if (context.Albums.Any(a => a.Name == albumTitle))
                {
                    throw new ArgumentException($"Album {albumTitle} exists!");
                }

                bool bgColorIsValid = Enum.TryParse(bgColor, out Color color);
                if (!bgColorIsValid)
                {
                    throw new ArgumentException($"Color {bgColor} not found!");
                }

                var album = new Album()
                {
                    Name            = albumTitle,
                    IsPublic        = false,
                    BackgroundColor = color,
                };

                context.Albums.Add(album);

                var currentAlbumRole = new AlbumRole
                {
                    Album = album,
                    User  = user,
                    Role  = Role.Owner
                };

                context.AlbumRoles.Add(currentAlbumRole);

                for (int i = 0; i < tags.Length; i++)
                {
                    var currentTag = context.Tags.FirstOrDefault(t => t.Name.ToLower() == tags[i].ToLower());

                    if (currentTag == null)
                    {
                        throw new ArgumentException("Invalid tags!");
                    }

                    context.AlbumTags.Add(
                        new AlbumTag()
                    {
                        TagId   = currentTag.Id,
                        AlbumId = album.Id
                    });
                }

                context.SaveChanges();
            }

            return($"Album {albumTitle} successfully created!");
        }
예제 #11
0
 public Login()
 {
     InitializeComponent();
     ac = new AuthenticationCheck();
 }
예제 #12
0
 public Register()
 {
     InitializeComponent();
     au = new AuthenticationCheck();
 }
예제 #13
0
 public SimpleAuthenticator(string realm, AuthenticationCheck authenticationCheck)
     : base(realm)
 {
     if (authenticationCheck != null)
         AuthenticationCheck = authenticationCheck;
     else
         throw new NotImplementedException("No DoCheck delegate was specified for WWWAuthenticator.");
 }
        // ModifyUser <username> <property> <new value>
        // For example:
        // ModifyUser <username> Password <NewPassword>
        // ModifyUser <username> BornTown <newBornTownName>
        // ModifyUser <username> CurrentTown <newCurrentTownName>
        // !!! Cannot change username
        public static string Execute(string[] data)
        {
            if (data.Length != 4)
            {
                throw new InvalidOperationException($"Command {data[0]} not valid!");
            }

            string username = data[1];
            string property = data[2];
            string newValue = data[3];

            string exceptionMessage = $"Value {newValue} not valid.{Environment.NewLine}";

            using (var context = new PhotoShareContext())
            {
                var currentUser = context.Users
                                  .Where(u => u.Username == username)
                                  .FirstOrDefault();

                if (currentUser == null)
                {
                    throw new ArgumentException($"User {username} not found!");
                }

                AuthenticationCheck.CheckUserCredentials(username);

                switch (property.ToLower())
                {
                case "password":

                    if (!newValue.Any(char.IsLower) || !newValue.Any(char.IsDigit))
                    {
                        throw new ArgumentException($"{exceptionMessage}Invalid Password");
                    }

                    currentUser.Password = newValue;
                    break;

                case "borntown":
                    var bornTownValue = context.Towns
                                        .Where(t => t.Name == newValue)
                                        .FirstOrDefault();

                    if (bornTownValue == null)
                    {
                        throw new ArgumentException($"{exceptionMessage}Town {newValue} not found!");
                    }

                    currentUser.BornTown = bornTownValue;
                    break;

                case "currenttown":
                    var currentTownValue = context.Towns
                                           .Where(t => t.Name == newValue)
                                           .FirstOrDefault();

                    if (currentTownValue == null)
                    {
                        throw new ArgumentException($"{exceptionMessage}Town {newValue} not found!");
                    }

                    currentUser.CurrentTown = currentTownValue;
                    break;

                default: throw new ArgumentException($"Property {property} not supported!");
                }

                context.SaveChanges();
            }

            return($"User {username} {property} is {newValue}.");
        }