DocSpace-client/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs

402 lines
14 KiB
C#
Raw Normal View History

2022-01-31 15:15:43 +00:00
namespace ASC.Data.Backup
2021-08-31 09:40:28 +00:00
{
2020-10-19 15:53:15 +00:00
[Scope]
public class BackupAjaxHandler
{
private readonly TenantManager _tenantManager;
private readonly MessageService _messageService;
private readonly CoreBaseSettings _coreBaseSettings;
private readonly CoreConfiguration _coreConfiguration;
private readonly PermissionContext _permissionContext;
private readonly SecurityContext _securityContext;
private readonly UserManager _userManager;
private readonly TenantExtra _tenantExtra;
private readonly ConsumerFactory _consumerFactory;
private readonly BackupFileUploadHandler _backupFileUploadHandler;
private readonly BackupService _backupService;
2020-06-15 08:19:40 +00:00
#region backup
2021-08-31 09:40:28 +00:00
public BackupAjaxHandler(
BackupService backupService,
TenantManager tenantManager,
MessageService messageService,
CoreBaseSettings coreBaseSettings,
CoreConfiguration coreConfiguration,
PermissionContext permissionContext,
SecurityContext securityContext,
UserManager userManager,
TenantExtra tenantExtra,
ConsumerFactory consumerFactory,
2021-05-24 17:41:31 +00:00
BackupFileUploadHandler backupFileUploadHandler)
{
_tenantManager = tenantManager;
_messageService = messageService;
_coreBaseSettings = coreBaseSettings;
_coreConfiguration = coreConfiguration;
_permissionContext = permissionContext;
_securityContext = securityContext;
_userManager = userManager;
_tenantExtra = tenantExtra;
_consumerFactory = consumerFactory;
_backupFileUploadHandler = backupFileUploadHandler;
_backupService = backupService;
}
2020-06-15 15:33:53 +00:00
public void StartBackup(BackupStorageType storageType, Dictionary<string, string> storageParams, bool backupMail)
{
DemandPermissionsBackup();
var backupRequest = new StartBackupRequest
{
TenantId = GetCurrentTenantId(),
UserId = _securityContext.CurrentAccount.ID,
BackupMail = backupMail,
2021-08-31 09:40:28 +00:00
StorageType = storageType,
StorageParams = storageParams
};
switch (storageType)
{
case BackupStorageType.ThridpartyDocuments:
case BackupStorageType.Documents:
backupRequest.StorageBasePath = storageParams["folderId"];
break;
case BackupStorageType.Local:
2022-02-09 16:46:09 +00:00
if (!_coreBaseSettings.Standalone)
{
throw new Exception("Access denied");
}
backupRequest.StorageBasePath = storageParams["filePath"];
break;
}
_messageService.Send(MessageAction.StartBackupSetting);
2021-08-31 09:40:28 +00:00
_backupService.StartBackup(backupRequest);
}
public BackupProgress GetBackupProgress()
{
2021-08-31 09:40:28 +00:00
DemandPermissionsBackup();
return _backupService.GetBackupProgress(GetCurrentTenantId());
}
2020-10-14 14:26:18 +00:00
public BackupProgress GetBackupProgress(int tenantId)
{
2021-08-31 09:40:28 +00:00
DemandPermissionsBackup();
return _backupService.GetBackupProgress(tenantId);
2020-10-14 14:26:18 +00:00
}
public void DeleteBackup(Guid id)
{
DemandPermissionsBackup();
_backupService.DeleteBackup(id);
}
public void DeleteAllBackups()
{
DemandPermissionsBackup();
_backupService.DeleteAllBackups(GetCurrentTenantId());
}
public List<BackupHistoryRecord> GetBackupHistory()
{
DemandPermissionsBackup();
return _backupService.GetBackupHistory(GetCurrentTenantId());
}
public void CreateSchedule(BackupStorageType storageType, Dictionary<string, string> storageParams, int backupsStored, CronParams cronParams, bool backupMail)
{
DemandPermissionsBackup();
if (!SetupInfo.IsVisibleSettings("AutoBackup"))
2022-02-09 16:46:09 +00:00
{
throw new InvalidOperationException(Resource.ErrorNotAllowedOption);
2022-02-09 16:46:09 +00:00
}
ValidateCronSettings(cronParams);
var scheduleRequest = new CreateScheduleRequest
{
TenantId = _tenantManager.GetCurrentTenant().TenantId,
BackupMail = backupMail,
Cron = cronParams.ToString(),
NumberOfBackupsStored = backupsStored,
2021-08-31 09:40:28 +00:00
StorageType = storageType,
StorageParams = storageParams
2021-08-31 09:40:28 +00:00
};
switch (storageType)
{
case BackupStorageType.ThridpartyDocuments:
case BackupStorageType.Documents:
scheduleRequest.StorageBasePath = storageParams["folderId"];
break;
case BackupStorageType.Local:
2022-02-09 16:46:09 +00:00
if (!_coreBaseSettings.Standalone)
{
throw new Exception("Access denied");
}
scheduleRequest.StorageBasePath = storageParams["filePath"];
break;
}
_backupService.CreateSchedule(scheduleRequest);
}
public Schedule GetSchedule()
{
DemandPermissionsBackup();
ScheduleResponse response;
2020-06-04 10:47:22 +00:00
response = _backupService.GetSchedule(GetCurrentTenantId());
2020-06-04 10:47:22 +00:00
if (response == null)
{
2020-06-04 10:47:22 +00:00
return null;
}
var schedule = new Schedule
{
StorageType = response.StorageType,
2020-06-08 10:40:26 +00:00
StorageParams = response.StorageParams.ToDictionary(r => r.Key, r => r.Value) ?? new Dictionary<string, string>(),
CronParams = new CronParams(response.Cron),
2020-07-02 15:15:52 +00:00
BackupMail = response.BackupMail.NullIfDefault(),
BackupsStored = response.NumberOfBackupsStored.NullIfDefault(),
LastBackupTime = response.LastBackupTime
};
2020-11-17 10:00:01 +00:00
if (response.StorageType == BackupStorageType.CustomCloud)
{
var amazonSettings = _coreConfiguration.GetSection<AmazonS3Settings>();
var consumer = _consumerFactory.GetByKey<DataStoreConsumer>("s3");
if (!consumer.IsSet)
{
consumer["acesskey"] = amazonSettings.AccessKeyId;
consumer["secretaccesskey"] = amazonSettings.SecretAccessKey;
consumer["bucket"] = amazonSettings.Bucket;
consumer["region"] = amazonSettings.Region;
}
schedule.StorageType = BackupStorageType.ThirdPartyConsumer;
schedule.StorageParams = consumer.AdditionalKeys.ToDictionary(r => r, r => consumer[r]);
schedule.StorageParams.Add("module", "S3");
2020-06-08 10:40:26 +00:00
var Schedule = new CreateScheduleRequest
{
TenantId = _tenantManager.GetCurrentTenant().TenantId,
2020-09-29 11:53:02 +00:00
BackupMail = schedule.BackupMail != null && (bool)schedule.BackupMail,
2020-06-04 10:47:22 +00:00
Cron = schedule.CronParams.ToString(),
2020-06-29 11:40:42 +00:00
NumberOfBackupsStored = schedule.BackupsStored == null ? 0 : (int)schedule.BackupsStored,
2021-08-31 09:40:28 +00:00
StorageType = schedule.StorageType,
StorageParams = schedule.StorageParams
2020-06-08 10:40:26 +00:00
};
_backupService.CreateSchedule(Schedule);
}
2020-11-17 10:00:01 +00:00
else if (response.StorageType != BackupStorageType.ThirdPartyConsumer)
{
schedule.StorageParams["folderId"] = response.StorageBasePath;
}
return schedule;
}
public void DeleteSchedule()
{
DemandPermissionsBackup();
_backupService.DeleteSchedule(GetCurrentTenantId());
2020-06-04 10:47:22 +00:00
}
private void DemandPermissionsBackup()
{
_permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
if (!SetupInfo.IsVisibleSettings(ManagementType.Backup.ToString()))
2022-02-09 16:46:09 +00:00
{
throw new BillingException(Resource.ErrorNotAllowedOption, "Backup");
2022-02-09 16:46:09 +00:00
}
}
#endregion
#region restore
2020-06-15 15:33:53 +00:00
public void StartRestore(string backupId, BackupStorageType storageType, Dictionary<string, string> storageParams, bool notify)
{
DemandPermissionsRestore();
var restoreRequest = new StartRestoreRequest
{
TenantId = GetCurrentTenantId(),
2021-08-31 09:40:28 +00:00
NotifyAfterCompletion = notify,
StorageParams = storageParams
};
2020-06-15 08:19:40 +00:00
if (Guid.TryParse(backupId, out var guidBackupId))
{
restoreRequest.BackupId = guidBackupId;
}
else
{
restoreRequest.StorageType = storageType;
2021-08-31 09:40:28 +00:00
restoreRequest.FilePathOrId = storageParams["filePath"];
if (restoreRequest.StorageType == BackupStorageType.Local && !_coreBaseSettings.Standalone)
2021-08-31 09:40:28 +00:00
{
restoreRequest.FilePathOrId = _backupFileUploadHandler.GetFilePath();
2021-05-24 17:41:31 +00:00
}
2021-08-31 09:40:28 +00:00
}
2021-05-24 17:41:31 +00:00
_backupService.StartRestore(restoreRequest);
}
public BackupProgress GetRestoreProgress()
{
BackupProgress result;
var tenant = _tenantManager.GetCurrentTenant();
result = _backupService.GetRestoreProgress(tenant.TenantId);
return result;
}
private void DemandPermissionsRestore()
{
_permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
2021-08-31 09:40:28 +00:00
if (!SetupInfo.IsVisibleSettings("Restore") ||
(!_coreBaseSettings.Standalone && !_tenantManager.GetTenantQuota(_tenantManager.GetCurrentTenant().TenantId).Restore))
2022-02-09 16:46:09 +00:00
{
throw new BillingException(Resource.ErrorNotAllowedOption, "Restore");
2022-02-09 16:46:09 +00:00
}
}
#endregion
#region transfer
2020-06-15 15:33:53 +00:00
public void StartTransfer(string targetRegion, bool notifyUsers, bool transferMail)
{
DemandPermissionsTransfer();
_messageService.Send(MessageAction.StartTransferSetting);
_backupService.StartTransfer(
2020-06-04 10:47:22 +00:00
new StartTransferRequest
{
TenantId = GetCurrentTenantId(),
TargetRegion = targetRegion,
BackupMail = transferMail,
NotifyUsers = notifyUsers
});
}
public BackupProgress GetTransferProgress()
2021-08-31 09:40:28 +00:00
{
return _backupService.GetTransferProgress(GetCurrentTenantId());
}
private void DemandPermissionsTransfer()
{
_permissionContext.DemandPermissions(SecutiryConstants.EditPortalSettings);
var currentUser = _userManager.GetUsers(_securityContext.CurrentAccount.ID);
if (!SetupInfo.IsVisibleSettings(ManagementType.Migration.ToString())
|| !currentUser.IsOwner(_tenantManager.GetCurrentTenant())
|| !SetupInfo.IsSecretEmail(currentUser.Email) && !_tenantExtra.GetTenantQuota().HasMigration)
2022-02-09 16:46:09 +00:00
{
throw new InvalidOperationException(Resource.ErrorNotAllowedOption);
2022-02-09 16:46:09 +00:00
}
}
#endregion
public string GetTmpFolder()
{
return _backupService.GetTmpFolder();
}
private static void ValidateCronSettings(CronParams cronParams)
{
2020-10-12 19:39:23 +00:00
new CronExpression(cronParams.ToString());
}
private int GetCurrentTenantId()
{
return _tenantManager.GetCurrentTenant().TenantId;
}
public class Schedule
{
public BackupStorageType StorageType { get; set; }
public Dictionary<string, string> StorageParams { get; set; }
public CronParams CronParams { get; set; }
2020-06-29 11:40:42 +00:00
public bool? BackupMail { get; set; }
public int? BackupsStored { get; set; }
public DateTime LastBackupTime { get; set; }
}
public class CronParams
{
public BackupPeriod Period { get; set; }
public int Hour { get; set; }
public int Day { get; set; }
public CronParams()
{
}
public CronParams(string cronString)
{
var tokens = cronString.Split(' ');
Hour = Convert.ToInt32(tokens[2]);
if (tokens[3] != "?")
{
Period = BackupPeriod.EveryMonth;
Day = Convert.ToInt32(tokens[3]);
}
else if (tokens[5] != "*")
{
Period = BackupPeriod.EveryWeek;
Day = Convert.ToInt32(tokens[5]);
}
else
{
Period = BackupPeriod.EveryDay;
}
}
public override string ToString()
{
2021-08-31 09:40:28 +00:00
return Period switch
{
BackupPeriod.EveryDay => string.Format("0 0 {0} ? * *", Hour),
BackupPeriod.EveryMonth => string.Format("0 0 {0} {1} * ?", Hour, Day),
BackupPeriod.EveryWeek => string.Format("0 0 {0} ? * {1}", Hour, Day),
_ => base.ToString(),
};
}
}
public enum BackupPeriod
{
EveryDay = 0,
EveryWeek = 1,
EveryMonth = 2
}
}
}