mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
Added initial portion of Recovery Email option.
This commit is contained in:
parent
1f485c0aee
commit
1821cf75ad
@ -19,6 +19,7 @@ using Teknik.ViewModels;
|
||||
using System.Windows;
|
||||
using System.Net;
|
||||
using Teknik.Areas.Users.Utility;
|
||||
using Teknik.Helpers;
|
||||
using Teknik.Filters;
|
||||
|
||||
namespace Teknik.Areas.Users.Controllers
|
||||
@ -237,12 +238,28 @@ namespace Teknik.Areas.Users.Controllers
|
||||
return Json(new { error = "Passwords must match" });
|
||||
}
|
||||
|
||||
// PGP Key valid?
|
||||
if (!string.IsNullOrEmpty(model.PublicKey) && !PGP.IsPublicKey(model.PublicKey))
|
||||
{
|
||||
return Json(new { error = "Invalid PGP Public Key" });
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
User newUser = db.Users.Create();
|
||||
newUser.JoinDate = DateTime.Now;
|
||||
newUser.Username = model.Username;
|
||||
if (!string.IsNullOrEmpty(model.RecoveryEmail))
|
||||
{
|
||||
string recoveryCode = Teknik.Utility.RandomString(24);
|
||||
string resetUrl = Url.SubRouteUrl("user", "User.ResetPassword", new { Username = model.Username });
|
||||
string verifyUrl = Url.SubRouteUrl("user", "User.VerifyRecoveryEmail", new { Username = model.Username, Code = recoveryCode });
|
||||
//UserHelper.SendRecoveryEmailVerification(Config, model.Username, model.RecoveryEmail, resetUrl, verifyUrl); Not yet :)
|
||||
//newUser.RecoveryEmail = model.RecoveryEmail;
|
||||
}
|
||||
newUser.UserSettings = new UserSettings();
|
||||
if (!string.IsNullOrEmpty(model.PublicKey))
|
||||
newUser.UserSettings.PGPSignature = model.PublicKey;
|
||||
newUser.BlogSettings = new BlogSettings();
|
||||
newUser.UploadSettings = new UploadSettings();
|
||||
|
||||
|
@ -14,6 +14,12 @@ namespace Teknik.Areas.Users.Models
|
||||
|
||||
public string HashedPassword { get; set; }
|
||||
|
||||
public string RecoveryEmail { get; set; }
|
||||
|
||||
public string RecoveryVerifyCode { get; set; }
|
||||
|
||||
public bool RecoveryVerified { get; set; }
|
||||
|
||||
public bool TransferAccount { get; set; }
|
||||
|
||||
public DateTime JoinDate { get; set; }
|
||||
@ -34,8 +40,11 @@ namespace Teknik.Areas.Users.Models
|
||||
|
||||
public User()
|
||||
{
|
||||
Username = String.Empty;
|
||||
HashedPassword = String.Empty;
|
||||
Username = string.Empty;
|
||||
HashedPassword = string.Empty;
|
||||
RecoveryEmail = string.Empty;
|
||||
RecoveryVerifyCode = string.Empty;
|
||||
RecoveryVerified = false;
|
||||
JoinDate = DateTime.Now;
|
||||
LastSeen = DateTime.Now;
|
||||
Groups = new List<Group>();
|
||||
|
@ -50,6 +50,22 @@ namespace Teknik.Areas.Users
|
||||
new { controller = "User", action = "Settings" }, // Parameter defaults
|
||||
new[] { typeof(Controllers.UserController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"User.ResetPassword", // Route name
|
||||
new List<string>() { "user" }, // Subdomains
|
||||
new List<string>() { config.Host }, // domains
|
||||
"Reset/{username}", // URL with parameters
|
||||
new { controller = "User", action = "ResetPassword", username = UrlParameter.Optional }, // Parameter defaults
|
||||
new[] { typeof(Controllers.UserController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"User.VerifyRecoveryEmail", // Route name
|
||||
new List<string>() { "user" }, // Subdomains
|
||||
new List<string>() { config.Host }, // domains
|
||||
"VerifyEmail/{username}/{code}", // URL with parameters
|
||||
new { controller = "User", action = "VerifyRecoveryEmail" }, // Parameter defaults
|
||||
new[] { typeof(Controllers.UserController).Namespace }
|
||||
);
|
||||
context.MapSubdomainRoute(
|
||||
"User.Index", // Route name
|
||||
new List<string>() { "user" }, // Subdomains
|
||||
|
@ -4,6 +4,7 @@ using System.Data.Entity;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Mail;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
@ -321,6 +322,36 @@ namespace Teknik.Areas.Users.Utility
|
||||
throw new Exception("Unable to delete user.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SendRecoveryEmailVerification(Config config, string username, string email, string resetUrl, string verifyUrl)
|
||||
{
|
||||
SmtpClient client = new SmtpClient();
|
||||
client.Host = config.ContactConfig.Host;
|
||||
client.Port = config.ContactConfig.Port;
|
||||
client.EnableSsl = config.ContactConfig.SSL;
|
||||
client.DeliveryMethod = SmtpDeliveryMethod.Network;
|
||||
client.UseDefaultCredentials = true;
|
||||
client.Credentials = new NetworkCredential(config.NoReplyEmail, config.ContactConfig.Password);
|
||||
client.Timeout = 5000;
|
||||
|
||||
MailMessage mail = new MailMessage(config.NoReplyEmail, email);
|
||||
mail.Subject = "Recovery Email Validation";
|
||||
mail.Body = string.Format(@"Thank you {0} for signing up for Teknik!
|
||||
|
||||
You are recieving this email because you have specified this email address as your recovery email. In the event that you forget your password, you can visit {1} and request a temporary password reset key be sent to this email. You will then be able to reset and choose a new password.
|
||||
|
||||
In order to verify that you own this email, please click the following link or paste it into your browser: {2}
|
||||
|
||||
If you recieved this email and you did not sign up for an account, please email us at {3} and ignore the verification link.
|
||||
|
||||
Thank you and enjoy!
|
||||
|
||||
- Teknik Administration", username, resetUrl, verifyUrl, config.SupportEmail);
|
||||
mail.BodyEncoding = UTF8Encoding.UTF8;
|
||||
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.Never;
|
||||
|
||||
client.Send(mail);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Email Management
|
||||
|
@ -23,6 +23,12 @@ namespace Teknik.Areas.Users.ViewModels
|
||||
[DataType(DataType.Password)]
|
||||
public string ConfirmPassword { get; set; }
|
||||
|
||||
[Display(Name = "Recovery Email")]
|
||||
public string RecoveryEmail { get; set; }
|
||||
|
||||
[Display(Name = "Public PGP Key")]
|
||||
public string PublicKey { get; set; }
|
||||
|
||||
public string ReturnUrl { get; set; }
|
||||
}
|
||||
}
|
@ -18,6 +18,12 @@
|
||||
<div class="form-group">
|
||||
<input type="password" class="form-control" id="registerConfirmPassword" value="" placeholder="Confirm Password" name="Register.ConfirmPassword" data-val-required="The Confirm Password field is required." data-val="true" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="text" class="form-control" id="registerRecoveryEmail" value="" placeholder="Recovery Email (Optional)" name="Register.RecoveryEmail" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<textarea class="form-control" id="registerPublicKey" name="Register.PublicKey" placeholder="PGP Public Key (Optional)" title="enter your pgp public key" rows="5"></textarea>
|
||||
</div>
|
||||
<p class="text-center">
|
||||
<small>
|
||||
Username must meet the following requirements: <var>@Model.Config.UserConfig.UsernameFilterLabel</var><br />
|
||||
|
@ -48,7 +48,7 @@
|
||||
</div>
|
||||
<div class="col-sm-8">
|
||||
<label for="update_pgp_public_key"><h4>Public Key</h4></label>
|
||||
<textarea class="form-control" id="update_pgp_public_key" name="update_pgp_public_key" placeholder="Public Key Here" title="enter your blog's description" rows="10">@Model.UserSettings.PGPSignature</textarea>
|
||||
<textarea class="form-control" id="update_pgp_public_key" name="update_pgp_public_key" placeholder="Public Key Here" title="enter your pgp public key" rows="10">@Model.UserSettings.PGPSignature</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
@ -19,6 +19,7 @@ namespace Teknik.Configuration
|
||||
private string _Author;
|
||||
private string _Host;
|
||||
private string _SupportEmail;
|
||||
private string _NoReplyEmail;
|
||||
private string _BitcoinAddress;
|
||||
private string _Salt1;
|
||||
private string _Salt2;
|
||||
@ -46,6 +47,7 @@ namespace Teknik.Configuration
|
||||
public string Author { get { return _Author; } set { _Author = value; } }
|
||||
public string Host { get { return _Host; } set { _Host = value; } }
|
||||
public string SupportEmail { get { return _SupportEmail; } set { _SupportEmail = value; } }
|
||||
public string NoReplyEmail { get { return _NoReplyEmail; } set { _NoReplyEmail = value; } }
|
||||
public string BitcoinAddress { get { return _BitcoinAddress; } set { _BitcoinAddress = value; } }
|
||||
public string Salt1 { get { return _Salt1; } set { _Salt1 = value; } }
|
||||
public string Salt2 { get { return _Salt2; } set { _Salt2 = value; } }
|
||||
@ -111,6 +113,7 @@ namespace Teknik.Configuration
|
||||
Author = string.Empty;
|
||||
Host = string.Empty;
|
||||
SupportEmail = string.Empty;
|
||||
NoReplyEmail = string.Empty;
|
||||
BitcoinAddress = string.Empty;
|
||||
Salt1 = string.Empty;
|
||||
Salt2 = string.Empty;
|
||||
|
Loading…
Reference in New Issue
Block a user