Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3115c93

Browse files
committed
feat: add support for RDP URIs
1 parent78ff6da commit3115c93

File tree

8 files changed

+605
-86
lines changed

8 files changed

+605
-86
lines changed

‎App/App.xaml.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public partial class App : Application
4141
#endif
4242

4343
privatereadonlyILogger<App>_logger;
44+
privatereadonlyIUriHandler_uriHandler;
4445

4546
publicApp()
4647
{
@@ -72,6 +73,8 @@ public App()
7273
.Bind(builder.Configuration.GetSection(MutagenControllerConfigSection));
7374
services.AddSingleton<ISyncSessionController,MutagenController>();
7475
services.AddSingleton<IUserNotifier,UserNotifier>();
76+
services.AddSingleton<IRdpConnector,RdpConnector>();
77+
services.AddSingleton<IUriHandler,UriHandler>();
7578

7679
// SignInWindow views and view models
7780
services.AddTransient<SignInViewModel>();
@@ -98,6 +101,7 @@ public App()
98101

99102
_services=services.BuildServiceProvider();
100103
_logger=(ILogger<App>)_services.GetService(typeof(ILogger<App>))!;
104+
_uriHandler=(IUriHandler)_services.GetService(typeof(IUriHandler))!;
101105

102106
InitializeComponent();
103107
}
@@ -190,7 +194,18 @@ public void OnActivated(object? sender, AppActivationArguments args)
190194
_logger.LogWarning("URI activation with null data");
191195
return;
192196
}
193-
HandleURIActivation(protoArgs.Uri);
197+
198+
try
199+
{
200+
// don't need to wait for it to complete.
201+
_=_uriHandler.HandleUri(protoArgs.Uri);
202+
}
203+
catch(System.Exceptione)
204+
{
205+
_logger.LogError(e,"unhandled exception while processing URI coder://{authority}{path}",
206+
protoArgs.Uri.Authority,protoArgs.Uri.AbsolutePath);
207+
}
208+
194209
break;
195210

196211
caseExtendedActivationKind.AppNotification:
@@ -204,12 +219,6 @@ public void OnActivated(object? sender, AppActivationArguments args)
204219
}
205220
}
206221

