Exemplo n.º 1
0
        /// <summary>
        /// Import config file that was sent to in API body - this act as import from backup
        /// </summary>
        /// <returns>APIStatus</returns>
        private object ImportConfig()
        {
            CL_ServerSettings settings     = this.Bind();
            string            raw_settings = settings.ToJSON();

            if (raw_settings.Length != new CL_ServerSettings().ToJSON().Length)
            {
                string path = Path.Combine(ServerSettings.ApplicationPath, "temp.json");
                File.WriteAllText(path, raw_settings, Encoding.UTF8);
                try
                {
                    ServerSettings.LoadSettingsFromFile(path, true);
                    return(APIStatus.OK());
                }
                catch
                {
                    return(APIStatus.InternalError("Error while importing settings"));
                }
            }
            return(APIStatus.BadRequest("Empty settings are not allowed"));
        }
Exemplo n.º 2
0
        public ActionResult TestAniDB()
        {
            ShokoService.AnidbProcessor.ForceLogout();
            ShokoService.AnidbProcessor.CloseConnections();

            Thread.Sleep(1000);

            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(ServerSettings.Instance.Culture);

            ShokoService.AnidbProcessor.Init(ServerSettings.Instance.AniDb.Username, ServerSettings.Instance.AniDb.Password,
                                             ServerSettings.Instance.AniDb.ServerAddress,
                                             ServerSettings.Instance.AniDb.ServerPort, ServerSettings.Instance.AniDb.ClientPort);

            if (!ShokoService.AnidbProcessor.Login())
            {
                return(APIStatus.BadRequest("Failed to log in"));
            }
            ShokoService.AnidbProcessor.ForceLogout();

            return(APIStatus.OK());
        }
Exemplo n.º 3
0
 public ActionResult StartServer()
 {
     if (ServerState.Instance.ServerOnline)
     {
         return(APIStatus.BadRequest("Already Running"));
     }
     if (ServerState.Instance.ServerStarting)
     {
         return(APIStatus.BadRequest("Already Starting"));
     }
     try
     {
         ShokoServer.RunWorkSetupDB();
     }
     catch (Exception e)
     {
         logger.Error($"There was an error starting the server: {e}");
         return(APIStatus.InternalError($"There was an error starting the server: {e}"));
     }
     return(APIStatus.OK());
 }
Exemplo n.º 4
0
        /// <summary>
        /// Return given setting
        /// </summary>
        /// <returns></returns>
        private object GetSetting()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            try
            {
                // TODO Refactor Settings to a POCO that is serialized, and at runtime, build a dictionary of types to validate against
                Settings setting = this.Bind();
                if (string.IsNullOrEmpty(setting?.setting))
                {
                    return(APIStatus.BadRequest("An invalid setting was passed"));
                }
                try
                {
                    var value = typeof(ServerSettings).GetProperty(setting.setting)?.GetValue(null, null);
                    if (value == null)
                    {
                        return(APIStatus.BadRequest("An invalid setting was passed"));
                    }

                    Settings return_setting = new Settings
                    {
                        setting = setting.setting,
                        value   = value.ToString()
                    };
                    return(return_setting);
                }
                catch
                {
                    return(APIStatus.BadRequest("An invalid setting was passed"));
                }
            }
            catch
            {
                return(APIStatus.InternalError());
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Set AniDB account credentials with a Credentials object
        /// </summary>
        /// <returns></returns>
        private object SetAniDB()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            Credentials cred    = this.Bind();
            var         details = new List <(string, string)>();

            if (string.IsNullOrEmpty(cred.login))
            {
                details.Add(("login", "Username missing"));
            }
            if (string.IsNullOrEmpty(cred.password))
            {
                details.Add(("password", "Password missing"));
            }
            if (details.Count > 0)
            {
                return(new APIMessage(400, "Login or Password missing", details));
            }

            ServerSettings.AniDB_Username = cred.login;
            ServerSettings.AniDB_Password = cred.password;
            if (cred.port != 0)
            {
                ServerSettings.AniDB_ClientPort = cred.port.ToString();
            }
            if (!string.IsNullOrEmpty(cred.apikey))
            {
                ServerSettings.AniDB_AVDumpKey = cred.apikey;
            }
            if (cred.apiport != 0)
            {
                ServerSettings.AniDB_AVDumpClientPort = cred.apiport.ToString();
            }

            return(APIStatus.OK());
        }
