123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading.Tasks;
- using InABox.Core;
- using InABox.Mail;
- namespace InABox.Clients
- {
- public class BypassSession : IDisposable
- {
- public BypassSession()
- {
- ClientFactory.SetBypass();
- }
- public void Dispose()
- {
- ClientFactory.UnsetBypass();
- }
- }
- public static class ClientFactory
- {
- public static Dictionary<EmailType, Type> MailerTypes = new Dictionary<EmailType, Type>();
- public static Guid UserGuid { get; private set; }
- public static string UserID { get; private set; }
- public static Guid UserSecurityID { get; private set; }
- public static Guid SessionID { get; set; }
- public static Guid DatabaseID { get; set; }
- public static Platform Platform { get; private set; }
- public static string? Version { get; private set; }
-
- public static Type? ClientType { get; private set; }
-
- public static object[]? Parameters { get; private set; }
- public static IEnumerable<string>? SupportedTypes { get; private set; }
-
-
- public static string? Recipient2FA { get; private set; }
- public static DateTime PasswordExpiration { get; private set; }
- public static int PINLength { get; } = 4;
-
- public static PushHandlers PushHandlers { get; set; } = new PushHandlers();
- public delegate void RequestErrorHandler(RequestException e);
- public static event RequestErrorHandler? OnRequestError;
- public static void RaiseRequestError(RequestException e)
- {
- OnRequestError?.Invoke(e);
- }
- private static bool IsSupported(Type t)
- {
- return true;
- //if (SupportedTypes == null)
- //{
- // try
- // {
- // SupportedTypes = new Client<User>().SupportedTypes();
- // }
- // catch (Exception e)
- // {
- // SupportedTypes = new String[] { };
- // }
- //}
- //return SupportedTypes.Contains(t.EntityName().Replace(".", "_"));
- }
- public static bool IsSupported<T>() where T : Entity, new()
- {
- return IsSupported(typeof(T));
- }
- public static bool IsSupported<T1, T2>() where T1 : Entity, new() where T2 : Entity, new()
- {
- return IsSupported<T1>() && IsSupported<T2>();
- }
- public static bool IsSupported<T1, T2, T3>() where T1 : Entity, new() where T2 : Entity, new() where T3 : Entity, new()
- {
- return IsSupported<T1>() && IsSupported<T2>() && IsSupported<T3>();
- }
- public static bool IsSupported<T1, T2, T3, T4>() where T1 : Entity, new()
- where T2 : Entity, new()
- where T3 : Entity, new()
- where T4 : Entity, new()
- {
- return IsSupported<T1>() && IsSupported<T2>() && IsSupported<T3>() && IsSupported<T4>();
- }
- public static bool IsSupported<T1, T2, T3, T4, T5>() where T1 : Entity, new()
- where T2 : Entity, new()
- where T3 : Entity, new()
- where T4 : Entity, new()
- where T5 : Entity, new()
- {
- return IsSupported<T1>() && IsSupported<T2>() && IsSupported<T3>() && IsSupported<T4>() && IsSupported<T4>();
- }
- public static bool IsSupported(params Type[] types)
- {
- return true;
- //if (SupportedTypes == null)
- // SupportedTypes = new Client<User>().SupportedTypes();
- //bool result = true;
- //foreach (var type in types)
- // result = result && SupportedTypes.Contains(type.EntityName().Replace(".", "_"));
- //return result;
- }
- public static void SetClientType(Type type, Platform platform, string? version, params object[]? parameters)
- {
- ClientType = type;
- Platform = platform;
- Version = String.IsNullOrEmpty(version) ? Version : version;
- Parameters = parameters == null ? Parameters : parameters;
- SupportedTypes = parameters == null ? SupportedTypes : null;
- }
- public static void ClearClientType()
- {
- ClientType = null;
- Platform = default(Platform);
- Version = "";
- Parameters = null;
- }
- // override the need to provide credentials when configuring the database
- public static void SetBypass()
- {
- UserGuid = CoreUtils.FullGuid;
- UserID = "";
- Request.BeforeRequest = request =>
- {
- if(request is ValidateRequest validate)
- {
- var ticks = DateTime.Now.ToUniversalTime().Ticks.ToString();
- validate.UserID = Encryption.Encrypt(ticks, "wCq9rryEJEuHIifYrxRjxg", true);
- validate.Password = Encryption.Encrypt(ticks, "7mhvLnqMwkCAzN+zNGlyyg", true);
- }
- };
- var ticks = DateTime.Now.ToUniversalTime().Ticks.ToString();
- var result = Validate(
- Encryption.Encrypt(ticks, "wCq9rryEJEuHIifYrxRjxg", true),
- Encryption.Encrypt(ticks, "7mhvLnqMwkCAzN+zNGlyyg", true));
- if (result != ValidationStatus.VALID)
- {
- Logger.Send(LogType.Error, "", "Bypass login failed");
- }
- //Load up the data model, including Custom Properties
- //var props = CreateClient<CustomProperty>().Load();
- //DatabaseSchema.Load(props);
- }
- public static void UnsetBypass()
- {
- Request.BeforeRequest = null;
- UserGuid = Guid.Empty;
- }
-
- public static ValidationStatus Validate(string userid, string password, Guid session = default)
- {
- InvalidateUser();
- var result = Client.Validate(userid, password, session);
- if (result.Status != ValidationStatus.INVALID)
- {
- UserGuid = result.UserGuid;
- UserID = result.UserID;
- UserSecurityID = result.SecurityID;
- Recipient2FA = result.Recipient2FA;
- SessionID = result.SessionID;
- PasswordExpiration = result.PasswordExpiration;
- if(result.Status == ValidationStatus.VALID)
- {
- OnValidLogin();
- }
- return result.Status;
- }
- return result.Status;
- }
- public static ValidationStatus Validate(string pin, Guid session = default)
- {
- InvalidateUser();
- var result = Client.Validate(pin, session);
- if (result.Status != ValidationStatus.INVALID)
- {
- UserGuid = result.UserGuid;
- UserID = result.UserID;
- UserSecurityID = result.SecurityID;
- Recipient2FA = result.Recipient2FA;
- SessionID = result.SessionID;
- PasswordExpiration = result.PasswordExpiration;
- if (result.Status == ValidationStatus.VALID)
- {
- OnValidLogin();
- }
- return result.Status;
- }
- return result.Status;
- }
- public static ValidationStatus Validate(Guid session)
- {
- var result = Client.Validate(session);
- if (result.Status != ValidationStatus.INVALID)
- {
- UserGuid = result.UserGuid;
- UserID = result.UserID;
- UserSecurityID = result.SecurityID;
- Recipient2FA = result.Recipient2FA;
- SessionID = result.SessionID;
- PasswordExpiration = result.PasswordExpiration;
- if (result.Status == ValidationStatus.VALID)
- {
- OnValidLogin();
- }
- return result.Status;
- }
- return result.Status;
- }
- public static bool ValidateUser(string userid, string password)
- {
- InvalidateUser();
- var result = Client.Validate(userid, password);
- if (result.Status == ValidationStatus.VALID)
- {
- UserGuid = result.UserGuid;
- UserID = result.UserID;
- UserSecurityID = result.SecurityID;
- Recipient2FA = result.Recipient2FA;
- SessionID = result.SessionID;
- PasswordExpiration = result.PasswordExpiration;
-
- if (result.Status == ValidationStatus.VALID)
- {
- OnValidLogin();
- }
- return true;
- }
- return false;
- }
- public static bool ValidatePIN(string pin)
- {
- InvalidateUser();
- var result = Client.Validate(pin);
- if (result.Status == ValidationStatus.VALID)
- {
- UserGuid = result.UserGuid;
- UserID = result.UserID;
- UserSecurityID = result.SecurityID;
- Recipient2FA = result.Recipient2FA;
- SessionID = result.SessionID;
- PasswordExpiration = result.PasswordExpiration;
-
- if (result.Status == ValidationStatus.VALID)
- {
- OnValidLogin();
- }
- return true;
- }
- return false;
- }
- public static bool Check2FA(string code, Guid? session = null)
- {
- var result = Client.Check2FA(code, session);
- if (result)
- {
- OnValidLogin();
- }
- return result;
- }
- public static void OnValidLogin()
- {
- //Load up the data model, including Custom Properties
- var props = new Client<CustomProperty>().Load();
- DatabaseSchema.Load(props);
- }
- public static void InvalidateUser()
- {
- //CurrentUser = null;
- UserGuid = Guid.Empty;
- UserID = "";
- UserSecurityID = Guid.Empty;
- SessionID = Guid.Empty;
- Security.Reset();
- }
- public static event LogEvent? OnLog;
- public static IClient<TEntity> CreateClient<TEntity>() where TEntity : Entity, new()
- {
- var type = ClientType.MakeGenericType(typeof(TEntity));
- var client = (IClient<TEntity>)Activator.CreateInstance(type, Parameters);
- client.OnLog += OnLog;
- return client;
- }
- public static IClient CreateClient(Type t)
- {
- var type = ClientType.MakeGenericType(t);
- var client = (IClient)Activator.CreateInstance(type, Parameters);
- client.OnLog += OnLog;
- return client;
- }
- public static CoreTable[] MultiQuery(params IQueryDef[] queries)
- {
- var tasks = new Dictionary<object, Task<CoreTable>>();
- for (var i = 0; i < queries.Length; i++)
- {
- var def = queries[i];
- var task = Task.Run(() => { return CreateClient(def.Type).Query(def.Filter, def.Columns, def.SortOrder); });
- tasks[i] = task;
- }
- Task.WaitAll(tasks.Values.ToArray());
- var results = new List<CoreTable>();
- for (var i = 0; i < queries.Length; i++)
- results.Add(tasks[i].Result);
- return results.ToArray();
- }
- public static void MultiQuery(IQueryDef[] queries, Action<CoreTable[]> OnResults)
- {
- Task.Run(() =>
- {
- var tasks = new Dictionary<object, Task<CoreTable>>();
- for (var i = 0; i < queries.Length; i++)
- {
- var def = queries[i];
- var task = Task.Run(() => { return CreateClient(def.Type).Query(def.Filter, def.Columns, def.SortOrder); });
- tasks[i] = task;
- }
- Task.WaitAll(tasks.Values.ToArray());
- var results = new List<CoreTable>();
- for (var i = 0; i < queries.Length; i++)
- results.Add(tasks[i].Result);
- OnResults.Invoke(results.ToArray());
- });
- }
- public static void RegisterMailer(EmailType type, Type mailer)
- {
- MailerTypes[type] = mailer;
- }
- public static ICoreMailer? CreateMailer()
- {
- var row = new Client<User>().Query(
- new Filter<User>(x => x.ID).IsEqualTo(UserGuid),
- Columns.None<User>().Add(
- x => x.EmailType,
- x => x.EmailHost,
- x => x.EmailPort,
- x => x.EmailDomain,
- x => x.EmailUserID,
- x => x.EmailPassword,
- x => x.SMTPHost,
- x => x.SMPTPort,
- x => x.SMTPUserName,
- x => x.SMTPPassword)
- ).Rows.FirstOrDefault();
- if (row == null)
- return null;
- var type = row.Get<User, EmailType>(x => x.EmailType);
- if (type == EmailType.None)
- return null;
- var result = (Activator.CreateInstance(MailerTypes[type]) as ICoreMailer)!;
- result.MailboxHost = row.Get<User, string>(x => x.EmailHost);
- result.MailboxPort = row.Get<User, int>(x => x.EmailPort);
- result.MailboxDomain = row.Get<User, string>(x => x.EmailDomain);
- result.MailboxUserName = row.Get<User, string>(x => x.EmailUserID);
- result.MailboxPassword = row.Get<User, string>(x => x.EmailPassword);
- result.SMTPHost = row.Get<User, string>(x => x.SMTPHost);
- result.SMTPPort = row.Get<User, int>(x => x.SMPTPort);
- result.SMTPUserName = row.Get<User, string>(x => x.SMTPUserName);
- result.SMTPPassword = row.Get<User, string>(x => x.SMTPPassword);
- return result;
- }
- }
- }
|