207-
publicvoidHandleURIActivation(Uriuri)
208-
{
209-
// don't log the query string as that's where we include some sensitive information like passwords
210-
_logger.LogInformation("handling URI activation for {path}",uri.AbsolutePath);
211-
}
212-
213222
publicvoidHandleNotification(AppNotificationManager?sender,AppNotificationActivatedEventArgsargs)
214223
{
215224
// right now, we don't do anything other than log

‎App/Services/CredentialManager.cs

Lines changed: 142 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
usingSystem;
2+
usingSystem.Net.Sockets;
23
usingSystem.Runtime.InteropServices;
34
usingSystem.Text;
45
usingSystem.Text.Json;
@@ -307,7 +308,7 @@ public WindowsCredentialBackend(string credentialsTargetName)
307308

308309
publicTask<RawCredentials?>ReadCredentials(CancellationTokenct=default)
309310
{
310-
varraw=NativeApi.ReadCredentials(_credentialsTargetName);
311+
varraw=Wincred.ReadCredentials(_credentialsTargetName);
311312
if(raw==null)returnTask.FromResult<RawCredentials?>(null);
312313

313314
RawCredentials?credentials;
@@ -326,115 +327,179 @@ public WindowsCredentialBackend(string credentialsTargetName)
326327
publicTaskWriteCredentials(RawCredentialscredentials,CancellationTokenct=default)
327328
{
328329
varraw=JsonSerializer.Serialize(credentials,RawCredentialsJsonContext.Default.RawCredentials);
329-
NativeApi.WriteCredentials(_credentialsTargetName,raw);
330+
Wincred.WriteCredentials(_credentialsTargetName,raw);
330331
returnTask.CompletedTask;
331332
}
332333

333334
publicTaskDeleteCredentials(CancellationTokenct=default)
334335
{
335-
NativeApi.DeleteCredentials(_credentialsTargetName);
336+
Wincred.DeleteCredentials(_credentialsTargetName);
336337
returnTask.CompletedTask;
337338
}
338339

339-
privatestaticclassNativeApi
340+
}
341+
342+
/// <summary>
343+
/// Wincred provides relatively low level wrapped calls to the Wincred.h native API.
344+
/// </summary>
345+
internalstaticclassWincred
346+
{
347+
privateconstintCredentialTypeGeneric=1;
348+
privateconstintCredentialTypeDomainPassword=2;
349+
privateconstintPersistenceTypeLocalComputer=2;
350+
privateconstintErrorNotFound=1168;
351+
privateconstintCredMaxCredentialBlobSize=5*512;
352+
privateconststringPackageNTLM="NTLM";
353+
354+
publicstaticstring?ReadCredentials(stringtargetName)
340355
{
341-
privateconstintCredentialTypeGeneric=1;
342-
privateconstintPersistenceTypeLocalComputer=2;
343-
privateconstintErrorNotFound=1168;
344-
privateconstintCredMaxCredentialBlobSize=5*512;
356+
if(!CredReadW(targetName,CredentialTypeGeneric,0,outvarcredentialPtr))
357+
{
358+
varerror=Marshal.GetLastWin32Error();
359+
if(error==ErrorNotFound)returnnull;
360+
thrownewInvalidOperationException($"Failed to read credentials (Error{error})");
361+
}
345362

346-
publicstaticstring?ReadCredentials(stringtargetName)
363+
try
347364
{
348-
if(!CredReadW(targetName,CredentialTypeGeneric,0,outvarcredentialPtr))
349-
{
350-
varerror=Marshal.GetLastWin32Error();
351-
if(error==ErrorNotFound)returnnull;
352-
thrownewInvalidOperationException($"Failed to read credentials (Error{error})");
353-
}
365+
varcred=Marshal.PtrToStructure<CREDENTIALW>(credentialPtr);
366+
returnMarshal.PtrToStringUni(cred.CredentialBlob,cred.CredentialBlobSize/sizeof(char));
367+
}
368+
finally
369+
{
370+
CredFree(credentialPtr);
371+
}
372+
}
354373

355-
try
356-
{
357-
varcred=Marshal.PtrToStructure<CREDENTIAL>(credentialPtr);
358-
returnMarshal.PtrToStringUni(cred.CredentialBlob,cred.CredentialBlobSize/sizeof(char));
359-
}
360-
finally
374+
publicstaticvoidWriteCredentials(stringtargetName,stringsecret)
375+
{
376+
varbyteCount=Encoding.Unicode.GetByteCount(secret);
377+
if(byteCount>CredMaxCredentialBlobSize)
378+
thrownewArgumentOutOfRangeException(nameof(secret),
379+
$"The secret is greater than{CredMaxCredentialBlobSize} bytes");
380+
381+
varcredentialBlob=Marshal.StringToHGlobalUni(secret);
382+
varcred=newCREDENTIALW
383+
{
384+
Type=CredentialTypeGeneric,
385+
TargetName=targetName,
386+
CredentialBlobSize=byteCount,
387+
CredentialBlob=credentialBlob,
388+
Persist=PersistenceTypeLocalComputer,
389+
};
390+
try
391+
{
392+
if(!CredWriteW(refcred,0))
361393
{
362-
CredFree(credentialPtr);
394+
varerror=Marshal.GetLastWin32Error();
395+
thrownewInvalidOperationException($"Failed to write credentials (Error{error})");
363396
}
364397
}
365-
366-
publicstaticvoidWriteCredentials(stringtargetName,stringsecret)
398+
finally
367399
{
368-
varbyteCount=Encoding.Unicode.GetByteCount(secret);
369-
if(byteCount>CredMaxCredentialBlobSize)
370-
thrownewArgumentOutOfRangeException(nameof(secret),
371-
$"The secret is greater than{CredMaxCredentialBlobSize} bytes");
400+
Marshal.FreeHGlobal(credentialBlob);
401+
}
402+
}
372403

373-
varcredentialBlob=Marshal.StringToHGlobalUni(secret);
374-
varcred=newCREDENTIAL
375-
{
376-
Type=CredentialTypeGeneric,
377-
TargetName=targetName,
378-
CredentialBlobSize=byteCount,
379-
CredentialBlob=credentialBlob,
380-
Persist=PersistenceTypeLocalComputer,
381-
};
382-
try
383-
{
384-
if(!CredWriteW(refcred,0))
385-
{
386-
varerror=Marshal.GetLastWin32Error();
387-
thrownewInvalidOperationException($"Failed to write credentials (Error{error})");
388-
}
389-
}
390-
finally
391-
{
392-
Marshal.FreeHGlobal(credentialBlob);
393-
}
404+
publicstaticvoidDeleteCredentials(stringtargetName)
405+
{
406+
if(!CredDeleteW(targetName,CredentialTypeGeneric,0))
407+
{
408+
varerror=Marshal.GetLastWin32Error();
409+
if(error==ErrorNotFound)return;
410+
thrownewInvalidOperationException($"Failed to delete credentials (Error{error})");
394411
}
412+
}
413+
414+
publicstaticvoidWriteDomainCredentials(stringdomainName,stringserverName,stringusername,stringpassword)
415+
{
416+
vartargetName=$"{domainName}/{serverName}";
417+
vartargetInfo=newCREDENTIAL_TARGET_INFORMATIONW
418+
{
419+
TargetName=targetName,
420+
DnsServerName=serverName,
421+
DnsDomainName=domainName,
422+
PackageName=PackageNTLM,
423+
};
424+
varbyteCount=Encoding.Unicode.GetByteCount(password);
425+
if(byteCount>CredMaxCredentialBlobSize)
426+
thrownewArgumentOutOfRangeException(nameof(password),
427+
$"The secret is greater than{CredMaxCredentialBlobSize} bytes");
395428

396-
publicstaticvoidDeleteCredentials(stringtargetName)
429+
varcredentialBlob=Marshal.StringToHGlobalUni(password);
430+
varcred=newCREDENTIALW
397431
{
398-
if(!CredDeleteW(targetName,CredentialTypeGeneric,0))
432+
Type=CredentialTypeDomainPassword,
433+
TargetName=targetName,
434+
CredentialBlobSize=byteCount,
435+
CredentialBlob=credentialBlob,
436+
Persist=PersistenceTypeLocalComputer,
437+
UserName=username,
438+
};
439+
try
440+
{
441+
if(!CredWriteDomainCredentialsW(reftargetInfo,refcred,0))
399442
{
400443
varerror=Marshal.GetLastWin32Error();
401-
if(error==ErrorNotFound)return;
402-
thrownewInvalidOperationException($"Failed to delete credentials (Error{error})");
444+
thrownewInvalidOperationException($"Failed to write credentials (Error{error})");
403445
}
404446
}
447+
finally
448+
{
449+
Marshal.FreeHGlobal(credentialBlob);
450+
}
451+
}
405452

406-
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
407-
privatestaticexternboolCredReadW(stringtarget,inttype,intreservedFlag,outIntPtrcredentialPtr);
453+
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
454+
privatestaticexternboolCredReadW(stringtarget,inttype,intreservedFlag,outIntPtrcredentialPtr);
408455

409-
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
410-
privatestaticexternboolCredWriteW([In]refCREDENTIALuserCredential,[In]uintflags);
456+
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
457+
privatestaticexternboolCredWriteW([In]refCREDENTIALWuserCredential,[In]uintflags);
411458

412-
[DllImport("Advapi32.dll",SetLastError=true)]
413-
privatestaticexternvoidCredFree([In]IntPtrcred);
459+
[DllImport("Advapi32.dll",SetLastError=true)]
460+
privatestaticexternvoidCredFree([In]IntPtrcred);
414461

415-
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
416-
privatestaticexternboolCredDeleteW(stringtarget,inttype,intflags);
462+
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
463+
privatestaticexternboolCredDeleteW(stringtarget,inttype,intflags);
417464

418-
[StructLayout(LayoutKind.Sequential)]
419-
privatestructCREDENTIAL
420-
{
421-
publicintFlags;
422-
publicintType;
465+
[DllImport("Advapi32.dll",CharSet=CharSet.Unicode,SetLastError=true)]
466+
privatestaticexternboolCredWriteDomainCredentialsW([In]refCREDENTIAL_TARGET_INFORMATIONWtarget,[In]refCREDENTIALWuserCredential,[In]uintflags);
423467

424-
[MarshalAs(UnmanagedType.LPWStr)]publicstringTargetName;
468+
[StructLayout(LayoutKind.Sequential)]
469+
privatestructCREDENTIALW
470+
{
471+
publicintFlags;
472+
publicintType;
425473

426-
[MarshalAs(UnmanagedType.LPWStr)]publicstringComment;
474+
[MarshalAs(UnmanagedType.LPWStr)]publicstringTargetName;
427475

428-
publiclongLastWritten;
429-
publicintCredentialBlobSize;
430-
publicIntPtrCredentialBlob;
431-
publicintPersist;
432-
publicintAttributeCount;
433-
publicIntPtrAttributes;
476+
[MarshalAs(UnmanagedType.LPWStr)]publicstringComment;
434477

435-
[MarshalAs(UnmanagedType.LPWStr)]publicstringTargetAlias;
478+
publiclongLastWritten;
479+
publicintCredentialBlobSize;
480+
publicIntPtrCredentialBlob;
481+
publicintPersist;
482+
publicintAttributeCount;
483+
publicIntPtrAttributes;
436484

437-
[MarshalAs(UnmanagedType.LPWStr)]publicstringUserName;
438-
}
485+
[MarshalAs(UnmanagedType.LPWStr)]publicstringTargetAlias;
486+
487+
[MarshalAs(UnmanagedType.LPWStr)]publicstringUserName;
488+
}
489+
490+
[StructLayout(LayoutKind.Sequential)]
491+
privatestructCREDENTIAL_TARGET_INFORMATIONW
492+
{
493+
[MarshalAs(UnmanagedType.LPWStr)]publicstringTargetName;
494+
[MarshalAs(UnmanagedType.LPWStr)]publicstringNetbiosServerName;
495+
[MarshalAs(UnmanagedType.LPWStr)]publicstringDnsServerName;
496+
[MarshalAs(UnmanagedType.LPWStr)]publicstringNetbiosDomainName;
497+
[MarshalAs(UnmanagedType.LPWStr)]publicstringDnsDomainName;
498+
[MarshalAs(UnmanagedType.LPWStr)]publicstringDnsTreeName;
499+
[MarshalAs(UnmanagedType.LPWStr)]publicstringPackageName;
500+
501+
publicuintFlags;
502+
publicuintCredTypeCount;
503+
publicIntPtrCredTypes;
439504
}
440505
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp