123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using Emby.Server.Implementations.Data;
- using Jellyfin.Data.Entities.Security;
- using Jellyfin.Server.Implementations;
- using MediaBrowser.Controller;
- using Microsoft.Extensions.Logging;
- using SQLitePCL.pretty;
- namespace Jellyfin.Server.Migrations.Routines
- {
- /// <summary>
- /// A migration that moves data from the authentication database into the new schema.
- /// </summary>
- public class MigrateAuthenticationDb : IMigrationRoutine
- {
- private const string DbFilename = "authentication.db";
- private readonly ILogger<MigrateAuthenticationDb> _logger;
- private readonly JellyfinDbProvider _dbProvider;
- private readonly IServerApplicationPaths _appPaths;
- /// <summary>
- /// Initializes a new instance of the <see cref="MigrateAuthenticationDb"/> class.
- /// </summary>
- /// <param name="logger">The logger.</param>
- /// <param name="dbProvider">The database provider.</param>
- /// <param name="appPaths">The server application paths.</param>
- public MigrateAuthenticationDb(ILogger<MigrateAuthenticationDb> logger, JellyfinDbProvider dbProvider, IServerApplicationPaths appPaths)
- {
- _logger = logger;
- _dbProvider = dbProvider;
- _appPaths = appPaths;
- }
- /// <inheritdoc />
- public Guid Id => Guid.Parse("5BD72F41-E6F3-4F60-90AA-09869ABE0E22");
- /// <inheritdoc />
- public string Name => "MigrateAuthenticationDatabase";
- /// <inheritdoc />
- public bool PerformOnNewInstall => false;
- /// <inheritdoc />
- public void Perform()
- {
- var dataPath = _appPaths.DataPath;
- using (var connection = SQLite3.Open(
- Path.Combine(dataPath, DbFilename),
- ConnectionFlags.ReadOnly,
- null))
- {
- using var dbContext = _dbProvider.CreateContext();
- var authenticatedDevices = connection.Query("SELECT * FROM Tokens");
- foreach (var row in authenticatedDevices)
- {
- var dateCreatedStr = row[9].ToString();
- _ = DateTime.TryParse(dateCreatedStr, out var dateCreated);
- var dateLastActivityStr = row[10].ToString();
- _ = DateTime.TryParse(dateLastActivityStr, out var dateLastActivity);
- if (row[6].IsDbNull())
- {
- dbContext.ApiKeys.Add(new ApiKey(row[3].ToString())
- {
- AccessToken = row[1].ToString(),
- DateCreated = dateCreated,
- DateLastActivity = dateLastActivity
- });
- }
- else
- {
- dbContext.Devices.Add(new Device(
- new Guid(row[6].ToString()),
- row[3].ToString(),
- row[4].ToString(),
- row[5].ToString(),
- row[2].ToString())
- {
- AccessToken = row[1].ToString(),
- IsActive = row[8].ToBool(),
- DateCreated = dateCreated,
- DateLastActivity = dateLastActivity
- });
- }
- }
- var deviceOptions = connection.Query("SELECT * FROM Devices");
- var deviceIds = new HashSet<string>();
- foreach (var row in deviceOptions)
- {
- if (row[2].IsDbNull())
- {
- continue;
- }
- var deviceId = row[2].ToString();
- if (deviceIds.Contains(deviceId))
- {
- continue;
- }
- deviceIds.Add(deviceId);
- dbContext.DeviceOptions.Add(new DeviceOptions(deviceId)
- {
- CustomName = row[1].IsDbNull() ? null : row[1].ToString()
- });
- }
- dbContext.SaveChanges();
- }
- try
- {
- File.Move(Path.Combine(dataPath, DbFilename), Path.Combine(dataPath, DbFilename + ".old"));
- var journalPath = Path.Combine(dataPath, DbFilename + "-journal");
- if (File.Exists(journalPath))
- {
- File.Move(journalPath, Path.Combine(dataPath, DbFilename + ".old-journal"));
- }
- }
- catch (IOException e)
- {
- _logger.LogError(e, "Error renaming legacy activity log database to 'authentication.db.old'");
- }
- }
- }
- }
|