diff --git a/Teknik/Areas/User/Controllers/UserController.cs b/Teknik/Areas/User/Controllers/UserController.cs index 0cccf34..100c68b 100644 --- a/Teknik/Areas/User/Controllers/UserController.cs +++ b/Teknik/Areas/User/Controllers/UserController.cs @@ -100,6 +100,7 @@ namespace Teknik.Areas.Users.Controllers model.UserID = user.UserId; model.Username = user.Username; model.TrustedDeviceCount = user.TrustedDevices.Count; + model.AuthTokens = user.AuthTokens.ToList(); model.UserSettings = user.UserSettings; model.SecuritySettings = user.SecuritySettings; @@ -777,5 +778,38 @@ namespace Teknik.Areas.Users.Controllers return Json(new { error = ex.GetFullMessage(true) }); } } + + [HttpPost] + [ValidateAntiForgeryToken] + public ActionResult GenerateToken(string name) + { + try + { + User user = UserHelper.GetUser(db, User.Identity.Name); + if (user != null) + { + string newTokenStr = UserHelper.GenerateAuthToken(Config, user.Username); + + if (!string.IsNullOrEmpty(newTokenStr)) + { + AuthToken token = db.AuthTokens.Create(); + token.UserId = user.UserId; + token.HashedToken = SHA256.Hash(newTokenStr); + token.Name = name; + token.LastDateUsed = DateTime.Now; + + db.AuthTokens.Add(token); + db.SaveChanges(); + return Json(new { result = newTokenStr }); + } + return Json(new { error = "Unable to generate Auth Token" }); + } + return Json(new { error = "User does not exist" }); + } + catch (Exception ex) + { + return Json(new { error = ex.GetFullMessage(true) }); + } + } } } \ No newline at end of file diff --git a/Teknik/Areas/User/Scripts/User.js b/Teknik/Areas/User/Scripts/User.js index a5d15bc..df3aeb2 100644 --- a/Teknik/Areas/User/Scripts/User.js +++ b/Teknik/Areas/User/Scripts/User.js @@ -92,6 +92,68 @@ }); }); + $('#generate_token').click(function () { + bootbox.prompt("Specify a name for this Auth Token", function (result) { + if (result) { + $.ajax({ + type: "POST", + url: generateTokenURL, + data: AddAntiForgeryToken({ name: result }), + success: function (response) { + if (response.result) { + bootbox.dialog({ + title: "Authentication Token", + message: '', + callback: function () { + window.location.reload(); + } + }); + } + else { + errorMsg = response; + if (response.error) { + errorMsg = response.error; + if (response.error.message) { + errorMsg = response.error.message; + } + } + $("#top_msg").css('display', 'inline', 'important'); + $("#top_msg").html('
' + errorMsg + '
'); + } + } + }); + } + }); + }); + + $('#revoke_all_tokens').click(function () { + bootbox.confirm("Are you sure you want to revoke all your auth tokens?

This is irreversable and all applications using a token will stop working.", function (result) { + if (result) { + $.ajax({ + type: "POST", + url: revokeAllTokensURL, + data: AddAntiForgeryToken({}), + success: function (response) { + if (response.result) { + window.location.reload(); + } + else { + errorMsg = response; + if (response.error) { + errorMsg = response.error; + if (response.error.message) { + errorMsg = response.error.message; + } + } + $("#top_msg").css('display', 'inline', 'important'); + $("#top_msg").html('
' + errorMsg + '
'); + } + } + }); + } + }); + }); + $('#delete_account').click(function () { bootbox.confirm("Are you sure you want to delete your account?", function (result) { if (result) { diff --git a/Teknik/Areas/User/Utility/UserHelper.cs b/Teknik/Areas/User/Utility/UserHelper.cs index c23108b..d630c34 100644 --- a/Teknik/Areas/User/Utility/UserHelper.cs +++ b/Teknik/Areas/User/Utility/UserHelper.cs @@ -134,11 +134,11 @@ namespace Teknik.Areas.Users.Utility } } - public static string GenerateAuthToken(Config config, User user) + public static string GenerateAuthToken(Config config, string username) { try { - string username = user.Username.ToLower(); + username = username.ToLower(); byte[] hashBytes = SHA384.Hash(username, StringHelper.RandomString(24)); string hash = hashBytes.ToHex(); diff --git a/Teknik/Areas/User/ViewModels/SettingsViewModel.cs b/Teknik/Areas/User/ViewModels/SettingsViewModel.cs index b8f2932..504bc87 100644 --- a/Teknik/Areas/User/ViewModels/SettingsViewModel.cs +++ b/Teknik/Areas/User/ViewModels/SettingsViewModel.cs @@ -15,6 +15,8 @@ namespace Teknik.Areas.Users.ViewModels public int TrustedDeviceCount { get; set; } + public List AuthTokens { get; set; } + public UserSettings UserSettings { get; set; } public SecuritySettings SecuritySettings { get; set; } diff --git a/Teknik/Areas/User/Views/User/Settings.cshtml b/Teknik/Areas/User/Views/User/Settings.cshtml index abe7ec6..e40b5c4 100644 --- a/Teknik/Areas/User/Views/User/Settings.cshtml +++ b/Teknik/Areas/User/Views/User/Settings.cshtml @@ -1,6 +1,7 @@ @model Teknik.Areas.Users.ViewModels.SettingsViewModel @using Teknik.Utilities +@using Teknik.Areas.Users.Models @Styles.Render("~/Content/user") @@ -127,7 +132,7 @@
-
+
@@ -147,30 +152,58 @@ }
-
-
-
-
- -
- +
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
-
-
- -
- +
+
+ +
+
    + @if (Model.AuthTokens.Any()) + { + foreach (AuthToken token in Model.AuthTokens) + { +
  • +
    + + +
    +

    @token.Name

    +

    Last Used on

    +
  • + } + } + else + { +
  • No Auth Codes
  • + } +
-