#include "Datenbank.h" #include #include #include // Inhalt der RSDatenbank Klasse aus Datenbank.h // Konstruktor RSDatenbank::RSDatenbank(InitDatei* zIni) : ReferenceCounter() { datenbank = new Datenbank(zIni->zWert("DBBenutzer")->getText(), zIni->zWert("DBPasswort")->getText(), zIni->zWert("DBName")->getText(), zIni->zWert("DBIP")->getText(), (unsigned short)TextZuInt(zIni->zWert("DBPort")->getText(), 10)); if (!datenbank->istOk()) { std::cout << "AS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet."; exit(1); } InitializeCriticalSection(&cs); Text befehl = "SELECT port, admin_port FROM server WHERE id = "; befehl += zIni->zWert("ServerId")->getText(); lock(); datenbank->befehl(befehl); Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl == 1) { zIni->addWert("ServerPort", res.values[0]); zIni->addWert("AdminServerPort", res.values[1]); } res.destroy(); } // Destruktor RSDatenbank::~RSDatenbank() { datenbank->release(); DeleteCriticalSection(&cs); } // nicht constant void RSDatenbank::lock() { EnterCriticalSection(&cs); } void RSDatenbank::unlock() { LeaveCriticalSection(&cs); } int RSDatenbank::istAdministrator(const char* name, const char* passwort) { Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' AND passwort = md5( '"); Text p(passwort); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = 0; if (res.zeilenAnzahl > 0) ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } bool RSDatenbank::adminHatRecht(int id, int recht) { Text* befehl = new Text("SELECT * FROM benutzer_rechte WHERE benutzer_id = "); befehl->append(id); befehl->append(" AND rechte_id = "); befehl->append(recht); lock(); datenbank->befehl(befehl->getText()); int ret = datenbank->getZeilenAnzahl(); unlock(); befehl->release(); return ret != 0; } bool RSDatenbank::proveKlient(int num, int sNum) { Text* befehl = new Text("SELECT * FROM server_client WHERE server_id = "); befehl->append(sNum); befehl->append(" AND client_id = "); befehl->append(num); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); bool ret = 0; if (res.zeilenAnzahl == 1) ret = 1; res.destroy(); return ret; } Text* RSDatenbank::getKlientKey(int cId) { lock(); if (!datenbank->befehl(Text("SELECT schluessel FROM client WHERE id = ") += cId)) { unlock(); return 0; } Result res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } Text* ret = new Text(res.values[0].getText()); res.destroy(); return ret; } void RSDatenbank::unregisterKlient(int num, int sNum) { Text* befehl = new Text("DELETE FROM server_client WHERE client_id = "); befehl->append(num); befehl->append(" AND server_id = "); befehl->append(sNum); lock(); datenbank->befehl(befehl->getText()); int za = datenbank->getZeilenAnzahl(); unlock(); if (za == 1) { befehl->setText("UPDATE server SET tasks = tasks - 1 WHERE id = "); befehl->append(sNum); lock(); datenbank->befehl(befehl->getText()); unlock(); } befehl->release(); } bool RSDatenbank::setServerStatus(int id, int status) { Text* befehl = new Text("UPDATE server SET server_status_id = "); *befehl += status; *befehl += "WHERE id = "; *befehl += id; lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } bool ret = datenbank->getZeilenAnzahl() != 0; unlock(); befehl->release(); return ret; } bool RSDatenbank::setMaxClients(int id, int maxC) { Text* befehl = new Text("UPDATE server SET max_tasks = "); befehl->append(maxC); befehl->append(" WHERE id = "); befehl->append(id); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } bool ret = datenbank->getZeilenAnzahl() > 0; unlock(); befehl->release(); return ret; } bool RSDatenbank::serverIstNichtPausiert(int id) { Text* befehl = new Text("SELECT server_status_id FROM server WHERE id = "); befehl->append(id); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } bool ret = (int)res.values[0] == 3; res.destroy(); return ret; } int RSDatenbank::proveNeuAccount(const char* name, const char* eMail) { Text* befehl = new Text("SELECT account_neu_alt_check( '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("', '"); Text m(eMail); m.ersetzen("'", "''"); befehl->append(m); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); if (res.values[0].istGleich("t")) { befehl->release(); res.destroy(); return 0; } else { res.destroy(); befehl->setText("SELECT account.id FROM account, account_neu WHERE account.name = '"); befehl->append(n); befehl->append("' OR account_neu.name = '"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl > 0) { befehl->release(); res.destroy(); return 1; } else { res.destroy(); befehl->release(); return 2; } } } bool RSDatenbank::neuAccount(const char* name, const char* pass, const char* geheim, const char* eMail, const char* gebDatum, InitDatei* zIni) { Text* befehl = new Text("INSERT INTO account_neu( name, passwort, geheimnis, e_mail, geb_datum ) VALUES ( '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("', md5( '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ), '"); Text g(geheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("', '"); Text m(eMail); m.ersetzen("'", "''"); befehl->append(m); befehl->append("', '"); Text d(gebDatum); d.ersetzen("'", "''"); befehl->append(d); befehl->append("' )"); lock(); if (datenbank->befehl(befehl->getText())) { unlock(); befehl->setText("SELECT schluessel, id FROM account_neu WHERE name = '"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl) { // e_mail senden pid_t pid; char* pargs[] = { (char*)zIni->zWert("PHP")->getText(), (char*)zIni->zWert("AccountActivationMail")->getText(), (char*)name, (char*)geheim, (char*)gebDatum, (char*)res.values[0].getText(), (char*)eMail, (char*)res.values[1].getText(), (char*)0 }; posix_spawn(&pid, zIni->zWert("PHP")->getText(), 0, 0, pargs, 0); } res.destroy(); befehl->release(); return 1; } unlock(); befehl->release(); return 0; } int RSDatenbank::removeAccount(const char* name, const char* pass, const char* geheim, InitDatei* zIni) { Text* befehl = new Text("SELECT account_loeschen( '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("', md5( '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ), '"); Text g(geheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); if (!ret) { befehl->setText("SELECT account_loeschen.schluessel, account.e_mail FROM account, account_loeschen WHERE account.id = account_loeschen.account_id AND account.name = '"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); res = datenbank->getResult(); unlock(); Datei md; if (res.zeilenAnzahl) { md.setDatei(res.values[0].getText()); if (md.open(Datei::Style::schreiben)) { Text txt = res.values[1].getText(); txt += "\nAccount löschen\nSchade, dass du deinen Account löschen möchtest.\nBestätigungscode: "; txt += res.values[0].getText(); md.schreibe(txt, txt.getLength()); md.close(); // e_mail senden pid_t pid; char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)res.values[0].getText(), (char*)0 }; posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0); } } res.destroy(); } befehl->release(); return ret; } void RSDatenbank::removeAccountAbbruch(const char* name) { Text* befehl = new Text("DELETE FROM account_loeschen WHERE account_id = ( SELECT id FROM account where name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); } bool RSDatenbank::removeConfirmation(const char* name, const char* key) { Text* befehl = new Text("SELECT account_loeschen_bestaetigen( '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("', '"); Text s(key); s.ersetzen("'", "''"); befehl->append(s); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.values[0].istGleich("t")) { res.destroy(); return 1; } res.destroy(); return 0; } int RSDatenbank::passwortChange(const char* name, const char* pass, const char* nPass, const char* geheim) { Text* befehl = new Text("SELECT id, passwort, geheimnis, md5( '"); Text p(name); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ) FROM account WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl != 1) { res.destroy(); befehl->release(); return 1; } if (!res.values[1].istGleich(res.values[3])) { res.destroy(); befehl->release(); return 2; } if (!res.values[2].istGleich(geheim)) { res.destroy(); befehl->release(); return 3; } befehl->setText("UPDATE account SET passwort = md5( '"); p = Text(nPass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ) WHERE id = "); befehl->append(res.values[0].getText()); res.destroy(); lock(); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); return 0; } int RSDatenbank::eMailChange(const char* name, const char* pass, const char* geheim, const char* eMail) { Text* befehl = new Text("SELECT id, passwort, geheimnis, md5( '"); Text p(name); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ) FROM account WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl != 1) { res.destroy(); befehl->release(); return 1; } if (!res.values[1].istGleich(res.values[3])) { res.destroy(); befehl->release(); return 2; } if (!res.values[2].istGleich(geheim)) { res.destroy(); befehl->release(); return 3; } befehl->setText("Update account SET e_mail = '"); Text m(eMail); m.ersetzen("'", "''"); befehl->append(m); befehl->append("' WHERE id = "); befehl->append(res.values[0].getText()); res.destroy(); int ret = 0; lock(); if (!datenbank->befehl(befehl->getText())) ret = 4; unlock(); befehl->release(); return ret; } int RSDatenbank::geheimnisChange(const char* name, const char* pass, const char* geheim, const char* nGeheim) { Text* befehl = new Text("SELECT id, passwort, geheimnis, md5( '"); Text p(name); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ) FROM account WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); if (res.zeilenAnzahl != 1) { res.destroy(); befehl->release(); return 1; } if (!res.values[1].istGleich(res.values[3])) { res.destroy(); befehl->release(); return 2; } if (!res.values[2].istGleich(geheim)) { res.destroy(); befehl->release(); return 3; } befehl->setText("UPDATE account SET geheimnis = '"); Text g(nGeheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("' WHERE id = "); befehl->append(res.values[0].getText()); res.destroy(); lock(); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); return 0; } bool RSDatenbank::nameVergessen(const char* pass, const char* geheim, InitDatei* zIni) { Text* befehl = new Text("SELECT name, e_mail FROM account WHERE passwort = md5( '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ) AND geheimnis = '"); Text g(geheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl != 1) { res.destroy(); return 0; } Datei md; if (res.zeilenAnzahl) { Text pfad = res.values[0].getText(); pfad.ersetzen(" ", "_"); pfad.insert(0, "mail."); md.setDatei(pfad); if (md.open(Datei::Style::schreiben)) { Text txt = res.values[1].getText(); txt += "\nAccount Name\nDein Account Name lautet: "; txt += res.values[0].getText(); md.schreibe(txt, txt.getLength()); md.close(); // e_mail senden pid_t pid; char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)pfad.getText(), (char*)0 }; posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0); } } res.destroy(); return 1; } bool RSDatenbank::passwortVergessen(const char* name, const char* geheim, InitDatei* zIni) { Text* befehl = new Text("SELECT get_next_schluessel()"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->setText("UPDATE account SET passwort = md5( '"); Text pass(res.values[0]); res.destroy(); befehl->append(pass); befehl->append("' ) WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' AND geheimnis = '"); Text g(geheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("' RETURNING e_mail"); lock(); datenbank->befehl(befehl->getText()); res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl != 1) { res.destroy(); return 0; } Datei md; if (res.zeilenAnzahl) { Text pfad = res.values[0].getText(); pfad.ersetzen(" ", "_"); pfad.insert(0, "mail."); md.setDatei(pfad); if (md.open(Datei::Style::schreiben)) { Text txt = res.values[1].getText(); txt += "\nAccount Passwort\nDein Account Passwort wurde zurückgesetzt und lautet jetzt: "; txt += pass.getText(); md.schreibe(txt, txt.getLength()); md.close(); // e_mail senden pid_t pid; char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)pfad.getText(), (char*)0 }; posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0); } } res.destroy(); return 1; } bool RSDatenbank::geheimnisVergessen(const char* name, const char* pass, InitDatei* zIni) { Text* befehl = new Text("SELECT geheimnis, e_mail FROM account WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' AND passwort = md5( '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl != 1) { res.destroy(); return 0; } Datei md; if (res.zeilenAnzahl) { Text pfad = res.values[0].getText(); pfad.ersetzen(" ", "_"); pfad.insert(0, "mail."); md.setDatei(pfad); if (md.open(Datei::Style::schreiben)) { Text txt = res.values[1].getText(); txt += "\nAccount Geheimnis\nDein Account Geheimnis lautet: "; txt += res.values[0].getText(); md.schreibe(txt, txt.getLength()); md.close(); // e_mail senden pid_t pid; char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)pfad.getText(), (char*)0 }; posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0); } } res.destroy(); return 1; } Text* RSDatenbank::eMailVergessen(const char* name, const char* pass, const char* geheim) { Text* befehl = new Text("SELECT e_mail FROM account WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' AND passwort = md5( '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' ) AND geheimnis = '"); Text g(geheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl != 1) { res.destroy(); return 0; } Text* ret = new Text(res.values[0].getText()); res.destroy(); return ret; } char RSDatenbank::suchConfirmation(const char* name, const char* pass) { Text* befehl = new Text("select such_account_bestaetigung( '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("', '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); char ret = (char)TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } void RSDatenbank::sendeRemoveEMail(const char* name, InitDatei* zIni) { Text* befehl = new Text("SELECT account_loeschen.schluessel, account.e_mail FROM account, account_loeschen WHERE account.id = account_loeschen.account_id AND account.name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); Datei md; if (res.zeilenAnzahl) { md.setDatei(res.values[0].getText()); if (md.open(Datei::Style::schreiben)) { Text txt = res.values[1].getText(); txt += "\nAccount löschen\nSchade, dass du deinen Account löschen möchtest.\nBestätigungscode: "; txt += res.values[0].getText(); md.schreibe(txt, txt.getLength()); md.close(); // e_mail senden pid_t pid; char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)res.values[0].getText(), (char*)0 }; posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0); } } res.destroy(); } // constant Text* RSDatenbank::getLetzterFehler() const { return datenbank->getLetzterFehler(); }