public SetupLoginCommand( LoginUi ui, MethodWeb web, int loginDurationMinutes = 15) : this( ui, web, TimeSpan.FromMinutes( loginDurationMinutes)) { }
/// <summary> /// Requires a UiReaderWriter, an AccessController, and an EventRaiser /// Also requires a Timer called LoginTimer and a StopHandler /// The timer and handler are registered by the SetupLoginCommand /// </summary> /// <param name="ui"></param> /// public virtual void Handle( LoginUi ui) { var r = this.runner; r?.Run < UiReaderWriter, AccessController, SettingsHolder>( (uiRW, ac, settings) => { var securePw = uiRW.Read( ui, () => ui?.CurrentPassword); var previousLevel = ac.CurrentAccessLevel; ac.InputPassword( securePw, settings.Duration); var newLevel = ac.CurrentAccessLevel; if (previousLevel == newLevel) { r.Run <xofz.Framework.Timer, EventRaiser>( (t, er) => { er.Raise(t, nameof(t.Elapsed)); }, DependencyNames.Timer); } const AccessLevel zeroAccess = AccessLevel.None; if (newLevel > zeroAccess) { settings.CurrentPassword = securePw; r.Run <StopHandler>(handler => { handler.Handle(ui); }); return; } uiRW.Write( ui, () => { ui?.FocusPassword(); }); }); }
/// <summary> /// Requires an AccessController and UiReaderWriter /// Also requires a SettingsHolder and Labels, but /// this is registered by the SetupLoginCommand /// </summary> /// <param name="ui">The LoginUi on which to handle the event</param> public virtual void Handle( LoginUi ui) { var r = this.runner; r?.Run < AccessController, SettingsHolder, Labels>( (ac, settings, labels) => { var cal = ac.CurrentAccessLevel; string timeRemaining; if (cal < AccessLevel.Level1) { timeRemaining = labels.NotLoggedIn; goto checkAccess; } var tr = ac.TimeRemaining; var sb = new StringBuilder(); sb.Append((int)tr.TotalHours) .Append(':') .Append(tr .Minutes .ToString() .PadLeft(2, '0')) .Append(':') .Append(tr .Seconds .ToString() .PadLeft(2, '0')) .Append('.') .Append(tr .Milliseconds .ToString() .PadLeft(3, '0')); timeRemaining = sb.ToString(); checkAccess: var noAccess = cal == AccessLevel.None; if (noAccess) { settings.CurrentPassword = null; } r.Run <UiReaderWriter>(uiRW => { uiRW.Write( ui, () => { if (ui == null) { return; } ui.CurrentAccessLevel = cal; ui.TimeRemaining = timeRemaining; }); }); }); }
/// <summary> /// Requires a UiReaderWriter, an AccessController, and /// a timer called LoginTimer registered with the MethodWeb /// </summary> /// <param name="ui"> /// The LoginUi to set up</param> public virtual void Handle( LoginUi ui) { var r = this.runner; r?.Run <Labels, UiReaderWriter>( (labels, uiRW) => { uiRW.Write( ui, () => { if (ui == null) { return; } ui.TimeRemaining = labels.NotLoggedIn; ui.KeyboardKeyVisible = false; }); r.Run <KeyboardLoader>(loader => { uiRW.Write( ui, () => { if (ui == null) { return; } ui.KeyboardKeyVisible = true; }); }); r.Run <AccessController>(ac => { var cal = ac.CurrentAccessLevel; uiRW.Write( ui, () => { if (ui == null) { return; } ui.CurrentAccessLevel = cal; }); }); if (ui is LoginUiV2 v2) { r.Run <LabelApplier>(applier => { applier.Apply( v2); }); } r.Run <xofz.Framework.Timer>(t => { const short timerInterval = 1000; t.Start(timerInterval); }, DependencyNames.Timer); }); }