diff --git a/EnvelopeGenerator.Common/Helpers.vb b/EnvelopeGenerator.Common/Helpers.vb index 0cd2aeb6..0615f236 100644 --- a/EnvelopeGenerator.Common/Helpers.vb +++ b/EnvelopeGenerator.Common/Helpers.vb @@ -39,6 +39,11 @@ Public Class Helpers End Function + Public Shared Function GetAccessCode() As String + Return Guid.NewGuid().ToString("d").Substring(1, 6).ToUpper() + End Function + + Public Shared Function ColorTypeToColor(pColorType As ColorType) As Color Select Case pColorType Case ColorType.ReceiverColor1 diff --git a/EnvelopeGenerator.Common/Services/TemplateService.vb b/EnvelopeGenerator.Common/Services/TemplateService.vb index 8c5171c9..193e325c 100644 --- a/EnvelopeGenerator.Common/Services/TemplateService.vb +++ b/EnvelopeGenerator.Common/Services/TemplateService.vb @@ -7,16 +7,12 @@ Public Class TemplateService Private _replaceDictionary As Dictionary(Of String, String) Private ReadOnly DbConfig As DbConfig - Private ReadOnly LogConfig As LogConfig - Private ReadOnly Logger As Logger Private ReadOnly EmailHtmlTemplateModel As EmailTemplateModel Public Sub New(pState As State) MyBase.New(pState) DbConfig = pState.DbConfig - LogConfig = pState.LogConfig - Logger = LogConfig.GetLogger() EmailHtmlTemplateModel = New EmailTemplateModel(pState) End Sub diff --git a/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb b/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb index 44681d6d..9491a8cd 100644 --- a/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb +++ b/EnvelopeGenerator.Form/Controllers/EnvelopeEditorController.vb @@ -12,7 +12,6 @@ Public Class EnvelopeEditorController Public ReadOnly EmailService As EmailService Public ReadOnly ActionService As ActionService - Public ReadOnly Thumbnail As Thumbnail Public Sub New(pState As State) diff --git a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb index ff581e71..e32d37e7 100644 --- a/EnvelopeGenerator.Form/frmEnvelopeEditor.vb +++ b/EnvelopeGenerator.Form/frmEnvelopeEditor.vb @@ -22,6 +22,10 @@ Partial Public Class frmEnvelopeEditor Private Controller As EnvelopeEditorController Private Logger As Logger + Private Const COL_NAME = "Name" + Private Const COL_EMAIL = "Email" + Private Const COL_CODE = "AccessCode" + Public Property State As State Public Sub New() @@ -447,7 +451,7 @@ Partial Public Class frmEnvelopeEditor End Sub Private Sub ViewReceivers_CellValueChanged(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles ViewReceivers.CellValueChanged - If e.Column.FieldName = "Email" Then + If e.Column.FieldName = COL_EMAIL Then If e.Value Is Nothing Then ' Keine E-Mail-Adresse, also weg damit ViewReceivers.DeleteRow(ViewReceivers.FocusedRowHandle) @@ -455,20 +459,16 @@ Partial Public Class frmEnvelopeEditor ' Doppelte E-Mail-Adresse? TODO 'Dim oReceivers = Controller.Envelope.Receivers - Dim oNameCellValue = ViewReceivers.GetRowCellValue(e.RowHandle, "Name") + Dim oNameCellValue = ViewReceivers.GetRowCellValue(e.RowHandle, COL_NAME) If oNameCellValue Is Nothing Then Dim oEmailAdress As String = DirectCast(e.Value, String) Dim oLastName As String = Controller.GetLastNameByEmailAdress(oEmailAdress) - Dim oAccessCode As String = Guid.NewGuid().ToString("d").Substring(1, 6).ToUpper() + Dim oAccessCode As String = Helpers.GetAccessCode() - ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns("Name"), oLastName) - ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns("AccessCode"), oAccessCode) + ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_NAME), oLastName) + ViewReceivers.SetRowCellValue(e.RowHandle, ViewReceivers.Columns.Item(COL_CODE), oAccessCode) End If End If End If End Sub - - Private Sub RibbonControl1_Click(sender As Object, e As EventArgs) Handles RibbonControl1.Click - - End Sub End Class diff --git a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs index ce12611f..5c945e5f 100644 --- a/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/EnvelopeController.cs @@ -53,6 +53,12 @@ namespace EnvelopeGenerator.Web.Controllers envelopeService.EnsureValidEnvelopeKey(envelopeKey); EnvelopeResponse response = envelopeService.LoadEnvelope(envelopeKey); + // Again check if receiver has already signed + if (envelopeService.ReceiverAlreadySigned(response.Envelope, response.Receiver.Id) == true) + { + return Problem(statusCode: 403); + } + var Request = ControllerContext.HttpContext.Request; var document = envelopeService.GetDocument(Request, envelopeKey); diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 2b943bd7..ed1da50e 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -19,10 +19,54 @@ namespace EnvelopeGenerator.Web.Controllers [HttpGet] [Route("/")] public IActionResult Index() - { - List envelopes = _envelopeService.LoadEnvelopes(); + { + return View(); + } - return View(envelopes); + [HttpPost] + [Route("/")] + public IActionResult DebugEnvelopes() + { + try + { + StringValues passwordFromForm = HttpContext.Request.Form["password"]; + string passwordFromConfig = database.GetAppSetting("Config:AdminPassword"); + + if (passwordFromConfig == null) + { + ViewData["error"] = "No admin password configured!"; + return View("Index"); + } + + if (passwordFromForm.Count != 1) + { + ViewData["error"] = "No admin password configured!"; + return View("Index"); + } + + string password = passwordFromForm[0]; + + if (password == null) + { + ViewData["error"] = "No password supplied!"; + return View("Index"); + } + + if (password != passwordFromConfig) + { + ViewData["error"] = "Wrong Password!"; + return View("Index"); + } + + List envelopes = _envelopeService.LoadEnvelopes(); + + return View(envelopes); + } + catch (Exception e) + { + ViewData["error"] = "Unknown error!"; + return View("Index"); + } } [HttpGet] diff --git a/EnvelopeGenerator.Web/Services/DatabaseService.cs b/EnvelopeGenerator.Web/Services/DatabaseService.cs index b8c9fe47..2d2e8de2 100644 --- a/EnvelopeGenerator.Web/Services/DatabaseService.cs +++ b/EnvelopeGenerator.Web/Services/DatabaseService.cs @@ -6,6 +6,7 @@ namespace EnvelopeGenerator.Web.Services public class DatabaseService: BaseService { public MSSQLServer MSSQL { get; set; } + public IConfiguration Config { get; set; } public State State { get; set; } @@ -47,12 +48,13 @@ namespace EnvelopeGenerator.Web.Services public readonly ModelContainer? Models; public readonly ServiceContainer? Services; - public DatabaseService(IConfiguration Config, LoggingService Logging) : base(Config, Logging) + public DatabaseService(IConfiguration pConfig, LoggingService pLogging) : base(pConfig, pLogging) { - logger = Logging.LogConfig.GetLogger(); + logger = pLogging.LogConfig.GetLogger(); + Config = pConfig; logger.Debug("Establishing MSSQL Database connection.."); - MSSQL = new MSSQLServer(logConfig, Config["Config:ConnectionString"]); + MSSQL = new MSSQLServer(logConfig, pConfig["Config:ConnectionString"]); if (MSSQL.DBInitialized == true) { @@ -71,6 +73,11 @@ namespace EnvelopeGenerator.Web.Services } } + public string? GetAppSetting(string key) + { + return Config[key]; + } + /// /// There is a circular dependency between state and models /// All models need a state object, including the config Model diff --git a/EnvelopeGenerator.Web/Views/Home/DebugEnvelopes.cshtml b/EnvelopeGenerator.Web/Views/Home/DebugEnvelopes.cshtml new file mode 100644 index 00000000..4a34b90a --- /dev/null +++ b/EnvelopeGenerator.Web/Views/Home/DebugEnvelopes.cshtml @@ -0,0 +1,48 @@ +@using EnvelopeGenerator.Common; +@using static EnvelopeGenerator.Common.Constants; +@{ + ViewData["Title"] = "Debug"; +} + +@functions { + string encodeEnvelopeKey(Envelope envelope) + { + var receiver = envelope.Receivers.First(); + return Helpers.EncodeEnvelopeReceiverId(envelope.Uuid, receiver.Signature); + } + + IEnumerable> groupEnvelopes(List envelopes) + { + return envelopes.GroupBy(item => item.Status).OrderBy(item => (int)item.Key); + } +} + +
+
+ @foreach (IGrouping group in groupEnvelopes((List)@Model)) + { +
+

@group.Key.ToString() @group.Count()

+ +
+ Show envelopes + @foreach (Envelope envelope in @group) + { + +
+
+ @envelope.Title +
Ersteller @envelope.User.Email
+
Datum @envelope.AddedWhen
+
+
+ + } +
+ +
+
+ } +
+
+ diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml index fa954ada..30861534 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeLocked.cshtml @@ -2,9 +2,9 @@ ViewData["Title"] = "Dokument geschützt"; } -
+
-
+
@@ -18,7 +18,7 @@
-
+
@@ -36,4 +36,6 @@

