more work on api & rename to Pilz.Net

This commit is contained in:
Pilzinsel64
2024-08-16 06:59:39 +02:00
parent f57aef5f4f
commit 2efb4f141c
91 changed files with 299 additions and 241 deletions

View File

@@ -0,0 +1,162 @@
using Pilz.Net.CloudProviders.Nextcloud.Client;
using Pilz.Net.CloudProviders.Nextcloud.Client.Cloud;
using Pilz.Net.CloudProviders.Nextcloud.Client.Cloud.Model;
using Pilz.Net.CloudProviders.Nextcloud.Client.LoginFlowV2.Ocs;
using Pilz.Net.CloudProviders.Nextcloud.OCS;
/* Nicht gemergte Änderung aus Projekt "Pilz.Networking.CloudProviders.Nextcloud (net6.0)"
Vor:
using Pilz.Networking.CloudProviders.Nextcloud.Ocs;
Nach:
using Pilz.Networking.CloudProviders.Nextcloud.Ocs;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
*/
using System.Diagnostics;
namespace Pilz.Net.CloudProviders.Nextcloud;
public class NextcloudClient : IDisposable
{
private readonly List<ClientBase> clients = new();
private NextcloudLogin? currentLogin;
public OcsApi Ocs { get; init; } = new();
public NextcloudLogin? CurrentLogin
{
get => currentLogin;
private set
{
currentLogin = value;
Ocs.BaseUrl = value?.Server ?? string.Empty;
}
}
public CloudClient Cloud => GetClient<CloudClient>();
public NextcloudClient()
{
Ocs.GetOcsApiAuthCredentails += Ocs_GetOcsApiAuthCredentails;
}
private void Ocs_GetOcsApiAuthCredentails(object sender, GetOcsApiAuthCredentailsEventArgs eventArgs)
{
if (sender == Ocs)
eventArgs.Credentials = CurrentLogin.ToOcsApiAuthCredentials();
}
public TClient GetClient<TClient>() where TClient : ClientBase
{
var instance = TryGetClient<TClient>();
return instance is null ? throw new NullReferenceException() : instance;
}
public TClient? TryGetClient<TClient>() where TClient : ClientBase
{
TClient? instance = (TClient?)clients.FirstOrDefault(n => n is TClient);
instance ??= (TClient?)Activator.CreateInstance(typeof(TClient), new object[] { this });
if (instance is not null)
clients.Add(instance);
return instance;
}
public UserInfo? Login(NextcloudLogin login)
{
return Login(login, true);
}
public UserInfo? Login(NextcloudLogin login, bool checkUser)
{
// Ensure we are logged out
Logout(false);
// Temporary set user login
CurrentLogin = login;
if (checkUser)
{
// Try get user info & check if user is enabled
var userInfo = Cloud.GetUserInfo();
var isValid = userInfo != null /*&& userInfo.Enabled*/; // Enabled is false for some (new) users but they still are able to login??
// If invalid, reset login credentials
if (!isValid)
CurrentLogin = null;
return userInfo;
}
return null;
}
public NextcloudLogin? Login(string baseUrl, CancellationToken cancellationToken)
{
// Ensure we are logged out
Logout(false);
// Init the login process
var initResponse = Ocs.LoginFlowV2.Init(baseUrl);
if (!string.IsNullOrEmpty(initResponse?.LoginUrl) && initResponse.Poll != null)
{
// Open the browser
Process.Start(new ProcessStartInfo
{
FileName = initResponse.LoginUrl,
UseShellExecute = true
});
// Poll for credentails in intervals
OcsResponseLoginFlowV2Credentials? pollResponse = null;
while (!cancellationToken.IsCancellationRequested && pollResponse is null)
{
// Wait 5 seconds
Thread.Sleep(5000);
// Poll the credentials
if (!cancellationToken.IsCancellationRequested)
pollResponse = Ocs.LoginFlowV2.Poll(initResponse.Poll);
}
// Check login credentials
if (pollResponse is not null)
CurrentLogin = new(pollResponse);
}
return CurrentLogin;
}
public void Logout()
{
Logout(false);
}
public void Logout(bool logoutOnServer)
{
if (CurrentLogin != null)
{
// Delete currently used app password
if (logoutOnServer)
Ocs.Core.DeleteAppPassword();
// Reset current login infos
CurrentLogin = null;
}
}
public void Dispose()
{
Ocs.Dispose();
GC.SuppressFinalize(this);
}
}