1
0
mirror of https://git.teknik.io/Teknikode/Teknik.git synced 2023-08-02 14:16:22 +02:00

Added cleaning of unused email and git accounts

This commit is contained in:
Uncled1023 2016-05-16 23:56:32 -07:00
parent 4280ff04f6
commit 8d3f1ccf3e
6 changed files with 116 additions and 54 deletions

View File

@ -19,6 +19,12 @@ namespace ServerMaint
[Option('u', "clean-users", DefaultValue = false, Required = false, HelpText = "Clean all inactive users")] [Option('u', "clean-users", DefaultValue = false, Required = false, HelpText = "Clean all inactive users")]
public bool CleanUsers { get; set; } public bool CleanUsers { get; set; }
[Option('e', "clean-emails", DefaultValue = false, Required = false, HelpText = "Clean all unused email accounts")]
public bool CleanEmails { get; set; }
[Option('g', "clean-git", DefaultValue = false, Required = false, HelpText = "Clean all unused git accounts")]
public bool CleanGit { get; set; }
[Option('s', "scan", DefaultValue = false, Required = false, HelpText = "Scan all uploads for viruses")] [Option('s', "scan", DefaultValue = false, Required = false, HelpText = "Scan all uploads for viruses")]
public bool ScanUploads { get; set; } public bool ScanUploads { get; set; }

View File

