467 lines
16 KiB
C#
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
|
|
}
|
|
}
|