Пример #1
0
        public IActionResult SetThumbnail([FromBody] TransferFile?transferFile)
        {
            try
            {
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser))
                {
                    return(Unauthorized());
                }
                if (transferFile == null)
                {
                    return(BadRequest());
                }

                // 設定
                using MemoryStream memoryStream = new MemoryStream(transferFile.Content);
                loginUser.Bitmap       = ServerCommon.CreateThumbnail(memoryStream, transferFile.Mime, YbdConstants.USER_THUMBNAIL_WIDTH_MAX, YbdConstants.USER_THUMBNAIL_HEIGHT_MAX, true);
                loginUser.Mime         = transferFile.Mime;
                loginUser.LastModified = YbdCommon.UtcNowModifiedJulianDate();
                userProfileContext.SaveChanges();

                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("プロフィール画像設定サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
Пример #2
0
        public IActionResult AddUser([FromBody] LoginInfo registerInfo)
        {
            try
            {
                if (!registerInfo.IsValid())
                {
                    return(BadRequest());
                }

                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                RegisteredUser newUser = new();
                newUser.Name         = registerInfo.Name;
                newUser.Password     = registerInfo.Password;
                newUser.LastModified = newUser.LastLogin = YbdCommon.UtcNowModifiedJulianDate();

                if (!IsAdminRegistered(registeredUsers))
                {
                    // 管理者未登録の場合は管理者登録でなければならない
                    if (newUser.Name != YbdConstants.ADMIN_NAME)
                    {
                        return(BadRequest());
                    }
                    newUser.IsAdmin = true;
                }

                // 同じ名前のユーザーが既に存在している場合は登録できない
                if (registeredUsers.FirstOrDefault(x => x.Name == newUser.Name) != null)
                {
                    return(Conflict());
                }

                // 登録
                HashPassword(newUser);
                registeredUsers.Add(newUser);
                userProfileContext.SaveChanges();

                String idAndToken = GenerateIdAndTokenString(newUser.Id);
                Debug.WriteLine("AddUser() " + idAndToken);

                // 登録と同時にログインできるように ID とログイン用トークンを返す
                return(Ok(idAndToken));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("ユーザー登録サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
Пример #3
0
        public IActionResult Login([FromBody] LoginInfo loginInfo)
        {
            try
            {
                if (!loginInfo.IsValid())
                {
                    return(BadRequest());
                }

#if DEBUG
                Thread.Sleep(1000);
#endif

                // ユーザーを検索
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                RegisteredUser?loginUser = registeredUsers.SingleOrDefault(x => x.Name == loginInfo.Name);
                if (loginUser == null)
                {
                    return(NotAcceptable());
                }

                // パスワードハッシュの一致を確認
                if (loginUser.Password != HashPassword(loginInfo.Password, loginUser.Salt))
                {
                    return(NotAcceptable());
                }

                String idAndToken = GenerateIdAndTokenString(loginUser.Id);
                Debug.WriteLine("Login() " + idAndToken);

                loginUser.LastLogin = YbdCommon.UtcNowModifiedJulianDate();
                userProfileContext.SaveChanges();

                // ID とログイン用トークンを返す
                return(Ok(idAndToken));
            }
            catch (Exception excep)
            {
                Debug.WriteLine("ログインサーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
Пример #4
0
        public IActionResult SetPassword([FromBody] String?[] passwords)
        {
            try
            {
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser))
                {
                    return(Unauthorized());
                }
                if (passwords.Length < 2)
                {
                    return(BadRequest());
                }
                String?currentPassword = passwords[0];
                String?newPassword     = passwords[1];
                if (String.IsNullOrEmpty(currentPassword) || String.IsNullOrEmpty(newPassword))
                {
                    return(BadRequest());
                }

                // 現在のパスワードハッシュの一致を確認
                if (loginUser.Password != HashPassword(currentPassword, loginUser.Salt))
                {
                    return(NotAcceptable());
                }

                // 設定
                loginUser.Password     = newPassword;
                loginUser.LastModified = YbdCommon.UtcNowModifiedJulianDate();
                HashPassword(loginUser);
                userProfileContext.SaveChanges();

                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("パスワード設定サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
Пример #5
0
        public IActionResult SetName([FromBody] String?newName)
        {
            try
            {
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out _, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser))
                {
                    return(Unauthorized());
                }
                if (String.IsNullOrEmpty(newName))
                {
                    return(BadRequest());
                }

                // 管理者の名前は変更できない
                if (loginUser.IsAdmin)
                {
                    return(BadRequest());
                }

                // 同じ名前のユーザーが既に存在している場合は登録できない
                if (registeredUsers.FirstOrDefault(x => x.Name == newName) != null)
                {
                    return(Conflict());
                }

                // 設定
                loginUser.Name         = newName;
                loginUser.LastModified = YbdCommon.UtcNowModifiedJulianDate();
                userProfileContext.SaveChanges();

                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("名前設定サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }
Пример #6
0
        public IActionResult AddStock([FromBody] AvailableSong availableSong)
        {
            try
            {
                using UserProfileContext userProfileContext = CreateUserProfileContext(out DbSet <RegisteredUser> registeredUsers, out DbSet <StockSong> stockSongs, out _);
                if (!IsTokenValid(registeredUsers, out RegisteredUser? loginUser))
                {
                    return(Unauthorized());
                }

                StockSong?stockSong = stockSongs.SingleOrDefault(x => x.UserId == loginUser.Id && x.AvailableSongId == availableSong.Id);
                if (stockSong == null)
                {
                    // 新規追加
                    stockSong = new();
                    YbdCommon.CopySongProperty(availableSong, stockSong);
                    stockSong.AvailableSongId = availableSong.Id;
                    stockSong.UserId          = loginUser.Id;
                    stockSong.RequestTime     = YbdCommon.UtcNowModifiedJulianDate();
                    stockSongs.Add(stockSong);
                }
                else
                {
                    // 登録日時更新
                    stockSong.RequestTime = YbdCommon.UtcNowModifiedJulianDate();
                }
                userProfileContext.SaveChanges();

                return(Ok());
            }
            catch (Exception excep)
            {
                Debug.WriteLine("後で歌う予定追加サーバーエラー:\n" + excep.Message);
                Debug.WriteLine(" スタックトレース:\n" + excep.StackTrace);
                return(InternalServerError());
            }
        }