@ -56,6 +56,19 @@ namespace ServerMaint
{ {
CleanUsers(config, db, options.DaysBeforeDeletion, options.EmailsToSend); CleanUsers(config, db, options.DaysBeforeDeletion, options.EmailsToSend);
} }
// Cleans the email for unused accounts
if (options.CleanEmails)
{
CleanEmail(config, db);
}
// Cleans all the git accounts that are unused
if (options.CleanGit)
{
CleanGit(config, db);
}
Output(string.Format("[{0}] Finished Server Maintainence Process.", DateTime.Now)); Output(string.Format("[{0}] Finished Server Maintainence Process.", DateTime.Now));
return 0; return 0;
} }
@ -219,22 +232,6 @@ Thank you for your use of Teknik and I hope you decide to come back.
} }
} }
#endregion #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
@ -249,6 +246,60 @@ Thank you for your use of Teknik and I hope you decide to come back.
db.SaveChanges(); db.SaveChanges();
} }
public static void CleanEmail(Config config, TeknikEntities db)
{
if (config.EmailConfig.Enabled)
{
List<User> curUsers = db.Users.ToList();
// 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 accounts = domain.Accounts;
for (int i = 0; i < accounts.Count; i++)
{
var account = accounts[i];
bool userExists = curUsers.Exists(u => UserHelper.GetUserEmailAddress(config, u.Username) == account.Address);
bool isReserved = UserHelper.GetReservedUsernames(config).Exists(r => UserHelper.GetUserEmailAddress(config, r).ToLower() == account.Address.ToLower());
if (!userExists && !isReserved)
{
// User doesn't exist, and it isn't reserved. Let's nuke it.
UserHelper.DeleteUserEmail(config, account.Address);
}
}
}
}
public static void CleanGit(Config config, TeknikEntities db)
{
if (config.EmailConfig.Enabled)
{
List<User> curUsers = db.Users.ToList();
// We need to check the actual git database
MysqlDatabase mySQL = new MysqlDatabase(config.GitConfig.Database);
string sql = @"SELECT gogs.user.login_name AS login_name, gogs.user.lower_name AS username FROM gogs.user";
var results = mySQL.Query(sql);
if (results != null && results.Any())
{
foreach (var account in results)
{
bool userExists = curUsers.Exists(u => UserHelper.GetUserEmailAddress(config, u.Username).ToLower() == account["login_name"].ToString().ToLower());
bool isReserved = UserHelper.GetReservedUsernames(config).Exists(r => UserHelper.GetUserEmailAddress(config, r) == account["login_name"].ToString().ToLower());
if (!userExists && !isReserved)
{
UserHelper.DeleteUserGit(config, account["username"].ToString());
}
}
}
}
}
public static void Output(string message) public static void Output(string message)
{ {
Console.WriteLine(message); Console.WriteLine(message);

View File

@ -124,6 +124,17 @@
<Install>false</Install> <Install>false</Install>
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup>
<COMReference Include="hMailServer">
<Guid>{DB241B59-A1B1-4C59-98FC-8D101A2995F2}</Guid>
<VersionMajor>1</VersionMajor>
<VersionMinor>0</VersionMinor>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>False</Isolated>
<EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\GitVersionTask.3.5.3\build\dotnet\GitVersionTask.targets" Condition="Exists('..\packages\GitVersionTask.3.5.3\build\dotnet\GitVersionTask.targets')" /> <Import Project="..\packages\GitVersionTask.3.5.3\build\dotnet\GitVersionTask.targets" Condition="Exists('..\packages\GitVersionTask.3.5.3\build\dotnet\GitVersionTask.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

View File

@ -60,6 +60,7 @@ login
logout logout
logs logs
mail mail
mailer
mailman mailman
map map
maps maps

View File

@ -316,14 +316,7 @@ namespace Teknik.Areas.Users.Controllers
User user = UserHelper.GetUser(db, User.Identity.Name); User user = UserHelper.GetUser(db, User.Identity.Name);
if (user != null) if (user != null)
{ {
try UserHelper.DeleteUser(db, Config, user);
{
UserHelper.DeleteUser(db, Config, user);
}
catch (Exception ex)
{
return Json(new { error = ex.Message });
}
// Sign Out // Sign Out
Logout(); Logout();
return Json(new { result = true }); return Json(new { result = true });

View File

@ -78,7 +78,7 @@ namespace Teknik.Areas.Users.Utility
isAvailable &= ValidUsername(db, config, username); isAvailable &= ValidUsername(db, config, username);
isAvailable &= !UserExists(db, username); isAvailable &= !UserExists(db, username);
isAvailable &= !UserEmailExists(config, username); isAvailable &= !UserEmailExists(config, GetUserEmailAddress(config, username));
isAvailable &= !UserGitExists(config, username); isAvailable &= !UserGitExists(config, username);
return isAvailable; return isAvailable;
@ -89,9 +89,8 @@ namespace Teknik.Areas.Users.Utility
try try
{ {
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);
DateTime emailLastActive = UserEmailLastActive(config, user.Username); DateTime emailLastActive = UserEmailLastActive(config, GetUserEmailAddress(config, user.Username));
if (lastActive < emailLastActive) if (lastActive < emailLastActive)
lastActive = emailLastActive; lastActive = emailLastActive;
@ -115,10 +114,10 @@ namespace Teknik.Areas.Users.Utility
try try
{ {
// Create an Email Account // Create an Email Account
AddUserEmail(config, user, password); AddUserEmail(config, GetUserEmailAddress(config, user.Username), password);
// Create a Git Account // Create a Git Account
AddUserGit(config, user, password); AddUserGit(config, user.Username, password);
// Add User // Add User
user.HashedPassword = SHA384.Hash(user.Username, password); user.HashedPassword = SHA384.Hash(user.Username, password);
@ -141,15 +140,14 @@ namespace Teknik.Areas.Users.Utility
{ {
try try
{ {
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
// Changing Password? // Changing Password?
if (changePass) if (changePass)
{ {
// Change email password // Change email password
EditUserEmailPassword(config, user, password); EditUserEmailPassword(config, GetUserEmailAddress(config, user.Username), password);
// Update Git password // Update Git password
EditUserGitPassword(config, user, password); EditUserGitPassword(config, user.Username, password);
// Update User password // Update User password
user.HashedPassword = SHA384.Hash(user.Username, password); user.HashedPassword = SHA384.Hash(user.Username, password);
@ -168,10 +166,12 @@ namespace Teknik.Areas.Users.Utility
try try
{ {
// Delete Email Account // Delete Email Account
DeleteUserEmail(config, user); if (UserEmailExists(config, GetUserEmailAddress(config, user.Username)))
DeleteUserEmail(config, GetUserEmailAddress(config, user.Username));
// Delete Git Account // Delete Git Account
DeleteUserGit(config, user); if (UserGitExists(config, user.Username))
DeleteUserGit(config, user.Username);
// Update uploads // Update uploads
List<Upload.Models.Upload> uploads = db.Uploads.Include("User").Where(u => u.User.Username == user.Username).ToList(); List<Upload.Models.Upload> uploads = db.Uploads.Include("User").Where(u => u.User.Username == user.Username).ToList();
@ -245,12 +245,16 @@ namespace Teknik.Areas.Users.Utility
#endregion #endregion
#region Email Management #region Email Management
public static bool UserEmailExists(Config config, string username) public static string GetUserEmailAddress(Config config, string username)
{
return string.Format("{0}@{1}", username, config.EmailConfig.Domain);
}
public static bool UserEmailExists(Config config, string email)
{ {
// If Email Server is enabled // 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 // Connect to hmailserver COM
var app = new hMailServer.Application(); var app = new hMailServer.Application();
app.Connect(); app.Connect();
@ -268,13 +272,12 @@ namespace Teknik.Areas.Users.Utility
return false; return false;
} }
public static DateTime UserEmailLastActive(Config config, string username) public static DateTime UserEmailLastActive(Config config, string email)
{ {
DateTime lastActive = new DateTime(1900, 1, 1); DateTime lastActive = new DateTime(1900, 1, 1);
if (config.EmailConfig.Enabled) if (config.EmailConfig.Enabled)
{ {
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);
@ -292,14 +295,13 @@ namespace Teknik.Areas.Users.Utility
return lastActive; return lastActive;
} }
public static void AddUserEmail(Config config, User user, string password) public static void AddUserEmail(Config config, string email, string password)
{ {
try try
{ {
// If Email Server is enabled // If Email Server is enabled
if (config.EmailConfig.Enabled) if (config.EmailConfig.Enabled)
{ {
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain);
// Connect to hmailserver COM // Connect to hmailserver COM
var app = new hMailServer.Application(); var app = new hMailServer.Application();
app.Connect(); app.Connect();
@ -321,14 +323,13 @@ namespace Teknik.Areas.Users.Utility
} }
} }
public static void EditUserEmailPassword(Config config, User user, string password) public static void EditUserEmailPassword(Config config, string email, string password)
{ {
try try
{ {
// If Email Server is enabled // If Email Server is enabled
if (config.EmailConfig.Enabled) if (config.EmailConfig.Enabled)
{ {
string email = string.Format("{0}@{1}", user.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);
@ -344,19 +345,18 @@ namespace Teknik.Areas.Users.Utility
} }
} }
public static void DeleteUserEmail(Config config, User user) public static void DeleteUserEmail(Config config, string email)
{ {
try try
{ {
// If Email Server is enabled // If Email Server is enabled
if (config.EmailConfig.Enabled) if (config.EmailConfig.Enabled)
{ {
string email = string.Format("{0}@{1}", user.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);
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) if (account != null)
{ {
account.Delete(); account.Delete();
@ -399,7 +399,7 @@ namespace Teknik.Areas.Users.Utility
if (config.GitConfig.Enabled) if (config.GitConfig.Enabled)
{ {
string email = string.Format("{0}@{1}", username, config.EmailConfig.Domain); string email = GetUserEmailAddress(config, username);
// 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
@ -419,18 +419,18 @@ namespace Teknik.Areas.Users.Utility
return lastActive; return lastActive;
} }
public static void AddUserGit(Config config, User user, string password) public static void AddUserGit(Config config, string username, string password)
{ {
try try
{ {
// If Git is enabled // If Git is enabled
if (config.GitConfig.Enabled) if (config.GitConfig.Enabled)
{ {
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain); string email = GetUserEmailAddress(config, username);
// Add gogs user // Add gogs user
using (var client = new WebClient()) using (var client = new WebClient())
{ {
var obj = new { source_id = config.GitConfig.SourceId, username = user.Username, email = email, login_name = email, password = password }; var obj = new { source_id = config.GitConfig.SourceId, username = username, email = email, login_name = email, password = password };
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj); string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
client.Headers[HttpRequestHeader.ContentType] = "application/json"; client.Headers[HttpRequestHeader.ContentType] = "application/json";
Uri baseUri = new Uri(config.GitConfig.Host); Uri baseUri = new Uri(config.GitConfig.Host);
@ -445,21 +445,21 @@ namespace Teknik.Areas.Users.Utility
} }
} }
public static void EditUserGitPassword(Config config, User user, string password) public static void EditUserGitPassword(Config config, string username, string password)
{ {
try try
{ {
// If Git is enabled // If Git is enabled
if (config.GitConfig.Enabled) if (config.GitConfig.Enabled)
{ {
string email = string.Format("{0}@{1}", user.Username, config.EmailConfig.Domain); string email = GetUserEmailAddress(config, username);
using (var client = new WebClient()) using (var client = new WebClient())
{ {
var obj = new { source_id = config.GitConfig.SourceId, email = email, password = password }; var obj = new { source_id = config.GitConfig.SourceId, email = email, password = password };
string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj); string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);
client.Headers[HttpRequestHeader.ContentType] = "application/json"; client.Headers[HttpRequestHeader.ContentType] = "application/json";
Uri baseUri = new Uri(config.GitConfig.Host); Uri baseUri = new Uri(config.GitConfig.Host);
Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + user.Username + "?token=" + config.GitConfig.AccessToken); Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + username + "?token=" + config.GitConfig.AccessToken);
string result = client.UploadString(finalUri, "PATCH", json); string result = client.UploadString(finalUri, "PATCH", json);
} }
} }
@ -470,7 +470,7 @@ namespace Teknik.Areas.Users.Utility
} }
} }
public static void DeleteUserGit(Config config, User user) public static void DeleteUserGit(Config config, string username)
{ {
try try
{ {
@ -480,7 +480,7 @@ namespace Teknik.Areas.Users.Utility
try try
{ {
Uri baseUri = new Uri(config.GitConfig.Host); Uri baseUri = new Uri(config.GitConfig.Host);
Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + user.Username + "?token=" + config.GitConfig.AccessToken); Uri finalUri = new Uri(baseUri, "api/v1/admin/users/" + username + "?token=" + config.GitConfig.AccessToken);
WebRequest request = WebRequest.Create(finalUri); WebRequest request = WebRequest.Create(finalUri);
request.Method = "DELETE"; request.Method = "DELETE";