Entwicklung_BLAZOR/InterneDLLs/LambertzSocketKommunikation/LambertzSocketKommunikation/CredentialSingelton.cs
2025-08-23 19:30:21 +02:00

467 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Net;
using System.Security.Principal;
using System.Threading;
using De.Lambertz.Socket.Tools;
namespace De.Lambertz.Socket
{
public class CredentialSingelton : ISingelton
{
private static CredentialSingelton me = null; //Singelton
//
private Dictionary<string, string> sessionIds;
//private string login;
private string language = null;
private Dictionary<string, bool> credentials = null;
private Dictionary<string, string> interrimsÜbersetzung = null;
private Thread berechtigungenLaden = null;
private LoginInfo loginInfo = null;
/// <summary>
/// Achtung private da Singelton!
/// </summary>
private CredentialSingelton()
{
sessionIds = new Dictionary<string,string>();
interrimsÜbersetzung = new Dictionary<string, string>();
interrimsÜbersetzung.Add("ANTENNENADMIN", "ANTENNAD");
interrimsÜbersetzung.Add("BILDDBADMIN", "BILDDBAD");
interrimsÜbersetzung.Add("CONTROLLING", "CONTROL");
interrimsÜbersetzung.Add("CONTROLLING_WERK", "CONTROLW");
interrimsÜbersetzung.Add("EMAILVERT", "EMAILVER");
interrimsÜbersetzung.Add("KASSENSYSTEM", "KASSSYST");
interrimsÜbersetzung.Add("KASSENSYSTEMADMIN", "KASSSYAD");
interrimsÜbersetzung.Add("KASSIERER", "KASSIER");
interrimsÜbersetzung.Add("LOGISTIK_TOOLS", "LOGTOOLS");
interrimsÜbersetzung.Add("ODALADMIN", "ODALADMI");
interrimsÜbersetzung.Add("PORTAL_IC", "PORTALIC");
interrimsÜbersetzung.Add("PORTAL_TEST", "PORTALTS");
interrimsÜbersetzung.Add("SCANNER", "SCANNER");
interrimsÜbersetzung.Add("SCANNERADMIN", "SCANNAD");
interrimsÜbersetzung.Add("TICKETADMIN", "TICKETAD");
interrimsÜbersetzung.Add("TEST", "AGENT");
}
//private void basisBerechtigungenVonAS400Laden(Object o)
//{
// String login = (String)o;
// LaPoSocketSpecializedHandler handler = new LaPoSocketSpecializedHandler("9400", felderErstellenBerechtigunsDaten(62), false, "");
// String anfrageSchlüssel = PortalTools.Get9400AnfrageSchlüssel("61", 1, login, null, null, null);
// handler.WriteLine(anfrageSchlüssel);
// //handler.WriteLine("54" + login.PadRight(10) + "001");
// String line = handler.ReadLine();
// while (line.StartsWith("62"))
// {
// LaPoPreviewContainer con = handler.ToPreviewContainer(line);
// this.credentials.Add(con.GetField(2).TrimEnd().ToUpper(), true);
// //
// line = handler.ReadLine();
// }
// handler.closeConnection();
//}
public void AddCredential(String value)
{
if (this.credentials == null)
{
this.credentials = new Dictionary<string, bool>();
}
String key = value.TrimEnd().ToUpper();
if(!this.credentials.ContainsKey(key))
{
this.credentials.Add(key, true);
}
}
private List<LaPoSocketField> felderErstellenBerechtigunsDaten(String satzArt)
{
List<LaPoSocketField> felder = new List<LaPoSocketField>();
LaPoSocketField field;
int start = 2;
//
field = new LaPoSocketField(satzArt, "HVUSER", "A", start, 30, 0, "User");
start += field.Length;
felder.Add(field);
//
field = new LaPoSocketField(satzArt, "HVAPID", "A", start, 3, 0, "ApplikationsID");
start += field.Length;
felder.Add(field);
//
field = new LaPoSocketField(satzArt, "HVMODU", "A", start, 10, 0, "Berechtigungsschlüssel");
start += field.Length;
felder.Add(field);
return felder;
}
/// <summary>
/// Singelton Kapsel
/// </summary>
/// <returns></returns>
public static CredentialSingelton GetInstance()
{
if (me==null) {
me = new CredentialSingelton();
//SingeltonManager.GetInstance().RegisterSingelton(me);
}
return me;
}
public void ClearCredentials()
{
if (berechtigungenLaden != null)
{
berechtigungenLaden.Join();
}
credentials = new Dictionary<string, bool>();
}
public string GetSessionID(string ferneAdresse)
{
return GetSessionID(ferneAdresse, null);
}
public void ResetSessionIDs()
{
sessionIds = new Dictionary<string, string>();
}
public LoginInfo LoginInfo
{
get { return loginInfo; }
}
//DB2Umstellung
public string GetSessionID(string ferneAdresse, string login)
{
//Initialiseren der Credentials, weil sie bei einer neuen Session ID ebenfalls erneuert werden müssen!
credentials = new Dictionary<string, bool>();
//
string sessionID = "";
string loginName = null;
string domäne = null;
bool loginOK = true;
string key;
string answer;
//Login kann zum Erzwingen eines Logins übergeben werden
if (login == null)
{
WindowsIdentity windowsUserIndentity = WindowsIdentity.GetCurrent();
login = windowsUserIndentity.Name.ToUpper(); //Domäne und Name
}
else
{
login = login.ToUpper();
}
//Prüfen ob Anmeldung bereits vorhanden ist..
key = ferneAdresse + login;
if (sessionIds.ContainsKey(key))
{
sessionID = sessionIds[key];
}
else
{
//Prüfen OB IP eine der eigenen IP's ist (Wenn nicht dann Serverbetrieb)
if (login.IndexOf(@"\") >= 0 && login.Length > 0)
{
domäne = login.Substring(0, login.IndexOf(@"\")); //Nur Domäne
loginName = login.Substring(login.IndexOf(@"\") + 1); //Nur Name
}
else
{
domäne = "";
loginName = login;
}
// LDAPCheck ldap = new LDAPCheck();
//#if DEBUG
// // Im Debug-Modus nicht prüfen -> Entwicklungs-PC nicht in Domäne
// if (loginName == "VERSINS" || (PortalTools.IsDeveloperPC()))
// {
// ldap = null;
// }
//#endif
// if(PortalTools.IsDeveloperPC())
// {
// ldap = null;
// }
// if (ldap != null)
// {
// if (ldap.checkDomänName(domäne))
// {
// //Zusätzliche Abfrage auf richtige Domäne!!!
// if (!ldap.checkIdentitiy())
// {
// login = "";
// }
// }
// else
// {
// loginOK = false;
// login = "";
// }
// }
// ldap = null;
LaPoSocketLoginHandler l = new LaPoSocketLoginHandler();
l.Language = this.Language;
//Test gegen AS400 ob user OK ist, falls er OK aussieht :-)
if (loginOK || login.Equals(""))
{
answer = l.PreLogin();
if (!answer.Substring(0, 2).Equals("OK") || login.Equals(""))
{
loginOK = false;
}
else
{
this.loginInfo = l.Login(loginName);
if (this.loginInfo.LoginOK)
{
sessionID = this.loginInfo.SessionId;
sessionIds.Add(key, sessionID);
if (String.IsNullOrEmpty(login))
{
login = loginName;
}
}
else
{
loginOK = false;
}
}
// Anmeldung gegen AS400 falls Login nicht OK ist
if (!loginOK)
{
//Window zur Anmeldung anzeigen!
//FrmLogin loginForm = new FrmLogin();
//loginForm.LoginHandler = l;
//if (loginName == "RÜDIGER VOSSEL")
//{
// loginName = "VOSSELR";
//}
//loginForm.txtLogin.Text = loginName;
//loginForm.Key = key;
//loginForm.SessionIDs = this.sessionIds;
//loginForm.ShowDialog();
//login = loginForm.txtLogin.Text;
//if (sessionIds.ContainsKey(key))
//{
// sessionID = sessionIds[key];
// this.loginInfo = loginForm.Li;
//}
//loginForm.Dispose();
}
}
}
//ParameterizedThreadStart pts = new ParameterizedThreadStart(basisBerechtigungenVonAS400Laden);
//berechtigungenLaden = new Thread(pts);
//berechtigungenLaden.Start(loginName);
////basisBerechtigungenVonAS400Laden(loginName);
return sessionID;
}
public string GetSessionIDIfExists(string ferneAdresse)
{
string sessionID = null;
string login;
string key;
WindowsIdentity windowsUserIndentity = WindowsIdentity.GetCurrent();
login = windowsUserIndentity.Name.ToUpper(); //Domäne und Name
//Prüfen ob Anmeldung bereits vorhanden ist..
key = ferneAdresse + login;
if (sessionIds.ContainsKey(key))
{
sessionID = sessionIds[key];
}
return sessionID;
}
private bool ownAdress(string ferneAdresse)
{
bool eigeneAdresse;
if (ferneAdresse.Equals("127.0.0.1"))
{
eigeneAdresse = true;
}
else
{
eigeneAdresse = false;
// den Host Namen holen
string hostname = Dns.GetHostName();
IPHostEntry hostent = Dns.GetHostEntry(hostname); // Host Info
Array ipArray = hostent.AddressList; // alle IP Adressen
IEnumerator it = ipArray.GetEnumerator(); // Iterator
while (it.MoveNext())
{
IPAddress ip = (IPAddress)it.Current;
if (ip.ToString().Equals(ferneAdresse))
{
eigeneAdresse = true;
}
}
}
return eigeneAdresse;
}
//public string UserName
//{
// get { return login; }
//}
private bool credentialsContainsKey(string key)
{
bool result = false;
if (berechtigungenLaden != null)
{
berechtigungenLaden.Join();
}
if(credentials == null)
{
credentials = new Dictionary<string, bool>();
}
if (credentials.ContainsKey(key))
{
result = credentials[key];
}
else
{
key = InterrimsÜbersetzungVon(key);
if (credentials.ContainsKey(key))
{
result = credentials[key]; ;
}
else
{
key = ReverseInterrimsÜbersetzungVon(key);
if (credentials.ContainsKey(key))
{
result = credentials[key];
}
}
}
return result;
}
public string InterrimsÜbersetzungVon(String key)
{
String result = null;
key = key.ToUpper();
if (interrimsÜbersetzung.ContainsKey(key))
{
result = interrimsÜbersetzung[key];
}
else
{
result = key;
}
return result;
}
public string ReverseInterrimsÜbersetzungVon(String key)
{
String result = null;
key = key.ToUpper();
if (interrimsÜbersetzung.ContainsValue(key))
{
foreach (String k in interrimsÜbersetzung.Keys)
{
String v = interrimsÜbersetzung[k];
if (v == key)
{
result = interrimsÜbersetzung[k];
break;
}
}
}
else
{
result = key;
}
return result;
}
//DB2Umstellung
public bool CheckWarrant(String sessionID, String key)
{
if (berechtigungenLaden != null)
{
berechtigungenLaden.Join();
}
bool result = credentialsContainsKey(key);
//Wenn schon mal geholt
if (!String.IsNullOrEmpty(key) && !result)
{
LaPoSocketSpecializedHandler handler = new LaPoSocketSpecializedHandler("T001", null, false, sessionID);
handler.WriteLine("80" + key);
String antwort = handler.ReadLine();
if (antwort.Equals("OK"))
{
result = true;
}
else
{
result = false;
}
if (!credentials.ContainsKey(key))
{
credentials.Add(key, result);
}
handler.WriteLine("99");
handler.Close();
handler = null;
}
return result;
}
public string Language
{
get { return language; }
set { language = value; }
}
#region ISingelton Member
public void ManagedReset(string userName)
{
ClearCredentials();
}
public void ManagedKill()
{
me = null;
}
#endregion
}
}