2020-04-08 14:25:01 +02:00
using System ;
2024-07-31 21:54:06 +02:00
using System.Collections.Specialized ;
using System.Configuration ;
2020-04-08 14:25:01 +02:00
using System.IO ;
2024-07-31 21:54:06 +02:00
using System.Linq ;
2020-04-08 14:25:01 +02:00
using System.Net ;
2026-01-30 19:35:18 +01:00
using System.Text.RegularExpressions ;
2024-07-31 21:54:06 +02:00
using BeWo.Data.Access ;
using BeWo.Data.Entities ;
2020-04-08 14:25:01 +02:00
using BeWo.Service.Configuration ;
using BeWo.Service.Core ;
using BeWo.Service.Plugins ;
using Newtonsoft.Json ;
namespace BeWo.Service.OwnChat
{
public class OwnChatHelper
{
2026-01-30 19:35:18 +01:00
2020-04-08 14:25:01 +02:00
public static void StartOwnChatSync ( )
{
2020-08-17 15:50:00 +02:00
//if (AppSettings.CreateSettings().ShowChat)
//{
2020-04-08 14:25:01 +02:00
var m = AppSettings . GetMandatorEntity ( ) ;
var tenant = PluginLoader . Tenant ;
2020-08-17 15:50:00 +02:00
2020-04-08 14:25:01 +02:00
StartOwnChatSync ( m . Apikey , tenant ) ;
2020-08-17 15:50:00 +02:00
//}
2020-04-08 14:25:01 +02:00
}
private static void StartOwnChatSync ( String apiKey , String tenant )
{
2020-08-17 15:50:00 +02:00
2020-04-08 14:25:01 +02:00
if ( ! String . IsNullOrEmpty ( apiKey ) )
{
try
{
2026-01-30 19:35:18 +01:00
var serverUrl = ErmittleServerURL ( "1" , tenant ) ;
2020-04-08 14:25:01 +02:00
if ( ! String . IsNullOrEmpty ( serverUrl ) )
{
#if DEBUG
var endurl = serverUrl + "/api/ownchat/sync/schedule/" + apiKey + "/5473568546" ;
2020-08-17 15:50:00 +02:00
2020-04-08 14:25:01 +02:00
#else
var endurl = serverUrl + "/api/ownchat/sync/schedule/" + apiKey + "/" + tenant ;
#endif
WebRequest request = WebRequest . Create ( endurl ) ;
request . Credentials = CredentialCache . DefaultCredentials ;
var response = request . GetResponse ( ) ;
response . Close ( ) ;
response . Dispose ( ) ;
}
}
catch ( Exception e )
{
// MessageBox.Show("Die Verbindung konnte nicht aufgebaut werden.", "ownChat Fehler ", MessageBoxButton.OK);
}
}
}
public static string ErmittleServerURL ( string tenant )
{
2026-01-30 19:35:18 +01:00
return ErmittleServerURL ( "1" , tenant ) ;
}
2020-08-17 15:50:00 +02:00
2026-01-30 19:35:18 +01:00
public static string ErmittleServerURL ( string typ , string tenant )
{
//CB HACK solange App4 nicht geht:
#if ! DEBUG
return GetUrlFromApp6 ( typ , tenant ) ;
#endif
2020-04-08 14:25:01 +02:00
try
{
2026-01-30 19:35:18 +01:00
string url = String . Format ( "https://dict.ownchat.de/api/server/resolve/{0}/{1}" , typ , tenant ) ;
2020-04-08 14:25:01 +02:00
WebRequest request = WebRequest . Create ( url ) ;
request . Credentials = CredentialCache . DefaultCredentials ;
2026-01-30 19:35:18 +01:00
using ( var response = request . GetResponse ( ) )
{
string responseFromServer = ReadStringFromResponse ( response ) ;
2020-04-08 14:25:01 +02:00
2026-01-30 19:35:18 +01:00
var definition = new { status = "" , URL = "" , SYNCTYPE = "" } ;
2020-04-08 14:25:01 +02:00
2026-01-30 19:35:18 +01:00
var jsondaten = JsonConvert . DeserializeAnonymousType ( responseFromServer , definition ) ;
2020-04-08 14:25:01 +02:00
2026-01-30 19:35:18 +01:00
string serverUrl = jsondaten . URL ;
return serverUrl ;
}
2020-04-08 14:25:01 +02:00
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2024-07-31 21:54:06 +02:00
public static String SendOwnChatMessage ( String message , Employee emp )
{
String pin = "" ;
/ *
* Hi ,
hier mal die Infos für die 2F A Implementierung .
fwev
Der POST - Request geht an
https : //[SERVER-URL]/api/ownchat/sendmessage/user/[API-KEY]/[CUSTOMERID]/[USERID] oder
[SERVER-URL] = Server des Kunden ( Zu finden ü ber Dictionary - > siehe z . B . Chat - Code Erstellung im BWP )
[API-KEY] = Der Key , den du immer hinterlegst ( siehe z . B . Chat - Code Erstellung im BWP )
[USERID] = interne User - ID des Users , der sich gerade anmeldet . Das ist m . W . bei euch immer "E" ( = Employee ) oder "C" ( = Client ) plus OID . Also z . B . "E123" oder "C456" . Schau mal in Lyns Code beim Endpunkt [ BWP - Server - URL ] / Chat / LoginToken / ? typ = users
Per POST - Field dann noch "text" . Z . B . "Ihre 2FA-Code lautet: xyz" oder halt statt "2FA" der Begriff , der auch in deiner Login - Maske verwendet wird , damit die nicht durcheinander kommen .
Es gibt eine Sache auf die du achten musst : Nicht jeder User muss zwangsläufig ein ownChat - User sein ! ! Insb . bei den Kunden die pro Lizenz zahlen ist das der Fall , weil die nicht jedem eine Lizenz bezahlen wollen .
Vermutlich ist es am einfachsten , wenn du versuchst einen 2F A - Code an den User zu senden . Dann bekommst du vom ownChat - Backend in einem solchen Fall eine Fehlermeldung zurück , dass der User nicht existiert ( s . u . ) . Außerdem wir der Request immer um 5 sec verzögert um Brute - Force zu verhindern .
Wenn das so ist , schreibst du eine Meldung a la "Eine 2-Faktor-Authentifizierung ist nicht möglich, da Sie kein(e) aktive(r) ownChat-Nutzer(in) sind. Bitte wenden Sie sich an Ihre Administratoren." . Dann lässt du den User ohne 2F A rein . Die Meldung geht denen dann hoffentlich auf den Nerv und die Inhaber / Admin versorgen Ihre Leute mit ownChat .
Als Response kommt immer ein JSON zurück . Wenn success = true , dann ist alles fein . Sonst unterhalb von errors
* error : 11 - > Kundennummer unbekannt
* error : 12 - > Der API - Key ist falsch - > Auth - Error
* error : 13 - > Es existiert kein API - Key für die angegeben Kundennummer
* error : 14 - > Ziel - Gruppe / - User existiert nicht
* error : 15 - > System - User existiert nicht
LG
* /
string url = ConfigurationManager . AppSettings . Get ( "OwnChatUrl" ) ;
if ( String . IsNullOrEmpty ( url ) )
{
url = "[SERVER-URL]/api/ownchat/sendmessage/user/[API-KEY]/[CUSTOMERID]/[USERID]" ;
}
var tenant = PluginLoader . Tenant ;
2024-08-07 16:26:43 +02:00
#if DEBUG
tenant = "4368658435" ;
2026-01-30 19:35:18 +01:00
var serverUrl = OwnChatHelper . ErmittleServerURL ( "1" , tenant ) ;
2024-08-07 16:26:43 +02:00
var apikey = "hNykpBwxE1Y6NmwZBTDQOpPXW6xCgnVHjJ5lh0QDQyCefgcnimC32aZ3CwB4qQl4" ;
var userid = "1432790061" ;
2024-07-31 21:54:06 +02:00
2024-08-07 16:26:43 +02:00
#else
2024-07-31 21:54:06 +02:00
var m = DAOFactory . GenericDAO . LoadByID < Mandator > ( 1 ) ;
if ( m = = null | | String . IsNullOrEmpty ( m . Apikey ) )
{
return "NO API-KEY" ;
}
var chatcode = DAOFactory . SearchDAO . FindAllEmployeeAppCodes ( emp . Oid . Value ) . OrderByDescending ( c = > c . InsTs ) . FirstOrDefault ( ) ;
if ( chatcode = = null | | String . IsNullOrEmpty ( chatcode . EmployeeCode ) )
{
return "NO CHAT CODE" ;
}
var serverUrl = OwnChatHelper . ErmittleServerURL ( tenant ) ;
var apikey = m . Apikey ;
var userid = String . Format ( "E{0}" , emp . Oid ) ;
2024-08-07 16:26:43 +02:00
#endif
2024-07-31 21:54:06 +02:00
url = url . Replace ( "[SERVER-URL]" , serverUrl ) ;
url = url . Replace ( "[API-KEY]" , apikey ) ;
url = url . Replace ( "[CUSTOMERID]" , tenant ) ;
url = url . Replace ( "[USERID]" , userid ) ;
using ( var client = new WebClient ( ) )
{
var nvc = new NameValueCollection ( ) ;
nvc . Add ( "text" , message ) ;
var definition = new { errors = "" , success = true } ;
var response = client . UploadValues ( url , "POST" , nvc ) ;
String responseStr = System . Text . Encoding . UTF8 . GetString ( response ) ;
var json = Newtonsoft . Json . JsonConvert . DeserializeAnonymousType ( responseStr , definition ) ;
return json . errors ;
}
}
2026-01-30 19:35:18 +01:00
private static string GetUrlFromApp6 ( string typ , string tenant )
2020-08-17 15:50:00 +02:00
{
try
{
2026-01-30 19:35:18 +01:00
string url = String . Format ( "https://app6.bewoplaner.de/mobil/Chat/GetServerUrl?t={0}&k={1}" , typ , tenant ) ;
2020-08-17 15:50:00 +02:00
WebRequest request = WebRequest . Create ( url ) ;
2026-01-30 19:35:18 +01:00
2020-08-17 15:50:00 +02:00
request . Credentials = CredentialCache . DefaultCredentials ;
WebResponse response = request . GetResponse ( ) ;
2026-01-30 19:35:18 +01:00
string responseFromServer = ReadStringFromResponse ( response ) ;
2020-08-17 15:50:00 +02:00
return responseFromServer ;
}
catch ( Exception e )
{
throw Utils . CreateBeWoFaultException ( e ) ;
}
}
2026-01-30 19:35:18 +01:00
private static string ReadStringFromResponse ( WebResponse response )
2020-04-08 14:25:01 +02:00
{
try
{
2026-01-30 19:35:18 +01:00
using ( Stream dataStream = response . GetResponseStream ( ) )
{
using ( StreamReader reader = new StreamReader ( dataStream ) )
{
string responseFromServer = reader . ReadToEnd ( ) ;
2020-04-08 14:25:01 +02:00
2026-01-30 19:35:18 +01:00
return responseFromServer ;
}
}
2020-04-08 14:25:01 +02:00
}
catch ( Exception e )
{
return null ;
}
}
}
}