Skip to content

0.4.2 auth #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Jun 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pglet.psm1
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ New-Alias -Name Dropdown -Value New-PgletDropdown
New-Alias -Name DropdownOption -Value New-PgletDropdownOption
New-Alias -Name GridColumn -Value New-PgletGridColumn
New-Alias -Name Grid -Value New-PgletGrid
New-Alias -Name Html -Value New-PgletHtml
New-Alias -Name Icon -Value New-PgletIcon
New-Alias -Name Image -Value New-PgletImage
New-Alias -Name LineChart -Value New-PgletLineChart
Expand Down
13 changes: 8 additions & 5 deletions src/Pglet.PowerShell/ConnectPgletAppCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ public class ConnectPgletAppCommand : PSCmdlet
[Parameter(Mandatory = true, HelpMessage = "A handler script block for a new user session.")]
public ScriptBlock ScriptBlock { get; set; }

[Parameter(Mandatory = false, HelpMessage = "Makes the page available as public at pglet.io service or a self-hosted Pglet server.")]
public SwitchParameter Web { get; set; }
[Parameter(Mandatory = false, HelpMessage = "Run the app on the local instance of Pglet server.")]
public SwitchParameter Local { get; set; }

[Parameter(Mandatory = false, HelpMessage = "Do not open browser window.")]
public SwitchParameter NoWindow { get; set; }
Expand All @@ -30,6 +30,9 @@ public class ConnectPgletAppCommand : PSCmdlet
[Parameter(Mandatory = false, HelpMessage = "Authentication token for pglet.io service or a self-hosted Pglet server.")]
public string Token { get; set; }

[Parameter(Mandatory = false, HelpMessage = "The list of users and groups allowed to access this app.")]
public string Permissions { get; set; }

[Parameter(Mandatory = false, HelpMessage = "Interval in milliseconds between 'tick' events; disabled if not specified.")]
public int? Ticker { get; set; }

Expand All @@ -56,7 +59,7 @@ void pageCreated(string pageUrl)
{
ps.Runspace = runspace;
runspace.Open();
runspace.SessionStateProxy.PSVariable.Set(new PSVariable(Constants.PGLET_PAGE, page, ScopedItemOptions.Private));
runspace.SessionStateProxy.PSVariable.Set(new PSVariable(Constants.PGLET_PAGE, page, ScopedItemOptions.AllScope));
ps.AddScript($"Import-Module '{pgletModulePath}'");
ps.AddScript(ScriptBlock.ToString());
ps.AddScript("\nSwitch-PgletEvents");
Expand All @@ -71,8 +74,8 @@ void pageCreated(string pageUrl)
}
});
},
cancellationToken: _cancellationSource.Token, name: Name, web: Web.ToBool(), noWindow: NoWindow.ToBool(),
server: Server, token: Token, ticker: Ticker.HasValue ? Ticker.Value : 0,
cancellationToken: _cancellationSource.Token, name: Name, local: Local.ToBool(), noWindow: NoWindow.ToBool(),
server: Server, token: Token, ticker: Ticker.HasValue ? Ticker.Value : 0, permissions: Permissions,
createPage: (conn, pageUrl) => new PsPage(conn, pageUrl), pageCreated: pageCreated).Wait();
}

Expand Down
11 changes: 7 additions & 4 deletions src/Pglet.PowerShell/ConnectPgletPageCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ public class ConnectPgletPageCommand : PSCmdlet
[Parameter(Mandatory = false, Position = 0, HelpMessage = "The name of Pglet page.")]
public string Name { get; set; }

[Parameter(Mandatory = false, HelpMessage = "Makes the page available as public at pglet.io service or a self-hosted Pglet server.")]
public SwitchParameter Web { get; set; }
[Parameter(Mandatory = false, HelpMessage = "Run the page on the local instance of Pglet server.")]
public SwitchParameter Local { get; set; }