Bitte überprüfen Sie Ihr Email Postfach inklusive Spam-Ordner. Sie können auch den Absender bitten, Ihnen den Code auf anderem Wege zukommen zu lassen.

-
\ No newline at end of file +
+ + \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeSigned.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeSigned.cshtml index b7b2d68e..e2c87acc 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeSigned.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeSigned.cshtml @@ -2,9 +2,9 @@ ViewData["Title"] = "Dokument unterschrieben"; } -
+
-
+
@@ -19,3 +19,5 @@
+ + \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Views/Home/Index.cshtml b/EnvelopeGenerator.Web/Views/Home/Index.cshtml index 7a73248c..c596896c 100644 --- a/EnvelopeGenerator.Web/Views/Home/Index.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/Index.cshtml @@ -1,33 +1,37 @@ -@using EnvelopeGenerator.Common; -@using static EnvelopeGenerator.Common.Constants; -@{ - ViewData["Title"] = "Home Page"; +@{ + ViewData["Title"] = "Dokument geschützt"; } -@functions { - string encodeEnvelopeKey(Envelope envelope) +
+
+
+ + + + +
+

Administration

+
+ + @if (ViewData["error"] != null) { - var receiver = envelope.Receivers.First(); - return Helpers.EncodeEnvelopeReceiverId(envelope.Uuid, receiver.Signature); +
+ @ViewData["error"] +
} -} -
- @foreach (IGrouping group in ((List)@Model).GroupBy(item => item.Status).OrderBy(item => (int)item.Key)) - { -
-

@group.Key.ToString()

+
+
+ + +
- -
-
- } +
+ +
+
+ \ No newline at end of file diff --git a/EnvelopeGenerator.Web/appsettings.Development.json b/EnvelopeGenerator.Web/appsettings.Development.json index f8802543..aefe0330 100644 --- a/EnvelopeGenerator.Web/appsettings.Development.json +++ b/EnvelopeGenerator.Web/appsettings.Development.json @@ -10,6 +10,7 @@ "ConnectionString": "Server=sDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;", "LogPath": "E:\\EnvelopeGenerator\\Logs", "LogDebug": true, - "LogJson": true + "LogJson": true, + "AdminPassword": "dd" } } diff --git a/EnvelopeGenerator.Web/wwwroot/css/site.css b/EnvelopeGenerator.Web/wwwroot/css/site.css index 0077d5ac..e4f25b35 100644 --- a/EnvelopeGenerator.Web/wwwroot/css/site.css +++ b/EnvelopeGenerator.Web/wwwroot/css/site.css @@ -41,26 +41,46 @@ color: white; } +body { + background-color: #bbb; +} -/* Success Page */ +.page { + margin-top: 3rem; + background: white; + border-radius: 5px; + box-shadow: rgba(9, 30, 66, 0.25) 0px 4px 8px -2px, rgba(9, 30, 66, 0.08) 0px 0px 0px 1px; + max-width: 40rem; +} -#page-success header .icon { +.page section { + max-width: 30rem; + margin: 0 auto; +} + +.page header .icon { display: inline-block; border-radius: 100px; padding: 15px; margin-bottom: 2rem; } -/* Locked Page */ + .page header .icon.admin { + background-color: #331904; + color: #fecba1; + } -#page-locked header .icon { - display: inline-block; - border-radius: 10px; - padding: 15px; - margin-bottom: 2rem; -} + .page header .icon.locked { + background-color: #ffc107; + color: #000; + } -#form-access-code { + .page header .icon.signed { + background-color: #146c43; + color: #fff; + } + +.page .form { max-width: 30rem; margin: 2rem auto; @@ -68,7 +88,35 @@ gap: 1rem; } - #form-access-code > .input { + #form-access-code > .input, + #form-admin-password > .input { flex-grow: 1; } +#page-admin header .icon { + background-color: #331904; + color: #fecba1; +} + + +.envelope { + display: block; + border: 1px solid #eee; + margin-bottom: 1rem; + padding: 0.5rem; +} + +footer#page-footer { + color: #333; + max-width: 40rem; + margin-top: 1rem; + font-size: 0.85rem; +} + +footer#page-footer a, +footer#page-footer a:link, +footer#page-footer a:hover, +footer#page-footer a:visited, +footer#page-footer a:focus { + color: #444; +} \ No newline at end of file