bool AttentionPlugin::incomingStanza(int account, const QDomElement& stanza) { if (enabled) { if(stanza.tagName() == "message" && stanza.attribute("type") == "headline" && !stanza.firstChildElement("attention").isNull()) { if(disableDnd && accInfoHost->getStatus(account) == "dnd") return false; QString from = stanza.attribute("from"); int i = blockedJids_.size(); if(findAcc(account, from, i)) { Blocked &B = blockedJids_[i]; if(QDateTime::currentDateTime().secsTo(B.LastMes) > -timeout_) { return false; } else { B.LastMes = QDateTime::currentDateTime(); } } else { Blocked B = { account, from, QDateTime::currentDateTime() }; blockedJids_ << B; } const QString optAway = "options.ui.notifications.passive-popups.suppress-while-away"; QVariant suppressAway = psiOptions->getGlobalOption(optAway); const QString optDnd = "options.ui.notifications.passive-popups.suppress-while-dnd"; QVariant suppressDnd = psiOptions->getGlobalOption(optDnd); int interval = popup->popupDuration(POPUP_OPTION); if(infPopup && (accInfoHost->getStatus(account) == "away" || accInfoHost->getStatus(account) == "xa")) { psiOptions->setGlobalOption(optAway, false); popup->setPopupDuration(POPUP_OPTION, -1); } psiOptions->setGlobalOption(optDnd, disableDnd); showPopup(account, from.split("/").first(), from + tr(" sends Attention message to you!")); psiOptions->setGlobalOption(optAway, suppressAway); psiOptions->setGlobalOption(optDnd, suppressDnd); popup->setPopupDuration(POPUP_OPTION, interval); if(psiOptions->getGlobalOption("options.ui.notifications.sounds.enable").toBool()) playSound(soundFile); /*QTextEdit *te = activeTab->getEditBox(); if(te) nudgeWindow_ = te->window(); else nudgeWindow_ = qApp->activeWindow();*/ if(nudgeWindow_ && nudgeWindow_->isVisible()) nudge(); } else if(stanza.tagName() == "iq" && stanza.attribute("type") == "get") { QDomElement query = stanza.firstChildElement("query"); if(!query.isNull() && query.attribute("xmlns") == "http://jabber.org/protocol/disco#info") { if(query.attribute("node") == "http://psi-dev.googlecode.com/caps#at-pl") { QString reply = QString("<iq type=\"result\" to=\"%1\" id=\"%2\">" "<query xmlns=\"http://jabber.org/protocol/disco#info\" node=\"http://psi-dev.googlecode.com/caps#at-pl\">" "<feature var=\"urn:xmpp:attention:0\"/></query></iq>") .arg(stanzaSender->escape(stanza.attribute("from")), stanzaSender->escape(stanza.attribute("id"))); stanzaSender->sendStanza(account, reply); return true; } } } } return false; }
bool StopSpam::processMuc(int account, const QDomElement& stanza) { if(stanza.tagName() == "presence") { QStringList jidList = stanza.attribute("from").split("/"); int i = mucUsers_.size(); if(findMuc(jidList.first(),jidList.last(), i)) { MucUser &mu = mucUsers_[i]; QDomNodeList nodeList = stanza.elementsByTagName("x"); for(int i = nodeList.size(); i> 0;) { QDomNode node = nodeList.at(--i).firstChild(); while(!node.isNull()) { QDomElement item = node.toElement(); if(item.tagName() == "item") { mu.affiliation = item.attribute("affiliation"); mu.role = item.attribute("role"); mu.jid = item.attribute("jid"); break; } node = node.nextSibling(); } } } else { MucUser mu; mu.mucJid = jidList.first(); mu.nick = jidList.last(); QDomNodeList nodeList = stanza.elementsByTagName("x"); for(int i = nodeList.size(); i> 0;) { QDomNode node = nodeList.at(--i).firstChild(); while(!node.isNull()) { QDomElement item = node.toElement(); if(item.tagName() == "item") { mu.affiliation = item.attribute("affiliation"); mu.role = item.attribute("role"); mu.jid = item.attribute("jid"); break; } node = node.nextSibling(); } } mucUsers_ << mu; } } else if(stanza.tagName() == "message" && stanza.attribute("type") == "chat") { QDomElement subj = stanza.firstChildElement("subject"); if (subj.text() == "StopSpam" || subj.text() == "StopSpam Question") return false; QString valF = stanza.attribute("from"); if (contactInfo->isConference(account, valF)) return false; MucUser mu; QStringList jidList = valF.split("/"); int i = mucUsers_.size(); if(findMuc(jidList.first(),jidList.last(), i)) { mu = mucUsers_[i]; } else { mu.affiliation = ""; mu.jid = ""; mu.mucJid = ""; mu.nick = ""; mu.role = ""; } bool find = false; if(mu.affiliation == "owner" && !Owner) find = true; else if( mu.affiliation == "admin" && !Admin) find = true; else if(mu.affiliation == "none" && !None) find = true; else if(mu.affiliation == "member" && !Member) find = true; if(find) return false; if(mu.role == "moderator" && !Moder) find = true; else if(mu.role == "participant" && !Participant) find = true; else if(mu.role == "visitor" && !Visitor) find = true; if(find) return false; QStringList UnblockedJids = Unblocked.split("\n"); if(UnblockedJids.contains(valF, Qt::CaseInsensitive)) return false; for(int i = 0; i < Jids.size(); i++) { QString jid_ = Jids.at(i); if(jid_.isEmpty()) continue; if(mu.jid.contains(jid_, Qt::CaseInsensitive) || mu.nick.contains(jid_, Qt::CaseInsensitive) || mu.mucJid.contains(jid_, Qt::CaseInsensitive)) { if(!selected[i].toBool()) return false; break; } } QDomElement Body = stanza.firstChildElement("body"); if(Body.isNull()) return false; if(BlockAll) { updateCounter(stanza, false); if(EnableBlockAllMes) stanzaHost->sendMessage(account, valF, BlockAllMes, "StopSpam", "chat"); return true; } QString BodyText = Body.text(); if(BodyText == Answer) { Unblocked += valF + "\n"; QVariant vUnblocked(Unblocked); psiOptions->setPluginOption(constUnblocked, vUnblocked); psiOptions->setPluginOption(constLastUnblock, QVariant(QDate::currentDate().toString("yyyyMMdd"))); stanzaHost->sendMessage(account, valF, Congratulation, "StopSpam", "chat"); updateCounter(stanza, true); return true; } else { int i = BlockedJids.size(); if(findAcc(account, valF, i)) { Blocked &B = BlockedJids[i]; if(B.count < Times) { stanzaHost->sendMessage(account, valF, Question, "StopSpam Question", "chat"); updateCounter(stanza, false); B.count++; B.LastMes = QDateTime::currentDateTime(); return true; } else { if(QDateTime::currentDateTime().secsTo(B.LastMes) >= -ResetTime*60) { updateCounter(stanza, false); return true; } else { B.count = 1; B.LastMes = QDateTime::currentDateTime(); stanzaHost->sendMessage(account, valF, Question, "StopSpam Question", "chat"); updateCounter(stanza, false); return true; } } } else { Blocked B = { account, valF, 1, QDateTime::currentDateTime() }; BlockedJids << B; stanzaHost->sendMessage(account, valF, Question, "StopSpam Question", "chat"); updateCounter(stanza, false); return true; } } } return false; }
int main(){ int listen_sock; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; listen_sock = socket(AF_INET, SOCK_STREAM, 0); if (listen_sock == -1) { printf("khong tao duoc socket\n"); return 0; } printf("Tao socket thanh cong\n"); server_address.sin_family = AF_INET; inet_aton("127.0.0.1",&server_address.sin_addr); server_address.sin_port = htons(5500); server_len = sizeof(server_address); if(bind(listen_sock, (struct sockaddr *)&server_address,server_len)<0) { printf("bind failed.\n"); return 0; } printf("bind done\n"); int check = listen(listen_sock, 10); if (check == -1) { printf("error"); return 0; } printf("waiting connect ...\n"); while(1) { client_len = sizeof(client_address); conn_sock = accept(listen_sock,(struct sockaddr *)&client_address, &client_len); if(conn_sock==-1){ printf("error connect\n"); return 0; }else{ printf("Accept new connection\n"); } if(fork() == 0){ close(listen_sock); //thiet lap truyen nhan giu lieu lien tuc int sentBytes,revedBytes,i; time_t start; struct tm * timeinfo; char name[30]; char pass[16]; struct userinfo acc1; char s[2]="|"; char *token; int flag; char str_flag[3]; char filename[]="data.txt"; int stop = 0; FILE *f; FILE *result; int login; while((revedBytes = recv(conn_sock,buff,1024,0)) >= 0){ buff[revedBytes]='\0'; token = strtok(buff, s); strcpy(str_flag,token); flag=atoi(str_flag); //nhan va kiem tra co bao switch(flag){ case 0: //kiem tra dang nhap neu dang nhap thang cong tra ve buff[0] = 5 //neu khong dung tra ve buff[0]=4 va buff[1] la ma loi printf("Dang nhap\n"); token =strtok(NULL,s); strcpy(name,token); token=strtok(NULL,s); strcpy(pass,token); login = checklogin(name,pass); if(login==1){ result =fopen(name,"w"); buff[0] = 5; sentBytes = send(conn_sock,buff,1024,0); }else{ buff[0] = 4; buff[1] = login; sentBytes = send(conn_sock,buff,1024,0); } break; case 1: token =strtok(NULL,s); strcpy(name,token); token=strtok(NULL,s); strcpy(pass,token); if(findAcc(name)==1){ buff[0] = 4; buff[1] = 1; buff[2] = '\0'; sentBytes = send(conn_sock,buff,1024,0); break; } f =fopen(filename,"a"); fprintf(f, "%s\t%s\n",name,pass ); fclose(f); buff[0] = 5; buff[1] = '\0'; sentBytes = send(conn_sock,buff,1024,0); break; case 2: side = 1 ;xside = 0; time (&start ); timeinfo = localtime ( &start ); fprintf(result,"IP address is: %s\n", inet_ntoa(client_address.sin_addr)); fprintf (result,"time start :%s\n", asctime (timeinfo) ); InitGen(); while(1){ if(side == computerside){ ComputerThink(); printf("%d may choi\n",side); fprintf(result,"%s-%s\n",indexChar(newmove.from),indexChar(newmove.dest)); UpdateNewMove(); buff[0] = 3; buff[1] = newmove.from; buff[2] = newmove.dest; buff[3] = check_thua();stop = buff[3]; buff[4] = '\0'; send(conn_sock,buff,1024,0); if(stop == 1) break; } else if(GetHumanMove(0,1)==0){ fprintf(result,"%s-%s\t",indexChar(newmove.from),indexChar(newmove.dest)); UpdateNewMove(); printf("%d nguoi choi\n",side); buff[0] = 3; buff[1] = 1; buff[2] = 0; buff[3] = check_thang(); stop = buff[3]; buff[4] = '\0'; send(conn_sock,buff,1024,0); //tra ve neu di thanh cong if(stop == 1) break; }; side = xside; xside = 1-xside; printf("%d-%d-%d\n",side,newmove.from,newmove.dest); } printf("Dung choi\n"); time (&start ); timeinfo = localtime ( &start ); fprintf (result,"time end :%s\n", asctime (timeinfo)); fclose(result); result = fopen(name,"r"); while(!feof(result)){ if (fgets(buff,81,result) != NULL ){ sentBytes=send(conn_sock,buff,1024,0); } } buff[0] = 'Q'; buff[1] = '\0'; sentBytes=send(conn_sock,buff,1024,0); break; default: break; } } close(conn_sock); exit(0); } signal(SIGCHLD,sig_chld); close(conn_sock); } return 1; }
bool StopSpam::incomingStanza(int account, const QDomElement& stanza) { if (enabled) { if(stanza.tagName() == "iq") { QDomElement query = stanza.firstChildElement("query"); if(!Unblocked.isEmpty() && !query.isNull() && query.attribute("xmlns") == "jabber:iq:roster") { QStringList Roster = accInfoHost->getRoster(account); QStringList UnblockedList = Unblocked.split("\n"); while(!Roster.isEmpty()) { QString jid = Roster.takeFirst(); UnblockedList.removeOne(jid); } Unblocked = ""; while(!UnblockedList.isEmpty()) { QString jid = UnblockedList.takeFirst(); if(jid != "") { Unblocked += jid + "\n"; } } psiOptions->setPluginOption(constUnblocked, QVariant(Unblocked)); } } QString from = stanza.attribute("from"); QString to = stanza.attribute("to"); QString valF = from.split("/").takeFirst(); QString valT = to.split("/").takeFirst(); if(valF.toLower() == valT.toLower() || valF.toLower() == accInfoHost->getJid(account).toLower()) return false; if(!from.contains("@")) return false; // Нам необходимо сделать эту проверку здесь, // иначе мы рискуем вообще ее не сделать if (stanza.tagName() == "message") { bool findInvite = false; QString invFrom; QDomElement x = stanza.firstChildElement("x"); while(!x.isNull()) { QDomElement invite = x.firstChildElement("invite"); if(!invite.isNull()) { findInvite = true; invFrom = invite.attribute("from"); break; } x = x.nextSiblingElement("x"); } if(findInvite) { // invite to MUC QStringList r = accInfoHost->getRoster(account); if(r.contains(invFrom.split("/").first(), Qt::CaseInsensitive)) return false; else { bool findRule = false; for(int i = 0; i < Jids.size(); i++) { QString jid_ = Jids.at(i); if(jid_.isEmpty()) continue; if(invFrom.contains(jid_, Qt::CaseInsensitive)) { findRule = true; if(!selected[i].toBool()) return false; break; } } if(!findRule && DefaultAct) return false; else { updateCounter(stanza, false); return true; } } } } if(contactInfo->isConference(account, valF) || contactInfo->isPrivate(account, from) || findMucNS(stanza)) { if(UseMuc) return processMuc(account, stanza); else return false; } QStringList Roster = accInfoHost->getRoster(account); if(Roster.isEmpty() || Roster.contains("-1")) return false; if(Roster.contains(valF, Qt::CaseInsensitive)) return false; QStringList UnblockedJids = Unblocked.split("\n"); if(UnblockedJids.contains(valF, Qt::CaseInsensitive)) return false; bool findRule = false; for(int i = 0; i < Jids.size(); i++) { QString jid_ = Jids.at(i); if(jid_.isEmpty()) continue; if(from.contains(jid_, Qt::CaseInsensitive)) { findRule = true; if(!selected[i].toBool()) return false; break; } } if(!findRule && DefaultAct) return false; if (stanza.tagName() == "message") { QString subj = stanza.firstChildElement("subject").text(); QString type = ""; type = stanza.attribute("type"); if(type == "error" && subj == "StopSpam Question") { updateCounter(stanza, false); return true; } if (subj == "AutoReply" || subj == "StopSpam" || subj == "StopSpam Question") return false; if(type == "groupchat" || type == "error") return false; QDomElement captcha = stanza.firstChildElement("captcha"); if(!captcha.isNull() && captcha.attribute("xmlns") == "urn:xmpp:captcha") return false; // CAPTCHA QDomElement Body = stanza.firstChildElement("body"); if(!Body.isNull()) { QString BodyText = Body.text(); if(BodyText == Answer) { Unblocked += valF + "\n"; psiOptions->setPluginOption(constUnblocked, QVariant(Unblocked)); psiOptions->setPluginOption(constLastUnblock, QVariant(QDate::currentDate().toString("yyyyMMdd"))); stanzaHost->sendMessage(account, from, Congratulation, "StopSpam", "chat"); updateCounter(stanza, true); if(LogHistory) logHistory(stanza); return true; } else { int i = BlockedJids.size(); if(findAcc(account, valF, i)) { Blocked &B = BlockedJids[i]; if(B.count < Times) { stanzaHost->sendMessage(account, from, Question, "StopSpam Question", "chat"); updateCounter(stanza, false); if(LogHistory) logHistory(stanza); B.count++; B.LastMes = QDateTime::currentDateTime(); return true; } else { if(QDateTime::currentDateTime().secsTo(B.LastMes) >= -ResetTime*60) { updateCounter(stanza, false); if(LogHistory) logHistory(stanza); return true; } else { B.count = 1; B.LastMes = QDateTime::currentDateTime(); stanzaHost->sendMessage(account, from, Question, "StopSpam Question", "chat"); updateCounter(stanza, false); if(LogHistory) logHistory(stanza); return true; } } } else { Blocked B = { account, valF, 1, QDateTime::currentDateTime() }; BlockedJids << B; stanzaHost->sendMessage(account, from, Question, "StopSpam Question", "chat"); updateCounter(stanza, false); if(LogHistory) logHistory(stanza); return true; } } } updateCounter(stanza, false); return true; } if (stanza.tagName() == "presence") { QString type = stanza.attribute("type"); if(type == "subscribe") { stanzaHost->sendMessage(account, from, Question, "StopSpam Question", "chat"); stanzaHost->sendStanza(account, "<presence type=\"unsubscribed\" to=\"" + valF + "\" />"); updateCounter(stanza, false); if(LogHistory) logHistory(stanza); return true; } else return false; } if (stanza.tagName() == "iq" && stanza.attribute("type") == "set") { QString msg = QString("<iq type=\"error\" id=\"%1\" ").arg(stanza.attribute("id")); if(!from.isEmpty()) msg += QString("to=\"%1\"").arg(from); msg += " />"; stanzaHost->sendStanza(account, msg); updateCounter(stanza, false); return true; } return false; } return false; }