diff --git a/VERAG_REST_SERVER/Controllers/AvisoController/AVISOController.vb b/VERAG_REST_SERVER/Controllers/AvisoController/AVISOController.vb index 15af21b..c990310 100644 --- a/VERAG_REST_SERVER/Controllers/AvisoController/AVISOController.vb +++ b/VERAG_REST_SERVER/Controllers/AvisoController/AVISOController.vb @@ -1,6 +1,11 @@ Imports System.IO +Imports System.Net +Imports System.Net.Http +Imports System.Threading +Imports System.Web.Http Imports System.Web.Http.Description Imports Microsoft.Web.Http +Imports Org.BouncyCastle.Asn1 Imports VERAG_PROG_ALLGEMEIN Namespace ApiController.Controllers @@ -21,12 +26,19 @@ Namespace ApiController.Controllers - Public Function uploadAvisoAttachment(anhangsart As String, arrayOfFiles() As String, Optional avisoId As Integer = -1, Optional sendungsId As Integer = -1) As String + Public Function uploadAvisoAttachment(anhangsart As String, arrayOfFiles() As String, Optional avisoId As Integer = -1, Optional sendungsId As Integer = -1, Optional saveOnServer As Boolean = False) As HttpResponseMessage VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM = False - VERAG_PROG_ALLGEMEIN.cAllgemein.ERR_OP_GLOBAL = VERAG_PROG_ALLGEMEIN.ERROR_OP.MAIL + VERAG_PROG_ALLGEMEIN.cAllgemein.ERR_OP_GLOBAL = VERAG_PROG_ALLGEMEIN.ERROR_OP.LOG Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL + Dim prog As String = "" + Dim DSZugang As New DataTable + Dim DS_Domain As String = "" + Dim DS_name As String = "" + Dim DS_pw As String = "" + Dim uploadAvisoAttachmentErr As String = "ERR" + Try Dim ip = Request.Properties("MS_HttpContext").Request.UserHostAddress() @@ -52,36 +64,74 @@ Namespace ApiController.Controllers ' Return uploadAvisoAttachment 'End If - uploadAvisoAttachment = "ERR" - If arrayOfFiles Is Nothing OrElse arrayOfFiles.Length < 0 Then + If arrayOfFiles Is Nothing Then + + uploadAvisoAttachmentErr = "FILESARRAY_NOTHING_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.NotFound, uploadAvisoAttachmentErr) + + End If + + If arrayOfFiles.Length < 1 Then + + uploadAvisoAttachmentErr = "FILESARRAY_EMPTY_ERR" & arrayOfFiles.ToString + Return Request.CreateErrorResponse(HttpStatusCode.NotFound, uploadAvisoAttachmentErr) - uploadAvisoAttachment = "FILESARRAY_EMPTY_ERR" - Return uploadAvisoAttachment End If - If anhangsart <> "" Then ' AndAlso listOfImages IsNot Nothing AndAlso listOfImages.Count > 0 + If Not saveOnServer Then + prog = "Datenarchiv" + DSZugang = SQL.loadDgvBySql("SELECT top(1) * FROM tblAPIEinstellungen WHERE api_program='" & prog & "' and api_productive ='" & IIf(VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM, "0", "1") & "'", "ADMIN") + If DSZugang.Rows.Count = 0 Then + uploadAvisoAttachmentErr = "LOGIN_DS_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + + 'Zugang für Datenarchiv + DS_Domain = DSZugang.Rows(0).Item("api_url") + DS_name = DSZugang.Rows(0).Item("api_user") + DS_pw = DSZugang.Rows(0).Item("api_password") + End If + + If sendungsId > 0 Then Dim SENDUNG = New VERAG_PROG_ALLGEMEIN.cSendungen(sendungsId) If SENDUNG Is Nothing Then - uploadAvisoAttachment = "NO_SENDUNG_ERR" - Return uploadAvisoAttachment + uploadAvisoAttachmentErr = "NO_SENDUNG_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.NotFound, uploadAvisoAttachmentErr) Else + If Not saveOnServer Then + 'wenn bereits offen, dann wareten + For i = 0 To 20 + If Not NetzwerkVerbindungOffen(DS_name, DS_Domain) Then Exit For + Thread.Sleep(1000) + i = i + 1 + If i = 10 AndAlso NetzwerkVerbindungOffen(DS_name, DS_Domain) Then + uploadAvisoAttachmentErr = "NO_NEW_DS_CONNECTION_ERR" + Return Request.CreateErrorResponse(600, uploadAvisoAttachmentErr) + End If + Next + + + + NetzwerkVerbindungHerstellen(DS_Domain, DS_name, DS_pw) + End If + For Each image In arrayOfFiles Dim filetemp = image.Replace("data:application/pdf;base64,", "") Try Convert.FromBase64String(filetemp) Catch ex As Exception - uploadAvisoAttachment = "BASE64_FORMAT_ERR" - Return uploadAvisoAttachment + uploadAvisoAttachmentErr = "BASE64_FORMAT_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) End Try Dim fileextension = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getFileExtensionFromBase64String(filetemp) @@ -91,44 +141,114 @@ Namespace ApiController.Controllers ' Return uploadAvisoAttachment 'End If + If Not saveOnServer Then - Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "AVISO_ANHAENGE", SENDUNG.tblSnd_AvisoID, Now.ToString("ddMMyy_HHmmss.ffff"), "", anhangsart & "_" & Now.ToString("ddMMyy_HHmmss"), False) - DS.uploadDataToDATENSERVER_fromBase64String(filetemp, DS.da_name, IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg"), False, False) - If DS.da_id <= 0 Then - uploadAvisoAttachment = "UPLOAD_DS_ERR" - Return uploadAvisoAttachment - End If - Dim fileName = DS.da_name - Dim destPath = DS.GET_TOP1_PATH - fileName = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(fileName) - Dim fi As New FileInfo(destPath) - Dim ANH As New VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge(SENDUNG.tblSnd_AvisoID, fileName, DS.da_id, anhangsart, fi.Extension, sendungsId,, fi.Length,) - If Not ANH.SAVE Then - uploadAvisoAttachment = "SAVE_ANH_ERR" - Return uploadAvisoAttachment + + Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "AVISO_ANHAENGE", SENDUNG.tblSnd_AvisoID, Now.ToString("ddMMyy_HHmmss.ffff"), "", anhangsart & "_" & Now.ToString("ddMMyy_HHmmss"), False) + DS.uploadDataToDATENSERVER_fromBase64String(filetemp, DS.da_name, IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg"), False, False) + + If DS Is Nothing AndAlso DS.da_id Is Nothing AndAlso DS.da_id <= 0 Then + uploadAvisoAttachmentErr = "UPLOAD_DS_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + Dim fileName = DS.da_name + Dim destPath = DS.GET_TOP1_PATH + fileName = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(fileName) + If destPath <> "" Then + Dim fi As New FileInfo(destPath) + Dim ANH As New VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge(SENDUNG.tblSnd_AvisoID, fileName, DS.da_id, anhangsart, fi.Extension, sendungsId,, fi.Length,) + If Not ANH.SAVE Then + uploadAvisoAttachmentErr = "SAVE_ANH_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + Else + Dim ANH As New VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge(SENDUNG.tblSnd_AvisoID, fileName, DS.da_id, anhangsart, IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg"), sendungsId,, 100,) + If Not ANH.SAVE Then + uploadAvisoAttachmentErr = "SAVE_ANH_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + End If + + + + Else + Try + + Dim TMP_PATH = "" + + If Environment.GetFolderPath(Environment.SpecialFolder.Personal) = "" Then ' WEB_SERV + TMP_PATH = "G:\temp\Verag\DatenTMP\SENDUNGSID\" + Else + TMP_PATH = Path.GetTempPath() & "\VERAG\DatenTMP\" + End If + + TMP_PATH = TMP_PATH.Replace("\\", "\") + If Not My.Computer.FileSystem.DirectoryExists(TMP_PATH) Then + My.Computer.FileSystem.CreateDirectory(TMP_PATH) + End If + + Dim name = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(sendungsId & "_" & anhangsart & "_" & Now.ToString("ddMMyy_HHmmss")) + name = name.Replace("?", "") + + + Dim extension = IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg") + + Dim destPath = TMP_PATH & name + + While System.IO.File.Exists(destPath) + destPath = TMP_PATH & name & "_" & Now.ToString("yyyyMMddHHmmssfff") + End While + + Dim bytes As Byte() = Convert.FromBase64String(filetemp) + File.WriteAllBytes(destPath & extension, bytes) + + Catch ex As Exception + VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine, System.Reflection.MethodInfo.GetCurrentMethod.Name) + uploadAvisoAttachmentErr = ex.Message & " " & ex.StackTrace + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End Try + End If Next + If Not saveOnServer Then NetzwerkVerbindungTrennen(DS_Domain) End If ElseIf avisoId > 0 Then Dim AVISO = VERAG_PROG_ALLGEMEIN.cAviso.getAvisoById(avisoId) If AVISO Is Nothing Then - uploadAvisoAttachment = "NO_AVISO_ERR" - Return uploadAvisoAttachment + uploadAvisoAttachmentErr = "NO_AVISO_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.NotFound, uploadAvisoAttachmentErr) Else + + If Not saveOnServer Then + + 'wenn bereits offen, dann wareten + For i = 0 To 20 + If Not NetzwerkVerbindungOffen(DS_name, DS_Domain) Then Exit For + Thread.Sleep(1000) + i = i + 1 + If i = 10 AndAlso NetzwerkVerbindungOffen(DS_name, DS_Domain) Then + uploadAvisoAttachmentErr = "NO_NEW_DS_CONNECTION_ERR" + Return Request.CreateErrorResponse(600, uploadAvisoAttachmentErr) + End If + Next + + NetzwerkVerbindungHerstellen(DS_Domain, DS_name, DS_pw) + End If + For Each image In arrayOfFiles Dim filetemp = image.Replace("data:application/pdf;base64,", "") Try Convert.FromBase64String(filetemp) Catch ex As Exception - uploadAvisoAttachment = "BASE64_FORMAT_ERR" - Return uploadAvisoAttachment + uploadAvisoAttachmentErr = "BASE64_FORMAT_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) End Try @@ -139,45 +259,103 @@ Namespace ApiController.Controllers ' Return uploadAvisoAttachment 'End If - Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "AVISO_ANHAENGE", avisoId, Now.ToString("ddMMyy_HHmmss.ffff"), "", anhangsart & "_" & Now.ToString("ddMMyy_HHmmss"), False) - DS.uploadDataToDATENSERVER_fromBase64String(filetemp, DS.da_name, IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg"), False, False) + If Not saveOnServer Then + + + + Dim DS As New VERAG_PROG_ALLGEMEIN.cDATENSERVER("DOKUMENTE", "AVISO_ANHAENGE", avisoId, Now.ToString("ddMMyy_HHmmss.ffff"), "", anhangsart & "_" & Now.ToString("ddMMyy_HHmmss"), False) + DS.uploadDataToDATENSERVER_fromBase64String(filetemp, DS.da_name, IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg"), False, False) + + If DS Is Nothing AndAlso DS.da_id Is Nothing AndAlso DS.da_id <= 0 Then + uploadAvisoAttachmentErr = "UPLOAD_DS_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + Dim fileName = DS.da_name + Dim destPath = DS.GET_TOP1_PATH + fileName = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(fileName) + If destPath <> "" Then + Dim fi As New FileInfo(destPath) + Dim ANH As New VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge(avisoId, fileName, DS.da_id, anhangsart, fi.Extension, sendungsId,, fi.Length,) + If Not ANH.SAVE Then + uploadAvisoAttachmentErr = "SAVE_ANH_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + Else + Dim ANH As New VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge(avisoId, fileName, DS.da_id, anhangsart, IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg"), sendungsId,, 100,) + If Not ANH.SAVE Then + uploadAvisoAttachmentErr = "SAVE_ANH_ERR" + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End If + End If + Else + + Try + + Dim TMP_PATH = "" + + If Environment.GetFolderPath(Environment.SpecialFolder.Personal) = "" Then ' WEB_SERV + TMP_PATH = "G:\temp\Verag\DatenTMP\AVISOID\" + Else + TMP_PATH = Path.GetTempPath() & "\VERAG\DatenTMP\" + End If + + + TMP_PATH = TMP_PATH.Replace("\\", "\") + If Not My.Computer.FileSystem.DirectoryExists(TMP_PATH) Then + My.Computer.FileSystem.CreateDirectory(TMP_PATH) + End If + + Dim name = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(avisoId & "_" & anhangsart & "_" & Now.ToString("ddMMyy_HHmmss")) + name = name.Replace("?", "") + + + Dim extension = IIf(fileextension.ToLower <> "unknown", "." & fileextension, "." & "jpg") + + Dim destPath = TMP_PATH & name + + + While System.IO.File.Exists(destPath) + destPath = TMP_PATH & name & "_" & Now.ToString("yyyyMMddHHmmssfff") + End While + + Dim bytes As Byte() = Convert.FromBase64String(filetemp) + File.WriteAllBytes(destPath & extension, bytes) + + Catch ex As Exception + VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine, System.Reflection.MethodInfo.GetCurrentMethod.Name) + uploadAvisoAttachmentErr = ex.Message & " " & ex.StackTrace + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) + End Try + - If DS.da_id <= 0 Then - uploadAvisoAttachment = "UPLOAD_DS_ERR" - Return uploadAvisoAttachment - End If - Dim fileName = DS.da_name - Dim destPath = DS.GET_TOP1_PATH - fileName = VERAG_PROG_ALLGEMEIN.cDATENSERVER.replaceInvalidCahr(fileName) - Dim fi As New FileInfo(destPath) - Dim ANH As New VERAG_PROG_ALLGEMEIN.cAvisoAnhaenge(avisoId, fileName, DS.da_id, anhangsart, fi.Extension, sendungsId,, fi.Length,) - If Not ANH.SAVE Then - uploadAvisoAttachment = "SAVE_ANH_ERR" - Return uploadAvisoAttachment End If + Next + If Not saveOnServer Then NetzwerkVerbindungTrennen(DS_Domain) + End If Else - Return uploadAvisoAttachment + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) End If - Return "OK" + Return Request.CreateErrorResponse(HttpStatusCode.OK, "DOCS HAS BEEN UPLOADED") End If Catch ex As Exception - Return uploadAvisoAttachment + VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace & vbNewLine, System.Reflection.MethodInfo.GetCurrentMethod.Name) + uploadAvisoAttachmentErr = ex.Message & " " & ex.StackTrace + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) End Try - - Return uploadAvisoAttachment + Return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, uploadAvisoAttachmentErr) End Function @@ -365,6 +543,47 @@ Namespace ApiController.Controllers Return TESTEN_POST End Function + Public Shared Sub NetzwerkVerbindungHerstellen(remotePath As String, username As String, password As String) + ' Netzwerkverbindung mit "net use" aufbauen + Dim startInfo As New ProcessStartInfo("net", $"use {remotePath} /user:{username} {password}") + startInfo.WindowStyle = ProcessWindowStyle.Hidden + startInfo.CreateNoWindow = True + Process.Start(startInfo).WaitForExit() + End Sub + + ' Methode zum Trennen der Verbindung + Public Shared Sub NetzwerkVerbindungTrennen(remotePath As String) + Dim startInfo As New ProcessStartInfo("net", $"use {remotePath} /delete") + startInfo.WindowStyle = ProcessWindowStyle.Hidden + startInfo.CreateNoWindow = True + Process.Start(startInfo).WaitForExit() + End Sub + + Function NetzwerkVerbindungOffen(ByVal username As String, ByVal remotePath As String) As Boolean + Try + ' Führe den Befehl "net use" aus und hole die Ausgabe + Dim process As New Process() + process.StartInfo.FileName = "cmd.exe" + process.StartInfo.Arguments = "/c net use" + process.StartInfo.RedirectStandardOutput = True + process.StartInfo.UseShellExecute = False + process.StartInfo.CreateNoWindow = True + process.Start() + + ' Lies die Ausgabe des Befehls + Dim output As String = process.StandardOutput.ReadToEnd() + process.WaitForExit() + + ' Überprüfe, ob die Ausgabe die gewünschte Freigabe und den Benutzernamen enthält + Return output.Contains(remotePath) AndAlso output.Contains(username) + + Catch ex As Exception + Console.WriteLine("Fehler: " & ex.Message) + Return False + End Try + End Function + + End Class