tgstation-server  4.3.2
The /tg/station 13 server suite
DatabaseSeeder.cs
Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using System;
3 using System.Linq;
4 using System.Threading;
5 using System.Threading.Tasks;
10 
11 namespace Tgstation.Server.Host.Database
12 {
15  {
20 
25 
31  public DatabaseSeeder(ICryptographySuite cryptographySuite, IPlatformIdentifier platformIdentifier)
32  {
33  this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite));
34  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
35  }
36 
41  void SeedAdminUser(IDatabaseContext databaseContext)
42  {
43  var admin = new User
44  {
46  CreatedAt = DateTimeOffset.Now,
48  Name = Api.Models.User.AdminName,
49  CanonicalName = User.CanonicalizeName(Api.Models.User.AdminName),
50  Enabled = true,
51  };
52  cryptographySuite.SetUserPassword(admin, Api.Models.User.DefaultAdminPassword, true);
53  databaseContext.Users.Add(admin);
54  }
55 
57  public async Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
58  {
59  SeedAdminUser(databaseContext);
60  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
61  }
62 
64  public async Task SanitizeDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
65  {
66  var admin = await GetAdminUser(databaseContext, cancellationToken).ConfigureAwait(false);
67  if (admin != null)
68  {
69  // Fix the issue with ulong enums
70  // https://github.com/tgstation/tgstation-server/commit/db341d43b3dab74fe3681f5172ca9bfeaafa6b6d#diff-09f06ec4584665cf89bb77b97f5ccfb9R36-R39
71  // https://github.com/JamesNK/Newtonsoft.Json/issues/2301
72  admin.AdministrationRights &= RightsHelper.AllRights<AdministrationRights>();
73  admin.InstanceManagerRights &= RightsHelper.AllRights<InstanceManagerRights>();
74  }
75 
76  if (platformIdentifier.IsWindows)
77  {
78  // normalize backslashes to forward slashes
79  var allInstances = await databaseContext
80  .Instances
81  .AsQueryable()
82  .ToListAsync(cancellationToken)
83  .ConfigureAwait(false);
84  foreach (var instance in allInstances)
85  instance.Path = instance.Path.Replace('\\', '/');
86  }
87 
88  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
89  }
90 
92  public async Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
93  {
94  var admin = await GetAdminUser(databaseContext, cancellationToken).ConfigureAwait(false);
95  if (admin != null)
96  {
97  admin.Enabled = true;
98  cryptographySuite.SetUserPassword(admin, Api.Models.User.DefaultAdminPassword, false);
99  }
100 
101  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
102  }
103 
110  async Task<User> GetAdminUser(IDatabaseContext databaseContext, CancellationToken cancellationToken)
111  {
112  var admin = await databaseContext
113  .Users
114  .AsQueryable()
115  .Where(x => x.CanonicalName == User.CanonicalizeName(Api.Models.User.AdminName))
116  .FirstOrDefaultAsync(cancellationToken)
117  .ConfigureAwait(false);
118  if (admin == default)
119  SeedAdminUser(databaseContext);
120 
121  return admin;
122  }
123  }
124 }
readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the DatabaseSeeder
For initially seeding a database
async Task SanitizeDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Correct invalid database data caused by previous versions.
void Add(TModel model)
Add a given model to the the working set.
async Task SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext
AdministrationRights
Rights for Models.Administration
Contains various cryptographic functions
IDatabaseCollection< Instance > Instances
The Instances in the IDatabaseContext
async Task ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it&#39;s default and enables the account ...
InstanceManagerRights
Rights for managing Models.Instances
static string CanonicalizeName(string name)
Change a Api.Models.Internal.User.Name into a CanonicalName.
DatabaseSeeder(ICryptographySuite cryptographySuite, IPlatformIdentifier platformIdentifier)
Construct a DatabaseSeeder
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the DatabaseSeeder.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
async Task< User > GetAdminUser(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Get or create the admin User.
void SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext
IDatabaseCollection< User > Users
The Users in the IDatabaseContext
For identifying the current platform