private void WriteDataCore(byte[] data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, $"Write Data core, goign to write '{data.Length}' to the storage"); if (SharedUtilities.IsMacPlatform() || SharedUtilities.IsLinuxPlatform()) { if (SharedUtilities.IsMacPlatform()) { _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, "Before write to mac keychain"); MacKeyChain.WriteKey( CreationProperties.MacKeyChainServiceName, CreationProperties.MacKeyChainAccountName, data); _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, "After write to mac keychain"); } else if (SharedUtilities.IsLinuxPlatform()) { _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, "Before saving to linux keyring"); IntPtr error = IntPtr.Zero; Libsecret.secret_password_store_sync( schema: GetLibsecretSchema(), collection: CreationProperties.KeyringCollection, label: CreationProperties.KeyringSecretLabel, password: Convert.ToBase64String(data), cancellable: IntPtr.Zero, error: out error, attribute1Type: CreationProperties.KeyringAttribute1.Key, attribute1Value: CreationProperties.KeyringAttribute1.Value, attribute2Type: CreationProperties.KeyringAttribute2.Key, attribute2Value: CreationProperties.KeyringAttribute2.Value, end: IntPtr.Zero); if (error != IntPtr.Zero) { try { GError err = (GError)Marshal.PtrToStructure(error, typeof(GError)); _logger.TraceEvent(TraceEventType.Error, /*id*/ 0, $"An error was encountered while saving secret to keyring in the {nameof(AdalCacheStorage)} domain:'{err.Domain}' code:'{err.Code}' message:'{err.Message}'"); } catch (Exception e) { _logger.TraceEvent(TraceEventType.Error, /*id*/ 0, $"An exception was encountered while processing libsecret error information during saving in the {nameof(AdalCacheStorage)} ex:'{e}'"); } } _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, "After saving to linux keyring"); } // Change data to 1 byte so we can write it to the cache file to update the last write time using the same write code used for windows. data = new byte[] { 1 }; } string directoryForCacheFile = Path.GetDirectoryName(CacheFilePath); if (!Directory.Exists(directoryForCacheFile)) { string directory = Path.GetDirectoryName(CacheFilePath); _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, $"Creating directory '{directory}'"); Directory.CreateDirectory(directory); } _logger.TraceEvent(TraceEventType.Information, /*id*/ 0, $"Cache file directory exists. '{Directory.Exists(directoryForCacheFile)}' now writing cache file"); TryProcessFile(() => { File.WriteAllBytes(CacheFilePath, data); WriteVersionFile(); }); }