288 lines
12 KiB
VB.net
288 lines
12 KiB
VB.net
Imports System.Collections.Generic
|
|
Imports System.Net
|
|
Imports System.Net.Http
|
|
Imports System.Web.Http
|
|
Imports System.Web.Http.Description
|
|
Imports System.Data
|
|
Imports Windream.WebService.WebAPI.PlugIns
|
|
Imports Windream.WebService.Documents
|
|
Imports WMOBRWSLib
|
|
Imports WINDREAMLib
|
|
Imports WMCNNCTDLLLib
|
|
Imports DD_LIB_Standards.clsDatabase
|
|
|
|
Imports NLog
|
|
Imports NLog.Targets
|
|
Imports NLog.Config
|
|
|
|
Imports System.Reflection
|
|
Imports System.Xml
|
|
Imports System.Net.Http.Headers
|
|
Imports System.Threading
|
|
Imports System.Threading.Tasks
|
|
Imports System.Web.Http.Controllers
|
|
|
|
Namespace Controllers
|
|
|
|
Public Class DigitalDataController
|
|
Inherits PlugInBaseController
|
|
|
|
Private _routesSettings As IEnumerable(Of RouteSettings)
|
|
Private _docController As IDocumentsController
|
|
Private _session As IWMSession6
|
|
Private _logger As Logger
|
|
|
|
''' <summary>
|
|
''' Gets the routes settings for the controller.
|
|
''' This property will automatically be called from the windream Web Service - WebAPI framework.
|
|
''' </summary>
|
|
''' <value>
|
|
''' The routes settings of the controller.
|
|
''' </value>
|
|
Public Overrides ReadOnly Property RoutesSettings As IEnumerable(Of RouteSettings)
|
|
Get
|
|
Return _routesSettings
|
|
End Get
|
|
End Property
|
|
|
|
|
|
Public Overrides Function ExecuteAsync(controllerContext As HttpControllerContext, cancellationToken As CancellationToken) As Task(Of HttpResponseMessage)
|
|
Return MyBase.ExecuteAsync(controllerContext, cancellationToken)
|
|
End Function
|
|
|
|
''' <summary>
|
|
''' Initializes a new instance of the <see cref="DigitalDataController"/> class.
|
|
''' </summary>
|
|
Sub New()
|
|
Dim routesSettings As List(Of RouteSettings) = New List(Of RouteSettings)()
|
|
routesSettings.Add(New RouteSettings("DigitalDataController", "DigitalData/{action}/{id}", New With {.id = RouteParameter.Optional, .controller = "DigitalData"}))
|
|
_routesSettings = routesSettings
|
|
|
|
Dim config = New LoggingConfiguration()
|
|
|
|
Dim fileTarget = New FileTarget() With {
|
|
.Name = "BNSPlugin",
|
|
.ArchiveEvery = FileArchivePeriod.Day,
|
|
.FileName = "D:/ProgramFiles/DigitalData/SERVICES/WMWebServiceBNS/Log/${date:format=yyyy-MM-dd}-WMWebServiceBNS.txt",
|
|
.Layout = "${longdate} || ${message}"
|
|
}
|
|
|
|
config.AddTarget("file", fileTarget)
|
|
|
|
Dim rule = New LoggingRule("*", LogLevel.Debug, fileTarget)
|
|
config.LoggingRules.Add(rule)
|
|
|
|
LogManager.Configuration = config
|
|
_logger = LogManager.GetLogger("DigitalDataController")
|
|
|
|
Dim connectionString = GetConnectionString()
|
|
|
|
_logger.Info($"[DATABASE] Verbindung zu {connectionString}")
|
|
|
|
Dim dbInit = Init(connectionString)
|
|
If dbInit = False Then
|
|
_logger.Info("[DATABASE] Die Verbindung zur Datenbank konnte nicht hergestellt werden.")
|
|
Else
|
|
_logger.Info("[DATABASE] Die Verbindung zur Datenbank wurde hergestellt.")
|
|
End If
|
|
_logger.Info("[INIT] Die Initialisierung wurde abgeschlossen.")
|
|
End Sub
|
|
|
|
Private Function GetPluginPath()
|
|
Dim s = Assembly.GetExecutingAssembly().CodeBase
|
|
s = New Uri(s).AbsolutePath
|
|
s = Uri.UnescapeDataString(s)
|
|
s = IO.Path.GetFullPath(s)
|
|
s = IO.Path.GetDirectoryName(s)
|
|
|
|
Return s
|
|
End Function
|
|
|
|
Private Function GetConnectionString()
|
|
Dim path As String = GetPluginPath()
|
|
Dim configFile = path & "\config.xml"
|
|
|
|
If IO.File.Exists(configFile) Then
|
|
Dim Doc As XmlDocument = New XmlDocument()
|
|
Doc.Load(configFile)
|
|
|
|
Dim connectionString As String = Doc.DocumentElement.SelectSingleNode("/config/connectionString").InnerText
|
|
|
|
_logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde gefunden")
|
|
Return connectionString
|
|
Else
|
|
_logger.Info($"[CONFIG] Konfigurations Datei {configFile} wurde NICHT gefunden!")
|
|
|
|
Return Nothing
|
|
End If
|
|
End Function
|
|
|
|
|
|
''' <summary>
|
|
''' A simple example of a http-get service method implementation.
|
|
''' </summary>
|
|
''' <param name="docId">windream Document-ID</param>
|
|
''' <param name="userId">windream User-ID</param>
|
|
''' <remarks>This method creates a nice greeting.</remarks>
|
|
'<ResponseType(GetType(String))>
|
|
<HttpGet>
|
|
Public Function BNSDownload(<FromUri> docId As Integer, <FromUri> userId As String) As HttpResponseMessage
|
|
Dim DT As DataTable
|
|
Dim Domain, Username, Password As String
|
|
|
|
_logger.Info($"[REQUEST] Anfrage von Benutzer-ID {userId} für Dokument-ID {docId}")
|
|
|
|
Try
|
|
DT = Return_Datatable($"SELECT DOMAIN, USERNAME, PW FROM TBDD_WEBSERVICE_USER_EX WHERE USERNAME_LINK = '{userId}'")
|
|
Catch ex As Exception
|
|
_logger.Info("[DATABASE] Fehler beim Zugriff auf die Datenbank ")
|
|
_logger.Info(ex.Message)
|
|
|
|
Return CreateResponseMessage(Request, HttpStatusCode.InternalServerError)
|
|
End Try
|
|
|
|
If DT.Rows.Count = 0 Then
|
|
_logger.Info($"[DATABASE] BenutzerID {userId} wurde nicht in der Datenbank gefunden.")
|
|
Return CreateResponseMessage(Request, $"Benutzer {userId} wurde nicht gefunden", HttpStatusCode.Unauthorized)
|
|
Else
|
|
Dim firstRow As DataRow = DT.Rows.Item(0)
|
|
|
|
Domain = firstRow.Item("DOMAIN")
|
|
Username = firstRow.Item("USERNAME")
|
|
Password = firstRow.Item("PW")
|
|
|
|
_logger.Info($"[DATABASE] BenutzerID {userId} wurde gefunden.")
|
|
End If
|
|
|
|
Dim loggedIn As Boolean = CreateSessionForUser(Username, Password, Domain)
|
|
|
|
If Not loggedIn Then
|
|
Return CreateResponseMessage(Request, $"Session für Benutzer {userId} konnte nicht aufgebaut werden. Weitere Informationen im Log", HttpStatusCode.BadRequest)
|
|
End If
|
|
|
|
|
|
Dim WMDoc As IWMObject7
|
|
Dim WMStream As IWMStream
|
|
Dim fileContent As Byte()
|
|
|
|
Try
|
|
WMDoc = _session.GetWMObjectById(WMEntity.WMEntityDocument, docId)
|
|
Catch ex As Exception
|
|
_logger.Info("[WINDREAM/GetWMObjectById] Ein Fehler beim Zugriff auf Windream ist aufgetreten ")
|
|
_logger.Info(ex.Message)
|
|
_logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen")
|
|
_session.Logout()
|
|
|
|
Return CreateResponseMessage(Request, "Document not found", HttpStatusCode.NotFound)
|
|
End Try
|
|
|
|
Try
|
|
WMStream = WMDoc.OpenStream("BinaryObject", WMObjectStreamOpenMode.WMObjectStreamOpenModeRead)
|
|
fileContent = WMStream.Read(WMStream.GetSize())
|
|
Catch ex As Exception
|
|
_logger.Info("[WINDREAM/OpenStream] Ein Fehler beim Zugriff auf Windream ist aufgetreten")
|
|
_logger.Info(ex.Message)
|
|
_logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen")
|
|
_session.Logout()
|
|
|
|
Return CreateResponseMessage(Request, HttpStatusCode.InternalServerError)
|
|
End Try
|
|
|
|
_logger.Info($"[WINDREAM/Session] Session für Benutzer {Username} wird geschlossen")
|
|
_session.Logout()
|
|
|
|
' Gibt die Datei zum Download zurück
|
|
Return CreateFileResponseMessage(fileContent, WMDoc.aName)
|
|
End Function
|
|
|
|
Private Function CreateFileResponseMessage(data As Byte(), filename As String) As HttpResponseMessage
|
|
_logger.Info($"[WINDREAM/Download] Datei {filename} wird für Download zur Verfügung gestellt")
|
|
Dim Res = New HttpResponseMessage()
|
|
Res.StatusCode = HttpStatusCode.OK
|
|
Res.Content = New ByteArrayContent(data)
|
|
Res.Content.Headers.ContentType = New MediaTypeHeaderValue("application/octet-stream")
|
|
Res.Content.Headers.ContentDisposition = New ContentDispositionHeaderValue("attachment") With {
|
|
.FileName = filename
|
|
}
|
|
Return Res
|
|
End Function
|
|
|
|
Private Function CreateSessionForUser(username As String, password As String, domain As String)
|
|
Dim WMServerBrowser As New ServerBrowser()
|
|
Dim DMSServer As String
|
|
Dim Connect As IWMConnect2
|
|
Dim Session As IWMSession6
|
|
Dim User As WMOTOOLLib.WMUserIdentity
|
|
|
|
Try
|
|
'' Get the current Windream Server
|
|
DMSServer = WMServerBrowser.GetCurrentServer()
|
|
Catch ex As Exception
|
|
_logger.Info($"[WINDREAM/ServerBrowser] DMS Server konnte nicht ausgelesen werden.")
|
|
_logger.Info(ex.Message)
|
|
Return False
|
|
End Try
|
|
|
|
Try
|
|
' Create a User Object for Session
|
|
User = New WMOTOOLLib.WMUserIdentity()
|
|
User.aDomain = domain
|
|
User.aPassword = password
|
|
User.aUserName = username
|
|
User.aServerName = DMSServer
|
|
Catch ex As Exception
|
|
_logger.Info($"[WINDREAM/User] User Objekt konnte nicht erstellt werden.")
|
|
_logger.Info(ex.Message)
|
|
Return False
|
|
End Try
|
|
|
|
|
|
_logger.Info("[WINDREAM/Session] Session wird aufgebaut")
|
|
_logger.Info($"[WINDREAM/Session] Username: {username}")
|
|
_logger.Info($"[WINDREAM/Session] Passwort: {password}")
|
|
_logger.Info($"[WINDREAM/Session] Domäne: {domain}")
|
|
_logger.Info($"[WINDREAM/Session] Windream Server: {DMSServer}")
|
|
|
|
Try
|
|
' Create Connect Object for Session
|
|
Connect = New WMConnect()
|
|
Connect.ModuleId = 9
|
|
Catch ex As Exception
|
|
_logger.Info($"[WINDREAM/Connect] Connect Objekt konnte nicht erstellt werden.")
|
|
_logger.Info(ex.Message)
|
|
Return False
|
|
End Try
|
|
|
|
|
|
Try
|
|
Session = Connect.Login(User)
|
|
_logger.Info($"[WINDREAM/Session] Session wurde aufgebaut")
|
|
|
|
If Session.aLoggedin Then
|
|
_session = Session
|
|
|
|
_logger.Info($"[WINDREAM/Session] Benutzer {username} ist eingeloggt")
|
|
Return True
|
|
Else
|
|
_logger.Info($"[WINDREAM/Session] Fehler beim Aufbau der Session. Benutzer {username} ist nicht eingeloggt!")
|
|
Return False
|
|
End If
|
|
Catch ex As Exception
|
|
_logger.Info($"[WINDREAM/Session] Fehler bei Login von Benutzer {username}!")
|
|
_logger.Info(ex.Message)
|
|
|
|
If Not IsNothing(Session) AndAlso Session.aLoggedin Then
|
|
_session = Session
|
|
_logger.Info($"[WINDREAM/Session] Benutzer {username} ist eingeloggt")
|
|
Return True
|
|
Else
|
|
_logger.Info($"[WINDREAM/Session] Fehler beim Aufbau der Session. Benutzer {username} ist nicht eingeloggt!")
|
|
_logger.Info(ex.Message)
|
|
Return False
|
|
End If
|
|
End Try
|
|
End Function
|
|
|
|
End Class
|
|
|
|
End Namespace |