private string GetSessionFileLinkInternal(IFileVersion version, string userIdentity) { if (version == null) { throw new ArgumentNullException("version"); } this.Logger.WriteFormatMessage("GetSessionFileLinkInternal:Начало генерации сессионной ссылки"); FileVersion typedVersion = (FileVersion)version; string securityIdentifier = null; if (!String.IsNullOrEmpty(userIdentity)) { this.Logger.WriteFormatMessage("SecurityAdapter.GetSecurityIdentifier:Начало генерации securityIdentifier, userIdentity: {0}", userIdentity); securityIdentifier = this.SecurityAdapter.GetSecurityIdentifier(userIdentity); this.Logger.WriteFormatMessage("SecurityAdapter.GetSecurityIdentifier:Окончание генерации securityIdentifier,userIdentity: {0}, securityIdentifier: {1}", userIdentity, securityIdentifier ?? String.Empty); } this.Logger.WriteFormatMessage("FileTokenAdapter.GenerateFileToken:Начало генерации токена для файла, version.Name: {0}, version.UniqueID: {1}", version.Name, version.UniqueID); IFileToken token = this.FileTokenAdapter.GenerateFileToken(typedVersion.Metadata, securityIdentifier); this.Logger.WriteFormatMessage("FileTokenAdapter.GenerateFileToken:Окончание генерации токена для файла, version.Name: {0}, version.UniqueID: {1}, token.ID: {2}", version.Name, version.UniqueID, token.UniqueID); this.Logger.WriteFormatMessage("SessionLinkResolver.GetSessionLink:Начало генерации сессионной ссылки на файл, version.Name: {0}, version.UniqueID: {1}", version.Name, version.UniqueID); string sessionLink = this.SessionLinkResolver.GetSessionLink(token); this.Logger.WriteFormatMessage("SessionLinkResolver.GetSessionLink:Окончание генерации сессионной ссылки на файл, version.Name: {0}, version.UniqueID: {1}, sessionLink: {2}", version.Name, version.UniqueID, sessionLink); this.Logger.WriteFormatMessage("GetSessionFileLinkInternal:Окончание генерации сессионной ссылки"); return(sessionLink); }
/// <summary> /// Возвращает сессионную ссылку по токену. /// </summary> /// <param name="token">Токен файла.</param> /// <returns></returns> public string GetSessionLink(IFileToken token) { if (token == null) { throw new ArgumentNullException("token"); } int destinationIndex = 0; if (string.IsNullOrEmpty(token.FolderUrl)) { throw new Exception(string.Format("sessionToken.FolderUrl")); } if (token.UniqueID == Guid.Empty) { throw new ArgumentNullException("sessionToken.UniqueID"); } if (token.FileUniqueID == Guid.Empty) { throw new ArgumentNullException("sessionToken.FileUniqueID"); } if (token.VersionUniqueID == Guid.Empty) { throw new ArgumentNullException("sessionToken.VersionUniqueID"); } byte[] folderUrlBytes = Encoding.UTF8.GetBytes(token.FolderUrl); byte[] tokenBytes = new byte[(_guidLength * 3) + folderUrlBytes.Length]; Array.Copy(token.UniqueID.ToByteArray(), 0, tokenBytes, destinationIndex, _guidLength); destinationIndex += _guidLength; Array.Copy(token.FileUniqueID.ToByteArray(), 0, tokenBytes, destinationIndex, _guidLength); destinationIndex += _guidLength; Array.Copy(token.VersionUniqueID.ToByteArray(), 0, tokenBytes, destinationIndex, _guidLength); destinationIndex += _guidLength; Array.Copy(folderUrlBytes, 0, tokenBytes, destinationIndex, folderUrlBytes.Length); string tokenString = Convert.ToBase64String(tokenBytes); string contentDeliveryHost = ConfigReader.GetStringValue(EngineConsts.CongfigParams.ContentDeliveryHost); contentDeliveryHost = contentDeliveryHost.TrimEnd('/'); string link = string.Format("{0}/{1}", contentDeliveryHost, tokenString.Replace("/", "-")); return(link); }
/// <summary> /// Возвращает версию по сессионной ссылке. /// </summary> /// <param name="sessionLink">Сессионная ссылка.</param> /// <param name="identity">Идентификатор пользователя.</param> /// <returns></returns> public IFileVersion ResolveSessionLink(string sessionLink, IIdentity identity) { if (string.IsNullOrEmpty(sessionLink)) { throw new ArgumentNullException("sessionLink"); } if (identity == null) { throw new ArgumentNullException("identity"); } this.Logger.WriteFormatMessage("ResolveSessionLink:Начало разрешения сессионной ссылки, sessionLink: {0}", sessionLink); IFileToken sessionToken = this.SessionLinkResolver.Resolve(sessionLink); if (string.IsNullOrEmpty(sessionToken.FolderUrl)) { throw new Exception(string.Format("sessionToken.FolderUrl")); } if (sessionToken.UniqueID == Guid.Empty) { throw new ArgumentNullException("sessionToken.UniqueID"); } if (sessionToken.FileUniqueID == Guid.Empty) { throw new ArgumentNullException("sessionToken.FileUniqueID"); } if (sessionToken.VersionUniqueID == Guid.Empty) { throw new ArgumentNullException("sessionToken.VersionUniqueID"); } this.Logger.WriteFormatMessage("ResolveSessionLink:Результат разрешения ссылки: sessionLink:{0}, sessionToken.UniqueID: {1}, sessionToken.FileUniqueID: {2}, sessionToken.VersionUniqueID: {3}, sessionToken.FolderUrl: {4}", sessionLink, sessionToken.UniqueID, sessionToken.FileUniqueID, sessionToken.VersionUniqueID, sessionToken.FolderUrl); //сначала нужно поднять версию файла File file = this.GetFileInternal(sessionToken.FolderUrl, sessionToken.FileUniqueID); FileVersion version = (FileVersion)file.GetVersion(sessionToken.VersionUniqueID); this.Logger.WriteFormatMessage("ResolveSessionLink:Разрешение сессионной ссылки, sessionLink: {0}, version.Name: {1}, version.UniqueID: {2}", sessionLink, version.Name, version.UniqueID); bool tokenValid = false; IFileToken fileToken = this.FileTokenAdapter.GetToken(version.Metadata, sessionToken.UniqueID); if (fileToken != null) { tokenValid = this.SecurityAdapter.ValidateToken(fileToken, identity); } this.Logger.WriteFormatMessage("ResolveSessionLink:Валидация сессионной ссылки, sessionLink: {0}, valid: {1}, identity.Name: {2}", sessionLink, tokenValid, identity.Name); if (!tokenValid) { throw new Exception(string.Format("Токен не валиден")); } this.Logger.WriteFormatMessage("ResolveSessionLink:Окончание разрешения сессионной ссылки, sessionLink: {0}", sessionLink); return(version); }