Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Commit 6367136

Browse files
authored
Merge pull request #326 from csteeg/stripinvalidcharacters
Check for invalid filenames when using username as a filename in uwp
2 parents 9a034c9 + 83ab0fd commit 6367136

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

source/Core/Xamarin.Auth.UniversalWindowsPlatform/AccountStore/UWPAccountStore.Async.cs

+35-17
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ internal partial class UWPAccountStore
3232
{
3333
public override async Task<List<Account>> FindAccountsForServiceAsync(string serviceId)
3434
{
35+
if (serviceId?.Length == 0)
36+
throw new ArgumentNullException(nameof(serviceId));
37+
3538
var localFolder = ApplicationData.Current.LocalFolder;
3639

3740
var files = await localFolder.GetFilesAsync().AsTask().ConfigureAwait(false);
@@ -59,6 +62,13 @@ public override async Task<List<Account>> FindAccountsForServiceAsync(string ser
5962

6063
public override async Task DeleteAsync(Account account, string serviceId)
6164
{
65+
if (account == null)
66+
throw new ArgumentNullException(nameof(account));
67+
if (account.Username?.Length == 0)
68+
throw new ArgumentOutOfRangeException(nameof(account), "Username cannot be empty");
69+
if (serviceId?.Length == 0)
70+
throw new ArgumentNullException(nameof(serviceId));
71+
6272
var path = GetAccountPath(account, serviceId);
6373
try
6474
{
@@ -72,26 +82,21 @@ public override async Task DeleteAsync(Account account, string serviceId)
7282
}
7383
}
7484

75-
public override async Task SaveAsync(Account account, string serviceId)
85+
public override Task SaveAsync(Account account, string serviceId)
7686
{
77-
byte[] data = Encoding.UTF8.GetBytes(account.Serialize());
78-
byte[] prot = (await DataProtectionExtensions.ProtectAsync(data.AsBuffer()).ConfigureAwait(false)).ToArray();
79-
80-
var path = GetAccountPath(account, serviceId);
81-
82-
var localFolder = ApplicationData.Current.LocalFolder;
83-
var file = await localFolder.CreateFileAsync(path, CreationCollisionOption.OpenIfExists).AsTask().ConfigureAwait(false);
84-
using (var stream = await file.OpenStreamForWriteAsync().ConfigureAwait(false))
85-
using (var writer = new BinaryWriter(stream))
86-
{
87-
writer.Write((Int32)prot.Length);
88-
writer.Write(prot);
89-
}
87+
return SaveAsync(account, serviceId, null);
9088
}
9189

9290
public async Task SaveAsync(Account account, string serviceId, Uri uri)
9391
{
94-
byte[] data = Encoding.UTF8.GetBytes(account.Serialize(uri));
92+
if (account == null)
93+
throw new ArgumentNullException(nameof(account));
94+
if (account.Username?.Length == 0)
95+
throw new ArgumentOutOfRangeException(nameof(account), "Username cannot be empty");
96+
if (serviceId?.Length == 0)
97+
throw new ArgumentNullException(nameof(serviceId));
98+
99+
byte[] data = Encoding.UTF8.GetBytes(uri == null ? account.Serialize() : account.Serialize(uri));
95100
byte[] prot = (await DataProtectionExtensions.ProtectAsync(data.AsBuffer()).ConfigureAwait(false)).ToArray();
96101

97102
var path = GetAccountPath(account, serviceId);
@@ -107,8 +112,21 @@ public async Task SaveAsync(Account account, string serviceId, Uri uri)
107112
}
108113

109114
private static string GetAccountPath(Account account, string serviceId)
110-
{
111-
return String.Format("xamarin.auth.{0}.{1}", account.Username, serviceId);
115+
{
116+
if (account == null)
117+
throw new ArgumentNullException(nameof(account));
118+
if (account.Username?.Length == 0)
119+
throw new ArgumentOutOfRangeException(nameof(account), "Username cannot be empty");
120+
if (serviceId?.Length == 0)
121+
throw new ArgumentNullException(nameof(serviceId));
122+
123+
string fileName = account.Username;
124+
foreach (char c in Path.GetInvalidFileNameChars())
125+
{
126+
fileName = fileName.Replace(c, '_');
127+
}
128+
129+
return $"xamarin.auth.{fileName}.{serviceId}";
112130
}
113131
}
114132
}

0 commit comments

Comments
 (0)