Exemplo n.º 6
0
        public ActionResult TestDatabaseConnection()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }
            return(APIStatus.NotImplemented()); //TODO: Needs to be redone for EFCore.

            /*if (ServerSettings.Instance.Database.Type.Equals(Constants.DatabaseType.MySQL,
             *      StringComparison.InvariantCultureIgnoreCase) && new MySQL().TestConnection())
             *  return APIStatus.OK();
             *
             * if (ServerSettings.Instance.Database.Type.Equals(Constants.DatabaseType.SqlServer,
             *      StringComparison.InvariantCultureIgnoreCase) && new SQLServer().TestConnection())
             *  return APIStatus.OK();
             *
             * if (ServerSettings.Instance.Database.Type.Equals(Constants.DatabaseType.Sqlite,
             *  StringComparison.InvariantCultureIgnoreCase))
             *  return APIStatus.OK();*/

            //return APIStatus.BadRequest("Failed to Connect");
        }
Exemplo n.º 7
0
        public ActionResult <Credentials> GetAniDB()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            try
            {
                return(new Credentials
                {
                    login = ServerSettings.Instance.AniDb.Username,
                    port = ServerSettings.Instance.AniDb.ClientPort,
                    apiport = ServerSettings.Instance.AniDb.AVDumpClientPort
                });
            }
            catch
            {
                return(APIStatus.InternalError(
                           "The ports are not set as integers. Set them and try again.\n\rThe default values are:\n\rAniDB Client Port: 4556\n\rAniDB AVDump Client Port: 4557"));
            }
        }
Exemplo n.º 8
0
        public ActionResult <DatabaseSettings> GetDatabaseSettings()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            var settings = new DatabaseSettings
            {
                db_type                  = ServerSettings.Instance.Database.Type,
                mysql_hostname           = ServerSettings.Instance.Database.Hostname,
                mysql_password           = ServerSettings.Instance.Database.Password,
                mysql_schemaname         = ServerSettings.Instance.Database.Schema,
                mysql_username           = ServerSettings.Instance.Database.Username,
                sqlite_databasefile      = ServerSettings.Instance.Database.SQLite_DatabaseFile,
                sqlserver_databasename   = ServerSettings.Instance.Database.Schema,
                sqlserver_databaseserver = ServerSettings.Instance.Database.Hostname,
                sqlserver_password       = ServerSettings.Instance.Database.Password,
                sqlserver_username       = ServerSettings.Instance.Database.Username
            };

            return(settings);
        }
Exemplo n.º 9
0
        public ActionResult ImportConfig(CL_ServerSettings settings)
        {
            string raw_settings = settings.ToJSON();

            if (raw_settings.Length == new CL_ServerSettings().ToJSON().Length)
            {
                return(APIStatus.BadRequest("Empty settings are not allowed"));
            }

            string path = Path.Combine(ServerSettings.ApplicationPath, "temp.json");

            System.IO.File.WriteAllText(path, raw_settings, Encoding.UTF8);
            try
            {
                ServerSettings.LoadSettingsFromFile(path, true);
                ServerSettings.Instance.SaveSettings();
                return(APIStatus.OK());
            }
            catch
            {
                return(APIStatus.InternalError("Error while importing settings"));
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// Get Database Settings
        /// </summary>
        /// <returns></returns>
        private object GetDatabaseSettings()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            var settings = new DatabaseSettings
            {
                db_type                  = ServerSettings.DatabaseType,
                mysql_hostname           = ServerSettings.MySQL_Hostname,
                mysql_password           = ServerSettings.MySQL_Password,
                mysql_schemaname         = ServerSettings.MySQL_SchemaName,
                mysql_username           = ServerSettings.MySQL_Username,
                sqlite_databasefile      = ServerSettings.DatabaseFile,
                sqlserver_databasename   = ServerSettings.DatabaseName,
                sqlserver_databaseserver = ServerSettings.DatabaseServer,
                sqlserver_password       = ServerSettings.DatabasePassword,
                sqlserver_username       = ServerSettings.DatabaseUsername
            };

            return(settings);
        }
Exemplo n.º 11
0
        /// <summary>
        /// Return existing login and ports for AniDB
        /// </summary>
        /// <returns></returns>
        private object GetAniDB()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            try
            {
                Credentials cred = new Credentials
                {
                    login   = ServerSettings.AniDB_Username,
                    port    = int.Parse(ServerSettings.AniDB_ClientPort),
                    apiport = int.Parse(ServerSettings.AniDB_AVDumpClientPort)
                };
                return(cred);
            }
            catch
            {
                return(APIStatus.InternalError(
                           "The ports are not set as integers. Set them and try again.\n\rThe default values are:\n\rAniDB Client Port: 4556\n\rAniDB AVDump Client Port: 4557"));
            }
        }
