diff --git a/JSON/AnP.settings.json b/JSON/AnP.settings.json index 393a3ca..cdedb78 100644 --- a/JSON/AnP.settings.json +++ b/JSON/AnP.settings.json @@ -51,8 +51,23 @@ }, "AnP_QueuesManager_end" : null, + "AnP_DatabasesManager_start" : null, + "AnP_DatabasesManager_end" : null, + + "AnP_DispatchesManager_start" : null, + "default_dispatches" : { + "sqlserver" : { + "sessions" : { + "type" : "SessionsSQLServerDispatch", + "database" : "anp" + } + } + }, + "AnP_DispatchesManager_end" : null, + "AnP_ControllersManager_start" : null, "default_controllers" : { + "sessions" : "SessionsController", "ai" : "AIController", "clonations_processes" : "CloneController", "ai_translate" : "AITranslateController" diff --git a/Python/AnP/Controllers/AIController.py b/Python/AnP/Controllers/AIController.py index a200a3f..0f48dbf 100644 --- a/Python/AnP/Controllers/AIController.py +++ b/Python/AnP/Controllers/AIController.py @@ -2,13 +2,12 @@ # -*- coding: utf-8 -*- from typing import Self, Callable -from AnP.Abstracts.ModelAbstract import ModelAbstract from AnP.Abstracts.ControllerAbstract import ControllerAbstract from AnP.Models.RequestModel import RequestModel from AnP.Models.AIResponseModel import AIResponseModel from AnP.Utils.Common import Common -class AIController(ControllerAbstract, ModelAbstract): +class AIController(ControllerAbstract): def __analyse_loras(self:Self, iterations:dict[str, int], diff --git a/Python/AnP/Controllers/SessionsController.py b/Python/AnP/Controllers/SessionsController.py new file mode 100644 index 0000000..91ca5f5 --- /dev/null +++ b/Python/AnP/Controllers/SessionsController.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from typing import Self +from AnP.Abstracts.ControllerAbstract import ControllerAbstract +from AnP.Models.RequestModel import RequestModel + +class SessionsController(ControllerAbstract): + + def get_guest(self:Self, request:RequestModel) -> None: + pass + + def login(self:Self, request:RequestModel) -> None: + pass + + def logout(self:Self, request:RequestModel) -> None: + pass + + def update(self:Self, request:RequestModel) -> None: + pass + + def register(self:Self, request:RequestModel) -> None: + pass + + def change_password(self:Self, request:RequestModel) -> None: + pass \ No newline at end of file diff --git a/Python/AnP/Dispatches/SQLServer/SessionsSQLServerDispatch.py b/Python/AnP/Dispatches/SQLServer/SessionsSQLServerDispatch.py new file mode 100644 index 0000000..3f06e96 --- /dev/null +++ b/Python/AnP/Dispatches/SQLServer/SessionsSQLServerDispatch.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from typing import Self, Any, Optional, Sequence +from AnP.Interfaces.Application.AnPInterface import AnPInterface +from AnP.Abstracts.DispatchAbstract import DispatchAbstract +from AnP.Models.DatabaseResponseModel import DatabaseResponseModel +from AnP.Utils.Common import Common + +class SessionsSQLServerDispatch(DispatchAbstract): + + def __init__(self:Self, anp:AnPInterface, inputs:Optional[dict[str, Any|None]|Sequence[Any|None]] = None) -> None: + super().__init__(anp, inputs) + + self.__database:str = Common.get_value("database", inputs, "anp_sqlserver") + + def get_guest(self:Self, session:int|None, ip:str) -> tuple[str, int|None, list[str]]: + + response:DatabaseResponseModel = self.anp.databases.execute( + self.__database, + "execute dbo.sessions_login_guest {session}, {ip}, @errors output, @id output", + {"session" : session, "ip" : ip} + ) + + return response.variables.get("errors"), response.variables.get("id") + + def login(self:Self, session:int, nick:str, password:str, ip:str) -> tuple[str, int|None, list[str]]: + + response:DatabaseResponseModel = self.anp.databases.execute( + self.__database, + "execute dbo.sessions_login {session}, {nick}, {password}, {ip}, @errors output, @id output", + {"session" : session, "nick" : nick, "password" : password, "ip" : ip} + ) + + return response.variables.get("errors"), response.variables.get("id") + + def logout(self:Self, session:int) -> tuple[str, int|None, list[str]]: + + response:DatabaseResponseModel = self.anp.databases.execute( + self.__database, + "execute dbo.sessions_logout {session}, @errors output, @id output", + {"session" : session} + ) + + return response.variables.get("errors"), response.variables.get("id") + + def update(self:Self, session:int, ip:str) -> tuple[str, list[str]]: + + response:DatabaseResponseModel = self.anp.databases.execute( + self.__database, + "execute dbo.sessions_update {session}, {ip}, @errors output", + {"session" : session, "ip" : ip} + ) + + return response.variables.get("errors") + + def register(self:Self, session:int, nick:str, password:str, email:str) -> str: + + response:DatabaseResponseModel = self.anp.databases.execute( + self.__database, + "execute dbo.sessions_login {session}, {nick}, {password}, {email}, @errors output", + {"session" : session, "nick" : nick, "password" : password, "email" : email} + ) + + return response.variables.get("errors") + + def change_password(self:Self, session:int, current_password:str, new_password:str) -> str: + + response:DatabaseResponseModel = self.anp.databases.execute( + self.__database, + "execute dbo.sessions_login {session}, {current_password}, {new_password}, @errors output", + {"session" : session, "current_password" : current_password, "new_password" : new_password} + ) + + return response.variables.get("errors") \ No newline at end of file diff --git a/Python/base.py b/Python/base.py index 9f57b7b..4c31bf4 100644 --- a/Python/base.py +++ b/Python/base.py @@ -13,12 +13,16 @@ from AnP.Drivers.SeleniumDriver import SeleniumDriver from AnP.Drivers.SQLiteDriver import SQLiteDriver from AnP.Controllers.CloneController import CloneController from AnP.Controllers.AITranslateController import AITranslateController +from AnP.Controllers.SessionsController import SessionsController +from AnP.Dispatches.SQLServer.SessionsSQLServerDispatch import SessionsSQLServerDispatch inputs:dict[str, dict[str, Any|None]] = { "default_models" : { + "SessionsController" : SessionsController, "AIController" : AIController, "CloneController" : CloneController, "AITranslateController" : AITranslateController, + "SessionsSQLServerDispatch" : SessionsSQLServerDispatch, "WebSocketServerDriver" : WebSocketServerDriver, "HTTPSocketServerDriver" : HTTPSocketServerDriver, "HTTPServerDriver" : HTTPServerDriver, diff --git a/SQLServer/AnP.02.users.server.sql b/SQLServer/AnP.02.users.build.server.sql similarity index 100% rename from SQLServer/AnP.02.users.server.sql rename to SQLServer/AnP.02.users.build.server.sql diff --git a/SQLServer/AnP.03.ips.server.sql b/SQLServer/AnP.03.ips.build.server.sql similarity index 100% rename from SQLServer/AnP.03.ips.server.sql rename to SQLServer/AnP.03.ips.build.server.sql diff --git a/SQLServer/AnP.04.sessions.server.sql b/SQLServer/AnP.04.sessions.build.server.sql similarity index 100% rename from SQLServer/AnP.04.sessions.server.sql rename to SQLServer/AnP.04.sessions.build.server.sql diff --git a/SQLServer/AnP.05.groups.server.sql b/SQLServer/AnP.05.groups.build.server.sql similarity index 100% rename from SQLServer/AnP.05.groups.server.sql rename to SQLServer/AnP.05.groups.build.server.sql diff --git a/SQLServer/AnP.06.settings.server.sql b/SQLServer/AnP.06.settings.build.server.sql similarity index 100% rename from SQLServer/AnP.06.settings.server.sql rename to SQLServer/AnP.06.settings.build.server.sql diff --git a/SQLServer/AnP.07.logs.server.sql b/SQLServer/AnP.07.logs.build.server.sql similarity index 100% rename from SQLServer/AnP.07.logs.server.sql rename to SQLServer/AnP.07.logs.build.server.sql diff --git a/SQLServer/AnP.08.permissions.server.sql b/SQLServer/AnP.08.permissions.build.server.sql similarity index 99% rename from SQLServer/AnP.08.permissions.server.sql rename to SQLServer/AnP.08.permissions.build.server.sql index 66602bf..dbc2103 100644 --- a/SQLServer/AnP.08.permissions.server.sql +++ b/SQLServer/AnP.08.permissions.build.server.sql @@ -55,7 +55,7 @@ create procedure dbo.permissions_tables_create as begin set nocount on constraint fk_permissions_groups_permission foreign key(permission) references dbo.Permissions(id) on update no action on delete no action, - constraint fk_permissions_groups_group foreign key([group]) references dbo.Users(id) + constraint fk_permissions_groups_group foreign key([group]) references dbo.Groups(id) on update no action on delete no action, constraint uq_permissions_groups unique(permission, [group]) with(fillfactor = 90) @@ -107,7 +107,7 @@ create procedure dbo.permissions_tables_create as begin set nocount on constraint fk__permissions_groups_permission foreign key(permission) references dbo.Permissions(id) on update no action on delete no action, - constraint fk__permissions_groups_group foreign key([group]) references dbo.Users(id) + constraint fk__permissions_groups_group foreign key([group]) references dbo.Groups(id) on update no action on delete no action ) diff --git a/SQLServer/AnP.09.fill.server.sql b/SQLServer/AnP.09.fill.server.sql index 8e4697b..5f84586 100644 --- a/SQLServer/AnP.09.fill.server.sql +++ b/SQLServer/AnP.09.fill.server.sql @@ -14,6 +14,7 @@ create procedure dbo.common_tables_fill as begin set nocount on declare @guest_user_id integer = (select top 1 id from dbo.Users where nick = 'guest') declare @guest_group_id integer = (select top 1 id from dbo.Groups where [name] = 'guest' and date_out is null) declare @root_group_id integer = (select top 1 id from dbo.Groups where [name] = 'root' and date_out is null) + declare @user_permissions_id integer = (select top 1 id from dbo.Permissions where [name] = 'user' and date_out is null) declare @guest_permissions_id integer = (select top 1 id from dbo.Permissions where [name] = 'guest' and date_out is null) declare @administrator_permissions_id integer = (select top 1 id from dbo.Permissions where [name] = 'administrator' and date_out is null) declare @user_group_id integer = (select top 1 id from dbo.Groups where [name] = 'users' and date_out is null) @@ -75,8 +76,40 @@ create procedure dbo.common_tables_fill as begin set nocount on delete from dbo._Ips where [session] != @machine end - execute dbo.users_tables_upgrade - execute dbo.ips_tables_upgrade + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = 'Users' and + constraint_name = 'fk_users_session' + ) is null alter table dbo.Users add constraint fk_users_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = '_Users' and + constraint_name = 'fk__users_session' + ) is null alter table dbo._Users add constraint fk__users_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = 'Ips' and + constraint_name = 'fk_ips_session' + ) is null alter table dbo.Ips add constraint fk_ips_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + + if (select top 1 0 from information_schema.table_constraints where + table_catalog = db_name() and + table_name = '_Ips' and + constraint_name = 'fk__ips_session' + ) is null alter table dbo._Ips add constraint fk__ips_session foreign key([session]) references dbo.Sessions(id) + on update no action + on delete no action + + -- execute dbo.users_tables_upgrade + -- execute dbo.ips_tables_upgrade end @@ -134,9 +167,14 @@ create procedure dbo.common_tables_fill as begin set nocount on (@procedure, @machine, 'users', 1) set @user_group_id = scope_identity() end - if (select top 1 0 from dbo.PermissionsGroups where permission = @guest_permissions_id and [group] = @user_group_id) is null + if @user_permissions_id is null begin + insert into dbo.Permissions([procedure], [session], [name], [description]) values + (@procedure, @machine, 'user', 'User permissions') + set @user_permissions_id = scope_identity() + end + if (select top 1 0 from dbo.PermissionsGroups where permission = @user_permissions_id and [group] = @user_group_id) is null insert into dbo.PermissionsGroups([procedure], [session], permission, [group]) values - (@procedure, @machine, @guest_permissions_id, @user_group_id) + (@procedure, @machine, @user_permissions_id, @user_group_id) drop table #Settings diff --git a/SQLServer/AnP.10.common.server.sql b/SQLServer/AnP.10.common.server.sql index 436bd1e..4761aa1 100644 --- a/SQLServer/AnP.10.common.server.sql +++ b/SQLServer/AnP.10.common.server.sql @@ -1,5 +1,18 @@ use AnP +if object_id(N'dbo.bw', N'FN') is not null drop function dbo.bw +go +create function dbo.bw( + @number bigint, + @bits smallint +) returns bigint begin + return (case + when @bits > 0 then @number * power(cast(2 as bigint), @bits) + when @bits < 0 then @number / power(cast(2 as bigint), -@bits) + else @number end) +end +go + if object_id(N'dbo.where_set', N'FN') is not null drop function dbo.where_set go create function dbo.where_set( @@ -22,7 +35,7 @@ create procedure tables_list( @pages integer output, @items integer output, @results integer output -) as begin set nocount on +) with execute as owner as begin set nocount on declare @item_from integer declare @query nvarchar(max) @@ -45,7 +58,7 @@ create procedure tables_list( set @query = ( N'select * from ' + @view + @where_string + - ' order by ' + (case when isnull(@order_by, '') = '' then 'id asc' else @order_by end) + + ' order by ' + (case when isnull(@order_by, '') = '' then 'id desc' else @order_by end) + ' offset ' + convert(varchar(14), (@page - 1) * @items_per_page) + ' rows fetch next ' + convert(varchar(14), @items_per_page) + ' rows only' ) @@ -53,4 +66,15 @@ create procedure tables_list( set @results = @@rowcount end +go + +if object_id(N'dbo.json_set', N'FN') is not null drop function dbo.json_set +go +create function dbo.json_set( + @path varchar(max), + @key varchar(max), + @value varchar(max) +) returns varchar(max) begin + return json_modify(@path, '$.' + @key, @value) +end go \ No newline at end of file diff --git a/SQLServer/AnP.12.sessions.manager.server.sql b/SQLServer/AnP.12.sessions.manager.server.sql new file mode 100644 index 0000000..4d0bc02 --- /dev/null +++ b/SQLServer/AnP.12.sessions.manager.server.sql @@ -0,0 +1,456 @@ +use AnP + +if object_id(N'dbo.SessionsPermissionsView', N'V') is not null drop view dbo.SessionsPermissionsView +go +create view dbo.SessionsPermissionsView as + select distinct + sessions.id as [session], + permissions.name as [permission] + from dbo.SessionsActived sessions + join dbo.Users users on sessions.[user] = users.id + join dbo.Ips ips on sessions.[ip] = ips.id + join dbo.GroupsUsers groups_users on groups_users.belongs = 1 and users.id = groups_users.[user] + join dbo.GroupsIps groups_ips on groups_ips.belongs = 1 and ips.id = groups_ips.[ip] + join dbo.Groups groups on groups_users.[group] = groups.id or groups_ips.[group] = groups.id + join dbo.PermissionsGroups permissions_groups on permissions_groups.belongs = 1 and groups.id = permissions_groups.[group] + join dbo.Permissions permissions on permissions_groups.[permission] = permissions.id + where + users.date_out is null and + ips.date_out is null and + groups.date_out is null and + groups_users.date_out is null and + groups_ips.date_out is null and + permissions.date_out is null and + permissions_groups.date_out is null +go + +if object_id(N'dbo.sessions_validate', N'FN') is not null drop function dbo.sessions_validate +go +create function dbo.sessions_validate( + @session integer, + @permissions varchar(max) = '' +) returns integer begin + + declare @error integer = (case + when @session is null then dbo.bw(1, 1) + when @session < 1 then dbo.bw(1, 2) + else isnull(( + select 0 from dbo.SessionsActived where id = @session + ), isnull(( + select dbo.bw(1, 4) from dbo.Sessions where id = @session + ), dbo.bw(1, 3))) end) + + if @error = 0 and @permissions != '' and ( + select top 1 0 from dbo.SessionsPermissionsView where [session] = @session and [permission] in ( + select [value] from string_split(@permissions, ',') + ) + ) is null + set @error = dbo.bw(1, 5) + + return @error +end +go + +if object_id(N'dbo.sessions_nick_validate', N'FN') is not null drop function dbo.sessions_nick_validate +go +create function dbo.sessions_nick_validate( + @nick varchar(32) +) returns integer begin + return (case + when @nick is null then dbo.bw(1, 1) + when @nick = '' then dbo.bw(1, 2) + when len(@nick) > 32 then dbo.bw(1, 3) + when @nick like '%[^a-zA-Z0-9]%' then dbo.bw(1, 4) + when @nick like '[^a-zA-Z]%' then dbo.bw(1, 5) + else 0 end) +end +go + +if object_id(N'dbo.sessions_password_validate', N'FN') is not null drop function dbo.sessions_password_validate +go +create function dbo.sessions_password_validate( + @password varchar(256) +) returns integer begin + return (case + when @password is null then dbo.bw(1, 1) + when @password = '' then dbo.bw(1, 2) + when len(@password) > 256 then dbo.bw(1, 3) + else ( + (case when @password collate Latin1_General_100_CS_AS_SC_UTF8 not like '%[a-z]%' then dbo.bw(1, 4) else 0 end) | + (case when @password collate Latin1_General_100_CS_AS_SC_UTF8 not like '%[A-Z]%' then dbo.bw(1, 5) else 0 end) | + (case when @password not like '%[0-9]%' then dbo.bw(1, 6) else 0 end) | + (case when @password not like '%[^a-zA-Z0-9]%' then dbo.bw(1, 7) else 0 end) | + 0) end) +end +go + +if object_id(N'dbo.ips_set', N'P') is not null drop procedure dbo.ips_set +go +create procedure dbo.ips_set( + @procedure integer, + @session integer, + @address varchar(39), + @error integer output, + @id integer output +) as begin set nocount on + + set @error = (case + when @address is null then dbo.bw(1, 1) + when @address = '' then dbo.bw(1, 2) + when len(@address) > 39 then dbo.bw(1, 3) + when @address not like '[0-9a-fA-F:.]%' then dbo.bw(1, 4) + when not (( + @address like '%._%._%._%' and + @address not like '%[^0-9.]%' and + len(@address) - len(replace(@address, '.', '')) = 3 and + parsename(@address, 1) between 0 and 255 and + parsename(@address, 2) between 0 and 255 and + parsename(@address, 3) between 0 and 255 and + parsename(@address, 4) between 0 and 255 + ) or ( + @address not like '%[^0-9a-fA-F:]%' and + @address like '%:%' and + @address not like '%:::%' and + @address not like '%[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]%' and + len(@address) - len(replace(@address, ':', '')) between 2 and 7 + )) then dbo.bw(1, 5) + else 0 end) + + if @error = 0 begin + insert into dbo.Ips([procedure], [session], [address]) values (@procedure, @session, @address) + set @id = scope_identity() + end + +end +go + +if object_id(N'dbo.sessions_register', N'P') is not null drop procedure dbo.sessions_register +go +create procedure dbo.sessions_register( + @session integer, + @nick varchar(32), + @password varchar(256), + @email varchar(256), + @errors varchar(512) output +) as begin set nocount on + + declare @database varchar(64) = db_name() + declare @procedure_id integer + declare @parameters varchar(max) = '{' + + '"session":' + convert(varchar(14), @session) + ',' + + '"nick":"' + @nick + '",' + + -- '"password":"' + @password + '",' + + '"email":"' + @email + '",' + + '"id":null' + + '}' + declare @error_code integer = 0 + declare @password_hash varbinary(64) + declare @id integer = null + + execute dbo.procedure_get_id @database, 'sessions_register', @procedure_id output + set @errors = '' + + begin try + + declare @nick_error integer = dbo.sessions_nick_validate(@nick) + declare @password_error integer = dbo.sessions_password_validate(@password) + + set @error_code = ( + dbo.bw(dbo.sessions_validate(@session, 'guest'), 1) | + dbo.bw(@nick_error, 7) | + dbo.bw(@password_error, 14) | + 0) + + if @error_code = 0 begin + if (select top 1 0 from dbo.Users where date_out is null and nick = @nick) is not null + set @error_code = @error_code | dbo.bw(1, 13) + if @error_code = 0 begin + insert into dbo.Users(nick, password) values + (@nick, hashbytes(dbo.settings_get('password_hash_algorithm', null, 'SHA2_512'), @password)) + set @id = scope_identity() + set @parameters = dbo.json_set(@parameters, 'id', @id) + end + end + + end try + begin catch + set @error_code = @error_code | dbo.bw(1, 0) + execute dbo.exceptions_set @procedure_id, @session, @parameters, @errors + end catch + + execute dbo.logs_set @procedure_id, @session, @parameters, @errors, 1 + +end +go + +if object_id(N'dbo.sessions_login_guest', N'P') is not null drop procedure dbo.sessions_login_guest +go +create procedure dbo.sessions_login_guest( + @session integer, + @ip varchar(39), + @errors varchar(512) output, + @id integer output +) as begin set nocount on + + declare @database varchar(64) = db_name() + declare @procedure_id integer + declare @machine integer = dbo.machine_session_get() + declare @parameters varchar(max) = '{"ip":"' + @ip + '","id":null}' + declare @error_code integer = 0 + + set @errors = '' + execute dbo.procedure_get_id @database, 'sessions_login_guest', @procedure_id output + + begin try + + declare @ip_id integer + declare @ip_error integer + + execute dbo.ips_set @procedure_id, @session, @ip, @ip_error output, @ip_id output + + set @error_code = ( + (case when @session is null then 0 else dbo.bw(1, 1) end) | + dbo.bw(@ip_error, 2) | + 0) + + if @error_code = 0 begin + insert into dbo.SessionsActived([procedure], [user], [ip]) values (@procedure_id, @machine, @ip_id) + set @id = scope_identity() + set @parameters = dbo.json_set(@parameters, 'id', @id) + end + + end try + begin catch + set @error_code = @errors | dbo.bw(1, 0) + execute dbo.exceptions_set @procedure_id, @machine, @parameters, @errors + end catch + + set @errors = '' + + select [permission] from dbo.SessionsPermissionsView where [session] = @id + + execute dbo.logs_set @procedure_id, @machine, @parameters, @errors, 1 + +end +go + +if object_id(N'dbo.sessions_login', N'P') is not null drop procedure dbo.sessions_login +go +create procedure dbo.sessions_login( + @session integer, + @user varchar(32), + @password varchar(256), + @ip varchar(39), + @errors varchar(512) output, + @id integer output +) as begin set nocount on + + declare @database varchar(64) = db_name() + declare @procedure_id integer + declare @error_code integer = 0 + declare @parameters varchar(max) = '{' + + '"user":"' + @user + '"' + + -- ',"password":"' + @password + '"' + + ',"ip":"' + @ip + '",' + + '"id":null' + + '}' + + set @errors = '' + execute dbo.procedure_get_id @database, 'sessions_login', @procedure_id output + + begin try + + declare @ip_id integer + declare @ip_error integer + + execute dbo.ips_set @procedure_id, @session, @ip, @ip_error output, @ip_id output + + set @error_code = ( + dbo.bw(dbo.sessions_validate(@session, 'guest'), 1) | + dbo.bw(dbo.sessions_nick_validate(@user), 7) | + dbo.bw(dbo.sessions_password_validate(@password), 15) | + dbo.bw(@ip_error, 23) | + 0) + + if @error_code = 0 begin + + declare @user_id integer = (select top 1 id from dbo.Users where nick = @user) + + set @error_code = @error_code | (select top 1 ( + (case when date_out is null then 0 else dbo.bw(1, 13) end) | + (case when password = hashbytes(dbo.settings_get('password_hash_algorithm', null, 'SHA2_512'), @password) then 0 else dbo.bw(1, 14) end) | + 0) from dbo.Users where id = @user_id) + + if @error_code = 0 begin + insert into dbo.SessionsActived([procedure], [user], [ip]) values(@procedure_id, @user_id, @ip_id) + set @id = scope_identity() + set @parameters = dbo.json_set(@parameters, 'id', @id) + end + + end + + end try + begin catch + set @error_code = @errors | dbo.bw(1, 0) + execute dbo.exceptions_set @procedure_id, @session, @parameters, @errors + end catch + + execute dbo.logs_set @procedure_id, @session, @parameters, @errors, 1 + +end +go + +if object_id(N'dbo.sessions_logout', N'P') is not null drop procedure dbo.sessions_logout +go +create procedure dbo.sessions_logout( + @session integer, + @errors varchar(512) output, + @id integer output +) as begin set nocount on + + declare @database varchar(64) = db_name() + declare @procedure_id integer + declare @error_code integer = 0 + declare @parameters varchar(max) = '{' + + '"session":' + convert(varchar(14), @session) + ',' + + '"id":null' + + '}' + + set @errors = '' + execute dbo.procedure_get_id @database, 'sessions_logout', @procedure_id output + + begin try + + set @error_code = ( + dbo.bw(dbo.sessions_validate(@session, ''), 1) | + 0) + + if @error_code = 0 begin + insert into dbo.SessionsActived([procedure], [user], [ip]) select @procedure_id, [user], [ip] from dbo.SessionsActived where id = @session + set @id = scope_identity() + delete from dbo.SessionsActived where id = @session + set @parameters = dbo.json_set(@parameters, 'id', @id) + end + + end try + begin catch + set @error_code = @errors | dbo.bw(1, 0) + execute dbo.exceptions_set @procedure_id, @session, @parameters, @errors + end catch + + execute dbo.logs_set @procedure_id, @session, @parameters, @errors, 1 + +end +go + +if object_id(N'dbo.sessions_update', N'P') is not null drop procedure dbo.sessions_update +go +create procedure dbo.sessions_update( + @session integer, + @ip varchar(39), + @errors varchar(512) output, + @id integer output +) as begin set nocount on + + declare @database varchar(64) = db_name() + declare @procedure_id integer + declare @error_code integer = 0 + declare @parameters varchar(max) = '{' + + '"session":' + convert(varchar(14), @session) + ',' + + '"ip":"' + @ip + '",' + + '"id":null' + + '}' + + set @errors = '' + execute dbo.procedure_get_id @database, 'sessions_update', @procedure_id output + + begin try + + declare @ip_id integer + declare @ip_error integer + + execute dbo.ips_set @procedure_id, @session, @ip, @ip_error output, @ip_id output + + set @error_code = ( + dbo.bw(dbo.sessions_validate(@session, ''), 1) | + dbo.bw(@ip_error, 2) | + 0) + + if @error_code = 0 + update dbo.SessionsActived set [ip] = @ip_id, date_last = getdate() where id = @session + + end try + begin catch + set @error_code = @errors | dbo.bw(1, 0) + execute dbo.exceptions_set @procedure_id, @session, @parameters, @errors + end catch + + execute dbo.logs_set @procedure_id, @session, @parameters, @errors, 8 + +end +go + +if object_id(N'dbo.sessions_autoclose', N'P') is not null drop procedure dbo.sessions_autoclose +go +create procedure dbo.sessions_autoclose as begin set nocount on + delete from dbo.SessionsActived where datediff(second, date_last, getdate()) > timeout +end +go + +if object_id(N'dbo.sessions_change_password', N'P') is not null drop procedure dbo.sessions_change_password +go +create procedure dbo.sessions_change_password( + @session integer, + @current_password varchar(256), + @new_password varchar(256), + @errors varchar(512) output +) as begin set nocount on + + declare @database varchar(64) = db_name() + declare @procedure_id integer + declare @error_code integer = 0 + declare @parameters varchar(max) = '{' + + '"session":' + convert(varchar(14), @session) + ',' + + '"id":null' + + '}' + + set @errors = '' + execute dbo.procedure_get_id @database, 'sessions_change_password', @procedure_id output + + begin try + + set @error_code = ( + dbo.bw(dbo.sessions_validate(@session, ''), 1) | + dbo.bw(dbo.sessions_password_validate(@current_password), 6) | + dbo.bw(dbo.sessions_password_validate(@new_password), 15) | + (case when @current_password = @new_password then dbo.bw(1, 23) else 0 end) | + 0) + + if @error_code = 0 begin + if ( + select top 1 0 + from dbo.SessionsActived sessions + join dbo.Users users on sessions.[user] = users.id + where + sessions.id = @session and + users.password != hashbytes(dbo.settings_get('password_hash_algorithm', null, 'SHA2_512'), @current_password) + ) is null + set @error_code = @error_code | dbo.bw(1, 14) + else + update users + set users.[password] = hashbytes(dbo.settings_get('password_hash_algorithm', null, 'SHA2_512'), @new_password) + from dbo.SessionsActived sessions + join dbo.Users users on sessions.[user] = users.id + where sessions.id = @session + end + + end try + begin catch + set @error_code = @errors | dbo.bw(1, 0) + execute dbo.exceptions_set @procedure_id, @session, @parameters, @errors + end catch + + execute dbo.logs_set @procedure_id, @session, @parameters, @errors, 1 + +end +go \ No newline at end of file diff --git a/Tools/sqlserver.install.bat b/Tools/sqlserver.install.bat index fc91844..2d07f36 100644 --- a/Tools/sqlserver.install.bat +++ b/Tools/sqlserver.install.bat @@ -12,7 +12,7 @@ if exist Tools\sqlserver.secrets.cmd ( call Tools\sqlserver.secrets.cmd ) -docker compose ps | findstr "anp-sql-server" >nul || call Tools\dockers.execute.bat +docker compose ps | findstr "anp-sql-server" >nul || (call Tools\dockers.execute.bat && sleep 3) for %%f in (SQLServer\AnP.*.sql) do ( echo %%f