/// <summary>
        /// Registers a stored file
        /// </summary>
        /// <param name="ownerName"></param>
        /// <param name="fileName"></param>
        /// <param name="identifier"></param>
        /// <param name="fileSize"></param>
        /// <returns></returns>
        public async Task <StoredFile> RegisterStoredFileAsync(string ownerName, string fileName, string userPath, string identifier,
                                                               long fileSize)
        {
            return(await Task.Run(() =>
            {
                var userDatabaseLock = ServerContext.ServiceTable.GetOrCreate(ownerName).UserLock;
                userDatabaseLock.ObtainExclusiveWrite();
                var db = new DatabaseAccessService().OpenOrCreateDefault();
                var storedFiles = db.GetCollection <StoredFile>(DatabaseAccessService.StoredFilesCollectionDatabaseKey);
                var result = new StoredFile
                {
                    Name = fileName,
                    Identifier = identifier,
                    FileSize = fileSize,
                    OwnerUsername = ownerName,
                    ParentDirPath = userPath
                };
                using (var trans = db.BeginTrans())
                {
                    storedFiles.Insert(result);
                    trans.Commit();
                }
                userDatabaseLock.ReleaseExclusiveWrite();

                // Index the database
                storedFiles.EnsureIndex(x => x.Identifier);
                return result;
            }));
        }
 public async Task UnregisterStoredFileAsync(string fileId)
 {
     await Task.Run(() =>
     {
         var db          = new DatabaseAccessService().OpenOrCreateDefault();
         var storedFiles = db.GetCollection <StoredFile>(DatabaseAccessService.StoredFilesCollectionDatabaseKey);
         using (var trans = db.BeginTrans())
         {
             storedFiles.Delete(x => x.Identifier == fileId);
             trans.Commit();
         }
         storedFiles.EnsureIndex(x => x.Identifier);
     });
 }
Esempio n. 3
0
 public async Task RemoveUserAsync(string username)
 {
     await Task.Run(() =>
     {
         var db = new DatabaseAccessService().OpenOrCreateDefault();
         var registeredUsers =
             db.GetCollection <RegisteredUser>(DatabaseAccessService.UsersCollectionDatabaseKey);
         using (var trans = db.BeginTrans())
         {
             registeredUsers.Delete(u => u.Username == username);
             trans.Commit();
         }
     });
 }
 public async Task NukeAllFilesAsync(RegisteredUser user)
 {
     await Task.Run(() =>
     {
         var db          = new DatabaseAccessService().OpenOrCreateDefault();
         var storedFiles = db.GetCollection <StoredFile>(DatabaseAccessService.StoredFilesCollectionDatabaseKey);
         using (var trans = db.BeginTrans())
         {
             storedFiles
             .Delete(x => x.OwnerUsername == user.Username);
             trans.Commit();
         }
         storedFiles.EnsureIndex(x => x.Identifier);
     });
 }
 public async Task <bool> UpdateStoredFileInDatabaseAsync(StoredFile currentFile)
 {
     return(await Task.Run(() =>
     {
         bool result;
         var db = new DatabaseAccessService().OpenOrCreateDefault();
         var storedFiles =
             db.GetCollection <StoredFile>(DatabaseAccessService.StoredFilesCollectionDatabaseKey);
         using (var trans = db.BeginTrans())
         {
             result = storedFiles.Update(currentFile);
             trans.Commit();
         }
         return result;
     }));
 }
Esempio n. 6
0
        private RegisteredUser RegisterUser(RegistrationRequest regRequest)
        {
            RegisteredUser newUserRecord = null;

            if (FindUserByUsernameAsync(regRequest.Username).GetAwaiter().GetResult() != null)
            {
                //BAD! Another conflicting user exists!
                throw new SecurityException("A user with the same username already exists!");
            }
            var db = new DatabaseAccessService().OpenOrCreateDefault();
            var registeredUsers = db.GetCollection <RegisteredUser>(DatabaseAccessService.UsersCollectionDatabaseKey);

            using (var trans = db.BeginTrans())
            {
                // Calculate cryptographic info
                var cryptoConf        = PasswordCryptoConfiguration.CreateDefault();
                var cryptoHelper      = new AuthCryptoHelper(cryptoConf);
                var pwSalt            = cryptoHelper.GenerateSalt();
                var encryptedPassword =
                    cryptoHelper.CalculateUserPasswordHash(regRequest.Password, pwSalt);
                // Create user
                newUserRecord = new RegisteredUser
                {
                    Identifier = Guid.NewGuid().ToString(),
                    Username   = regRequest.Username,
                    ApiKey     = StringUtils.SecureRandomString(AuthCryptoHelper.DefaultApiKeyLength),
                    Crypto     = new ItemCrypto
                    {
                        Salt = pwSalt,
                        Conf = cryptoConf,
                        Key  = encryptedPassword
                    },
                    StorageQuota = ServerContext.Configuration.DefaultQuota
                };
                // Add the user to the database
                registeredUsers.Insert(newUserRecord);

                // Index database
                registeredUsers.EnsureIndex(x => x.Identifier);
                registeredUsers.EnsureIndex(x => x.ApiKey);
                registeredUsers.EnsureIndex(x => x.Username);

                trans.Commit();
            }
            return(newUserRecord);
        }
Esempio n. 7
0
        /// <summary>
        /// Warning: Callers are expected to use their own locks before calling this method!
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task <bool> UpdateUserInDatabaseAsync(RegisteredUser user)
        {
            var result = false;
            await Task.Run(() =>
            {
                var db = new DatabaseAccessService().OpenOrCreateDefault();
                var registeredUsers =
                    db.GetCollection <RegisteredUser>(DatabaseAccessService.UsersCollectionDatabaseKey);
                using (var trans = db.BeginTrans())
                {
                    result = registeredUsers.Update(user);
                    trans.Commit();
                }
            });

            return(result);
        }