Datenbank.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. #include "Datenbank.h"
  2. #include <Datei.h>
  3. #include <iostream>
  4. #include <spawn.h>
  5. // Inhalt der RSDatenbank Klasse aus Datenbank.h
  6. // Konstruktor
  7. RSDatenbank::RSDatenbank(InitDatei* zIni)
  8. : ReferenceCounter()
  9. {
  10. datenbank = new Datenbank(zIni->zWert("DBBenutzer")->getText(), zIni->zWert("DBPasswort")->getText(),
  11. zIni->zWert("DBName")->getText(), zIni->zWert("DBIP")->getText(),
  12. (unsigned short)TextZuInt(zIni->zWert("DBPort")->getText(), 10));
  13. if (!datenbank->istOk())
  14. {
  15. std::cout << "AS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
  16. exit(1);
  17. }
  18. InitializeCriticalSection(&cs);
  19. Text befehl = "SELECT port, admin_port FROM server WHERE id = ";
  20. befehl += zIni->zWert("ServerId")->getText();
  21. lock();
  22. datenbank->befehl(befehl);
  23. Result res = datenbank->getResult();
  24. unlock();
  25. if (res.zeilenAnzahl == 1)
  26. {
  27. zIni->addWert("ServerPort", res.values[0]);
  28. zIni->addWert("AdminServerPort", res.values[1]);
  29. }
  30. res.destroy();
  31. }
  32. // Destruktor
  33. RSDatenbank::~RSDatenbank()
  34. {
  35. datenbank->release();
  36. DeleteCriticalSection(&cs);
  37. }
  38. // nicht constant
  39. void RSDatenbank::lock()
  40. {
  41. EnterCriticalSection(&cs);
  42. }
  43. void RSDatenbank::unlock()
  44. {
  45. LeaveCriticalSection(&cs);
  46. }
  47. int RSDatenbank::istAdministrator(const char* name, const char* passwort)
  48. {
  49. Text* befehl = new Text("SELECT id FROM benutzer WHERE name = '");
  50. Text n(name);
  51. n.ersetzen("'", "''");
  52. befehl->append(n);
  53. befehl->append("' AND passwort = md5( '");
  54. Text p(passwort);
  55. p.ersetzen("'", "''");
  56. befehl->append(p);
  57. befehl->append("' )");
  58. lock();
  59. datenbank->befehl(befehl->getText());
  60. Result res = datenbank->getResult();
  61. unlock();
  62. befehl->release();
  63. int ret = 0;
  64. if (res.zeilenAnzahl > 0)
  65. ret = TextZuInt(res.values[0].getText(), 10);
  66. res.destroy();
  67. return ret;
  68. }
  69. bool RSDatenbank::adminHatRecht(int id, int recht)
  70. {
  71. Text* befehl = new Text("SELECT * FROM benutzer_rechte WHERE benutzer_id = ");
  72. befehl->append(id);
  73. befehl->append(" AND rechte_id = ");
  74. befehl->append(recht);
  75. lock();
  76. datenbank->befehl(befehl->getText());
  77. int ret = datenbank->getZeilenAnzahl();
  78. unlock();
  79. befehl->release();
  80. return ret != 0;
  81. }
  82. bool RSDatenbank::proveKlient(int num, int sNum)
  83. {
  84. Text* befehl = new Text("SELECT * FROM server_client WHERE server_id = ");
  85. befehl->append(sNum);
  86. befehl->append(" AND client_id = ");
  87. befehl->append(num);
  88. lock();
  89. datenbank->befehl(befehl->getText());
  90. Result res = datenbank->getResult();
  91. unlock();
  92. befehl->release();
  93. bool ret = 0;
  94. if (res.zeilenAnzahl == 1)
  95. ret = 1;
  96. res.destroy();
  97. return ret;
  98. }
  99. Text* RSDatenbank::getKlientKey(int cId)
  100. {
  101. lock();
  102. if (!datenbank->befehl(Text("SELECT schluessel FROM client WHERE id = ") += cId))
  103. {
  104. unlock();
  105. return 0;
  106. }
  107. Result res = datenbank->getResult();
  108. unlock();
  109. if (!res.zeilenAnzahl)
  110. {
  111. res.destroy();
  112. return 0;
  113. }
  114. Text* ret = new Text(res.values[0].getText());
  115. res.destroy();
  116. return ret;
  117. }
  118. void RSDatenbank::unregisterKlient(int num, int sNum)
  119. {
  120. Text* befehl = new Text("DELETE FROM server_client WHERE client_id = ");
  121. befehl->append(num);
  122. befehl->append(" AND server_id = ");
  123. befehl->append(sNum);
  124. lock();
  125. datenbank->befehl(befehl->getText());
  126. int za = datenbank->getZeilenAnzahl();
  127. unlock();
  128. if (za == 1)
  129. {
  130. befehl->setText("UPDATE server SET tasks = tasks - 1 WHERE id = ");
  131. befehl->append(sNum);
  132. lock();
  133. datenbank->befehl(befehl->getText());
  134. unlock();
  135. }
  136. befehl->release();
  137. }
  138. bool RSDatenbank::setServerStatus(int id, int status)
  139. {
  140. Text* befehl = new Text("UPDATE server SET server_status_id = ");
  141. *befehl += status;
  142. *befehl += "WHERE id = ";
  143. *befehl += id;
  144. lock();
  145. if (!datenbank->befehl(befehl->getText()))
  146. {
  147. unlock();
  148. befehl->release();
  149. return 0;
  150. }
  151. bool ret = datenbank->getZeilenAnzahl() != 0;
  152. unlock();
  153. befehl->release();
  154. return ret;
  155. }
  156. bool RSDatenbank::setMaxClients(int id, int maxC)
  157. {
  158. Text* befehl = new Text("UPDATE server SET max_tasks = ");
  159. befehl->append(maxC);
  160. befehl->append(" WHERE id = ");
  161. befehl->append(id);
  162. lock();
  163. if (!datenbank->befehl(befehl->getText()))
  164. {
  165. unlock();
  166. befehl->release();
  167. return 0;
  168. }
  169. bool ret = datenbank->getZeilenAnzahl() > 0;
  170. unlock();
  171. befehl->release();
  172. return ret;
  173. }
  174. bool RSDatenbank::serverIstNichtPausiert(int id)
  175. {
  176. Text* befehl = new Text("SELECT server_status_id FROM server WHERE id = ");
  177. befehl->append(id);
  178. lock();
  179. if (!datenbank->befehl(befehl->getText()))
  180. {
  181. unlock();
  182. befehl->release();
  183. return 0;
  184. }
  185. Result res = datenbank->getResult();
  186. unlock();
  187. befehl->release();
  188. if (!res.zeilenAnzahl)
  189. {
  190. res.destroy();
  191. return 0;
  192. }
  193. bool ret = (int)res.values[0] == 3;
  194. res.destroy();
  195. return ret;
  196. }
  197. int RSDatenbank::proveNeuAccount(const char* name, const char* eMail)
  198. {
  199. Text* befehl = new Text("SELECT account_neu_alt_check( '");
  200. Text n(name);
  201. n.ersetzen("'", "''");
  202. befehl->append(n);
  203. befehl->append("', '");
  204. Text m(eMail);
  205. m.ersetzen("'", "''");
  206. befehl->append(m);
  207. befehl->append("' )");
  208. lock();
  209. datenbank->befehl(befehl->getText());
  210. Result res = datenbank->getResult();
  211. unlock();
  212. if (res.values[0].istGleich("t"))
  213. {
  214. befehl->release();
  215. res.destroy();
  216. return 0;
  217. }
  218. else
  219. {
  220. res.destroy();
  221. befehl->setText("SELECT account.id FROM account, account_neu WHERE account.name = '");
  222. befehl->append(n);
  223. befehl->append("' OR account_neu.name = '");
  224. befehl->append(n);
  225. befehl->append("'");
  226. lock();
  227. datenbank->befehl(befehl->getText());
  228. res = datenbank->getResult();
  229. unlock();
  230. if (res.zeilenAnzahl > 0)
  231. {
  232. befehl->release();
  233. res.destroy();
  234. return 1;
  235. }
  236. else
  237. {
  238. res.destroy();
  239. befehl->release();
  240. return 2;
  241. }
  242. }
  243. }
  244. bool RSDatenbank::neuAccount(const char* name, const char* pass, const char* geheim, const char* eMail, const char* gebDatum, InitDatei* zIni)
  245. {
  246. Text* befehl = new Text("INSERT INTO account_neu( name, passwort, geheimnis, e_mail, geb_datum ) VALUES ( '");
  247. Text n(name);
  248. n.ersetzen("'", "''");
  249. befehl->append(n);
  250. befehl->append("', md5( '");
  251. Text p(pass);
  252. p.ersetzen("'", "''");
  253. befehl->append(p);
  254. befehl->append("' ), '");
  255. Text g(geheim);
  256. g.ersetzen("'", "''");
  257. befehl->append(g);
  258. befehl->append("', '");
  259. Text m(eMail);
  260. m.ersetzen("'", "''");
  261. befehl->append(m);
  262. befehl->append("', '");
  263. Text d(gebDatum);
  264. d.ersetzen("'", "''");
  265. befehl->append(d);
  266. befehl->append("' )");
  267. lock();
  268. if (datenbank->befehl(befehl->getText()))
  269. {
  270. unlock();
  271. befehl->setText("SELECT schluessel, id FROM account_neu WHERE name = '");
  272. befehl->append(n);
  273. befehl->append("'");
  274. lock();
  275. datenbank->befehl(befehl->getText());
  276. Result res = datenbank->getResult();
  277. unlock();
  278. if (res.zeilenAnzahl)
  279. {
  280. // e_mail senden
  281. pid_t pid;
  282. 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 };
  283. posix_spawn(&pid, zIni->zWert("PHP")->getText(), 0, 0, pargs, 0);
  284. }
  285. res.destroy();
  286. befehl->release();
  287. return 1;
  288. }
  289. unlock();
  290. befehl->release();
  291. return 0;
  292. }
  293. int RSDatenbank::removeAccount(const char* name, const char* pass, const char* geheim, InitDatei* zIni)
  294. {
  295. Text* befehl = new Text("SELECT account_loeschen( '");
  296. Text n(name);
  297. n.ersetzen("'", "''");
  298. befehl->append(n);
  299. befehl->append("', md5( '");
  300. Text p(pass);
  301. p.ersetzen("'", "''");
  302. befehl->append(p);
  303. befehl->append("' ), '");
  304. Text g(geheim);
  305. g.ersetzen("'", "''");
  306. befehl->append(g);
  307. befehl->append("' )");
  308. lock();
  309. datenbank->befehl(befehl->getText());
  310. Result res = datenbank->getResult();
  311. unlock();
  312. int ret = TextZuInt(res.values[0].getText(), 10);
  313. res.destroy();
  314. if (!ret)
  315. {
  316. befehl->setText("SELECT account_loeschen.schluessel, account.e_mail FROM account, account_loeschen WHERE account.id = account_loeschen.account_id AND account.name = '");
  317. befehl->append(n);
  318. befehl->append("'");
  319. lock();
  320. datenbank->befehl(befehl->getText());
  321. res = datenbank->getResult();
  322. unlock();
  323. Datei md;
  324. if (res.zeilenAnzahl)
  325. {
  326. md.setDatei(res.values[0].getText());
  327. if (md.open(Datei::Style::schreiben))
  328. {
  329. Text txt = res.values[1].getText();
  330. txt += "\nAccount löschen\nSchade, dass du deinen Account löschen möchtest.\nBestätigungscode: ";
  331. txt += res.values[0].getText();
  332. md.schreibe(txt, txt.getLength());
  333. md.close();
  334. // e_mail senden
  335. pid_t pid;
  336. char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)res.values[0].getText(), (char*)0 };
  337. posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0);
  338. }
  339. }
  340. res.destroy();
  341. }
  342. befehl->release();
  343. return ret;
  344. }
  345. void RSDatenbank::removeAccountAbbruch(const char* name)
  346. {
  347. Text* befehl = new Text("DELETE FROM account_loeschen WHERE account_id = ( SELECT id FROM account where name = '");
  348. Text n(name);
  349. n.ersetzen("'", "''");
  350. befehl->append(n);
  351. befehl->append("' )");
  352. lock();
  353. datenbank->befehl(befehl->getText());
  354. unlock();
  355. befehl->release();
  356. }
  357. bool RSDatenbank::removeConfirmation(const char* name, const char* key)
  358. {
  359. Text* befehl = new Text("SELECT account_loeschen_bestaetigen( '");
  360. Text n(name);
  361. n.ersetzen("'", "''");
  362. befehl->append(n);
  363. befehl->append("', '");
  364. Text s(key);
  365. s.ersetzen("'", "''");
  366. befehl->append(s);
  367. befehl->append("' )");
  368. lock();
  369. datenbank->befehl(befehl->getText());
  370. Result res = datenbank->getResult();
  371. unlock();
  372. befehl->release();
  373. if (res.values[0].istGleich("t"))
  374. {
  375. res.destroy();
  376. return 1;
  377. }
  378. res.destroy();
  379. return 0;
  380. }
  381. int RSDatenbank::passwortChange(const char* name, const char* pass, const char* nPass, const char* geheim)
  382. {
  383. Text* befehl = new Text("SELECT id, passwort, geheimnis, md5( '");
  384. Text p(name);
  385. p.ersetzen("'", "''");
  386. befehl->append(p);
  387. befehl->append("' ) FROM account WHERE name = '");
  388. Text n(name);
  389. n.ersetzen("'", "''");
  390. befehl->append(n);
  391. befehl->append("'");
  392. lock();
  393. datenbank->befehl(befehl->getText());
  394. Result res = datenbank->getResult();
  395. unlock();
  396. if (res.zeilenAnzahl != 1)
  397. {
  398. res.destroy();
  399. befehl->release();
  400. return 1;
  401. }
  402. if (!res.values[1].istGleich(res.values[3]))
  403. {
  404. res.destroy();
  405. befehl->release();
  406. return 2;
  407. }
  408. if (!res.values[2].istGleich(geheim))
  409. {
  410. res.destroy();
  411. befehl->release();
  412. return 3;
  413. }
  414. befehl->setText("UPDATE account SET passwort = md5( '");
  415. p = Text(nPass);
  416. p.ersetzen("'", "''");
  417. befehl->append(p);
  418. befehl->append("' ) WHERE id = ");
  419. befehl->append(res.values[0].getText());
  420. res.destroy();
  421. lock();
  422. datenbank->befehl(befehl->getText());
  423. unlock();
  424. befehl->release();
  425. return 0;
  426. }
  427. int RSDatenbank::eMailChange(const char* name, const char* pass, const char* geheim, const char* eMail)
  428. {
  429. Text* befehl = new Text("SELECT id, passwort, geheimnis, md5( '");
  430. Text p(name);
  431. p.ersetzen("'", "''");
  432. befehl->append(p);
  433. befehl->append("' ) FROM account WHERE name = '");
  434. Text n(name);
  435. n.ersetzen("'", "''");
  436. befehl->append(n);
  437. befehl->append("'");
  438. lock();
  439. datenbank->befehl(befehl->getText());
  440. Result res = datenbank->getResult();
  441. unlock();
  442. if (res.zeilenAnzahl != 1)
  443. {
  444. res.destroy();
  445. befehl->release();
  446. return 1;
  447. }
  448. if (!res.values[1].istGleich(res.values[3]))
  449. {
  450. res.destroy();
  451. befehl->release();
  452. return 2;
  453. }
  454. if (!res.values[2].istGleich(geheim))
  455. {
  456. res.destroy();
  457. befehl->release();
  458. return 3;
  459. }
  460. befehl->setText("Update account SET e_mail = '");
  461. Text m(eMail);
  462. m.ersetzen("'", "''");
  463. befehl->append(m);
  464. befehl->append("' WHERE id = ");
  465. befehl->append(res.values[0].getText());
  466. res.destroy();
  467. int ret = 0;
  468. lock();
  469. if (!datenbank->befehl(befehl->getText()))
  470. ret = 4;
  471. unlock();
  472. befehl->release();
  473. return ret;
  474. }
  475. int RSDatenbank::geheimnisChange(const char* name, const char* pass, const char* geheim, const char* nGeheim)
  476. {
  477. Text* befehl = new Text("SELECT id, passwort, geheimnis, md5( '");
  478. Text p(name);
  479. p.ersetzen("'", "''");
  480. befehl->append(p);
  481. befehl->append("' ) FROM account WHERE name = '");
  482. Text n(name);
  483. n.ersetzen("'", "''");
  484. befehl->append(n);
  485. befehl->append("'");
  486. lock();
  487. datenbank->befehl(befehl->getText());
  488. Result res = datenbank->getResult();
  489. unlock();
  490. if (res.zeilenAnzahl != 1)
  491. {
  492. res.destroy();
  493. befehl->release();
  494. return 1;
  495. }
  496. if (!res.values[1].istGleich(res.values[3]))
  497. {
  498. res.destroy();
  499. befehl->release();
  500. return 2;
  501. }
  502. if (!res.values[2].istGleich(geheim))
  503. {
  504. res.destroy();
  505. befehl->release();
  506. return 3;
  507. }
  508. befehl->setText("UPDATE account SET geheimnis = '");
  509. Text g(nGeheim);
  510. g.ersetzen("'", "''");
  511. befehl->append(g);
  512. befehl->append("' WHERE id = ");
  513. befehl->append(res.values[0].getText());
  514. res.destroy();
  515. lock();
  516. datenbank->befehl(befehl->getText());
  517. unlock();
  518. befehl->release();
  519. return 0;
  520. }
  521. bool RSDatenbank::nameVergessen(const char* pass, const char* geheim, InitDatei* zIni)
  522. {
  523. Text* befehl = new Text("SELECT name, e_mail FROM account WHERE passwort = md5( '");
  524. Text p(pass);
  525. p.ersetzen("'", "''");
  526. befehl->append(p);
  527. befehl->append("' ) AND geheimnis = '");
  528. Text g(geheim);
  529. g.ersetzen("'", "''");
  530. befehl->append(g);
  531. befehl->append("'");
  532. lock();
  533. datenbank->befehl(befehl->getText());
  534. Result res = datenbank->getResult();
  535. unlock();
  536. befehl->release();
  537. if (res.zeilenAnzahl != 1)
  538. {
  539. res.destroy();
  540. return 0;
  541. }
  542. Datei md;
  543. if (res.zeilenAnzahl)
  544. {
  545. Text pfad = res.values[0].getText();
  546. pfad.ersetzen(" ", "_");
  547. pfad.insert(0, "mail.");
  548. md.setDatei(pfad);
  549. if (md.open(Datei::Style::schreiben))
  550. {
  551. Text txt = res.values[1].getText();
  552. txt += "\nAccount Name\nDein Account Name lautet: ";
  553. txt += res.values[0].getText();
  554. md.schreibe(txt, txt.getLength());
  555. md.close();
  556. // e_mail senden
  557. pid_t pid;
  558. char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)pfad.getText(), (char*)0 };
  559. posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0);
  560. }
  561. }
  562. res.destroy();
  563. return 1;
  564. }
  565. bool RSDatenbank::passwortVergessen(const char* name, const char* geheim, InitDatei* zIni)
  566. {
  567. Text* befehl = new Text("SELECT get_next_schluessel()");
  568. lock();
  569. datenbank->befehl(befehl->getText());
  570. Result res = datenbank->getResult();
  571. unlock();
  572. befehl->setText("UPDATE account SET passwort = md5( '");
  573. Text pass(res.values[0]);
  574. res.destroy();
  575. befehl->append(pass);
  576. befehl->append("' ) WHERE name = '");
  577. Text n(name);
  578. n.ersetzen("'", "''");
  579. befehl->append(n);
  580. befehl->append("' AND geheimnis = '");
  581. Text g(geheim);
  582. g.ersetzen("'", "''");
  583. befehl->append(g);
  584. befehl->append("' RETURNING e_mail");
  585. lock();
  586. datenbank->befehl(befehl->getText());
  587. res = datenbank->getResult();
  588. unlock();
  589. befehl->release();
  590. if (res.zeilenAnzahl != 1)
  591. {
  592. res.destroy();
  593. return 0;
  594. }
  595. Datei md;
  596. if (res.zeilenAnzahl)
  597. {
  598. Text pfad = res.values[0].getText();
  599. pfad.ersetzen(" ", "_");
  600. pfad.insert(0, "mail.");
  601. md.setDatei(pfad);
  602. if (md.open(Datei::Style::schreiben))
  603. {
  604. Text txt = res.values[1].getText();
  605. txt += "\nAccount Passwort\nDein Account Passwort wurde zurückgesetzt und lautet jetzt: ";
  606. txt += pass.getText();
  607. md.schreibe(txt, txt.getLength());
  608. md.close();
  609. // e_mail senden
  610. pid_t pid;
  611. char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)pfad.getText(), (char*)0 };
  612. posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0);
  613. }
  614. }
  615. res.destroy();
  616. return 1;
  617. }
  618. bool RSDatenbank::geheimnisVergessen(const char* name, const char* pass, InitDatei* zIni)
  619. {
  620. Text* befehl = new Text("SELECT geheimnis, e_mail FROM account WHERE name = '");
  621. Text n(name);
  622. n.ersetzen("'", "''");
  623. befehl->append(n);
  624. befehl->append("' AND passwort = md5( '");
  625. Text p(pass);
  626. p.ersetzen("'", "''");
  627. befehl->append(p);
  628. befehl->append("' )");
  629. lock();
  630. datenbank->befehl(befehl->getText());
  631. Result res = datenbank->getResult();
  632. unlock();
  633. befehl->release();
  634. if (res.zeilenAnzahl != 1)
  635. {
  636. res.destroy();
  637. return 0;
  638. }
  639. Datei md;
  640. if (res.zeilenAnzahl)
  641. {
  642. Text pfad = res.values[0].getText();
  643. pfad.ersetzen(" ", "_");
  644. pfad.insert(0, "mail.");
  645. md.setDatei(pfad);
  646. if (md.open(Datei::Style::schreiben))
  647. {
  648. Text txt = res.values[1].getText();
  649. txt += "\nAccount Geheimnis\nDein Account Geheimnis lautet: ";
  650. txt += res.values[0].getText();
  651. md.schreibe(txt, txt.getLength());
  652. md.close();
  653. // e_mail senden
  654. pid_t pid;
  655. char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)pfad.getText(), (char*)0 };
  656. posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0);
  657. }
  658. }
  659. res.destroy();
  660. return 1;
  661. }
  662. Text* RSDatenbank::eMailVergessen(const char* name, const char* pass, const char* geheim)
  663. {
  664. Text* befehl = new Text("SELECT e_mail FROM account WHERE name = '");
  665. Text n(name);
  666. n.ersetzen("'", "''");
  667. befehl->append(n);
  668. befehl->append("' AND passwort = md5( '");
  669. Text p(pass);
  670. p.ersetzen("'", "''");
  671. befehl->append(p);
  672. befehl->append("' ) AND geheimnis = '");
  673. Text g(geheim);
  674. g.ersetzen("'", "''");
  675. befehl->append(g);
  676. befehl->append("'");
  677. lock();
  678. datenbank->befehl(befehl->getText());
  679. Result res = datenbank->getResult();
  680. unlock();
  681. befehl->release();
  682. if (res.zeilenAnzahl != 1)
  683. {
  684. res.destroy();
  685. return 0;
  686. }
  687. Text* ret = new Text(res.values[0].getText());
  688. res.destroy();
  689. return ret;
  690. }
  691. char RSDatenbank::suchConfirmation(const char* name, const char* pass)
  692. {
  693. Text* befehl = new Text("select such_account_bestaetigung( '");
  694. Text n(name);
  695. n.ersetzen("'", "''");
  696. befehl->append(n);
  697. befehl->append("', '");
  698. Text p(pass);
  699. p.ersetzen("'", "''");
  700. befehl->append(p);
  701. befehl->append("' )");
  702. lock();
  703. datenbank->befehl(befehl->getText());
  704. Result res = datenbank->getResult();
  705. unlock();
  706. befehl->release();
  707. char ret = (char)TextZuInt(res.values[0].getText(), 10);
  708. res.destroy();
  709. return ret;
  710. }
  711. void RSDatenbank::sendeRemoveEMail(const char* name, InitDatei* zIni)
  712. {
  713. 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 = '");
  714. Text n(name);
  715. n.ersetzen("'", "''");
  716. befehl->append(n);
  717. befehl->append("'");
  718. lock();
  719. datenbank->befehl(befehl->getText());
  720. Result res = datenbank->getResult();
  721. unlock();
  722. befehl->release();
  723. Datei md;
  724. if (res.zeilenAnzahl)
  725. {
  726. md.setDatei(res.values[0].getText());
  727. if (md.open(Datei::Style::schreiben))
  728. {
  729. Text txt = res.values[1].getText();
  730. txt += "\nAccount löschen\nSchade, dass du deinen Account löschen möchtest.\nBestätigungscode: ";
  731. txt += res.values[0].getText();
  732. md.schreibe(txt, txt.getLength());
  733. md.close();
  734. // e_mail senden
  735. pid_t pid;
  736. char* pargs[] = { (char*)zIni->zWert("Java")->getText(), (char*)zIni->zWert("Mailer")->getText(), (char*)res.values[0].getText(), (char*)0 };
  737. posix_spawn(&pid, zIni->zWert("Java")->getText(), 0, 0, pargs, 0);
  738. }
  739. }
  740. res.destroy();
  741. }
  742. // constant
  743. Text* RSDatenbank::getLetzterFehler() const
  744. {
  745. return datenbank->getLetzterFehler();
  746. }