[Parameter(Mandatory = false, HelpMessage = "Do not open browser window.")]
public SwitchParameter NoWindow { get; set; }
Expand All @@ -26,10 +26,13 @@ public class ConnectPgletPageCommand : PSCmdlet
[Parameter(Mandatory = false, HelpMessage = "Interval in milliseconds between 'tick' events; disabled if not specified.")]
public int? Ticker { get; set; }

[Parameter(Mandatory = false, HelpMessage = "The list of users and groups allowed to access this page.")]
public string Permissions { get; set; }

protected override void ProcessRecord()
{
var page = PgletClient.ConnectPage(name: Name, web: Web.ToBool(), noWindow: NoWindow.ToBool(),
server: Server, token: Token, ticker: Ticker.HasValue ? Ticker.Value : 0,
var page = PgletClient.ConnectPage(name: Name, local: Local.ToBool(), noWindow: NoWindow.ToBool(),
server: Server, token: Token, ticker: Ticker.HasValue ? Ticker.Value : 0, permissions: Permissions,
createPage: (conn, pageUrl) => new PsPage(conn, pageUrl)).GetAwaiter().GetResult();

SessionState.PSVariable.Set(new PSVariable(Constants.PGLET_PAGE, page, ScopedItemOptions.Private));
Expand Down
23 changes: 23 additions & 0 deletions src/Pglet.PowerShell/NewPgletHtmlCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using Pglet.Controls;
using System.Management.Automation;

namespace Pglet.PowerShell
{
[Cmdlet(VerbsCommon.New, "PgletHtml")]
[OutputType(typeof(Html))]
public class NewPgletHtmlCommand : NewControlCmdletBase
{
[Parameter(Mandatory = false, Position = 0)]
public string Value { get; set; }

protected override void ProcessRecord()
{
var control = new Html
{
Value = Value
};

WriteObject(control);
}
}
}
54 changes: 54 additions & 0 deletions src/Pglet.PowerShell/ShowPgletSigninCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System;
using System.Management.Automation;
using System.Threading;

namespace Pglet.PowerShell
{
[Cmdlet(VerbsCommon.Show, "PgletSignin")]
[OutputType(typeof(bool))]
public class ShowPgletSigninCommand : PSCmdlet
{
readonly CancellationTokenSource _cancellationSource = new();

[Parameter(Mandatory = false, Position = 0, HelpMessage = "Page object.")]
public Page Page { get; set; }

[Parameter(Mandatory = false)]
public string[] AuthProviders { get; set; }

[Parameter(Mandatory = false)]
public SwitchParameter AuthGroups { get; set; }

[Parameter(Mandatory = false)]
public SwitchParameter AllowDismiss { get; set; }

protected override void ProcessRecord()
{
var page = Page;
if (page == null)
{
page = SessionState.PSVariable.Get(Constants.PGLET_PAGE).Value as Page;
}

if (page == null)
{
throw new Exception("There are no active Pglet connections.");
}

string authProviders = "*";
if (AuthProviders != null && AuthProviders.Length > 0)
{
authProviders = string.Join(",", AuthProviders);
}

var result = page.ShowSignin(authProviders, AuthGroups.IsPresent, AllowDismiss.IsPresent, _cancellationSource.Token);
WriteObject(result);
}

protected override void StopProcessing()
{
_cancellationSource.Cancel();
base.StopProcessing();
}
}
}
4 changes: 2 additions & 2 deletions src/Pglet.PowerShell/WaitPgletEventCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Pglet.PowerShell
{
[Cmdlet(VerbsLifecycle.Wait, "PgletEvent")]
[OutputType(typeof(Event))]
[OutputType(typeof(ControlEvent))]
public class WaitPgletEventCommand : PSCmdlet
{
readonly CancellationTokenSource _cancellationSource = new();
Expand All @@ -26,7 +26,7 @@ protected override void ProcessRecord()
throw new Exception("There are no active Pglet connections.");
}

var e = page.Connection.WaitEvent(_cancellationSource.Token);
var e = page.WaitEvent(_cancellationSource.Token);
WriteObject(e);
}

Expand Down
13 changes: 13 additions & 0 deletions src/Pglet/Controls/Html.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace Pglet.Controls
{
public class Html : Control
{
protected override string ControlName => "html";

public string Value
{
get { return GetAttr("value"); }
set { SetAttr("value", value); }
}
}
}
89 changes: 79 additions & 10 deletions src/Pglet/Page.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace Pglet
Expand Down Expand Up @@ -74,6 +75,12 @@ public int Gap
set { SetIntAttr("gap", value); }
}

public string Theme
{
get { return GetAttr("theme"); }
set { SetAttr("theme", value); }
}

public string ThemePrimaryColor
{
get { return GetAttr("themePrimaryColor"); }
Expand Down Expand Up @@ -119,31 +126,26 @@ public bool SigninGroups
public string UserId
{
get { return GetAttr("userId"); }
set { SetAttr("userId", value); }
}

public string UserLogin
{
get { return GetAttr("userLogin"); }
set { SetAttr("userLogin", value); }
}

public string UserName
{
get { return GetAttr("userName"); }
set { SetAttr("userName", value); }
}

public string UserEmail
{
get { return GetAttr("userEmail"); }
set { SetAttr("userEmail", value); }
}

public string UserClientIP
{
get { return GetAttr("userClientIP"); }
set { SetAttr("userClientIP", value); }
}

public EventHandler OnClose
Expand Down Expand Up @@ -261,6 +263,73 @@ public async Task UpdateAsync(params Control[] controls)
}
}

