You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mainclass.cpp 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. #include "mainclass.h"
  2. #include <QFile>
  3. #include <unistd.h>
  4. #include <limits.h>
  5. MainClass::MainClass(QObject *parent) : QObject(parent)
  6. {
  7. m_serv = new PTServer(this);
  8. connect(m_serv, SIGNAL(newClient(PTSocket*)), this, SLOT(newClient(PTSocket*)));
  9. m_ns = new NetSoul(this);
  10. connect(m_ns, SIGNAL(stateChanged(NetSoul::State)), this, SLOT(netsoulStateChanged(NetSoul::State)));
  11. connect(m_ns, SIGNAL(newMessage(NetSoul::Message)), this, SLOT(netsoulNewMessage(NetSoul::Message)));
  12. connect(m_ns, SIGNAL(userDataChanged(NetSoul::User)), this, SLOT(netsoulUserDataChanged(NetSoul::User)));
  13. m_eventsList.append(&m_nsEvents);
  14. m_eventsList.append(&m_chatEvents);
  15. m_eventsList.append(&m_watchlistEvents);
  16. }
  17. bool MainClass::start()
  18. {
  19. return m_serv->listen(QHostAddress::LocalHost, 12642);
  20. }
  21. void MainClass::execute(PacketType type, QByteArray queryData, PTSocket* sock)
  22. {
  23. QByteArray respData;
  24. QDataStream resp(&respData, QIODevice::ReadWrite);
  25. QDataStream query(&queryData, QIODevice::ReadOnly);
  26. QString error;
  27. resp << true;
  28. if(type == UsersList)
  29. {
  30. QStringList users;
  31. foreach(EpiUser user, Epimafia::loadUsers())
  32. if(user.hasPwd_socks())
  33. users << user.getLogin();
  34. resp << users;
  35. }
  36. else if(type == UsersAdd)
  37. {
  38. QString user, password;
  39. query >> user >> password;
  40. if(!user.isEmpty() && !password.isEmpty())
  41. {
  42. EpiUser usr;
  43. foreach(EpiUser u, Epimafia::loadUsers())
  44. if(u.getLogin() == user)
  45. {
  46. usr = u;
  47. break;
  48. }
  49. usr.setLogin(user);
  50. usr.setPwd_socks(password);
  51. Epimafia::saveUser(usr);
  52. }
  53. else
  54. error = "Empty username or password";
  55. }
  56. else if(type == UsersRemove)
  57. {
  58. QString user;
  59. query >> user;
  60. if(!user.isEmpty())
  61. {
  62. EpiUsers users = Epimafia::loadUsers();
  63. EpiUser usr;
  64. foreach(EpiUser u, users)
  65. if(u.getLogin() == user)
  66. {
  67. usr = u;
  68. break;
  69. }
  70. if(usr.hasLogin())
  71. {
  72. if(usr.hasPassword() || usr.hasPwd_num() || usr.hasPwd_ppp())
  73. {
  74. usr.setPwd_socks(QString());
  75. Epimafia::saveUser(usr);
  76. }
  77. else
  78. Epimafia::removeUser(usr);
  79. }
  80. }
  81. else
  82. error = "Empty username";
  83. }
  84. else if(type == NSConnect)
  85. {
  86. if(!isConnected())
  87. {
  88. QString user;
  89. query >> user;
  90. if(!user.isEmpty())
  91. {
  92. EpiUsers users = Epimafia::loadUsers();
  93. EpiUser usr;
  94. foreach(EpiUser u, users)
  95. if(u.getLogin() == user)
  96. {
  97. usr = u;
  98. break;
  99. }
  100. if(usr.hasLogin())
  101. {
  102. if(usr.hasPwd_socks())
  103. {
  104. m_ns->setLogin(usr);
  105. m_ns->login();
  106. }
  107. else
  108. error = "User has no socks password";
  109. }
  110. else
  111. error = "User not found";
  112. }
  113. else
  114. error = "Empty username";
  115. }
  116. else
  117. error = "Already in use (" + NetSoul::getStringFromState(m_ns->getState()) + ")";
  118. }
  119. else if(type == NSDisconnect)
  120. {
  121. if(isConnected())
  122. m_ns->logout();
  123. else
  124. error = "Not connected (" + NetSoul::getStringFromState(m_ns->getState()) + ")";
  125. }
  126. else if(type == NSStatus)
  127. resp << m_ns->getState();
  128. else if(type == NSLocationGet)
  129. resp << m_ns->getLocation();
  130. else if(type == NSLocationSet)
  131. {
  132. QString l;
  133. query >> l;
  134. m_ns->setLocation(l);
  135. }
  136. else if(type == EventsNSAdd)
  137. {
  138. if(!m_nsEvents.contains(sock))
  139. m_nsEvents.append(sock);
  140. }
  141. else if(type == EventsNSRemove)
  142. m_nsEvents.removeOne(sock);
  143. else if(type == EventsChatAdd)
  144. {
  145. if(!m_chatEvents.contains(sock))
  146. m_chatEvents.append(sock);
  147. }
  148. else if(type == EventsChatRemove)
  149. m_chatEvents.removeOne(sock);
  150. else if(type == EventsWatchlistAdd)
  151. {
  152. if(!m_watchlistEvents.contains(sock))
  153. m_watchlistEvents.append(sock);
  154. }
  155. else if(type == EventsWatchlistRemove)
  156. m_watchlistEvents.removeOne(sock);
  157. else if(type == EventsAllAdd)
  158. {
  159. foreach(QList<PTSocket*>* e, m_eventsList)
  160. if(!e->contains(sock))
  161. e->append(sock);
  162. }
  163. else if(type == EventsAllRemove)
  164. {
  165. foreach(QList<PTSocket*>* e, m_eventsList)
  166. e->removeOne(sock);
  167. }
  168. else if(type == WatchlistAdd)
  169. {
  170. QStringList logins;
  171. query >> logins;
  172. m_ns->addToWatchList(logins);
  173. }
  174. else if(type == WatchlistWhois)
  175. {
  176. QStringList logins;
  177. query >> logins;
  178. m_ns->whois(logins);
  179. return;
  180. }
  181. else
  182. error = "Unknown query type " + QString::number((int)type);
  183. resp.device()->seek(0);
  184. resp << error.isEmpty();
  185. if(!error.isEmpty())
  186. resp << error;
  187. if(sock)
  188. sock->send(type, respData);
  189. }
  190. void MainClass::setPidFile(QString f)
  191. {
  192. m_pidFile = f;
  193. }
  194. void MainClass::newClient(PTSocket* client)
  195. {
  196. connect(client, SIGNAL(packetReceived(int,QByteArray)), this, SLOT(packetReceived(int,QByteArray)));
  197. connect(client, SIGNAL(stateChanged(PTSocket::State)), this, SLOT(clientStateChanged(PTSocket::State)));
  198. qDebug()<<"[Info ] New client ("<<m_serv->getClients().size()<<")";
  199. }
  200. void MainClass::packetReceived(int type, QByteArray data)
  201. {
  202. PTSocket* sock = (PTSocket*)sender();
  203. if(!sock)
  204. return;
  205. execute((PacketType)type, data, sock);
  206. }
  207. void MainClass::clientStateChanged(PTSocket::State s)
  208. {
  209. PTSocket* sock = (PTSocket*)sender();
  210. if(!sock)
  211. return;
  212. if(s == PTSocket::Disconnected)
  213. qDebug()<<"[Info ] Client left ("<<m_serv->getClients().size()<<")";
  214. else if(s == PTSocket::Error)
  215. qDebug()<<"[Error] Client error:"<<sock->getError().toStdString().c_str()<<"("<<m_serv->getClients().size()<<")";
  216. if(s == PTSocket::Disconnected || s == PTSocket::Error)
  217. foreach(QList<PTSocket*>* e, m_eventsList)
  218. e->removeOne(sock);
  219. }
  220. void MainClass::netsoulStateChanged(NetSoul::State s)
  221. {
  222. if(!m_pidFile.isEmpty())
  223. {
  224. QFile f(m_pidFile);
  225. if(f.open(QIODevice::Truncate | QIODevice::WriteOnly))
  226. {
  227. int pid = s == NetSoul::LoggedIn ? getpid() : INT_MAX;
  228. f.write(QString::number(pid).toStdString().c_str());
  229. f.close();
  230. }
  231. else
  232. qDebug()<<"[Error] Could not write the pid file";
  233. }
  234. QByteArray respData;
  235. QDataStream resp(&respData, QIODevice::WriteOnly);
  236. resp << true;
  237. resp << s;
  238. foreach(PTSocket* sock, m_nsEvents)
  239. sock->send(NSStatus, respData);
  240. if(s == NetSoul::NetworkError || s == NetSoul::ProtocolError)
  241. QTimer::singleShot(1000, m_ns, SLOT(login()));
  242. }
  243. void MainClass::netsoulNewMessage(NetSoul::Message msg)
  244. {
  245. QByteArray respData;
  246. QDataStream resp(&respData, QIODevice::WriteOnly);
  247. resp << true;
  248. resp << msg;
  249. foreach(PTSocket* sock, m_chatEvents)
  250. sock->send(EventsChat, respData);
  251. }
  252. void MainClass::netsoulUserDataChanged(NetSoul::User usr)
  253. {
  254. QByteArray respData;
  255. QDataStream resp(&respData, QIODevice::WriteOnly);
  256. resp << true;
  257. resp << usr;
  258. foreach(PTSocket* sock, m_watchlistEvents)
  259. sock->send(WatchlistWhois, respData);
  260. }
  261. bool MainClass::isConnected()
  262. {
  263. return !(m_ns->getState() == NetSoul::Disconnected || m_ns->getState() == NetSoul::ProtocolError || m_ns->getState() == NetSoul::NetworkError || m_ns->getState() == NetSoul::BadLogin);
  264. }