mirror of
https://git.teknik.io/Teknikode/Teknik.git
synced 2023-08-02 14:16:22 +02:00
- Moved git and email management to their own functions.
- Added deletion of account on email or git account missing. - Added exception deep message generation extension. - Added better exception handling to user management. - Cleaned up user management functions.
This commit is contained in:
parent
644c7eefd1
commit
89683efcad
@ -73,7 +73,7 @@ namespace ServerMaint
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
string msg = string.Format("[{0}] Exception: {1}", DateTime.Now, ex.Message);
|
string msg = string.Format("[{0}] Exception: {1}", DateTime.Now, ex.GetFullMessage(true));
|
||||||
File.AppendAllLines(errorFile, new List<string> { msg });
|
File.AppendAllLines(errorFile, new List<string> { msg });
|
||||||
Output(msg);
|
Output(msg);
|
||||||
}
|
}
|
||||||
@ -166,6 +166,13 @@ namespace ServerMaint
|
|||||||
List<User> curUsers = db.Users.ToList();
|
List<User> curUsers = db.Users.ToList();
|
||||||
foreach (User user in curUsers)
|
foreach (User user in curUsers)
|
||||||
{
|
{
|
||||||
|
// If the username isn't valid, don't clean it (Reserved, not formatted correctly, etc)
|
||||||
|
if (!UserHelper.ValidUsername(db, config, user.Username))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Inactivity Cleaning
|
||||||
DateTime lastActivity = UserHelper.GetLastActivity(db, config, user);
|
DateTime lastActivity = UserHelper.GetLastActivity(db, config, user);
|
||||||
|
|
||||||
TimeSpan inactiveTime = DateTime.Now.Subtract(lastActivity);
|
TimeSpan inactiveTime = DateTime.Now.Subtract(lastActivity);
|
||||||
@ -181,7 +188,7 @@ namespace ServerMaint
|
|||||||
int daysForEmail = (int)Math.Floor((double)(maxDays / (numEmails + 1)));
|
int daysForEmail = (int)Math.Floor((double)(maxDays / (numEmails + 1)));
|
||||||
for (int i = daysForEmail; i < maxDays; i = i + daysForEmail)
|
for (int i = daysForEmail; i < maxDays; i = i + daysForEmail)
|
||||||
{
|
{
|
||||||
if (inactiveTime.Days == daysForEmail)
|
if (inactiveTime.Days == i)
|
||||||
{
|
{
|
||||||
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
// Let's send them an email
|
// Let's send them an email
|
||||||
@ -211,6 +218,23 @@ Thank you for your use of Teknik and I hope you decide to come back.
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Missing Email Accounts
|
||||||
|
if (!UserHelper.UserEmailExists(config, user.Username))
|
||||||
|
{
|
||||||
|
// They are missing an email account. Something bad happened, so let's delete their account so they can start over. :D
|
||||||
|
UserHelper.DeleteUser(db, config, user);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Missing Git Accounts
|
||||||
|
if (!UserHelper.UserGitExists(config, user.Username))
|
||||||
|
{
|
||||||
|
// They are missing a git account. Something bad happened, so let's delete their account so they can start over. :D
|
||||||
|
UserHelper.DeleteUser(db, config, user);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to transparency report if any users were removed
|
// Add to transparency report if any users were removed
|
||||||
|
@ -39,36 +39,44 @@ namespace Teknik.Areas.Users.Controllers
|
|||||||
ViewBag.Title = "User Does Not Exist - " + Config.Title;
|
ViewBag.Title = "User Does Not Exist - " + Config.Title;
|
||||||
ViewBag.Description = "The User does not exist";
|
ViewBag.Description = "The User does not exist";
|
||||||
|
|
||||||
User user = db.Users.Where(u => u.Username == username).FirstOrDefault();
|
try
|
||||||
|
|
||||||
if (user != null)
|
|
||||||
{
|
{
|
||||||
ViewBag.Title = username + "'s Profile - " + Config.Title;
|
User user = db.Users.Where(u => u.Username == username).FirstOrDefault();
|
||||||
ViewBag.Description = "Viewing " + username + "'s Profile";
|
|
||||||
|
if (user != null)
|
||||||
model.UserID = user.UserId;
|
|
||||||
model.Username = user.Username;
|
|
||||||
if (Config.EmailConfig.Enabled)
|
|
||||||
{
|
{
|
||||||
model.Email = string.Format("{0}@{1}", user.Username, Config.EmailConfig.Domain);
|
ViewBag.Title = username + "'s Profile - " + Config.Title;
|
||||||
|
ViewBag.Description = "Viewing " + username + "'s Profile";
|
||||||
|
|
||||||
|
model.UserID = user.UserId;
|
||||||
|
model.Username = user.Username;
|
||||||
|
if (Config.EmailConfig.Enabled)
|
||||||
|
{
|
||||||
|
model.Email = string.Format("{0}@{1}", user.Username, Config.EmailConfig.Domain);
|
||||||
|
}
|
||||||
|
model.JoinDate = user.JoinDate;
|
||||||
|
model.LastSeen = UserHelper.GetLastActivity(db, Config, user);
|
||||||
|
|
||||||
|
model.UserSettings = user.UserSettings;
|
||||||
|
model.BlogSettings = user.BlogSettings;
|
||||||
|
model.UploadSettings = user.UploadSettings;
|
||||||
|
|
||||||
|
model.Uploads = db.Uploads.Where(u => u.UserId == user.UserId).OrderByDescending(u => u.DateUploaded).ToList();
|
||||||
|
|
||||||
|
model.Pastes = db.Pastes.Where(u => u.UserId == user.UserId).OrderByDescending(u => u.DatePosted).ToList();
|
||||||
|
|
||||||
|
model.ShortenedUrls = db.ShortenedUrls.Where(s => s.UserId == user.UserId).OrderByDescending(s => s.DateAdded).ToList();
|
||||||
|
|
||||||
|
return View(model);
|
||||||
}
|
}
|
||||||
model.JoinDate = user.JoinDate;
|
model.Error = true;
|
||||||
model.LastSeen = UserHelper.GetLastActivity(db, Config, user);
|
model.ErrorMessage = "The user does not exist";
|
||||||
|
}
|
||||||
model.UserSettings = user.UserSettings;
|
catch (Exception ex)
|
||||||
model.BlogSettings = user.BlogSettings;
|
{
|
||||||
model.UploadSettings = user.UploadSettings;
|
model.Error = true;
|
||||||
|
model.ErrorMessage = ex.GetFullMessage(true);
|
||||||
model.Uploads = db.Uploads.Where(u => u.UserId == user.UserId).OrderByDescending(u => u.DateUploaded).ToList();
|
|
||||||
|
|
||||||
model.Pastes = db.Pastes.Where(u => u.UserId == user.UserId).OrderByDescending(u => u.DatePosted).ToList();
|
|
||||||
|
|
||||||
model.ShortenedUrls = db.ShortenedUrls.Where(s => s.UserId == user.UserId).OrderByDescending(s => s.DateAdded).ToList();
|
|
||||||
|
|
||||||
return View(model);
|
|
||||||
}
|
}
|
||||||
model.Error = true;
|
|
||||||
model.ErrorMessage = "The user does not exist";
|
|
||||||
return View(model);
|
return View(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,9 +218,9 @@ namespace Teknik.Areas.Users.Controllers
|
|||||||
{
|
{
|
||||||
if (Config.UserConfig.RegistrationEnabled)
|
if (Config.UserConfig.RegistrationEnabled)
|
||||||
{
|
{
|
||||||
if (UserHelper.UserExists(db, model.Username))
|
if (UserHelper.UsernameAvailable(db, Config, model.Username))
|
||||||
{
|
{
|
||||||
return Json(new { error = "That username already exists." });
|
return Json(new { error = "That username is not available." });
|
||||||
}
|
}
|
||||||
if (model.Password != model.ConfirmPassword)
|
if (model.Password != model.ConfirmPassword)
|
||||||
{
|
{
|
||||||
@ -224,7 +232,6 @@ namespace Teknik.Areas.Users.Controllers
|
|||||||
User newUser = db.Users.Create();
|
User newUser = db.Users.Create();
|
||||||
newUser.JoinDate = DateTime.Now;
|
newUser.JoinDate = DateTime.Now;
|
||||||
newUser.Username = model.Username;
|
newUser.Username = model.Username;
|
||||||
newUser.HashedPassword = SHA384.Hash(model.Username, model.Password);
|
|
||||||
newUser.UserSettings = new UserSettings();
|
newUser.UserSettings = new UserSettings();
|
||||||
newUser.BlogSettings = new BlogSettings();
|
newUser.BlogSettings = new BlogSettings();
|
||||||
newUser.UploadSettings = new UploadSettings();
|
newUser.UploadSettings = new UploadSettings();
|
||||||
@ -233,7 +240,7 @@ namespace Teknik.Areas.Users.Controllers
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
return Json(new { error = ex.Message });
|
return Json(new { error = ex.GetFullMessage(true) });
|
||||||
}
|
}
|
||||||
return Login(new LoginViewModel { Username = model.Username, Password = model.Password, RememberMe = false, ReturnUrl = model.ReturnUrl });
|
return Login(new LoginViewModel { Username = model.Username, Password = model.Password, RememberMe = false, ReturnUrl = model.ReturnUrl });
|
||||||
}
|
}
|
||||||
@ -247,48 +254,54 @@ namespace Teknik.Areas.Users.Controllers
|
|||||||
{
|
{
|
||||||
if (ModelState.IsValid)
|
if (ModelState.IsValid)
|
||||||
{
|
{
|
||||||
User user = UserHelper.GetUser(db, User.Identity.Name);
|
try
|
||||||
if (user != null)
|
|
||||||
{
|
{
|
||||||
bool changePass = false;
|
User user = UserHelper.GetUser(db, User.Identity.Name);
|
||||||
string email = string.Format("{0}@{1}", User.Identity.Name, Config.EmailConfig.Domain);
|
if (user != null)
|
||||||
// Changing Password?
|
|
||||||
if (!string.IsNullOrEmpty(curPass) && (!string.IsNullOrEmpty(newPass) || !string.IsNullOrEmpty(newPassConfirm)))
|
|
||||||
{
|
{
|
||||||
// Old Password Valid?
|
bool changePass = false;
|
||||||
if (SHA384.Hash(User.Identity.Name, curPass) != user.HashedPassword)
|
string email = string.Format("{0}@{1}", User.Identity.Name, Config.EmailConfig.Domain);
|
||||||
|
// Changing Password?
|
||||||
|
if (!string.IsNullOrEmpty(curPass) && (!string.IsNullOrEmpty(newPass) || !string.IsNullOrEmpty(newPassConfirm)))
|
||||||
{
|
{
|
||||||
return Json(new { error = "Invalid Original Password." });
|
// Old Password Valid?
|
||||||
|
if (SHA384.Hash(User.Identity.Name, curPass) != user.HashedPassword)
|
||||||
|
{
|
||||||
|
return Json(new { error = "Invalid Original Password." });
|
||||||
|
}
|
||||||
|
// The New Password Match?
|
||||||
|
if (newPass != newPassConfirm)
|
||||||
|
{
|
||||||
|
return Json(new { error = "New Password Must Match." });
|
||||||
|
}
|
||||||
|
changePass = true;
|
||||||
}
|
}
|
||||||
// The New Password Match?
|
|
||||||
if (newPass != newPassConfirm)
|
// PGP Key valid?
|
||||||
|
if (!string.IsNullOrEmpty(pgpPublicKey) && !PGP.IsPublicKey(pgpPublicKey))
|
||||||
{
|
{
|
||||||
return Json(new { error = "New Password Must Match." });
|
return Json(new { error = "Invalid PGP Public Key" });
|
||||||
}
|
}
|
||||||
user.HashedPassword = SHA384.Hash(User.Identity.Name, newPass);
|
user.UserSettings.PGPSignature = pgpPublicKey;
|
||||||
changePass = true;
|
|
||||||
|
user.UserSettings.Website = website;
|
||||||
|
user.UserSettings.Quote = quote;
|
||||||
|
user.UserSettings.About = about;
|
||||||
|
|
||||||
|
user.BlogSettings.Title = blogTitle;
|
||||||
|
user.BlogSettings.Description = blogDesc;
|
||||||
|
|
||||||
|
user.UploadSettings.SaveKey = saveKey;
|
||||||
|
user.UploadSettings.ServerSideEncrypt = serverSideEncrypt;
|
||||||
|
UserHelper.EditUser(db, Config, user, changePass, newPass);
|
||||||
|
return Json(new { result = true });
|
||||||
}
|
}
|
||||||
|
return Json(new { error = "User does not exist" });
|
||||||
// PGP Key valid?
|
}
|
||||||
if (!string.IsNullOrEmpty(pgpPublicKey) && !PGP.IsPublicKey(pgpPublicKey))
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
return Json(new { error = "Invalid PGP Public Key" });
|
return Json(new { error = ex.GetFullMessage(true) });
|
||||||
}
|
|
||||||
user.UserSettings.PGPSignature = pgpPublicKey;
|
|
||||||
|
|
||||||
user.UserSettings.Website = website;
|
|
||||||
user.UserSettings.Quote = quote;
|
|
||||||
user.UserSettings.About = about;
|
|
||||||
|
|
||||||
user.BlogSettings.Title = blogTitle;
|
|
||||||
user.BlogSettings.Description = blogDesc;
|
|
||||||
|
|
||||||
user.UploadSettings.SaveKey = saveKey;
|
|
||||||
user.UploadSettings.ServerSideEncrypt = serverSideEncrypt;
|
|
||||||
UserHelper.SaveUser(db, Config, user, changePass, newPass);
|
|
||||||
return Json(new { result = true });
|
|
||||||
}
|
}
|
||||||
return Json(new { error = "User does not exist" });
|
|
||||||
}
|
}
|
||||||
return Json(new { error = "Invalid Parameters" });
|
return Json(new { error = "Invalid Parameters" });
|
||||||
}
|
}
|
||||||
@ -298,20 +311,27 @@ namespace Teknik.Areas.Users.Controllers
|
|||||||
{
|
{
|
||||||
if (ModelState.IsValid)
|
if (ModelState.IsValid)
|
||||||
{
|
{
|
||||||
User user = UserHelper.GetUser(db, User.Identity.Name);
|
try
|
||||||
if (user != null)
|
|
||||||
{
|
{
|
||||||
try
|
User user = UserHelper.GetUser(db, User.Identity.Name);
|
||||||
|
if (user != null)
|
||||||
{
|
{
|
||||||
UserHelper.DeleteUser(db, Config, user);
|
try
|
||||||
|
{
|
||||||
|
UserHelper.DeleteUser(db, Config, user);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
return Json(new { error = ex.Message });
|
||||||
|
}
|
||||||
|
// Sign Out
|
||||||
|
Logout();
|
||||||
|
return Json(new { result = true });
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
}
|
||||||
{
|
catch (Exception ex)
|
||||||
return Json(new { error = ex.Message });
|
{
|
||||||
}
|
return Json(new { error = ex.GetFullMessage(true) });
|
||||||
// Sign Out
|
|
||||||
Logout();
|
|
||||||
return Json(new { result = true });
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Json(new { error = "Unable to delete user" });
|
return Json(new { error = "Unable to delete user" });
|
||||||
|
@ -19,6 +19,7 @@ namespace Teknik.Areas.Users.Utility
|
|||||||
{
|
{
|
||||||
public static class UserHelper
|
public static class UserHelper
|
||||||
{
|
{
|
||||||
|
#region User Management
|
||||||
public static User GetUser(TeknikEntities db, string username)
|
public static User GetUser(TeknikEntities db, string username)
|
||||||
{
|
{
|
||||||
User user = db.Users.Where(b => b.Username == username).FirstOrDefault();
|
User user = db.Users.Where(b => b.Username == username).FirstOrDefault();
|
||||||
@ -43,53 +44,66 @@ namespace Teknik.Areas.Users.Utility
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool ValidUsername(TeknikEntities db, Config config, string username)
|
||||||
|
{
|
||||||
|
bool isValid = true;
|
||||||
|
|
||||||
|
if (config.UserConfig.ReservedUsernames.Exists(u => u.ToLower() == username.ToLower()))
|
||||||
|
isValid = false;
|
||||||
|
|
||||||
|
return isValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool UsernameAvailable(TeknikEntities db, Config config, string username)
|
||||||
|
{
|
||||||
|
bool isAvailable = true;
|
||||||
|
|
||||||
|
isAvailable &= ValidUsername(db, config, username);
|
||||||
|
isAvailable &= !UserExists(db, username);
|
||||||
|
isAvailable &= !UserEmailExists(config, username);
|
||||||
|
isAvailable &= !UserGitExists(config, username);
|
||||||
|
|
||||||
|
return isAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DateTime GetLastActivity(TeknikEntities db, Config config, User user)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
DateTime lastActive = new DateTime(1900, 1, 1);
|
||||||
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
|
|
||||||
|
DateTime emailLastActive = UserEmailLastActive(config, user.Username);
|
||||||
|
if (lastActive < emailLastActive)
|
||||||
|
lastActive = emailLastActive;
|
||||||
|
|
||||||
|
DateTime gitLastActive = UserGitLastActive(config, user.Username);
|
||||||
|
if (lastActive < gitLastActive)
|
||||||
|
lastActive = gitLastActive;
|
||||||
|
|
||||||
|
if (lastActive < user.LastSeen)
|
||||||
|
lastActive = user.LastSeen;
|
||||||
|
|
||||||
|
return lastActive;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to determine last activity.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void AddUser(TeknikEntities db, Config config, User user, string password)
|
public static void AddUser(TeknikEntities db, Config config, User user, string password)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
// Create an Email Account
|
||||||
// If Email Server is enabled
|
AddUserEmail(config, user, password);
|
||||||
if (config.EmailConfig.Enabled)
|
|
||||||
{
|
|
||||||
// Connect to hmailserver COM
|
|
||||||
var app = new hMailServer.Application();
|
|
||||||
app.Connect();
|
|
||||||
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
|
||||||
|
|
||||||
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
// Create a Git Account
|
||||||
try
|
AddUserGit(config, user, password);
|
||||||
{
|
|
||||||
var account = domain.Accounts.ItemByAddress[email];
|
|
||||||
throw new Exception("That email already exists.");
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
|
|
||||||
// If we got an exception, then the email doesnt exist and we continue on!
|
|
||||||
var newAccount = domain.Accounts.Add();
|
|
||||||
newAccount.Address = email;
|
|
||||||
newAccount.Password = password;
|
|
||||||
newAccount.Active = true;
|
|
||||||
newAccount.MaxSize = config.EmailConfig.MaxSize;
|
|
||||||
|
|
||||||
newAccount.Save();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If Git is enabled
|
|
||||||
if (config.GitConfig.Enabled)
|
|
||||||
{
|
|
||||||
// Add gogs user
|
|
||||||
using (var client = new WebClient())
|
|
||||||
{
|
|
||||||
var obj = new { source_id = config.GitConfig.SourceId, username = user.Username, email = email, login_name = email, password = password };
|
|
||||||
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
|
|
||||||
client.Headers[HttpRequestHeader.ContentType] = "application/json";
|
|
||||||
Uri baseUri = new Uri(config.GitConfig.Host);
|
|
||||||
Uri finalUri = new Uri(baseUri, "api/v1/admin/users?token=" + config.GitConfig.AccessToken);
|
|
||||||
string result = client.UploadString(finalUri, "POST", json);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add User
|
// Add User
|
||||||
|
user.HashedPassword = SHA384.Hash(user.Username, password);
|
||||||
db.Users.Add(user);
|
db.Users.Add(user);
|
||||||
db.SaveChanges();
|
db.SaveChanges();
|
||||||
|
|
||||||
@ -105,178 +119,144 @@ namespace Teknik.Areas.Users.Utility
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SaveUser(TeknikEntities db, Config config, User user, bool changePass, string newPass)
|
public static void EditUser(TeknikEntities db, Config config, User user, bool changePass, string password)
|
||||||
{
|
{
|
||||||
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
try
|
||||||
// Changing Password?
|
|
||||||
if (changePass)
|
|
||||||
{
|
{
|
||||||
// Update Email Pass
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
if (config.EmailConfig.Enabled)
|
// Changing Password?
|
||||||
|
if (changePass)
|
||||||
{
|
{
|
||||||
try
|
// Change email password
|
||||||
{
|
EditUserEmailPassword(config, user, password);
|
||||||
var app = new hMailServer.Application();
|
|
||||||
app.Connect();
|
|
||||||
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
|
||||||
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
|
||||||
var account = domain.Accounts.ItemByAddress[email];
|
|
||||||
account.Password = newPass;
|
|
||||||
account.Save();
|
|
||||||
}
|
|
||||||
catch (COMException)
|
|
||||||
{ }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update Git Pass
|
// Update Git password
|
||||||
if (config.GitConfig.Enabled)
|
EditUserGitPassword(config, user, password);
|
||||||
{
|
|
||||||
using (var client = new WebClient())
|
// Update User password
|
||||||
{
|
user.HashedPassword = SHA384.Hash(user.Username, password);
|
||||||
var obj = new { source_id = config.GitConfig.SourceId, email = email, password = newPass };
|
|
||||||
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
|
|
||||||
client.Headers[HttpRequestHeader.ContentType] = "application/json";
|
|
||||||
Uri baseUri = new Uri(config.GitConfig.Host);
|
|
||||||
Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + user.Username + "?token=" + config.GitConfig.AccessToken);
|
|
||||||
string result = client.UploadString(finalUri, "PATCH", json);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
db.Entry(user).State = EntityState.Modified;
|
||||||
|
db.SaveChanges();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to edit user.", ex);
|
||||||
}
|
}
|
||||||
db.Entry(user).State = EntityState.Modified;
|
|
||||||
db.SaveChanges();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DeleteUser(TeknikEntities db, Config config, User user)
|
public static void DeleteUser(TeknikEntities db, Config config, User user)
|
||||||
{
|
{
|
||||||
// Check to see if we need to delete their email.
|
try
|
||||||
|
{
|
||||||
|
// Delete Email Account
|
||||||
|
DeleteUserEmail(config, user);
|
||||||
|
|
||||||
|
// Delete Git Account
|
||||||
|
DeleteUserGit(config, user);
|
||||||
|
|
||||||
|
// Update uploads
|
||||||
|
List<Upload.Models.Upload> uploads = db.Uploads.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
||||||
|
if (uploads != null)
|
||||||
|
{
|
||||||
|
foreach (Upload.Models.Upload upload in uploads)
|
||||||
|
{
|
||||||
|
upload.UserId = null;
|
||||||
|
db.Entry(upload).State = EntityState.Modified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update pastes
|
||||||
|
List<Paste.Models.Paste> pastes = db.Pastes.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
||||||
|
if (pastes != null)
|
||||||
|
{
|
||||||
|
foreach (Paste.Models.Paste paste in pastes)
|
||||||
|
{
|
||||||
|
paste.UserId = null;
|
||||||
|
db.Entry(paste).State = EntityState.Modified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update shortened urls
|
||||||
|
List<ShortenedUrl> shortUrls = db.ShortenedUrls.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
||||||
|
if (shortUrls != null)
|
||||||
|
{
|
||||||
|
foreach (ShortenedUrl shortUrl in shortUrls)
|
||||||
|
{
|
||||||
|
shortUrl.UserId = null;
|
||||||
|
db.Entry(shortUrl).State = EntityState.Modified;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete Blogs
|
||||||
|
Blog.Models.Blog blog = db.Blogs.Include("BlogPosts").Include("BlogPosts.Comments").Include("User").Where(u => u.User.Username == user.Username).FirstOrDefault();
|
||||||
|
if (blog != null)
|
||||||
|
{
|
||||||
|
db.Blogs.Remove(blog);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete post comments
|
||||||
|
List<BlogPostComment> postComments = db.BlogComments.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
||||||
|
if (postComments != null)
|
||||||
|
{
|
||||||
|
foreach (BlogPostComment postComment in postComments)
|
||||||
|
{
|
||||||
|
db.BlogComments.Remove(postComment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete podcast comments
|
||||||
|
List<Podcast.Models.PodcastComment> podComments = db.PodcastComments.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
||||||
|
if (podComments != null)
|
||||||
|
{
|
||||||
|
foreach (Podcast.Models.PodcastComment podComment in podComments)
|
||||||
|
{
|
||||||
|
db.PodcastComments.Remove(podComment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete User
|
||||||
|
db.Users.Remove(user);
|
||||||
|
db.SaveChanges();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to delete user.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Email Management
|
||||||
|
public static bool UserEmailExists(Config config, string username)
|
||||||
|
{
|
||||||
|
// If Email Server is enabled
|
||||||
if (config.EmailConfig.Enabled)
|
if (config.EmailConfig.Enabled)
|
||||||
{
|
{
|
||||||
|
string email = string.Format("{0}@{1}", username, config.EmailConfig.Domain);
|
||||||
|
// Connect to hmailserver COM
|
||||||
|
var app = new hMailServer.Application();
|
||||||
|
app.Connect();
|
||||||
|
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Delete Email
|
|
||||||
var app = new hMailServer.Application();
|
|
||||||
app.Connect();
|
|
||||||
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
|
||||||
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
||||||
var account = domain.Accounts.ItemByAddress[string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain)];
|
var account = domain.Accounts.ItemByAddress[email];
|
||||||
if (account != null)
|
// We didn't error out, so the email exists
|
||||||
{
|
return true;
|
||||||
account.Delete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (COMException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new Exception("Unable to delete email account.", ex);
|
|
||||||
}
|
}
|
||||||
|
catch { }
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
// Delete Git
|
|
||||||
if (config.GitConfig.Enabled)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Uri baseUri = new Uri(config.GitConfig.Host);
|
|
||||||
Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + user.Username + "?token=" + config.GitConfig.AccessToken);
|
|
||||||
WebRequest request = WebRequest.Create(finalUri);
|
|
||||||
request.Method = "DELETE";
|
|
||||||
|
|
||||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
|
||||||
if (response.StatusCode != HttpStatusCode.NotFound && response.StatusCode != HttpStatusCode.OK)
|
|
||||||
{
|
|
||||||
throw new Exception("Unable to delete git account. Response Code: " + response.StatusCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (HttpException htex)
|
|
||||||
{
|
|
||||||
if (htex.GetHttpCode() != 404)
|
|
||||||
throw new Exception("Unable to delete git account. Http Exception: " + htex.Message);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// This error signifies the user doesn't exist, so we can continue deleting
|
|
||||||
if (ex.Message != "The remote server returned an error: (404) Not Found.")
|
|
||||||
{
|
|
||||||
throw new Exception("Unable to delete git account. Exception: " + ex.Message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update uploads
|
|
||||||
List<Upload.Models.Upload> uploads = db.Uploads.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
|
||||||
if (uploads != null)
|
|
||||||
{
|
|
||||||
foreach (Upload.Models.Upload upload in uploads)
|
|
||||||
{
|
|
||||||
upload.UserId = null;
|
|
||||||
db.Entry(upload).State = EntityState.Modified;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update pastes
|
|
||||||
List<Paste.Models.Paste> pastes = db.Pastes.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
|
||||||
if (pastes != null)
|
|
||||||
{
|
|
||||||
foreach (Paste.Models.Paste paste in pastes)
|
|
||||||
{
|
|
||||||
paste.UserId = null;
|
|
||||||
db.Entry(paste).State = EntityState.Modified;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update shortened urls
|
|
||||||
List<ShortenedUrl> shortUrls = db.ShortenedUrls.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
|
||||||
if (shortUrls != null)
|
|
||||||
{
|
|
||||||
foreach (ShortenedUrl shortUrl in shortUrls)
|
|
||||||
{
|
|
||||||
shortUrl.UserId = null;
|
|
||||||
db.Entry(shortUrl).State = EntityState.Modified;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete Blogs
|
|
||||||
Blog.Models.Blog blog = db.Blogs.Include("BlogPosts").Include("BlogPosts.Comments").Include("User").Where(u => u.User.Username == user.Username).FirstOrDefault();
|
|
||||||
if (blog != null)
|
|
||||||
{
|
|
||||||
db.Blogs.Remove(blog);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete post comments
|
|
||||||
List<BlogPostComment> postComments = db.BlogComments.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
|
||||||
if (postComments != null)
|
|
||||||
{
|
|
||||||
foreach (BlogPostComment postComment in postComments)
|
|
||||||
{
|
|
||||||
db.BlogComments.Remove(postComment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete post comments
|
|
||||||
List<Podcast.Models.PodcastComment> podComments = db.PodcastComments.Include("User").Where(u => u.User.Username == user.Username).ToList();
|
|
||||||
if (podComments != null)
|
|
||||||
{
|
|
||||||
foreach (Podcast.Models.PodcastComment podComment in podComments)
|
|
||||||
{
|
|
||||||
db.PodcastComments.Remove(podComment);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete User
|
|
||||||
db.Users.Remove(user);
|
|
||||||
db.SaveChanges();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static DateTime GetLastActivity(TeknikEntities db, Config config, User user)
|
public static DateTime UserEmailLastActive(Config config, string username)
|
||||||
{
|
{
|
||||||
DateTime lastActive = new DateTime(1900, 1, 1);
|
DateTime lastActive = new DateTime(1900, 1, 1);
|
||||||
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
|
||||||
|
|
||||||
if (config.EmailConfig.Enabled)
|
if (config.EmailConfig.Enabled)
|
||||||
{
|
{
|
||||||
// Connect to hmailserver COM
|
string email = string.Format("{0}@{1}", username, config.EmailConfig.Domain);
|
||||||
var app = new hMailServer.Application();
|
var app = new hMailServer.Application();
|
||||||
app.Connect();
|
app.Connect();
|
||||||
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
||||||
@ -289,11 +269,119 @@ namespace Teknik.Areas.Users.Utility
|
|||||||
if (lastActive < lastEmail)
|
if (lastActive < lastEmail)
|
||||||
lastActive = lastEmail;
|
lastActive = lastEmail;
|
||||||
}
|
}
|
||||||
catch (Exception ex) { }
|
catch { }
|
||||||
}
|
}
|
||||||
|
return lastActive;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void AddUserEmail(Config config, User user, string password)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If Email Server is enabled
|
||||||
|
if (config.EmailConfig.Enabled)
|
||||||
|
{
|
||||||
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
|
// Connect to hmailserver COM
|
||||||
|
var app = new hMailServer.Application();
|
||||||
|
app.Connect();
|
||||||
|
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
||||||
|
|
||||||
|
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
||||||
|
var newAccount = domain.Accounts.Add();
|
||||||
|
newAccount.Address = email;
|
||||||
|
newAccount.Password = password;
|
||||||
|
newAccount.Active = true;
|
||||||
|
newAccount.MaxSize = config.EmailConfig.MaxSize;
|
||||||
|
|
||||||
|
newAccount.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to add email.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EditUserEmailPassword(Config config, User user, string password)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If Email Server is enabled
|
||||||
|
if (config.EmailConfig.Enabled)
|
||||||
|
{
|
||||||
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
|
var app = new hMailServer.Application();
|
||||||
|
app.Connect();
|
||||||
|
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
||||||
|
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
||||||
|
var account = domain.Accounts.ItemByAddress[email];
|
||||||
|
account.Password = password;
|
||||||
|
account.Save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to edit email account password.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DeleteUserEmail(Config config, User user)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If Email Server is enabled
|
||||||
|
if (config.EmailConfig.Enabled)
|
||||||
|
{
|
||||||
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
|
var app = new hMailServer.Application();
|
||||||
|
app.Connect();
|
||||||
|
app.Authenticate(config.EmailConfig.Username, config.EmailConfig.Password);
|
||||||
|
var domain = app.Domains.ItemByName[config.EmailConfig.Domain];
|
||||||
|
var account = domain.Accounts.ItemByAddress[string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain)];
|
||||||
|
if (account != null)
|
||||||
|
{
|
||||||
|
account.Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to delete email account.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Git Management
|
||||||
|
public static bool UserGitExists(Config config, string username)
|
||||||
|
{
|
||||||
if (config.GitConfig.Enabled)
|
if (config.GitConfig.Enabled)
|
||||||
{
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Uri baseUri = new Uri(config.GitConfig.Host);
|
||||||
|
Uri finalUri = new Uri(baseUri, "api/v1/users/" + username + "?token=" + config.GitConfig.AccessToken);
|
||||||
|
WebRequest request = WebRequest.Create(finalUri);
|
||||||
|
request.Method = "GET";
|
||||||
|
|
||||||
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||||
|
if (response.StatusCode == HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DateTime UserGitLastActive(Config config, string username)
|
||||||
|
{
|
||||||
|
DateTime lastActive = new DateTime(1900, 1, 1);
|
||||||
|
|
||||||
|
if (config.GitConfig.Enabled)
|
||||||
|
{
|
||||||
|
string email = string.Format("{0}@{1}", username, config.EmailConfig.Domain);
|
||||||
// We need to check the actual git database
|
// We need to check the actual git database
|
||||||
MysqlDatabase mySQL = new MysqlDatabase(config.GitConfig.Database);
|
MysqlDatabase mySQL = new MysqlDatabase(config.GitConfig.Database);
|
||||||
string sql = @"SELECT MAX(gogs.repository.updated) AS LastUpdate
|
string sql = @"SELECT MAX(gogs.repository.updated) AS LastUpdate
|
||||||
@ -310,13 +398,102 @@ namespace Teknik.Areas.Users.Utility
|
|||||||
lastActive = tmpLast;
|
lastActive = tmpLast;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastActive < user.LastSeen)
|
|
||||||
lastActive = user.LastSeen;
|
|
||||||
|
|
||||||
return lastActive;
|
return lastActive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void AddUserGit(Config config, User user, string password)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If Git is enabled
|
||||||
|
if (config.GitConfig.Enabled)
|
||||||
|
{
|
||||||
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
|
// Add gogs user
|
||||||
|
using (var client = new WebClient())
|
||||||
|
{
|
||||||
|
var obj = new { source_id = config.GitConfig.SourceId, username = user.Username, email = email, login_name = email, password = password };
|
||||||
|
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
|
||||||
|
client.Headers[HttpRequestHeader.ContentType] = "application/json";
|
||||||
|
Uri baseUri = new Uri(config.GitConfig.Host);
|
||||||
|
Uri finalUri = new Uri(baseUri, "api/v1/admin/users?token=" + config.GitConfig.AccessToken);
|
||||||
|
string result = client.UploadString(finalUri, "POST", json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to add git account.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void EditUserGitPassword(Config config, User user, string password)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If Git is enabled
|
||||||
|
if (config.GitConfig.Enabled)
|
||||||
|
{
|
||||||
|
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
|
||||||
|
using (var client = new WebClient())
|
||||||
|
{
|
||||||
|
var obj = new { source_id = config.GitConfig.SourceId, email = email, password = password };
|
||||||
|
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
|
||||||
|
client.Headers[HttpRequestHeader.ContentType] = "application/json";
|
||||||
|
Uri baseUri = new Uri(config.GitConfig.Host);
|
||||||
|
Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + user.Username + "?token=" + config.GitConfig.AccessToken);
|
||||||
|
string result = client.UploadString(finalUri, "PATCH", json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to edit git account password.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DeleteUserGit(Config config, User user)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If Git is enabled
|
||||||
|
if (config.GitConfig.Enabled)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Uri baseUri = new Uri(config.GitConfig.Host);
|
||||||
|
Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + user.Username + "?token=" + config.GitConfig.AccessToken);
|
||||||
|
WebRequest request = WebRequest.Create(finalUri);
|
||||||
|
request.Method = "DELETE";
|
||||||
|
|
||||||
|
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||||
|
if (response.StatusCode != HttpStatusCode.NotFound && response.StatusCode != HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to delete git account. Response Code: " + response.StatusCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (HttpException htex)
|
||||||
|
{
|
||||||
|
if (htex.GetHttpCode() != 404)
|
||||||
|
throw new Exception("Unable to delete git account. Http Exception: " + htex.Message);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
// This error signifies the user doesn't exist, so we can continue deleting
|
||||||
|
if (ex.Message != "The remote server returned an error: (404) Not Found.")
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to delete git account. Exception: " + ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new Exception("Unable to delete git account.", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
public static HttpCookie CreateAuthCookie(string username, bool remember, string domain, bool local)
|
public static HttpCookie CreateAuthCookie(string username, bool remember, string domain, bool local)
|
||||||
{
|
{
|
||||||
Config config = Config.Load();
|
Config config = Config.Load();
|
||||||
|
@ -10,11 +10,13 @@ namespace Teknik.Configuration
|
|||||||
{
|
{
|
||||||
public bool RegistrationEnabled { get; set; }
|
public bool RegistrationEnabled { get; set; }
|
||||||
public bool LoginEnabled { get; set; }
|
public bool LoginEnabled { get; set; }
|
||||||
|
public List<string> ReservedUsernames { get; set; }
|
||||||
|
|
||||||
public UserConfig()
|
public UserConfig()
|
||||||
{
|
{
|
||||||
RegistrationEnabled = true;
|
RegistrationEnabled = true;
|
||||||
LoginEnabled = true;
|
LoginEnabled = true;
|
||||||
|
ReservedUsernames = new List<string>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
24
Teknik/Helpers/ExceptionExtensions.cs
Normal file
24
Teknik/Helpers/ExceptionExtensions.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
|
||||||
|
namespace Teknik.Helpers
|
||||||
|
{
|
||||||
|
public static class ExceptionExtensions
|
||||||
|
{
|
||||||
|
public static string GetFullMessage(this Exception ex, bool recursive = false, bool stackTrace = false)
|
||||||
|
{
|
||||||
|
string message = ex.Message;
|
||||||
|
if (recursive && ex.InnerException != null)
|
||||||
|
{
|
||||||
|
message += " | Inner Exception: " + ex.InnerException.GetFullMessage(recursive, stackTrace);
|
||||||
|
}
|
||||||
|
if (stackTrace && !string.IsNullOrEmpty(ex.StackTrace))
|
||||||
|
{
|
||||||
|
message += " | Stack Trace: " + ex.StackTrace;
|
||||||
|
}
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -274,6 +274,7 @@
|
|||||||
<Compile Include="Areas\User\Models\PermissionType.cs" />
|
<Compile Include="Areas\User\Models\PermissionType.cs" />
|
||||||
<Compile Include="Areas\Blog\Models\BlogPost.cs" />
|
<Compile Include="Areas\Blog\Models\BlogPost.cs" />
|
||||||
<Compile Include="Areas\User\Models\Role.cs" />
|
<Compile Include="Areas\User\Models\Role.cs" />
|
||||||
|
<Compile Include="Helpers\ExceptionExtensions.cs" />
|
||||||
<Compile Include="Helpers\HttpRequestExtensions.cs" />
|
<Compile Include="Helpers\HttpRequestExtensions.cs" />
|
||||||
<Compile Include="Helpers\MysqlDatabase.cs" />
|
<Compile Include="Helpers\MysqlDatabase.cs" />
|
||||||
<Compile Include="Helpers\MarkdownHelper.cs" />
|
<Compile Include="Helpers\MarkdownHelper.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user