Datenbank.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  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. {
  9. datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
  10. zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
  11. (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
  12. if( !datenbank->istOk() )
  13. {
  14. std::cout << "AS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
  15. exit( 1 );
  16. }
  17. InitializeCriticalSection( &cs );
  18. ref = 1;
  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( (char*)n );
  53. befehl->append( "' AND passwort = md5( '" );
  54. Text p( passwort );
  55. p.ersetzen( "'", "''" );
  56. befehl->append( (char*)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_register_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( (char*)n );
  203. befehl->append( "', '" );
  204. Text m( eMail );
  205. m.ersetzen( "'", "''" );
  206. befehl->append( (char*)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( (char*)n );
  223. befehl->append( "' OR account_neu.name = '" );
  224. befehl->append( (char*)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( (char*)n );
  250. befehl->append( "', md5( '" );
  251. Text p( pass );
  252. p.ersetzen( "'", "''" );
  253. befehl->append( (char*)p );
  254. befehl->append( "' ), '" );
  255. Text g( geheim );
  256. g.ersetzen( "'", "''" );
  257. befehl->append( (char*)g );
  258. befehl->append( "', '" );
  259. Text m( eMail );
  260. m.ersetzen( "'", "''" );
  261. befehl->append( (char*)m );
  262. befehl->append( "', '" );
  263. Text d( gebDatum );
  264. d.ersetzen( "'", "''" );
  265. befehl->append( (char*)d );
  266. befehl->append( "' )" );
  267. lock();
  268. if( datenbank->befehl( befehl->getText() ) )
  269. {
  270. unlock();
  271. befehl->setText( "SELECT schluessel FROM account_neu WHERE name = '" );
  272. befehl->append( (char*)n );
  273. befehl->append( "'" );
  274. lock();
  275. datenbank->befehl( befehl->getText() );
  276. Result res = datenbank->getResult();
  277. unlock();
  278. Datei md;
  279. if( res.zeilenAnzahl )
  280. {
  281. md.setDatei( res.values[ 0 ].getText() );
  282. if( md.open( Datei::Style::schreiben ) )
  283. {
  284. md.schreibe( (char*)eMail, textLength( eMail ) );
  285. md.schreibe( ( char* )"\nAccount freischalten\n", 22 );
  286. md.schreibe( ( char* )"Dein Account Daten:\n", 20 );
  287. md.schreibe( ( char* )"name: ", 6 );
  288. md.schreibe( (char*)name, textLength( name ) );
  289. md.schreibe( ( char* )"\npasswort: ", 11 );
  290. md.schreibe( (char*)pass, textLength( pass ) );
  291. md.schreibe( ( char* )"\ngeheimnis: ", 12 );
  292. md.schreibe( (char*)geheim, textLength( geheim ) );
  293. md.schreibe( ( char* )"\ngeburtsdatum: ", 15 );
  294. md.schreibe( (char*)gebDatum, textLength( gebDatum ) );
  295. md.schreibe( ( char* )"\naktivierungs key: ", 25 );
  296. md.schreibe( res.values[ 0 ].getText(), res.values[ 0 ].getLength() );
  297. md.close();
  298. // e_mail senden
  299. pid_t pid;
  300. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), res.values[ 0 ].getText(), (char*)0 };
  301. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  302. }
  303. }
  304. res.destroy();
  305. befehl->release();
  306. return 1;
  307. }
  308. unlock();
  309. befehl->release();
  310. return 0;
  311. }
  312. void RSDatenbank::neuAccountAbbruch( const char *name )
  313. {
  314. Text *befehl = new Text( "DELETE FROM account_neu WHERE name = '" );
  315. Text n( name );
  316. n.ersetzen( "'", "''" );
  317. befehl->append( (char*)n );
  318. befehl->append( "'" );
  319. lock();
  320. datenbank->befehl( befehl->getText() );
  321. unlock();
  322. befehl->release();
  323. }
  324. bool RSDatenbank::aktiviereAccount( const char *name, const char *key )
  325. {
  326. Text *befehl = new Text( "SELECT account_aktivieren( '" );
  327. Text n( name );
  328. n.ersetzen( "'", "''" );
  329. befehl->append( (char*)n );
  330. befehl->append( "', '" );
  331. Text s( key );
  332. s.ersetzen( "'", "''" );
  333. befehl->append( (char*)s );
  334. befehl->append( "' )" );
  335. lock();
  336. if( datenbank->befehl( befehl->getText() ) )
  337. {
  338. befehl->release();
  339. Result res = datenbank->getResult();
  340. unlock();
  341. if( res.values[ 0 ].istGleich( "f" ) )
  342. {
  343. res.destroy();
  344. return 0;
  345. }
  346. return 1;
  347. }
  348. unlock();
  349. befehl->release();
  350. return 0;
  351. }
  352. int RSDatenbank::removeAccount( const char *name, const char *pass, const char *geheim, InitDatei *zIni )
  353. {
  354. Text *befehl = new Text( "SELECT account_loeschen( '" );
  355. Text n( name );
  356. n.ersetzen( "'", "''" );
  357. befehl->append( (char*)n );
  358. befehl->append( "', md5( '" );
  359. Text p( pass );
  360. p.ersetzen( "'", "''" );
  361. befehl->append( (char*)p );
  362. befehl->append( "' ), '" );
  363. Text g( geheim );
  364. g.ersetzen( "'", "''" );
  365. befehl->append( (char*)g );
  366. befehl->append( "' )" );
  367. lock();
  368. datenbank->befehl( befehl->getText() );
  369. Result res = datenbank->getResult();
  370. unlock();
  371. int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
  372. res.destroy();
  373. if( !ret )
  374. {
  375. befehl->setText( "SELECT account_loeschen.schluessel, account.e_mail FROM account, account_loeschen WHERE account.id = account_loeschen.account_id AND account.name = '" );
  376. befehl->append( (char*)n );
  377. befehl->append( "'" );
  378. lock();
  379. datenbank->befehl( befehl->getText() );
  380. res = datenbank->getResult();
  381. unlock();
  382. Datei md;
  383. if( res.zeilenAnzahl )
  384. {
  385. md.setDatei( res.values[ 0 ].getText() );
  386. if( md.open( Datei::Style::schreiben ) )
  387. {
  388. Text txt = res.values[ 1 ].getText();
  389. txt += "\nAccount löschen\nSchade, dass du deinen Account löschen möchtest.\nBestätigungscode: ";
  390. txt += res.values[ 0 ].getText();
  391. md.schreibe( txt, txt.getLength() );
  392. md.close();
  393. // e_mail senden
  394. pid_t pid;
  395. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), res.values[ 0 ].getText(), (char*)0 };
  396. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  397. }
  398. }
  399. res.destroy();
  400. }
  401. befehl->release();
  402. return ret;
  403. }
  404. void RSDatenbank::removeAccountAbbruch( const char *name )
  405. {
  406. Text *befehl = new Text( "DELETE FROM account_loeschen WHERE account_id = ( SELECT id FROM account where name = '" );
  407. Text n( name );
  408. n.ersetzen( "'", "''" );
  409. befehl->append( (char*)n );
  410. befehl->append( "' )" );
  411. lock();
  412. datenbank->befehl( befehl->getText() );
  413. unlock();
  414. befehl->release();
  415. }
  416. bool RSDatenbank::removeConfirmation( const char *name, const char *key )
  417. {
  418. Text *befehl = new Text( "SELECT account_loeschen_bestaetigen( '" );
  419. Text n( name );
  420. n.ersetzen( "'", "''" );
  421. befehl->append( (char*)n );
  422. befehl->append( "', '" );
  423. Text s( key );
  424. s.ersetzen( "'", "''" );
  425. befehl->append( (char*)s );
  426. befehl->append( "' )" );
  427. lock();
  428. datenbank->befehl( befehl->getText() );
  429. Result res = datenbank->getResult();
  430. unlock();
  431. befehl->release();
  432. if( res.values[ 0 ].istGleich( "t" ) )
  433. {
  434. res.destroy();
  435. return 1;
  436. }
  437. res.destroy();
  438. return 0;
  439. }
  440. int RSDatenbank::passwortChange( const char *name, const char *pass, const char *nPass, const char *geheim )
  441. {
  442. Text * befehl = new Text( "SELECT id, passwort, geheimnis, md5( '" );
  443. Text p( name );
  444. p.ersetzen( "'", "''" );
  445. befehl->append( (char*)p );
  446. befehl->append( "' ) FROM account WHERE name = '" );
  447. Text n( name );
  448. n.ersetzen( "'", "''" );
  449. befehl->append( (char*)n );
  450. befehl->append( "'" );
  451. lock();
  452. datenbank->befehl( befehl->getText() );
  453. Result res = datenbank->getResult();
  454. unlock();
  455. if( res.zeilenAnzahl != 1 )
  456. {
  457. res.destroy();
  458. befehl->release();
  459. return 1;
  460. }
  461. if( !res.values[ 1 ].istGleich( res.values[ 3 ] ) )
  462. {
  463. res.destroy();
  464. befehl->release();
  465. return 2;
  466. }
  467. if( !res.values[ 2 ].istGleich( geheim ) )
  468. {
  469. res.destroy();
  470. befehl->release();
  471. return 3;
  472. }
  473. befehl->setText( "UPDATE account SET passwort = md5( '" );
  474. p = Text( nPass );
  475. p.ersetzen( "'", "''" );
  476. befehl->append( (char*)p );
  477. befehl->append( "' ) WHERE id = " );
  478. befehl->append( res.values[ 0 ].getText() );
  479. res.destroy();
  480. lock();
  481. datenbank->befehl( befehl->getText() );
  482. unlock();
  483. befehl->release();
  484. return 0;
  485. }
  486. int RSDatenbank::eMailChange( const char *name, const char *pass, const char *geheim, const char *eMail )
  487. {
  488. Text *befehl = new Text( "SELECT id, passwort, geheimnis, md5( '" );
  489. Text p( name );
  490. p.ersetzen( "'", "''" );
  491. befehl->append( (char*)p );
  492. befehl->append( "' ) FROM account WHERE name = '" );
  493. Text n( name );
  494. n.ersetzen( "'", "''" );
  495. befehl->append( (char*)n );
  496. befehl->append( "'" );
  497. lock();
  498. datenbank->befehl( befehl->getText() );
  499. Result res = datenbank->getResult();
  500. unlock();
  501. if( res.zeilenAnzahl != 1 )
  502. {
  503. res.destroy();
  504. befehl->release();
  505. return 1;
  506. }
  507. if( !res.values[ 1 ].istGleich( res.values[ 3 ] ) )
  508. {
  509. res.destroy();
  510. befehl->release();
  511. return 2;
  512. }
  513. if( !res.values[ 2 ].istGleich( geheim ) )
  514. {
  515. res.destroy();
  516. befehl->release();
  517. return 3;
  518. }
  519. befehl->setText( "Update account SET e_mail = '" );
  520. Text m( eMail );
  521. m.ersetzen( "'", "''" );
  522. befehl->append( (char*)m );
  523. befehl->append( "' WHERE id = " );
  524. befehl->append( res.values[ 0 ].getText() );
  525. res.destroy();
  526. int ret = 0;
  527. lock();
  528. if( !datenbank->befehl( befehl->getText() ) )
  529. ret = 4;
  530. unlock();
  531. befehl->release();
  532. return ret;
  533. }
  534. int RSDatenbank::geheimnisChange( const char *name, const char *pass, const char *geheim, const char *nGeheim )
  535. {
  536. Text * befehl = new Text( "SELECT id, passwort, geheimnis, md5( '" );
  537. Text p( name );
  538. p.ersetzen( "'", "''" );
  539. befehl->append( (char*)p );
  540. befehl->append( "' ) FROM account WHERE name = '" );
  541. Text n( name );
  542. n.ersetzen( "'", "''" );
  543. befehl->append( (char*)n );
  544. befehl->append( "'" );
  545. lock();
  546. datenbank->befehl( befehl->getText() );
  547. Result res = datenbank->getResult();
  548. unlock();
  549. if( res.zeilenAnzahl != 1 )
  550. {
  551. res.destroy();
  552. befehl->release();
  553. return 1;
  554. }
  555. if( !res.values[ 1 ].istGleich( res.values[ 3 ] ) )
  556. {
  557. res.destroy();
  558. befehl->release();
  559. return 2;
  560. }
  561. if( !res.values[ 2 ].istGleich( geheim ) )
  562. {
  563. res.destroy();
  564. befehl->release();
  565. return 3;
  566. }
  567. befehl->setText( "UPDATE account SET geheimnis = '" );
  568. Text g( nGeheim );
  569. g.ersetzen( "'", "''" );
  570. befehl->append( (char*)g );
  571. befehl->append( "' WHERE id = " );
  572. befehl->append( res.values[ 0 ].getText() );
  573. res.destroy();
  574. lock();
  575. datenbank->befehl( befehl->getText() );
  576. unlock();
  577. befehl->release();
  578. return 0;
  579. }
  580. bool RSDatenbank::nameVergessen( const char *pass, const char *geheim, InitDatei *zIni )
  581. {
  582. Text *befehl = new Text( "SELECT name, e_mail FROM account WHERE passwort = md5( '" );
  583. Text p( pass );
  584. p.ersetzen( "'", "''" );
  585. befehl->append( (char*)p );
  586. befehl->append( "' ) AND geheimnis = '" );
  587. Text g( geheim );
  588. g.ersetzen( "'", "''" );
  589. befehl->append( (char*)g );
  590. befehl->append( "'" );
  591. lock();
  592. datenbank->befehl( befehl->getText() );
  593. Result res = datenbank->getResult();
  594. unlock();
  595. befehl->release();
  596. if( res.zeilenAnzahl != 1 )
  597. {
  598. res.destroy();
  599. return 0;
  600. }
  601. Datei md;
  602. if( res.zeilenAnzahl )
  603. {
  604. Text pfad = res.values[ 0 ].getText();
  605. pfad.ersetzen( " ", "_" );
  606. pfad.insert( 0, "mail." );
  607. md.setDatei( pfad );
  608. if( md.open( Datei::Style::schreiben ) )
  609. {
  610. Text txt = res.values[ 1 ].getText();
  611. txt += "\nAccount Name\nDein Account Name lautet: ";
  612. txt += res.values[ 0 ].getText();
  613. md.schreibe( txt, txt.getLength() );
  614. md.close();
  615. // e_mail senden
  616. pid_t pid;
  617. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), pfad, (char*)0 };
  618. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  619. }
  620. }
  621. res.destroy();
  622. return 1;
  623. }
  624. bool RSDatenbank::passwortVergessen( const char *name, const char *geheim, InitDatei *zIni )
  625. {
  626. Text *befehl = new Text( "SELECT get_next_schluessel()" );
  627. lock();
  628. datenbank->befehl( befehl->getText() );
  629. Result res = datenbank->getResult();
  630. unlock();
  631. befehl->setText( "UPDATE account SET passwort = md5( '" );
  632. Text pass( (char*)res.values[ 0 ] );
  633. res.destroy();
  634. befehl->append( (char*)pass );
  635. befehl->append( "' ) WHERE name = '" );
  636. Text n( name );
  637. n.ersetzen( "'", "''" );
  638. befehl->append( (char*)n );
  639. befehl->append( "' AND geheimnis = '" );
  640. Text g( geheim );
  641. g.ersetzen( "'", "''" );
  642. befehl->append( (char*)g );
  643. befehl->append( "' RETURNING e_mail" );
  644. lock();
  645. datenbank->befehl( befehl->getText() );
  646. Result res = datenbank->getResult();
  647. unlock();
  648. befehl->release();
  649. if( res.zeilenAnzahl != 1 )
  650. {
  651. res.destroy();
  652. return 0;
  653. }
  654. Datei md;
  655. if( res.zeilenAnzahl )
  656. {
  657. Text pfad = res.values[ 0 ].getText();
  658. pfad.ersetzen( " ", "_" );
  659. pfad.insert( 0, "mail." );
  660. md.setDatei( pfad );
  661. if( md.open( Datei::Style::schreiben ) )
  662. {
  663. Text txt = res.values[ 1 ].getText();
  664. txt += "\nAccount Passwort\nDein Account Passwort wurde zurückgesetzt und lautet jetzt: ";
  665. txt += pass.getText();
  666. md.schreibe( txt, txt.getLength() );
  667. md.close();
  668. // e_mail senden
  669. pid_t pid;
  670. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), pfad, (char*)0 };
  671. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  672. }
  673. }
  674. res.destroy();
  675. return 1;
  676. }
  677. bool RSDatenbank::geheimnisVergessen( const char *name, const char *pass, InitDatei *zIni )
  678. {
  679. Text *befehl = new Text( "SELECT geheimnis, e_mail FROM account WHERE name = '" );
  680. Text n( name );
  681. n.ersetzen( "'", "''" );
  682. befehl->append( (char*)n );
  683. befehl->append( "' AND passwort = md5( '" );
  684. Text p( pass );
  685. p.ersetzen( "'", "''" );
  686. befehl->append( (char*)p );
  687. befehl->append( "' )" );
  688. lock();
  689. datenbank->befehl( befehl->getText() );
  690. Result res = datenbank->getResult();
  691. unlock();
  692. befehl->release();
  693. if( res.zeilenAnzahl != 1 )
  694. {
  695. res.destroy();
  696. return 0;
  697. }
  698. Datei md;
  699. if( res.zeilenAnzahl )
  700. {
  701. Text pfad = res.values[ 0 ].getText();
  702. pfad.ersetzen( " ", "_" );
  703. pfad.insert( 0, "mail." );
  704. md.setDatei( pfad );
  705. if( md.open( Datei::Style::schreiben ) )
  706. {
  707. Text txt = res.values[ 1 ].getText();
  708. txt += "\nAccount Geheimnis\nDein Account Geheimnis lautet: ";
  709. txt += res.values[ 0 ].getText();
  710. md.schreibe( txt, txt.getLength() );
  711. md.close();
  712. // e_mail senden
  713. pid_t pid;
  714. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), pfad, (char*)0 };
  715. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  716. }
  717. }
  718. res.destroy();
  719. return 1;
  720. }
  721. Text *RSDatenbank::eMailVergessen( const char *name, const char *pass, const char *geheim )
  722. {
  723. Text *befehl = new Text( "SELECT e_mail FROM account WHERE name = '" );
  724. Text n( name );
  725. n.ersetzen( "'", "''" );
  726. befehl->append( (char*)n );
  727. befehl->append( "' AND passwort = md5( '" );
  728. Text p( pass );
  729. p.ersetzen( "'", "''" );
  730. befehl->append( (char*)p );
  731. befehl->append( "' ) AND geheimnis = '" );
  732. Text g( geheim );
  733. g.ersetzen( "'", "''" );
  734. befehl->append( (char*)g );
  735. befehl->append( "'" );
  736. lock();
  737. datenbank->befehl( befehl->getText() );
  738. Result res = datenbank->getResult();
  739. unlock();
  740. befehl->release();
  741. if( res.zeilenAnzahl != 1 )
  742. {
  743. res.destroy();
  744. return 0;
  745. }
  746. Text *ret = new Text( res.values[ 0 ].getText() );
  747. res.destroy();
  748. return ret;
  749. }
  750. char RSDatenbank::suchConfirmation( const char *name, const char *pass )
  751. {
  752. Text *befehl = new Text( "select such_account_bestaetigung( '" );
  753. Text n( name );
  754. n.ersetzen( "'", "''" );
  755. befehl->append( (char*)n );
  756. befehl->append( "', '" );
  757. Text p( pass );
  758. p.ersetzen( "'", "''" );
  759. befehl->append( (char*)p );
  760. befehl->append( "' )" );
  761. lock();
  762. datenbank->befehl( befehl->getText() );
  763. Result res = datenbank->getResult();
  764. unlock();
  765. befehl->release();
  766. char ret = (char)TextZuInt( res.values[ 0 ].getText(), 10 );
  767. res.destroy();
  768. return ret;
  769. }
  770. void RSDatenbank::sendeErstellEMail( const char *name, InitDatei *zIni )
  771. {
  772. Text *befehl = new Text( "SELECT geheimnis, e_mail, geb_datum, schluessel FROM account_neu WHERE name = '" );
  773. Text n( name );
  774. n.ersetzen( "'", "''" );
  775. befehl->append( (char*)n );
  776. befehl->append( "'" );
  777. lock();
  778. datenbank->befehl( befehl->getText() );
  779. Result res = datenbank->getResult();
  780. unlock();
  781. befehl->release();
  782. Datei md;
  783. if( res.zeilenAnzahl )
  784. {
  785. md.setDatei( res.values[ 3 ].getText() );
  786. if( md.open( Datei::Style::schreiben ) )
  787. {
  788. Text txt = res.values[ 1 ].getText();
  789. txt += "\nAccount freischalten\nDeine Account Daten:\n";
  790. txt += "\r\nname: ";
  791. txt += name;
  792. txt += "\r\ngeheimnis: ";
  793. txt += res.values[ 0 ].getText();
  794. txt += "\r\ngeburtsdatum: ";
  795. txt += res.values[ 2 ].getText();
  796. txt += "\r\naktivierungs key: ";
  797. txt += res.values[ 3 ].getText();
  798. md.schreibe( txt, txt.getLength() );
  799. md.close();
  800. // e_mail senden
  801. pid_t pid;
  802. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), res.values[ 4 ].getText(), (char*)0 };
  803. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  804. }
  805. }
  806. res.destroy();
  807. }
  808. void RSDatenbank::sendeRemoveEMail( const char *name, InitDatei *zIni )
  809. {
  810. 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 = '" );
  811. Text n( name );
  812. n.ersetzen( "'", "''" );
  813. befehl->append( (char*)n );
  814. befehl->append( "'" );
  815. lock();
  816. datenbank->befehl( befehl->getText() );
  817. Result res = datenbank->getResult();
  818. unlock();
  819. befehl->release();
  820. Datei md;
  821. if( res.zeilenAnzahl )
  822. {
  823. md.setDatei( res.values[ 0 ].getText() );
  824. if( md.open( Datei::Style::schreiben ) )
  825. {
  826. Text txt = res.values[ 1 ].getText();
  827. txt += "\nAccount löschen\nSchade, dass du deinen Account löschen möchtest.\nBestätigungscode: ";
  828. txt += res.values[ 0 ].getText();
  829. md.schreibe( txt, txt.getLength() );
  830. md.close();
  831. // e_mail senden
  832. pid_t pid;
  833. char *pargs[] = { zIni->zWert( "Java" )->getText(), zIni->zWert( "Mailer" )->getText(), res.values[ 0 ].getText(), (char*)0 };
  834. posix_spawn( &pid, zIni->zWert( "Java" )->getText(), 0, 0, pargs, 0 );
  835. }
  836. }
  837. res.destroy();
  838. }
  839. // constant
  840. Text *RSDatenbank::getLetzterFehler() const
  841. {
  842. return datenbank->getLetzterFehler();
  843. }
  844. // Reference Counting
  845. RSDatenbank *RSDatenbank::getThis()
  846. {
  847. ref++;
  848. return this;
  849. }
  850. RSDatenbank *RSDatenbank::release()
  851. {
  852. ref--;
  853. if( !ref )
  854. delete this;
  855. return 0;
  856. }