Files
BeWoPlaner/Service/OwnChat/OwnChatHelper.cs

243 lines
8.2 KiB
C#

using System;
using System.Collections.Specialized;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
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(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)
{
//CB HACK solange App4 nicht geht:
return GetUrlFromApp6(tenant);
try
{
string url = "https://dict.ownchat.de/api/server/resolve/1/" + tenant;
WebRequest request = WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
WebResponse response = request.GetResponse();
string responseFromServer = ReadStreamForChatCode(response);
var definition = new { status = "", URL = "", SYNCTYPE = "" };
var jsondaten = JsonConvert.DeserializeAnonymousType(responseFromServer, definition);
string serverUrl = jsondaten.URL;
response.Close();
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(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 tenant)
{
try
{
string url = "https://app6.bewoplaner.de/mobil/Chat/GetServerUrl?k=" + tenant;
WebRequest request = WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
WebResponse response = request.GetResponse();
string responseFromServer = ReadStreamForChatCode(response);
return responseFromServer;
}
catch (Exception e)
{
throw Utils.CreateBeWoFaultException(e);
}
}
private static string ReadStreamForChatCode(WebResponse response)
{
try
{
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
dataStream.Dispose();
reader.Dispose();
dataStream.Close();
reader.Close();
return responseFromServer;
}
catch (Exception e)
{
return null;
}
}
}
}