diff --git a/Service.EDMIService/EDMIService.vb b/Service.EDMIService/EDMIService.vb index 8f630a08..f739aa38 100644 --- a/Service.EDMIService/EDMIService.vb +++ b/Service.EDMIService/EDMIService.vb @@ -5,8 +5,9 @@ Imports DigitalData.Modules Imports System.IO Imports System.ServiceModel Imports System.Data.SqlClient -Imports DigitalData.Services.EDMIService.Results Imports System.ServiceModel.Description +Imports DigitalData.Services.EDMIService.Messages +Imports DigitalData.Services.EDMIService.Rights Public Class EDMIService @@ -22,10 +23,9 @@ Public Class EDMIService Public Shared GlobalState As GlobalState Public Shared Scheduler As Scheduler - Private ReadOnly _logger As Logger - - Private ReadOnly _debug As Boolean = False - Private ReadOnly _username As String + Private ReadOnly _Logger As Logger + Private ReadOnly _Debug As Boolean = False + Private ReadOnly _Username As String Public Shared Sub Configure(Config As ServiceConfiguration) Dim oBaseAddress = Config.BaseAddresses.Item(0) @@ -35,8 +35,6 @@ Public Class EDMIService Dim oDescription = ContractDescription.GetContract(GetType(IEDMIService), GetType(EDMIService)) Dim oEndpoint As New ServiceEndpoint(oDescription, oBinding, oAddress) - - Config.AddServiceEndpoint(oEndpoint) Config.Description.Behaviors.Add(New ServiceDebugBehavior With {.IncludeExceptionDetailInFaults = True}) End Sub @@ -46,12 +44,12 @@ Public Class EDMIService Dim oInstanceContext As InstanceContext = oOperationContext.InstanceContext Dim oUsername = StripDomainFromUsername(oOperationContext.ServiceSecurityContext.WindowsIdentity.Name) - _username = oUsername - _logger = LogConfig.GetLogger() - _logger.Debug("New Request by User [{0}]", _username) + _Username = oUsername + _Logger = LogConfig.GetLogger() + _Logger.Debug("New Request by User [{0}]", _Username) End Sub - Public Function StripDomainFromUsername(UserName As String) + Private Function StripDomainFromUsername(UserName As String) If UserName.Contains("\") Then Return UserName.Split("\")(1) ElseIf UserName.Contains("@") Then @@ -61,34 +59,21 @@ Public Class EDMIService End If End Function -#Region "=== Authorization ===" - Private Function TestUserAuth() As Boolean - Try - 'Dim oSQL As String = $"SELECT FNIDB_AUTH_USER('{_username}') FROM RDB$DATABASE;" - 'Dim oResult As Boolean = Database.GetScalarValue(oSQL) - 'Return oResult - Return True - Catch ex As Exception - _logger.Error(ex) - Return False - End Try - End Function -#End Region #Region "=== Heartbeat ===" Public Function Heartbeat() As Boolean Implements IEDMIService.Heartbeat Return True End Function #End Region -#Region "Database" +#Region "=== Database ===" Public Function ReturnDatatableFromCache(Name As String, FilterExpression As String, SortByColumn As String) As TableResult Implements IEDMIService.ReturnDatatableFromCache Try - _logger.Info($"ReturnDatatableFromCache, Datatable: {Name}") + _Logger.Info($"ReturnDatatableFromCache, Datatable: {Name}") - Dim oDataset As DataSet = Scheduler.DataSet + Dim oDataset As DataSet = GlobalState.TableStore Dim oDataTable As DataTable = Nothing - _logger.Debug("DataSet contains [{0}] datatables", oDataset.Tables.Count) + _Logger.Debug("DataSet contains [{0}] datatables", oDataset.Tables.Count) If oDataset.Tables.Contains(Name) Then oDataTable = oDataset.Tables.Item(Name).Copy() @@ -109,16 +94,16 @@ Public Class EDMIService oFilteredTable.TableName = Name End If - _logger.Debug("Datatable Stats for [{0}]:", Name) - _logger.Debug("Unfiltered: [{0}] rows", oDataTable.Rows.Count) - _logger.Debug("Filtered: [{0}] rows", oFilteredTable.Rows.Count) + _Logger.Debug("Datatable Stats for [{0}]:", Name) + _Logger.Debug("Unfiltered: [{0}] rows", oDataTable.Rows.Count) + _Logger.Debug("Filtered: [{0}] rows", oFilteredTable.Rows.Count) Return New TableResult(oFilteredTable) Else Throw New ApplicationException($"DataTable {Name} does not exist") End If Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New TableResult(ex.Message) End Try End Function @@ -127,33 +112,33 @@ Public Class EDMIService #Region "=== Database (MSSQL IDB) ===" Public Function ReturnDatatable_MSSQL_IDB(SQL As String) As TableResult Implements IEDMIService.ReturnDatatable_MSSQL_IDB Try - _logger.Info($"ReturnDatatable_MSSQL_IDB, SQL: {SQL}") + _Logger.Info($"ReturnDatatable_MSSQL_IDB, SQL: {SQL}") Dim oResult As DataTable = MSSQL_IDB.GetDatatable(SQL) Return New TableResult(oResult) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New TableResult(ex.Message) End Try End Function Public Function ReturnScalar_MSSQL_IDB(SQL As String) As ScalarResult Implements IEDMIService.ReturnScalar_MSSQL_IDB Try - _logger.Info($"ReturnScalar_MSSQL_IDB, SQL: {SQL}") + _Logger.Info($"ReturnScalar_MSSQL_IDB, SQL: {SQL}") Dim oResult As Object = MSSQL_IDB.GetScalarValue(SQL) Return New ScalarResult(oResult) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New ScalarResult(ex.Message) End Try End Function Public Function ExecuteNonQuery_MSSQL_IDB(SQL As String) As NonQueryResult Implements IEDMIService.ExecuteNonQuery_MSSQL_IDB Try - _logger.Info($"ExecuteNonQuery_MSSQL_IDB, SQL: {SQL}") + _Logger.Info($"ExecuteNonQuery_MSSQL_IDB, SQL: {SQL}") Dim oResult As Boolean = MSSQL_IDB.ExecuteNonQuery(SQL) Return New NonQueryResult() Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New NonQueryResult(ex.Message) End Try End Function @@ -162,33 +147,33 @@ Public Class EDMIService #Region "=== Database (MSSQL ECM) ===" Public Function ReturnDatatable_MSSQL_ECM(SQL As String) As TableResult Implements IEDMIService.ReturnDatatable_MSSQL_ECM Try - _logger.Info($"ReturnDatatable_MSSQL_ECM, SQL: {SQL}") + _Logger.Info($"ReturnDatatable_MSSQL_ECM, SQL: {SQL}") Dim oResult As DataTable = MSSQL_ECM.GetDatatable(SQL) Return New TableResult(oResult) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New TableResult(ex.Message) End Try End Function Public Function ReturnScalar_MSSQL_ECM(SQL As String) As ScalarResult Implements IEDMIService.ReturnScalar_MSSQL_ECM Try - _logger.Info($"ReturnScalar_MSSQL_ECM, SQL: {SQL}") + _Logger.Info($"ReturnScalar_MSSQL_ECM, SQL: {SQL}") Dim oResult As Object = MSSQL_ECM.GetScalarValue(SQL) Return New ScalarResult(oResult) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New ScalarResult(ex.Message) End Try End Function Public Function ExecuteNonQuery_MSSQL_ECM(SQL As String) As NonQueryResult Implements IEDMIService.ExecuteNonQuery_MSSQL_ECM Try - _logger.Info($"ExecuteNonQuery_MSSQL_ECM, SQL: {SQL}") + _Logger.Info($"ExecuteNonQuery_MSSQL_ECM, SQL: {SQL}") Dim oResult As Boolean = MSSQL_ECM.ExecuteNonQuery(SQL) Return New NonQueryResult() Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New NonQueryResult(ex.Message) End Try End Function @@ -197,39 +182,38 @@ Public Class EDMIService #Region "=== Database (Firebird) ===" Public Function ReturnDatatable_Firebird(SQL As String) As TableResult Implements IEDMIService.ReturnDatatable_Firebird Try - _logger.Info($"ReturnDatatable, SQL: {SQL}") + _Logger.Info($"ReturnDatatable, SQL: {SQL}") Dim oResult As DataTable = Firebird.GetDatatable(SQL) Return New TableResult(oResult) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New TableResult(ex.Message) End Try End Function Public Function ReturnScalar_Firebird(SQL As String) As ScalarResult Implements IEDMIService.ReturnScalar_Firebird Try - _logger.Info($"ReturnScalar, SQL: {SQL}") + _Logger.Info($"ReturnScalar, SQL: {SQL}") Dim oResult As Object = Firebird.GetScalarValue(SQL) Return New ScalarResult(oResult) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New ScalarResult(ex.Message) End Try End Function Public Function ExecuteNonQuery_Firebird(SQL As String) As NonQueryResult Implements IEDMIService.ExecuteNonQuery_Firebird Try - _logger.Info($"ExecuteNonQuery, SQL: {SQL}") + _Logger.Info($"ExecuteNonQuery, SQL: {SQL}") Dim oResult As Boolean = Firebird.ExecuteNonQuery(SQL) Return New NonQueryResult() Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Return New NonQueryResult(ex.Message) End Try End Function #End Region - #Region "=== Document ===" ''' ''' Imports a file according to ObjectStoreId @@ -261,14 +245,14 @@ Public Class EDMIService Try Directory.CreateDirectory(oDirectoryPath) Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Throw New FaultException(ex.Message) End Try Try Dim oVersionedFileName As String = Filesystem.GetVersionedFilename(oAbsolutePath) - _logger.Info("ImportFile: Saving file [{0}] to path [{1}]", Data.FileName, oVersionedFileName) + _Logger.Info("ImportFile: Saving file [{0}] to path [{1}]", Data.FileName, oVersionedFileName) Using oStream = New FileStream(oVersionedFileName, FileMode.CreateNew) oStream.Write(Data.Contents, 0, Data.Contents.Length) oStream.Flush(True) @@ -279,7 +263,7 @@ Public Class EDMIService Dim oCommand As New SqlCommand("PRIDB_NEW_DOCUMENT") oCommand.Parameters.AddWithValue("@OBJ_ST_ID", 1) oCommand.Parameters.AddWithValue("@REL_PATH", oRelativePath) - oCommand.Parameters.AddWithValue("@WHO", _username) + oCommand.Parameters.AddWithValue("@WHO", _Username) oCommand.Parameters.AddWithValue("@REF_DOCID", 0) oCommand.Parameters.Add(New SqlParameter("@IDB_OBJ_ID", SqlDbType.BigInt)) @@ -287,7 +271,7 @@ Public Class EDMIService Return New Messages.DocumentImportResponse() With {.ObjectId = oObjectId} Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Throw New FaultException(ex.Message) End Try End Function @@ -312,7 +296,7 @@ Public Class EDMIService Dim EDMIPath As New EDMI.File.Path(LogConfig, oObjectStore.Path) Dim oFullPath = EDMIPath.GetFullPathFromRelativePath(oPath) - _logger.Debug("GetFileByObjectId: Loading file [{0}]", oFullPath) + _Logger.Debug("GetFileByObjectId: Loading file [{0}]", oFullPath) Dim oFileInfo As New FileInfo(oFullPath) @@ -333,10 +317,10 @@ Public Class EDMIService Return oMessage Catch ex As IOException - _logger.Error(ex) + _Logger.Error(ex) Throw New FaultException($"Object [{Data.ObjectId}] could not be streamed!") Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Throw New FaultException(ex.Message) End Try End Function @@ -351,9 +335,46 @@ Public Class EDMIService .Datatable = oDatatable } Catch ex As Exception - _logger.Error(ex) + _Logger.Error(ex) Throw New FaultException(ex.Message) End Try End Function #End Region + +#Region "=== Access Rights ===" + Public Function GetAccessRight(UserId As Long, ObjectId As Long) As AccessRightResult Implements IEDMIService.GetAccessRight + Try + Dim oTableName As String = "TBIDB_ACCESSRIGHT" + + If Not GlobalState.TableStore.Tables.Contains(oTableName) Then + _Logger.Warn("GetAccessRight: Access right table does not exist!") + Return New AccessRightResult(AccessRight.VIEW_ONLY) + End If + + Dim oTable As DataTable = GlobalState.TableStore.Tables.Item(oTableName) + Dim oRows As List(Of DataRow) = oTable.Select($"IDB_OBJ_ID = {ObjectId} AND USR_ID = {UserId}").ToList() + Dim oRight As AccessRight = AccessRight.VIEW_ONLY + + If oRows.Count = 0 Then + _Logger.Warn("GetAccessRight: Access right assignment does not exist for user [{0}] on object [{1}]", UserId, ObjectId) + Return New AccessRightResult(AccessRight.VIEW_ONLY) + Else + If oRows.Count > 1 Then + _Logger.Warn("GetAccessRight: More than one access right assignment found for user [{0}] on object [{1}]", UserId, ObjectId) + End If + + Dim oRow As DataRow = oRows.First() + Dim oRightAsInt = oRow.Item("ACCESSRIGHT") + + oRight = Utils.ToEnum(Of AccessRight)(oRightAsInt) + End If + + Return New AccessRightResult(oRight) + Catch ex As Exception + _Logger.Warn("GetAccessRight: Exception while getting access right for user [{0}] on object [{1}]", UserId, ObjectId) + _Logger.Error(ex) + Return New AccessRightResult(ex) + End Try + End Function +#End Region End Class \ No newline at end of file diff --git a/Service.EDMIService/EDMIService.vbproj b/Service.EDMIService/EDMIService.vbproj index 0a905b4a..2b495e16 100644 --- a/Service.EDMIService/EDMIService.vbproj +++ b/Service.EDMIService/EDMIService.vbproj @@ -126,11 +126,14 @@ - + + + + diff --git a/Service.EDMIService/GlobalState.vb b/Service.EDMIService/GlobalState.vb index adaf8feb..225e1ea0 100644 --- a/Service.EDMIService/GlobalState.vb +++ b/Service.EDMIService/GlobalState.vb @@ -9,6 +9,8 @@ Public Class GlobalState Public Property ObjectStores As New List(Of ObjectStore) + Public Property TableStore As New DataSet + Public Sub New(LogConfig As LogConfig, MSSQL_IDB As MSSQLServer, MSSQL_ECM As MSSQLServer) _LogConfig = LogConfig _Logger = LogConfig.GetLogger() diff --git a/Service.EDMIService/IEDMIService.vb b/Service.EDMIService/IEDMIService.vb index fa04259e..81584c39 100644 --- a/Service.EDMIService/IEDMIService.vb +++ b/Service.EDMIService/IEDMIService.vb @@ -1,6 +1,7 @@ Imports System.IO Imports System.ServiceModel Imports DigitalData.Modules.Filesystem +Imports DigitalData.Services.EDMIService.Messages Imports DigitalData.Services.EDMIService.Results @@ -49,6 +50,10 @@ Interface IEDMIService Function ExecuteNonQuery_MSSQL_ECM(SQL As String) As NonQueryResult #End Region +#Region "Access Rights" + Function GetAccessRight(UserId As Long, ObjectId As Long) As AccessRightResult +#End Region + #Region "Document (New)" Function ImportFile(Data As Messages.DocumentImportRequest) As Messages.DocumentImportResponse diff --git a/Service.EDMIService/Results.vb b/Service.EDMIService/Results.vb new file mode 100644 index 00000000..12c058df --- /dev/null +++ b/Service.EDMIService/Results.vb @@ -0,0 +1,2 @@ +Friend Class Results +End Class diff --git a/Service.EDMIService/Results/AccessRightResult.vb b/Service.EDMIService/Results/AccessRightResult.vb new file mode 100644 index 00000000..52c5dcd3 --- /dev/null +++ b/Service.EDMIService/Results/AccessRightResult.vb @@ -0,0 +1,23 @@ +Imports System.Runtime.Serialization +Imports DigitalData.Services.EDMIService.Rights +Imports DigitalData.Modules.Language + +Namespace Messages + Public Class AccessRightResult + Inherits BaseResult + + Public Property Right As AccessRight = AccessRight.VIEW_ONLY + + Public Sub New(AccessRight As AccessRight) + MyBase.New() + Right = AccessRight + End Sub + + Public Sub New(Exception As Exception) + MyBase.New() + OK = False + ErrorMessage = Exception.Message + End Sub + End Class + +End Namespace \ No newline at end of file diff --git a/Service.EDMIService/Results/BaseResult.vb b/Service.EDMIService/Results/BaseResult.vb index 788ade61..72cfd738 100644 --- a/Service.EDMIService/Results/BaseResult.vb +++ b/Service.EDMIService/Results/BaseResult.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Results +Namespace Messages @@ -14,9 +14,14 @@ Namespace Results OK = True End Sub - Public Sub New(ErrorMessage As String) + Public Sub New(Message As String) OK = False - Me.ErrorMessage = ErrorMessage + ErrorMessage = Message + End Sub + + Public Sub New(Exception As Exception) + OK = False + ErrorMessage = Exception.Message End Sub End Class End Namespace diff --git a/Service.EDMIService/Results/DatabaseResult.vb b/Service.EDMIService/Results/DatabaseResult.vb index a303b47d..63e006d0 100644 --- a/Service.EDMIService/Results/DatabaseResult.vb +++ b/Service.EDMIService/Results/DatabaseResult.vb @@ -1,6 +1,6 @@ Imports System.Runtime.Serialization -Namespace Results +Namespace Messages diff --git a/Service.EDMIService/Messages.vb b/Service.EDMIService/Results/Messages.vb similarity index 100% rename from Service.EDMIService/Messages.vb rename to Service.EDMIService/Results/Messages.vb diff --git a/Service.EDMIService/Rights.vb b/Service.EDMIService/Rights.vb new file mode 100644 index 00000000..dc6ce6bf --- /dev/null +++ b/Service.EDMIService/Rights.vb @@ -0,0 +1,7 @@ +Public Class Rights + Public Enum AccessRight + VIEW_ONLY = 1 + VIEW_EXPORT = 2 + FULL = 4 + End Enum +End Class diff --git a/Service.EDMIService/Scheduler.vb b/Service.EDMIService/Scheduler.vb index 73745682..795cd335 100644 --- a/Service.EDMIService/Scheduler.vb +++ b/Service.EDMIService/Scheduler.vb @@ -20,20 +20,12 @@ Public Class Scheduler Private Const JOB_GROUP As String = "DatatableJobs" - Public ReadOnly Property DataSet As DataSet - Get - Return _JobListener.Dataset - End Get - End Property - - Public Sub New(LogConfig As LogConfig, MSSQL_ECM As MSSQLServer) + Public Sub New(LogConfig As LogConfig, MSSQL_ECM As MSSQLServer, TableStore As DataSet) _LogConfig = LogConfig _Logger = LogConfig.GetLogger() _Factory = New StdSchedulerFactory(_Props) _MSSQL = MSSQL_ECM - - Dim oDataSet As New DataSet() - _JobListener = New JobListener(LogConfig, _MSSQL, oDataSet) + _JobListener = New JobListener(LogConfig, _MSSQL, TableStore) Logging.LogProvider.SetCurrentLogProvider(New LogProvider(_Logger)) End Sub diff --git a/Service.EDMIService/WindowsService.vb b/Service.EDMIService/WindowsService.vb index 6aa602d4..c23d1831 100644 --- a/Service.EDMIService/WindowsService.vb +++ b/Service.EDMIService/WindowsService.vb @@ -60,7 +60,7 @@ Public Class WindowsService _Archive = New EDMI.File.Archive(_LogConfig) _Filesystem = New Filesystem.File(_LogConfig) _Global = New GlobalState(_LogConfig, _MSSQL_IDB, _MSSQL_ECM) - _Scheduler = New Scheduler(_LogConfig, _MSSQL_ECM) + _Scheduler = New Scheduler(_LogConfig, _MSSQL_ECM, _Global.TableStore) _Logger.Debug("Loading Objectstores") _Global.LoadObjectStores() @@ -107,15 +107,28 @@ Public Class WindowsService Private Function StartFirebird() As Firebird _Logger.Debug("Connecting to Firebird") - Dim oFirebird = New Firebird( - _LogConfig, - _Config.Firebird_Datasource, - _Config.Firebird_DatabaseName, - _Config.Firebird_DatabaseUser, - _Config.Firebird_DatabasePassword - ) - _Logger.Info("Database connection established.") - Return oFirebird + + If _Config.Firebird_Datasource = String.Empty Then + _Logger.Info("Firebird database not configured. Skipping.") + Return Nothing + End If + + Try + Dim oFirebird = New Firebird( + _LogConfig, + _Config.Firebird_Datasource, + _Config.Firebird_DatabaseName, + _Config.Firebird_DatabaseUser, + _Config.Firebird_DatabasePassword + ) + + _Logger.Info("Database connection established.") + Return oFirebird + Catch ex As Exception + _Logger.Warn("StartFirebird: Could not connect to firebird database.") + _Logger.Error(ex) + Return Nothing + End Try End Function Private Function StartMSSQL_ECM() As MSSQLServer