@@ -5,7 +5,10 @@ using Microsoft.EntityFrameworkCore; | |||
using Microsoft.Extensions.Logging; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.IO; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Threading.Tasks; | |||
using System.Web; | |||
using Teknik.Areas.Paste; | |||
using Teknik.Areas.Users.Models; | |||
@@ -20,6 +23,7 @@ using Teknik.Filters; | |||
using Teknik.Logging; | |||
using Teknik.Models; | |||
using Teknik.Utilities; | |||
using Teknik.Utilities.Cryptography; | |||
namespace Teknik.Areas.Vault.Controllers | |||
{ | |||
@@ -30,7 +34,7 @@ namespace Teknik.Areas.Vault.Controllers | |||
public VaultController(ILogger<Logger> logger, Config config, TeknikEntities dbContext) : base(logger, config, dbContext) { } | |||
[AllowAnonymous] | |||
public IActionResult ViewVault(string id) | |||
public async Task<IActionResult> ViewVault(string id) | |||
{ | |||
Models.Vault foundVault = _dbContext.Vaults.Where(v => v.Url == id).FirstOrDefault(); | |||
if (foundVault != null) | |||
@@ -94,7 +98,28 @@ namespace Teknik.Areas.Vault.Controllers | |||
pasteModel.Title = item.Title; | |||
pasteModel.Description = item.Description; | |||
pasteModel.DateAdded = item.DateAdded; | |||
pasteModel.Paste = paste.Paste; | |||
pasteModel.PasteId = paste.Paste.PasteId; | |||
pasteModel.Url = paste.Paste.Url; | |||
pasteModel.DatePosted = paste.Paste.DatePosted; | |||
pasteModel.Syntax = paste.Paste.Syntax; | |||
pasteModel.HasPassword = !string.IsNullOrEmpty(paste.Paste.HashedPassword); | |||
if (!pasteModel.HasPassword) | |||
{ | |||
// Read in the file | |||
string subDir = paste.Paste.FileName[0].ToString(); | |||
string filePath = Path.Combine(_config.PasteConfig.PasteDirectory, subDir, paste.Paste.FileName); | |||
byte[] ivBytes = Encoding.Unicode.GetBytes(paste.Paste.IV); | |||
byte[] keyBytes = AesCounterManaged.CreateKey(paste.Paste.Key, ivBytes, paste.Paste.KeySize); | |||
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read)) | |||
using (AesCounterStream cs = new AesCounterStream(fs, false, keyBytes, ivBytes)) | |||
using (StreamReader sr = new StreamReader(cs, Encoding.Unicode)) | |||
{ | |||
pasteModel.Content = await sr.ReadToEndAsync(); | |||
} | |||
} | |||
model.Items.Add(pasteModel); | |||
} | |||
} |
@@ -8,6 +8,11 @@ namespace Teknik.Areas.Vault.ViewModels | |||
{ | |||
public class PasteItemViewModel : VaultItemViewModel | |||
{ | |||
public Paste.Models.Paste Paste { get; set; } | |||
public int PasteId { get; set; } | |||
public string Url { get; set; } | |||
public string Content { get; set; } | |||
public string Syntax { get; set; } | |||
public DateTime DatePosted { get; set; } | |||
public bool HasPassword { get; set; } | |||
} | |||
} |
@@ -1,7 +1,7 @@ | |||
@model Teknik.Areas.Vault.ViewModels.PasteItemViewModel | |||
@{ | |||
string format = Model.Paste.Syntax; | |||
string format = Model.Syntax; | |||
string formatName = "Text"; | |||
if (!string.IsNullOrEmpty(format) && HighlightHelper.Languages.ContainsKey(format)) | |||
@@ -13,10 +13,10 @@ | |||
<div class="panel-heading"> | |||
<div class="row"> | |||
<div class="col-sm-10 text-left"> | |||
<h4><b>@((string.IsNullOrEmpty(Model.Title)) ? "Paste" : Model.Title)</b> <small>Pasted on <time datetime="@Model.Paste.DatePosted.ToString("s")">@Model.Paste.DatePosted.ToString("dddd, MMMM d, yyyy") at @Model.Paste.DatePosted.ToString("h:mm:ss tt")</time> - Format: <b id="syntaxLanguage_@(Model.Paste.PasteId)">@formatName</b></small></h4> | |||
<h4><b>@((string.IsNullOrEmpty(Model.Title)) ? "Paste" : Model.Title)</b> <small>Pasted on <time datetime="@Model.DatePosted.ToString("s")">@Model.DatePosted.ToString("dddd, MMMM d, yyyy") at @Model.DatePosted.ToString("h:mm:ss tt")</time> - Format: <b id="syntaxLanguage_@(Model.PasteId)">@formatName</b></small></h4> | |||
</div> | |||
<div class="col-sm-2 text-right"> | |||
<h4><small><a href="@Url.SubRouteUrl("p", "Paste.View", new { url = Model.Paste.Url })" target="_blank">Direct Link</a></small></h4> | |||
<h4><small><a href="@Url.SubRouteUrl("p", "Paste.View", new { url = Model.Url })" target="_blank">Direct Link</a></small></h4> | |||
</div> | |||
</div> | |||
</div> | |||
@@ -24,22 +24,22 @@ | |||
<div class="row"> | |||
<div class="col-sm-12 pull-left"> | |||
<div class="btn-group" role="group"> | |||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Simple", new { url = Model.Paste.Url })" target="_blank">Simple</a> | |||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Raw", new { url = Model.Paste.Url })" target="_blank">Raw</a> | |||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Download", new { url = Model.Paste.Url })">Download</a> | |||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Simple", new { url = Model.Url })" target="_blank">Simple</a> | |||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Raw", new { url = Model.Url })" target="_blank">Raw</a> | |||
<a role="button" class="btn btn-default" href="@Url.SubRouteUrl("p", "Paste.Download", new { url = Model.Url })">Download</a> | |||
</div> | |||
</div> | |||
</div> | |||
<br /> | |||
<div class="row paste-item"> | |||
<div class="col-sm-12 paste-content hideContent" id="@Model.VaultItemId"> | |||
@if (!string.IsNullOrEmpty(Model.Paste.HashedPassword)) | |||
@if (Model.HasPassword) | |||
{ | |||
<p class="text-center">Password Required</p> | |||
} | |||
else | |||
{ | |||
<pre class="line-numbers" id="code-@(Model.VaultItemId)"><code class="language-@(format)">@Model.Paste.Content</code></pre> | |||
<pre class="line-numbers" id="code-@(Model.VaultItemId)"><code class="language-@(format)">@Model.Content</code></pre> | |||
} | |||
</div> | |||
<div class="show-more" id="show-more-bottom-@Model.VaultItemId"> |