diff options
Diffstat (limited to 'ShareGuard.Web/Components/Pages')
| -rw-r--r-- | ShareGuard.Web/Components/Pages/Admin.razor | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/ShareGuard.Web/Components/Pages/Admin.razor b/ShareGuard.Web/Components/Pages/Admin.razor new file mode 100644 index 0000000..3884630 --- /dev/null +++ b/ShareGuard.Web/Components/Pages/Admin.razor @@ -0,0 +1,119 @@ +@page "/admin/" +@using ShareGuard.Web.DbModels +@rendermode InteractiveServer + +<PageTitle>ShareGuard Admin</PageTitle> + +<h2>ShareGuard Admin</h2> + +<h5>Generate Share-Link</h5> +<div class="field label round border"> + <input type="text" placeholder=" " @onchange="args => _newName = args.Value!.ToString()!"> + <label>Name</label> +</div> +<div class="field label round border"> + <input type="text" placeholder=" " @onchange="args => _newIpAddress = args.Value!.ToString()!"> + <label>IP Address(es)</label> +</div> +<button class="border small-round large small-elevate" style="margin-top: 1em;" @onclick="GenerateNewLink"> + <i>add_link</i> + <span>Generate</span> +</button> + +<h5>WG-Quick Template</h5> +<p>You can use the following placeholders: + <br/><code>{ip}</code> for the peer's ip address(es) + <br/><code>{publicKey}</code> for the peer's public key + <br/><code>{privateKey}</code> for the peer's private key</p> +<div class="field extra border"> + <textarea @onchange="args => _template = args.Value!.ToString()!">@_template</textarea> + <output>This template will be generated for your users.</output> +</div> +<button class="border small-round large small-elevate" style="margin-top: 1em;" @onclick="SaveTemplate"> + <i>save</i> + <span>Save</span> +</button> + +@if (_links != null) +{ + <h5>History</h5> + <table class="border medium-space"> + <thead> + <tr> + <th>Name</th> + <th>Token</th> + <th>Client Public Key</th> + <th>IP Address(es)</th> + <th>Actions</th> + </tr> + </thead> + <tbody> + @foreach (var link in _links) + { + <tr> + <td>@link.Name</td> + <td>@link.Token</td> + @if (link.PeerPublicKey == null) + { + <td>Pending</td> + } + else + { + <td><code>@link.PeerPublicKey</code></td> + } + <td>@link.IpAddress</td> + <td> + <button class="small-round tertiary small" @onclick="() => DeleteLink(link)">Delete link</button> + </td> + </tr> + } + </tbody> + </table> +} + +@code +{ + private const string TemplateFilePath = "./wg-quick-template.txt"; + private string? _template; + + private void SaveTemplate() + { + if (_template != null) + { + File.WriteAllText(TemplateFilePath, _template); + } + } + + private List<Link>? _links; + + protected override void OnInitialized() + { + if (File.Exists(TemplateFilePath)) _template = File.ReadAllText(TemplateFilePath); + using var db = new Database(); + _links = db.Links.ToList(); + } + + private string _newName = ""; + private string _newIpAddress = ""; + + private void GenerateNewLink() + { + using var db = new Database(); + db.Links.Add(new Link + { + Name = _newName, + IpAddress = _newIpAddress, + Token = Link.GenerateToken(db) + }); + db.SaveChanges(); + OnInitialized(); + } + + private void DeleteLink(Link link) + { + using var db = new Database(); + db.Remove(link); + db.SaveChanges(); + OnInitialized(); + } +} |
