using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.InformationProtection; using Microsoft.InformationProtection.File; using Microsoft.InformationProtection.Policy; using Microsoft.InformationProtection.Protection; using LogLevel = Microsoft.InformationProtection.LogLevel; namespace AipGateway.AIP { public class AipFileManager { public int LastErrNo { get; internal set; } public string LastErrMsg { get; internal set; } private readonly AipConfig _aipConfig; private readonly ApplicationInfo _appInfo; private AuthDelegateImplementation _authDelegate; private MipContext _mipContext; private readonly LabelManager _labelManager = null; private readonly PolicyManager _policyManager = null; private readonly ProtectionManager _protectionManager = null; public AipFileManager(AipConfig aipConfig) { _aipConfig = aipConfig; _appInfo = new ApplicationInfo { ApplicationId = aipConfig.ClientId, ApplicationName = aipConfig.AppName, ApplicationVersion = aipConfig.AppVersion }; LastErrNo = 0; LastErrMsg = string.Empty; _labelManager = new LabelManager(); _policyManager = new PolicyManager(); _protectionManager = new ProtectionManager(); } ~AipFileManager() => this.Dispose(false); public void Dispose() { this.Dispose(true); GC.SuppressFinalize((object)this); } protected virtual void Dispose(bool disposing) { lock (this) { if (_labelManager != null) { _labelManager.Dispose(); } if (_policyManager != null) { _policyManager.Dispose(); } if (_protectionManager != null) { _protectionManager.Dispose(); } _authDelegate = null; } } private void SetError(int errNo, string errMsg1, string errMsg2 = "No Exception Message.") { LastErrNo = errNo; LastErrMsg = errMsg1 + "\r\n" + errMsg2; Console.WriteLine("AipFileManager::SetError ==> {0}, {1}, {2}", errNo, errMsg1, errMsg2); } public bool Initialize() { _authDelegate = new AuthDelegateImplementation(_aipConfig); try { // Initialize SDK DLLs. If DLLs are missing or wrong type, this will throw an exception MIP.Initialize(MipComponent.File); //MIP.Initialize(MipComponent.Policy); //MIP.Initialize(MipComponent.Protection); // Protection } catch (Exception ex) { SetError(1, "MIP.Initialize Failed.", ex.Message); return false; } // Create MipConfiguration Object var mipConfiguration = new MipConfiguration(_appInfo, _aipConfig.MipData, LogLevel.Trace, false); // Create MipContext using MipConfiguration _mipContext = MIP.CreateMipContext(mipConfiguration); return true; } public bool CreateProfile() { if (_authDelegate == null || _mipContext == null) { SetError(999, "AipFileManager::CreateProfile Failed.", "Library Is not Initialized."); return false; } if (!_labelManager.CreateProfile(ref _mipContext)) { SetError(11, "AipFileManager::CreateProfile ==> LabelManager::CreateProfile Failed."); return false; } if (!_policyManager.CreateProfile(ref _mipContext)) { SetError(12, "AipFileManager::CreateProfile ==> PolicyManager::CreateProfile Failed."); return false; } if (!_protectionManager.CreateProfile(ref _mipContext)) { SetError(13, "AipFileManager::CreateProfile ==> ProtectionManager::CreateProfile Failed."); return false; } return true; } public bool CreateEngine() { if (_authDelegate == null || _mipContext == null) { SetError(999, "AipFileManager::CreateEngine Failed.", "Library Is not Initialized."); return false; } Identity identity = new Identity(_aipConfig.EMail); if (!_labelManager.CreateEngine(ref identity, ref _authDelegate)) { SetError(21, "AipFileManager::CreateEngine ==> LabelManager::CreateEngine Failed."); return false; } if (!_policyManager.CreateEngine(ref identity, ref _authDelegate)) { SetError(22, "AipFileManager::CreateEngine ==> PolicyManager::CreateEngine Failed."); return false; } if (!_protectionManager.CreateEngine(ref identity, ref _authDelegate)) { SetError(23, "AipFileManager::CreateEngine ==> ProtectionManager::CreateEngine Failed."); return false; } return true; } public AipFileInfo GetFileInfo(string fileName) { if (_authDelegate == null || _mipContext == null) { SetError(999, "AipFileManager::GetFileInfo Failed.", "Library Is not Initialized."); return null; } AipFileInfo fileInfo = _labelManager.GetFileInfo(fileName); if (fileInfo == null) { SetError(_labelManager.LastErrNo, "AipFileManager::GetFileInfo Failed.", _labelManager.LastErrMsg); } return fileInfo; } public List SensitivityLabels() { if (_authDelegate == null || _mipContext == null) { SetError(999, "AipFileManager::SensitivityLabels Failed.", "Library Is not Initialized."); return null; } var result = new List(); try { var labels = _labelManager.SensitivityLabels(); foreach (var label in labels) { var aipLabel = Utilities.LabelToAip(label); if (aipLabel != null) { if (label.Children.Count > 0) { foreach (var child in label.Children) { var aipChildLabel = Utilities.LabelToAip(child); if (aipChildLabel != null) aipLabel.Children.Add(aipChildLabel); } } result.Add(aipLabel); } } } catch (Exception ex) { SetError(31, "AipFileManager::SensitivityLabels Failed.", ex.Message); result = new List(); } return result; } public List ListSensitivityLabels() { if (_authDelegate == null || _mipContext == null) { SetError(999, "AipFileManager::ListSensitivityLabels Failed.", "Library Is not Initialized."); return null; } var result = new List(); try { var labels = _policyManager.ListSensitivityLabels(); foreach (var label in labels) { var aipLabel = Utilities.LabelToAip(label); if (aipLabel != null) { if (label.Children.Count > 0) { foreach (var child in label.Children) { var aipChildLabel = Utilities.LabelToAip(child); if (aipChildLabel != null) aipLabel.Children.Add(aipChildLabel); } } result.Add(aipLabel); } } } catch (Exception ex) { SetError(32, "AipFileManager::ListSensitivityLabels Failed.", ex.Message); result = new List(); } return result; } public List GetTemplates() { if (_authDelegate == null || _mipContext == null) { SetError(999, "AipFileManager::GetTemplates Failed.", "Library Is not Initialized."); return null; } var result = new List(); try { var templates = _protectionManager.GetTemplates(); foreach (var template in templates) { var aipTemplate = Utilities.TemplateToAip(template); if (aipTemplate != null) { result.Add(aipTemplate); } } } catch (Exception ex) { SetError(33, "AipFileManager::GetTemplates Failed.", ex.Message); result = new List(); } return result; } } }