246 lines
8.5 KiB
C#
246 lines
8.5 KiB
C#
using System;
|
|
using System.Collections.Specialized;
|
|
using System.Configuration;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Text.RegularExpressions;
|
|
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Service.Configuration;
|
|
using BeWo.Service.Core;
|
|
using BeWo.Service.Plugins;
|
|
using Newtonsoft.Json;
|
|
|
|
namespace BeWo.Service.OwnChat
|
|
{
|
|
public class OwnChatHelper
|
|
{
|
|
|
|
public static void StartOwnChatSync()
|
|
{
|
|
//if (AppSettings.CreateSettings().ShowChat)
|
|
//{
|
|
var m = AppSettings.GetMandatorEntity();
|
|
var tenant = PluginLoader.Tenant;
|
|
|
|
StartOwnChatSync(m.Apikey, tenant);
|
|
//}
|
|
}
|
|
|
|
private static void StartOwnChatSync(String apiKey, String tenant)
|
|
{
|
|
|
|
if (!String.IsNullOrEmpty(apiKey))
|
|
{
|
|
try
|
|
{
|
|
var serverUrl = ErmittleServerURL("1", tenant);
|
|
|
|
if (!String.IsNullOrEmpty(serverUrl))
|
|
{
|
|
#if DEBUG
|
|
var endurl = serverUrl + "/api/ownchat/sync/schedule/" + apiKey + "/5473568546";
|
|
|
|
#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)
|
|
{
|
|
return ErmittleServerURL("1", tenant);
|
|
}
|
|
|
|
public static string ErmittleServerURL(string typ, string tenant)
|
|
{
|
|
//CB HACK solange App4 nicht geht:
|
|
#if !DEBUG
|
|
return GetUrlFromApp6(typ, tenant);
|
|
#endif
|
|
try
|
|
{
|
|
string url = String.Format("https://dict.ownchat.de/api/server/resolve/{0}/{1}", typ, tenant);
|
|
|
|
WebRequest request = WebRequest.Create(url);
|
|
|
|
request.Credentials = CredentialCache.DefaultCredentials;
|
|
|
|
using (var response = request.GetResponse())
|
|
{
|
|
string responseFromServer = ReadStringFromResponse(response);
|
|
|
|
var definition = new { status = "", URL = "", SYNCTYPE = "" };
|
|
|
|
var jsondaten = JsonConvert.DeserializeAnonymousType(responseFromServer, definition);
|
|
|
|
string serverUrl = jsondaten.URL;
|
|
return serverUrl;
|
|
}
|
|
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw Utils.CreateBeWoFaultException(e);
|
|
}
|
|
}
|
|
|
|
public static String SendOwnChatMessage(String message, Employee emp)
|
|
{
|
|
String pin = "";
|
|
|
|
/*
|
|
* Hi,
|
|
|
|
hier mal die Infos für die 2FA 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 2FA-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 2FA 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;
|
|
|
|
|
|
|
|
|
|
|
|
#if DEBUG
|
|
tenant = "4368658435";
|
|
var serverUrl = OwnChatHelper.ErmittleServerURL("1", tenant);
|
|
var apikey = "hNykpBwxE1Y6NmwZBTDQOpPXW6xCgnVHjJ5lh0QDQyCefgcnimC32aZ3CwB4qQl4";
|
|
var userid = "1432790061";
|
|
|
|
|
|
#else
|
|
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);
|
|
#endif
|
|
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
private static string GetUrlFromApp6(string typ, string tenant)
|
|
{
|
|
try
|
|
{
|
|
|
|
string url = String.Format("https://app6.bewoplaner.de/mobil/Chat/GetServerUrl?t={0}&k={1}", typ, tenant);
|
|
|
|
WebRequest request = WebRequest.Create(url);
|
|
|
|
request.Credentials = CredentialCache.DefaultCredentials;
|
|
|
|
WebResponse response = request.GetResponse();
|
|
|
|
string responseFromServer = ReadStringFromResponse(response);
|
|
|
|
|
|
return responseFromServer;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
throw Utils.CreateBeWoFaultException(e);
|
|
}
|
|
|
|
}
|
|
|
|
private static string ReadStringFromResponse(WebResponse response)
|
|
{
|
|
try
|
|
{
|
|
using (Stream dataStream = response.GetResponseStream())
|
|
{
|
|
using (StreamReader reader = new StreamReader(dataStream))
|
|
{
|
|
string responseFromServer = reader.ReadToEnd();
|
|
|
|
return responseFromServer;
|
|
}
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|