Esempio n. 1
0
        private void ShareFile(Message message)
        {
            var fields = message.StringMessage.Split('$');

            if (fields.Length < 5)
            {
                SendResult(false, "Параметры неверны");
            }
            var  userIdTo     = fields[0];
            var  fileId       = fields[1];
            var  fileName     = fields[2];
            var  fileKey      = fields[3];
            var  comment      = fields[4];
            var  sendFilePath = CreatePrivateFileName(fileName);
            SHA1 hash         = SHA1.Create();
            var  fileKeyHash  = ByteToStringConverter(hash.ComputeHash(StringToByteConverter(fileKey)));
            var  filePath     = _dbController.GetPrivateFilePath(fileId, fileKeyHash);

            if (filePath == null)
            {
                SendResult(false, "Неверный ключ");
                return;
            }
            if (!File.Exists(filePath))
            {
                SendResult(false, "Файл не найден в файловой системе. Ошибка сервера");
                Console.WriteLine("Файл не найден в файловой системе: " + filePath);
                return;
            }
            try
            {
                File.Copy(filePath, sendFilePath);
            }
            catch (Exception)
            {
                SendResult(false, "Не удалось отправть файл");
                return;
            }
            var rsaPublicFile = _dbController.GetPublicKeyPath(userIdTo);

            if (String.IsNullOrEmpty(rsaPublicFile) || !_dbController.GetUserShareState(userIdTo))
            {
                SendResult(false, "Пользователь не имеет открытого ключа или запретил получение файлов");
                try
                {
                    File.Delete(sendFilePath);
                }
                catch (Exception)
                {
                    //
                }
                return;
            }
            var newFileKey          = GenerateNewFileKey(10);
            CryptoController crypto = new CryptoController();

            crypto.ChangeEncryptKey(sendFilePath, fileKey, newFileKey);
            newFileKey = ByteToStringConverter(crypto.EncryptDataWithRsaFile(rsaPublicFile,
                                                                             StringToByteConverter(newFileKey)));
            _dbController.ShareFile(sendFilePath, fileName, userIdTo, newFileKey, comment);
            SendResult(true);
        }