| @@ -1,13 +0,0 @@ | |||
| using SecureSharing.Areas.Identity; | |||
| [assembly: HostingStartup(typeof(IdentityHostingStartup))] | |||
| namespace SecureSharing.Areas.Identity; | |||
| public sealed class IdentityHostingStartup : IHostingStartup | |||
| { | |||
| public void Configure(IWebHostBuilder builder) | |||
| { | |||
| builder.ConfigureServices((context, services) => { }); | |||
| } | |||
| } | |||
| @@ -1,85 +0,0 @@ | |||
| @page | |||
| @model LoginModel | |||
| @{ | |||
| ViewData["Title"] = "Log in"; | |||
| } | |||
| <h1>@ViewData["Title"]</h1> | |||
| <div class="row"> | |||
| <div class="col-md-4"> | |||
| <section> | |||
| <form id="account" method="post"> | |||
| <h4>Use a local account to log in.</h4> | |||
| <hr/> | |||
| <div asp-validation-summary="All" class="text-danger"></div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.Email"></label> | |||
| <input asp-for="Input.Email" class="form-control"/> | |||
| <span asp-validation-for="Input.Email" class="text-danger"></span> | |||
| </div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.Password"></label> | |||
| <input asp-for="Input.Password" class="form-control"/> | |||
| <span asp-validation-for="Input.Password" class="text-danger"></span> | |||
| </div> | |||
| <div class="form-group"> | |||
| <div class="checkbox"> | |||
| <label asp-for="Input.RememberMe"> | |||
| <input asp-for="Input.RememberMe"/> | |||
| @Html.DisplayNameFor(m => m.Input.RememberMe) | |||
| </label> | |||
| </div> | |||
| </div> | |||
| <div class="form-group"> | |||
| <button type="submit" class="btn btn-primary">Log in</button> | |||
| </div> | |||
| <div class="form-group"> | |||
| <p> | |||
| <a id="forgot-password" asp-page="./ForgotPassword">Forgot your password?</a> | |||
| </p> | |||
| <p> | |||
| <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a> | |||
| </p> | |||
| <p> | |||
| <a id="resend-confirmation" asp-page="./ResendEmailConfirmation">Resend email confirmation</a> | |||
| </p> | |||
| </div> | |||
| </form> | |||
| </section> | |||
| </div> | |||
| <div class="col-md-6 col-md-offset-2"> | |||
| <section> | |||
| <h4>Use another service to log in.</h4> | |||
| <hr/> | |||
| @{ | |||
| if ((Model.ExternalLogins?.Count ?? 0) == 0) | |||
| { | |||
| <div> | |||
| <p> | |||
| There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a> | |||
| for details on setting up this ASP.NET application to support logging in via external services. | |||
| </p> | |||
| </div> | |||
| } | |||
| else | |||
| { | |||
| <form id="external-account" asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal"> | |||
| <div> | |||
| <p> | |||
| @foreach (var provider in Model.ExternalLogins) | |||
| { | |||
| <button type="submit" class="btn btn-primary" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button> | |||
| } | |||
| </p> | |||
| </div> | |||
| </form> | |||
| } | |||
| } | |||
| </section> | |||
| </div> | |||
| </div> | |||
| @section Scripts { | |||
| <partial name="_ValidationScriptsPartial"/> | |||
| } | |||
| @@ -1,91 +0,0 @@ | |||
| using System.ComponentModel.DataAnnotations; | |||
| using Microsoft.AspNetCore.Authentication; | |||
| using Microsoft.AspNetCore.Authorization; | |||
| using Microsoft.AspNetCore.Identity; | |||
| using Microsoft.AspNetCore.Mvc; | |||
| using Microsoft.AspNetCore.Mvc.RazorPages; | |||
| namespace SecureSharing.Areas.Identity.Pages.Account; | |||
| [AllowAnonymous] | |||
| public sealed class LoginModel : PageModel | |||
| { | |||
| private readonly ILogger<LoginModel> _logger; | |||
| private readonly SignInManager<IdentityUser> _signInManager; | |||
| private readonly UserManager<IdentityUser> _userManager; | |||
| public LoginModel(SignInManager<IdentityUser> signInManager, | |||
| ILogger<LoginModel> logger, | |||
| UserManager<IdentityUser> userManager) | |||
| { | |||
| _userManager = userManager; | |||
| _signInManager = signInManager; | |||
| _logger = logger; | |||
| } | |||
| [BindProperty] public InputModel Input { get; set; } | |||
| public IList<AuthenticationScheme> ExternalLogins { get; set; } | |||
| public string ReturnUrl { get; set; } | |||
| [TempData] public string ErrorMessage { get; set; } | |||
| public async Task OnGetAsync(string returnUrl = null) | |||
| { | |||
| if (!string.IsNullOrEmpty(ErrorMessage)) ModelState.AddModelError(string.Empty, ErrorMessage); | |||
| returnUrl ??= Url.Content("~/"); | |||
| // Clear the existing external cookie to ensure a clean login process | |||
| await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme); | |||
| ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); | |||
| ReturnUrl = returnUrl; | |||
| } | |||
| public async Task<IActionResult> OnPostAsync(string returnUrl = null) | |||
| { | |||
| returnUrl ??= Url.Content("~/"); | |||
| ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); | |||
| if (ModelState.IsValid) | |||
| { | |||
| // This doesn't count login failures towards account lockout | |||
| // To enable password failures to trigger account lockout, set lockoutOnFailure: true | |||
| var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, false); | |||
| if (result.Succeeded) | |||
| { | |||
| _logger.LogInformation("User logged in."); | |||
| return LocalRedirect(returnUrl); | |||
| } | |||
| if (result.RequiresTwoFactor) | |||
| return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, Input.RememberMe }); | |||
| if (result.IsLockedOut) | |||
| { | |||
| _logger.LogWarning("User account locked out."); | |||
| return RedirectToPage("./Lockout"); | |||
| } | |||
| ModelState.AddModelError(string.Empty, "Invalid login attempt."); | |||
| return Page(); | |||
| } | |||
| // If we got this far, something failed, redisplay form | |||
| return Page(); | |||
| } | |||
| public sealed class InputModel | |||
| { | |||
| [Required] [EmailAddress] public string Email { get; set; } | |||
| [Required] | |||
| [DataType(DataType.Password)] | |||
| public string Password { get; set; } | |||
| [Display(Name = "Remember me?")] public bool RememberMe { get; set; } | |||
| } | |||
| } | |||
| @@ -1,67 +0,0 @@ | |||
| @page | |||
| @model RegisterModel | |||
| @{ | |||
| ViewData["Title"] = "Register"; | |||
| } | |||
| <h1>@ViewData["Title"]</h1> | |||
| <div class="row"> | |||
| <div class="col-md-4"> | |||
| <form asp-route-returnUrl="@Model.ReturnUrl" method="post"> | |||
| <h4>Create a new account.</h4> | |||
| <hr/> | |||
| <div asp-validation-summary="All" class="text-danger"></div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.Email"></label> | |||
| <input asp-for="Input.Email" class="form-control"/> | |||
| <span asp-validation-for="Input.Email" class="text-danger"></span> | |||
| </div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.Password"></label> | |||
| <input asp-for="Input.Password" class="form-control"/> | |||
| <span asp-validation-for="Input.Password" class="text-danger"></span> | |||
| </div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.ConfirmPassword"></label> | |||
| <input asp-for="Input.ConfirmPassword" class="form-control"/> | |||
| <span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span> | |||
| </div> | |||
| <button type="submit" class="btn btn-primary">Register</button> | |||
| </form> | |||
| </div> | |||
| <div class="col-md-6 col-md-offset-2"> | |||
| <section> | |||
| <h4>Use another service to register.</h4> | |||
| <hr/> | |||
| @{ | |||
| if ((Model.ExternalLogins?.Count ?? 0) == 0) | |||
| { | |||
| <div> | |||
| <p> | |||
| There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a> | |||
| for details on setting up this ASP.NET application to support logging in via external services. | |||
| </p> | |||
| </div> | |||
| } | |||
| else | |||
| { | |||
| <form id="external-account" asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal"> | |||
| <div> | |||
| <p> | |||
| @foreach (var provider in Model.ExternalLogins) | |||
| { | |||
| <button type="submit" class="btn btn-primary" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button> | |||
| } | |||
| </p> | |||
| </div> | |||
| </form> | |||
| } | |||
| } | |||
| </section> | |||
| </div> | |||
| </div> | |||
| @section Scripts { | |||
| <partial name="_ValidationScriptsPartial"/> | |||
| } | |||
| @@ -1,102 +0,0 @@ | |||
| using System.ComponentModel.DataAnnotations; | |||
| using System.Text; | |||
| using System.Text.Encodings.Web; | |||
| using Microsoft.AspNetCore.Authentication; | |||
| using Microsoft.AspNetCore.Authorization; | |||
| using Microsoft.AspNetCore.Identity; | |||
| using Microsoft.AspNetCore.Identity.UI.Services; | |||
| using Microsoft.AspNetCore.Mvc; | |||
| using Microsoft.AspNetCore.Mvc.RazorPages; | |||
| using Microsoft.AspNetCore.WebUtilities; | |||
| namespace SecureSharing.Areas.Identity.Pages.Account; | |||
| [AllowAnonymous] | |||
| public sealed class RegisterModel : PageModel | |||
| { | |||
| private readonly IEmailSender _emailSender; | |||
| private readonly ILogger<RegisterModel> _logger; | |||
| private readonly SignInManager<IdentityUser> _signInManager; | |||
| private readonly UserManager<IdentityUser> _userManager; | |||
| public RegisterModel( | |||
| UserManager<IdentityUser> userManager, | |||
| SignInManager<IdentityUser> signInManager, | |||
| ILogger<RegisterModel> logger, | |||
| IEmailSender emailSender) | |||
| { | |||
| _userManager = userManager; | |||
| _signInManager = signInManager; | |||
| _logger = logger; | |||
| _emailSender = emailSender; | |||
| } | |||
| [BindProperty] public InputModel Input { get; set; } | |||
| public string ReturnUrl { get; set; } | |||
| public IList<AuthenticationScheme> ExternalLogins { get; set; } | |||
| public async Task OnGetAsync(string returnUrl = null) | |||
| { | |||
| ReturnUrl = returnUrl; | |||
| ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); | |||
| } | |||
| public async Task<IActionResult> OnPostAsync(string returnUrl = null) | |||
| { | |||
| returnUrl ??= Url.Content("~/"); | |||
| ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList(); | |||
| if (ModelState.IsValid) | |||
| { | |||
| var user = new IdentityUser { UserName = Input.Email, Email = Input.Email }; | |||
| var result = await _userManager.CreateAsync(user, Input.Password); | |||
| if (result.Succeeded) | |||
| { | |||
| _logger.LogInformation("User created a new account with password."); | |||
| var code = await _userManager.GenerateEmailConfirmationTokenAsync(user); | |||
| code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); | |||
| var callbackUrl = Url.Page( | |||
| "/Account/ConfirmEmail", | |||
| null, | |||
| new { area = "Identity", userId = user.Id, code, returnUrl }, | |||
| Request.Scheme); | |||
| await _emailSender.SendEmailAsync(Input.Email, "Confirm your email", | |||
| $"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>."); | |||
| if (_userManager.Options.SignIn.RequireConfirmedAccount) | |||
| return RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl }); | |||
| await _signInManager.SignInAsync(user, false); | |||
| return LocalRedirect(returnUrl); | |||
| } | |||
| foreach (var error in result.Errors) ModelState.AddModelError(string.Empty, error.Description); | |||
| } | |||
| // If we got this far, something failed, redisplay form | |||
| return Page(); | |||
| } | |||
| public sealed class InputModel | |||
| { | |||
| [Required] | |||
| [EmailAddress] | |||
| [Display(Name = "Email")] | |||
| public string Email { get; set; } | |||
| [Required] | |||
| [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", | |||
| MinimumLength = 6)] | |||
| [DataType(DataType.Password)] | |||
| [Display(Name = "Password")] | |||
| public string Password { get; set; } | |||
| [DataType(DataType.Password)] | |||
| [Display(Name = "Confirm password")] | |||
| [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] | |||
| public string ConfirmPassword { get; set; } | |||
| } | |||
| } | |||
| @@ -1,37 +0,0 @@ | |||
| @page | |||
| @model ResetPasswordModel | |||
| @{ | |||
| ViewData["Title"] = "Reset password"; | |||
| } | |||
| <h1>@ViewData["Title"]</h1> | |||
| <h4>Reset your password.</h4> | |||
| <hr/> | |||
| <div class="row"> | |||
| <div class="col-md-4"> | |||
| <form method="post"> | |||
| <div asp-validation-summary="ModelOnly" class="text-danger"></div> | |||
| <input asp-for="Input.Code" type="hidden"/> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.Email"></label> | |||
| <input asp-for="Input.Email" class="form-control"/> | |||
| <span asp-validation-for="Input.Email" class="text-danger"></span> | |||
| </div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.Password"></label> | |||
| <input asp-for="Input.Password" class="form-control"/> | |||
| <span asp-validation-for="Input.Password" class="text-danger"></span> | |||
| </div> | |||
| <div class="form-group"> | |||
| <label asp-for="Input.ConfirmPassword"></label> | |||
| <input asp-for="Input.ConfirmPassword" class="form-control"/> | |||
| <span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span> | |||
| </div> | |||
| <button type="submit" class="btn btn-primary">Reset</button> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| @section Scripts { | |||
| <partial name="_ValidationScriptsPartial"/> | |||
| } | |||
| @@ -1,65 +0,0 @@ | |||
| using System.ComponentModel.DataAnnotations; | |||
| using Microsoft.AspNetCore.Authorization; | |||
| using Microsoft.AspNetCore.Identity; | |||
| using Microsoft.AspNetCore.Mvc; | |||
| using Microsoft.AspNetCore.Mvc.RazorPages; | |||
| namespace SecureSharing.Areas.Identity.Pages.Account; | |||
| [AllowAnonymous] | |||
| public sealed class ResetPasswordModel : PageModel | |||
| { | |||
| private readonly UserManager<IdentityUser> _userManager; | |||
| public ResetPasswordModel(UserManager<IdentityUser> userManager) | |||
| { | |||
| _userManager = userManager; | |||
| } | |||
| [BindProperty] public InputModel Input { get; set; } | |||
| public IActionResult OnGet(string code = null) | |||
| { | |||
| if (code is null) return BadRequest("A code must be supplied for password reset."); | |||
| Input = new InputModel | |||
| { | |||
| Code = code | |||
| }; | |||
| return Page(); | |||
| } | |||
| public async Task<IActionResult> OnPostAsync() | |||
| { | |||
| if (!ModelState.IsValid) return Page(); | |||
| var user = await _userManager.FindByEmailAsync(Input.Email); | |||
| if (user is null) | |||
| // Don't reveal that the user does not exist | |||
| return RedirectToPage("./ResetPasswordConfirmation"); | |||
| var result = await _userManager.ResetPasswordAsync(user, Input.Code, Input.Password); | |||
| if (result.Succeeded) return RedirectToPage("./ResetPasswordConfirmation"); | |||
| foreach (var error in result.Errors) ModelState.AddModelError(string.Empty, error.Description); | |||
| return Page(); | |||
| } | |||
| public sealed class InputModel | |||
| { | |||
| [Required] [EmailAddress] public string Email { get; set; } | |||
| [Required] | |||
| [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", | |||
| MinimumLength = 6)] | |||
| [DataType(DataType.Password)] | |||
| public string Password { get; set; } | |||
| [DataType(DataType.Password)] | |||
| [Display(Name = "Confirm password")] | |||
| [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] | |||
| public string ConfirmPassword { get; set; } | |||
| public string Code { get; set; } | |||
| } | |||
| } | |||
| @@ -1 +0,0 @@ | |||
| @using SecureSharing.Areas.Identity.Pages.Account | |||
| @@ -1,18 +0,0 @@ | |||
| <environment include="Development"> | |||
| <script src="~/Identity/lib/jquery-validation/dist/jquery.validate.js"></script> | |||
| <script src="~/Identity/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script> | |||
| </environment> | |||
| <environment exclude="Development"> | |||
| <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js" | |||
| asp-fallback-src="~/Identity/lib/jquery-validation/dist/jquery.validate.min.js" | |||
| asp-fallback-test="window.jQuery && window.jQuery.validator" | |||
| crossorigin="anonymous" | |||
| integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp"> | |||
| </script> | |||
| <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.9/jquery.validate.unobtrusive.min.js" | |||
| asp-fallback-src="~/Identity/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js" | |||
| asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive" | |||
| crossorigin="anonymous" | |||
| integrity="sha384-ifv0TYDWxBHzvAk2Z0n8R434FL1Rlv/Av18DXE43N/1rvHyOG4izKst0f2iSLdds"> | |||
| </script> | |||
| </environment> | |||
| @@ -1,4 +0,0 @@ | |||
| @using Microsoft.AspNetCore.Identity | |||
| @using SecureSharing.Areas.Identity | |||
| @using SecureSharing.Areas.Identity.Pages | |||
| @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers | |||
| @@ -1,3 +0,0 @@ | |||
| @{ | |||
| Layout = "/Views/Shared/_Layout.cshtml"; | |||
| } | |||
| @@ -20,7 +20,7 @@ | |||
| "commandName": "Project", | |||
| "dotnetRunMessages": "true", | |||
| "launchBrowser": true, | |||
| "applicationUrl": "https://localhost:5001;http://localhost:5000", | |||
| "applicationUrl": "https://localhost:44336;http://localhost:5000", | |||
| "environmentVariables": { | |||
| "ASPNETCORE_ENVIRONMENT": "Development", | |||
| "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" | |||
| @@ -35,4 +35,15 @@ | |||
| <Folder Include="AppData\Errors\" /> | |||
| </ItemGroup> | |||
| <ItemGroup> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\Account\Login.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\Account\LoginTestbe.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\Account\Register.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\Account\ResetPassword.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\Account\_ViewImports.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ValidationScriptsPartial.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ViewImports.cshtml" /> | |||
| <_ContentIncludedByDefault Remove="Areas\Identity\Pages\_ViewStart.cshtml" /> | |||
| </ItemGroup> | |||
| </Project> | |||
| @@ -4,27 +4,41 @@ | |||
| @using SecureSharing.Business.Infrastructure | |||
| @model MessageModel | |||
| <div class="text-center"> | |||
| <form method="post" asp-controller="Home" asp-action="CreateMessage"> | |||
| <input asp-for="Text"/> | |||
| <div class="modal-content modal"> | |||
| <div class="share-files"> | |||
| <div class="image-logo"> | |||
| <img src="img/logo.png" alt=""/> | |||
| </div> | |||
| <h1>Share files</h1> | |||
| <form method="post" asp-controller="Home" asp-action="CreateMessage" class="share-files-form"> | |||
| <label class="label-text">Sharing link avaliability</label> | |||
| <div class="button-box col-lg-12"> | |||
| <div class="single-button-input"> | |||
| <input id="OneTime" class="radio-input" type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_TIME"> | |||
| <label for="OneTime" class="label-available">One Time</label> | |||
| </input> | |||
| </div> | |||
| <div class="single-button-input"> | |||
| <input id="OneHour" class="radio-input" type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_HOUR"/> <label for="OneHour" class="label-available">1 hour</label> | |||
| </div> | |||
| <div class="single-button-input"> | |||
| <input id="OneDay" class="radio-input" type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_DAY"/> <label for="OneDay" class="label-available">1 day</label> | |||
| </div> | |||
| <div class="single-button-input"> | |||
| <input id="SevenDays" class="radio-input" type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_WEEK"/> <label for="SevenDays" class="label-available">7 days</label> | |||
| </div> | |||
| </div> | |||
| <label class="label-text">Message (optional)</label> | |||
| <textarea asp-for="Text" class="input-message"></textarea> | |||
| <label class="label-text">Upload files</label> | |||
| <div class="drop-here"> | |||
| <div class="default-text"> | |||
| <img src="img/file-upload-image.png" alt=""/> | |||
| <p>Drag and drop files here or <span style="color: dodgerblue">browse</span></p> | |||
| </div> | |||
| </div> | |||
| <button class=" btn btn-light share-button" type="submit">Share</button> | |||
| </form> | |||
| <br> | |||
| <input type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_TIME"/> ONE TIME | |||
| <br> | |||
| <input type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_HOUR"/> ONE HOUR | |||
| <br> | |||
| <input type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_DAY"/> ONE DAY | |||
| <br> | |||
| <input type="radio" asp-for="ChosenPeriod" value="@PeriodOfValidity.ONE_WEEK"/> SEVEN DAYS | |||
| <br> | |||
| <button class=" btn btn-light" type="submit">Send</button> | |||
| </form> | |||
| <br> | |||
| </div> | |||
| </div> | |||
| @@ -4,7 +4,6 @@ | |||
| @model LinkModel | |||
| <div class="text-center"> | |||
| @if (!Model.IsValid) | |||
| { | |||
| <p>This link has expired</p> | |||
| @@ -36,8 +35,6 @@ | |||
| } | |||
| </div> | |||
| } | |||
| <div> | |||
| Message: @Model.message.Text | |||
| </div> | |||
| @@ -28,11 +28,8 @@ | |||
| <link rel="stylesheet" href="~/plugins/daterangepicker/daterangepicker.css"> | |||
| <!-- summernote --> | |||
| <link rel="stylesheet" href="~/plugins/summernote/summernote-bs4.min.css"> | |||
| <link href="~/lib/jquery-confirm/jquery-confirm.min.css" rel="stylesheet"/> | |||
| <link rel="stylesheet" href="~/css/site.css"> | |||
| </head> | |||
| <body class="hold-transition layout-fixed"> | |||
| @@ -40,30 +37,8 @@ | |||
| <p>Your browser does not support JavaScript. You need it enabled to do testing.</p> | |||
| </noscript> | |||
| <div class="wrapper"> | |||
| @RenderBody() | |||
| <div class="content-wrapper default-layout"> | |||
| <section class="content"> | |||
| <main role="main" class="pb-3"> | |||
| <div class="content-fluid"> | |||
| <div> </div> | |||
| <div class="card"> | |||
| <div class="card-body"> | |||
| @RenderBody() | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </main> | |||
| </section> | |||
| </div> | |||
| <footer class="main-footer ml-0"> | |||
| <strong>Copyright © 2021 <a href="https://dilig.net/">Diligent Software</a>.</strong> | |||
| All rights reserved. | |||
| <div class="float-right d-none d-sm-inline-block"> | |||
| <b>Version</b> 1.0.0-alpha | |||
| </div> | |||
| </footer> | |||
| </div> | |||
| <!-- jQuery --> | |||
| <script src="~/plugins/jquery/jquery.min.js"></script> | |||
| <!-- jQuery UI 1.11.4 --> | |||
| @@ -101,10 +76,17 @@ | |||
| <script src="~/lib/alertifyjs/alertify.min.js"></script> | |||
| <script src="~/lib/blockUI/jquery.blockUI.js"></script> | |||
| <script src="~/js/site.js" asp-append-version="true"></script> | |||
| @await RenderSectionAsync("Scripts", false) | |||
| </body> | |||
| @* *@ | |||
| @* <footer class="main-footer ml-0 footer"> *@ | |||
| @* <strong>Copyright © @DateTime.Now.Year <a href="https://dilig.net/">Diligent Software</a>.</strong> *@ | |||
| @* All rights reserved. *@ | |||
| @* <div class="float-right d-none d-sm-inline-block"> *@ | |||
| @* <b>Version</b> 1.0.0-alpha *@ | |||
| @* </div> *@ | |||
| @* </footer> *@ | |||
| </html> | |||
| @@ -1,6 +1,6 @@ | |||
| { | |||
| "version": 2, | |||
| "dgSpecHash": "adKPXrIJhbnKPr7vG5AIpNksfnOS2+IaKLAekWC9oodhh4hpQFsvvqpp8XJLKbqj4sypMHdwYqk11uEZ6q6Odg==", | |||
| "dgSpecHash": "Sm0OUd2oFeRQfP2x9Hc316VrFwOciAM1sd50sI0THzjwNojg57Kg5f6UuNyby8YR0g6WtFdJlVtr9+uxdyhJBw==", | |||
| "success": true, | |||
| "projectFilePath": "D:\\secure-sharing\\SecureSharing\\SecureSharing.csproj", | |||
| "expectedPackageFiles": [ | |||
| @@ -42,4 +42,160 @@ | |||
| .wrong.answered { | |||
| background-color: rgb(247, 247, 247); | |||
| border-color: rgb(255, 0, 0); | |||
| } | |||
| body{ | |||
| background: url('../img/gradient.png') no-repeat center center fixed; | |||
| -webkit-background-size: cover; | |||
| -moz-background-size: cover; | |||
| -o-background-size: cover; | |||
| background-size: cover; | |||
| size: 16px; | |||
| font-weight: bold; | |||
| } | |||
| .image-logo { | |||
| margin-top: 0; | |||
| margin-bottom: 25px; | |||
| align-items: center; | |||
| justify-content: center; | |||
| display: flex; | |||
| } | |||
| .modal { | |||
| display: flex; | |||
| flex-direction: column; | |||
| /*justify-content: center;*/ | |||
| /*align-items: center;*/ | |||
| padding: 32px; | |||
| gap: 24px; | |||
| position: absolute; | |||
| width: 600px; | |||
| height: 800px; | |||
| left: calc(50vw - 300px); | |||
| top: calc(50vh - 400px); | |||
| overflow-y: auto; | |||
| scrollbar-width: thin; | |||
| scrollbar-color: #ddd; | |||
| background-color: #FFFFFF; | |||
| color: #0D1C52; | |||
| box-shadow: 0 44px 64px rgba(69, 25, 160, 0.1); | |||
| border-radius: 32px; | |||
| } | |||
| .modal::-webkit-scrollbar { | |||
| width: 5px; | |||
| } | |||
| .modal::-webkit-scrollbar-track { | |||
| background: #ddd; | |||
| } | |||
| .modal::-webkit-scrollbar-thumb { | |||
| background: #777; | |||
| } | |||
| .share-files { | |||
| text-align: left !important; | |||
| align-items: initial; | |||
| color: #0D1C52; | |||
| width: 100%; | |||
| } | |||
| .share-files-form { | |||
| color: #0D1C52; | |||
| width: 100%; | |||
| } | |||
| .button-box { | |||
| text-align:center; | |||
| margin-top:10px; | |||
| margin-bottom: 15px; | |||
| display: flex; | |||
| flex-direction: row; | |||
| justify-content: space-between; | |||
| gap: 8px; | |||
| padding: 0; | |||
| } | |||
| .single-button-input { | |||
| flex: 1; | |||
| } | |||
| .radio-input { | |||
| display: none; | |||
| color: #B9CFE4; | |||
| } | |||
| .label-available { | |||
| cursor: pointer; | |||
| border: 1px solid #0D1C52; | |||
| border-radius: 5px; | |||
| width: 100%; | |||
| height: 55px; | |||
| padding-top: 15px; | |||
| } | |||
| .label-text { | |||
| font-size: 23px; | |||
| } | |||
| .radio-input:checked ~ .label-available { | |||
| background-color: #FFA463 !important; | |||
| } | |||
| .share-button { | |||
| /* Auto layout */ | |||
| display: flex; | |||
| flex-direction: row; | |||
| justify-content: center; | |||
| align-items: center; | |||
| padding: 32px; | |||
| gap: 10px; | |||
| width: 100%; | |||
| height: 94px; | |||
| margin-top: 14px; | |||
| background: #90278F; | |||
| border-radius: 30px; | |||
| /* Inside auto layout */ | |||
| flex: none; | |||
| order: 2; | |||
| align-self: stretch; | |||
| flex-grow: 0; | |||
| color: #FFFFFF; | |||
| font-size: 40px; | |||
| } | |||
| .input-message { | |||
| box-sizing: border-box; | |||
| width: 100%; | |||
| height: 90px; | |||
| /* white */ | |||
| background: #FFFFFF; | |||
| border: 1px solid #8F9DCE; | |||
| border-radius: 4px; | |||
| } | |||
| .drop-here { | |||
| box-sizing: border-box; | |||
| width: 100%; | |||
| height: 90px; | |||
| /* white */ | |||
| background: #FFFFFF; | |||
| border: 1px dashed #8F9DCE; | |||
| border-radius: 4px; | |||
| display: inline-block; /* [4] */ | |||
| vertical-align: middle; | |||
| text-align: center; | |||
| } | |||
| .default-text { | |||
| margin-top: 15px; | |||
| height: 100%; | |||
| /*text-align: center;*/ | |||
| } | |||