public ControlEvent WaitEvent()
{
return WaitEvent(CancellationToken.None);
}

public ControlEvent WaitEvent(CancellationToken cancellationToken)
{
var e = _conn.WaitEvent(cancellationToken);

return new ControlEvent
{
Target = e.Target,
Name = e.Name,
Data = e.Data,
Control = _index[e.Target],
Page = this
};
}

public bool ShowSignin(string authProviders, bool withGroups, bool allowDismiss, CancellationToken cancellationToken)
{
return ShowSigninAsync(authProviders, withGroups, allowDismiss, cancellationToken).GetAwaiter().GetResult();
}

public async Task<bool> ShowSigninAsync(string authProviders, bool withGroups, bool allowDismiss, CancellationToken cancellationToken)
{
this.Signin = authProviders;
this.SigninGroups = withGroups;
this.SigninAllowDismiss = allowDismiss;
await UpdateAsync();

// wait for events
while(!cancellationToken.IsCancellationRequested)
{
var e = WaitEvent(cancellationToken);
if (e.Control == this && e.Name.Equals("signin", StringComparison.OrdinalIgnoreCase))
{
return true;
}
else if (e.Control == this && e.Name.Equals("dismissSignin", StringComparison.OrdinalIgnoreCase))
{
return false;
}
}
return false;
}

public void Signout()
{
SignoutAsync().GetAwaiter().GetResult();
}

public async Task SignoutAsync()
{
await _conn.SendAsync("signout");
}

public bool CanAccess(string usersAndGroups)
{
return CanAccessAsync(usersAndGroups).GetAwaiter().GetResult();
}

public async Task<bool> CanAccessAsync(string permissions)
{
return (await _conn.SendAsync($"canAccess \"{permissions.Encode()}\"")).Equals("true", StringComparison.OrdinalIgnoreCase);
}

public Task RemoveAsync(params Control[] controls)
{
foreach(var control in controls)
Expand Down Expand Up @@ -298,11 +367,6 @@ public override async Task CleanAsync()
await _conn.SendAsync($"clean {Uid}");
}

public async Task CloseAsync()
{
await _conn.SendAsync("close");
}

public void Error(string message)
{
ErrorAsync(message).GetAwaiter().GetResult();
Expand All @@ -313,6 +377,11 @@ public async Task ErrorAsync(string message)
await _conn.SendAsync($"error \"{message.Encode()}\"");
}

public async Task CloseAsync()
{
await _conn.SendAsync("close");
}

public void Close()
{
CloseAsync().GetAwaiter().GetResult();
Expand Down
Loading