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.4KB

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