Exemplo n.º 12
0
        public ActionResult SetDatabaseSettings(DatabaseSettings settings)
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            DatabaseTypes?dbtype = settings?.db_type;

            if (dbtype == null)
            {
                return(APIStatus.BadRequest("You must specify database type and use valid xml or json."));
            }
            if (dbtype == DatabaseTypes.MySql)
            {
                var details = new List <(string, string)>();
                if (string.IsNullOrEmpty(settings.mysql_hostname))
                {
                    details.Add(("mysql_hostname", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.mysql_schemaname))
                {
                    details.Add(("mysql_schemaname", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.mysql_username))
                {
                    details.Add(("mysql_username", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.mysql_password))
                {
                    details.Add(("mysql_password", "Must not be empty"));
                }
                if (details.Count > 0)
                {
                    return(new APIMessage(HttpStatusCode.BadRequest, "An invalid setting was passed", details));
                }
                ServerSettings.Instance.Database.Type     = DatabaseTypes.MySql;
                ServerSettings.Instance.Database.Hostname = settings.mysql_hostname;
                ServerSettings.Instance.Database.Password = settings.mysql_password;
                ServerSettings.Instance.Database.Schema   = settings.mysql_schemaname;
                ServerSettings.Instance.Database.Username = settings.mysql_username;
                return(APIStatus.OK());
            }
            if (dbtype == DatabaseTypes.SqlServer)
            {
                var details = new List <(string, string)>();
                if (string.IsNullOrEmpty(settings.sqlserver_databaseserver))
                {
                    details.Add(("sqlserver_databaseserver", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.sqlserver_databasename))
                {
                    details.Add(("sqlserver_databaseserver", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.sqlserver_username))
                {
                    details.Add(("sqlserver_username", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.sqlserver_password))
                {
                    details.Add(("sqlserver_password", "Must not be empty"));
                }
                if (details.Count > 0)
                {
                    return(new APIMessage(HttpStatusCode.BadRequest, "An invalid setting was passed", details));
                }
                ServerSettings.Instance.Database.Type     = DatabaseTypes.SqlServer;
                ServerSettings.Instance.Database.Hostname = settings.sqlserver_databaseserver;
                ServerSettings.Instance.Database.Schema   = settings.sqlserver_databasename;
                ServerSettings.Instance.Database.Username = settings.sqlserver_username;
                ServerSettings.Instance.Database.Password = settings.sqlserver_password;
                return(APIStatus.OK());
            }
            if (dbtype == DatabaseTypes.Sqlite)
            {
                ServerSettings.Instance.Database.Type = DatabaseTypes.Sqlite;
                if (!string.IsNullOrEmpty(settings.sqlite_databasefile))
                {
                    ServerSettings.Instance.Database.SQLite_DatabaseFile = settings.sqlite_databasefile;
                }
                return(APIStatus.OK());
            }
            return(APIStatus.BadRequest("An invalid setting was passed"));
        }
Exemplo n.º 13
0
        public ActionResult <List <APIMessage> > SetSetting(List <Setting> settings)
        {
            // TODO Refactor Settings to a POCO that is serialized, and at runtime, build a dictionary of types to validate against
            try
            {
                List <APIMessage> errors = new List <APIMessage>();
                for (var index = 0; index < settings.Count; index++)
                {
                    var setting = settings[index];
                    if (string.IsNullOrEmpty(setting.setting))
                    {
                        errors.Add(APIStatus.BadRequest($"{index}: An invalid setting was passed"));
                        continue;
                    }

                    if (setting.value == null)
                    {
                        errors.Add(APIStatus.BadRequest($"{index}: An invalid value was passed"));
                        continue;
                    }

                    var property = typeof(ServerSettings).GetProperty(setting.setting);
                    if (property == null)
                    {
                        errors.Add(APIStatus.BadRequest($"{index}: An invalid setting was passed"));
                        continue;
                    }

                    if (!property.CanWrite)
                    {
                        errors.Add(APIStatus.BadRequest($"{index}: An invalid setting was passed"));
                        continue;
                    }
                    var settingType = property.PropertyType;
                    try
                    {
                        var converter = TypeDescriptor.GetConverter(settingType);
                        if (!converter.CanConvertFrom(typeof(string)))
                        {
                            errors.Add(APIStatus.BadRequest($"{index}: An invalid value was passed"));
                            continue;
                        }
                        var value = converter.ConvertFromInvariantString(setting.value);
                        if (value == null)
                        {
                            errors.Add(APIStatus.BadRequest($"{index}: An invalid value was passed"));
                            continue;
                        }
                        property.SetValue(null, value);
                    }
                    catch
                    {
                        errors.Add(APIStatus.BadRequest($"{index}: An invalid value was passed"));
                    }
                }

                if (errors.Count > 0)
                {
                    HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                    return(errors);
                }

                return(APIStatus.OK());
            }
            catch
            {
                return(APIStatus.InternalError());
            }
        }
Exemplo n.º 14
0
        public ActionResult <APIMessage> TestDatabaseConnection()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            return(new Repositories.Repo().GetProvider().GetContext() != null?APIStatus.OK() : APIStatus.BadRequest("Failed to connect"));

            //return APIStatus.BadRequest("Failed to Connect");
        }
Exemplo n.º 15
0
        /// <summary>
        /// Set Database Settings
        /// </summary>
        /// <returns></returns>
        private object SetDatabaseSettings()
        {
            if (ServerState.Instance.ServerOnline || ServerState.Instance.ServerStarting)
            {
                return(APIStatus.BadRequest("You may only do this before server init"));
            }

            DatabaseSettings settings = this.Bind();
            string           dbtype   = settings?.db_type?.Trim();

            if (string.IsNullOrEmpty(dbtype))
            {
                return(APIStatus.BadRequest("You must specify database type and use valid xml or json."));
            }
            if (dbtype.Equals(Constants.DatabaseType.MySQL, StringComparison.InvariantCultureIgnoreCase))
            {
                var details = new List <(string, string)>();
                if (string.IsNullOrEmpty(settings.mysql_hostname))
                {
                    details.Add(("mysql_hostname", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.mysql_schemaname))
                {
                    details.Add(("mysql_schemaname", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.mysql_username))
                {
                    details.Add(("mysql_username", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.mysql_password))
                {
                    details.Add(("mysql_password", "Must not be empty"));
                }
                if (details.Count > 0)
                {
                    return(new APIMessage(HttpStatusCode.BadRequest, "An invalid setting was passed", details));
                }
                ServerSettings.DatabaseType     = Constants.DatabaseType.MySQL;
                ServerSettings.MySQL_Hostname   = settings.mysql_hostname;
                ServerSettings.MySQL_Password   = settings.mysql_password;
                ServerSettings.MySQL_SchemaName = settings.mysql_schemaname;
                ServerSettings.MySQL_Username   = settings.mysql_username;
                return(APIStatus.OK());
            }
            if (dbtype.Equals(Constants.DatabaseType.SqlServer, StringComparison.InvariantCultureIgnoreCase))
            {
                var details = new List <(string, string)>();
                if (string.IsNullOrEmpty(settings.sqlserver_databaseserver))
                {
                    details.Add(("sqlserver_databaseserver", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.sqlserver_databasename))
                {
                    details.Add(("sqlserver_databaseserver", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.sqlserver_username))
                {
                    details.Add(("sqlserver_username", "Must not be empty"));
                }
                if (string.IsNullOrEmpty(settings.sqlserver_password))
                {
                    details.Add(("sqlserver_password", "Must not be empty"));
                }
                if (details.Count > 0)
                {
                    return(new APIMessage(HttpStatusCode.BadRequest, "An invalid setting was passed", details));
                }
                ServerSettings.DatabaseType     = Constants.DatabaseType.SqlServer;
                ServerSettings.DatabaseServer   = settings.sqlserver_databaseserver;
                ServerSettings.DatabaseName     = settings.sqlserver_databasename;
                ServerSettings.DatabaseUsername = settings.sqlserver_username;
                ServerSettings.DatabasePassword = settings.sqlserver_password;
                return(APIStatus.OK());
            }
            if (dbtype.Equals(Constants.DatabaseType.Sqlite, StringComparison.InvariantCultureIgnoreCase))
            {
                ServerSettings.DatabaseType = Constants.DatabaseType.Sqlite;
                if (!string.IsNullOrEmpty(settings.sqlite_databasefile))
                {
                    ServerSettings.DatabaseFile = settings.sqlite_databasefile;
                }
                return(APIStatus.OK());
            }
            return(APIStatus.BadRequest("An invalid setting was passed"));
        }