Skip to content

Commit

Permalink
can post without 4chan pass using captcha; can post threads
Browse files Browse the repository at this point in the history
  • Loading branch information
siavash119 committed Jul 27, 2017
1 parent 3cb40d8 commit 74cf1c0
Show file tree
Hide file tree
Showing 10 changed files with 238 additions and 38 deletions.
26 changes: 26 additions & 0 deletions boardtab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include <QJsonArray>
#include <QJsonDocument>
#include <QScrollBar>
#include <QRegularExpressionMatch>

BoardTab::BoardTab(QString board, BoardType type, QString search, QWidget *parent) :
QWidget(parent), board(board), type(type), search(search),
Expand All @@ -21,7 +22,18 @@ BoardTab::BoardTab(QString board, BoardType type, QString search, QWidget *paren
connect(&helper,&BoardTabHelper::newTF,this,&BoardTab::onNewTF,UniqueDirect);
connect(&helper,&BoardTabHelper::addStretch,this,&BoardTab::addStretch,UniqueDirect);
connect(&helper,&BoardTabHelper::clearMap,this,&BoardTab::clearMap,UniqueDirect);

myPostForm.setParent(this,Qt::Tool
| Qt::WindowMaximizeButtonHint
| Qt::WindowCloseButtonHint);
myPostForm.load(board,"");
connect(&myPostForm,&PostForm::loadThread,[=](QString threadNum){
TreeItem *childOf = mw->model->getItem(mw->selectionModel->currentIndex());
mw->onNewThread(mw,board,threadNum,QString(),childOf);
});

this->setShortcuts();
connect(mw,&MainWindow::setUse4chanPass,&myPostForm,&PostForm::usePass,UniqueDirect);
}

BoardTab::~BoardTab()
Expand All @@ -41,14 +53,22 @@ void BoardTab::setShortcuts()
refresh->setShortcut(Qt::Key_R);
connect(refresh, &QAction::triggered, &helper, &BoardTabHelper::getPosts, UniqueDirect);
this->addAction(refresh);

QAction *postForm = new QAction(this);
postForm->setShortcut(Qt::Key_Q);
connect(postForm, &QAction::triggered, this, &BoardTab::openPostForm, UniqueDirect);
this->addAction(postForm);

QAction *focuser = new QAction(this);
focuser->setShortcut(Qt::Key_F3);
connect(focuser,&QAction::triggered,mw,&MainWindow::focusTree);
this->addAction(focuser);

QAction *focusBar = new QAction(this);
focusBar->setShortcut(Qt::Key_F6);
connect(focusBar,&QAction::triggered,mw,&MainWindow::focusBar);
this->addAction(focusBar);

QAction *focusSearch = new QAction(this);
focusSearch->setShortcut(QKeySequence("Ctrl+f"));
connect(focusSearch,&QAction::triggered,this,&BoardTab::focusIt);
Expand Down Expand Up @@ -83,6 +103,12 @@ void BoardTab::setShortcuts()
this->addAction(selectPost);
}

void BoardTab::openPostForm()
{
myPostForm.show();
myPostForm.activateWindow();
myPostForm.raise();
}

void BoardTab::findText(const QString text)
{
Expand Down
3 changes: 3 additions & 0 deletions boardtab.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "boardtabhelper.h"
#include "threadform.h"
#include "postform.h"
#include <QSpacerItem>
#include <QWidget>
#include <QThread>
Expand All @@ -29,6 +30,8 @@ class BoardTab : public QWidget
QString boardUrl;
QNetworkReply *reply;
QMap<QString,ThreadForm*> tfMap;
PostForm myPostForm;
void openPostForm();

void setShortcuts();
void getPosts();
Expand Down
70 changes: 70 additions & 0 deletions captcha.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#include "captcha.h"
#include <QDebug>

Captcha::Captcha()
{

}

Captcha::~Captcha(){

}

void Captcha::getCaptcha(){
qDebug() << "getting captcha from " + urlChallenge;
loaded = true;
replyChallenge = nc.jsonManager->get(requestChallenge);
QObject::connect(replyChallenge,&QNetworkReply::finished,this,&Captcha::loadCaptcha);
}

void Captcha::loadCaptcha(){
qDebug() << "got captcha";
if(!replyChallenge){
emit fail();
return;
}
else if(replyChallenge->error()) {
qDebug().noquote() << "loading post error:" << replyChallenge->errorString();
replyChallenge->deleteLater();
return;
}
QByteArray rep = replyChallenge->readAll();
replyChallenge->deleteLater();
if(rep.isEmpty()) return;
QString replyString(rep);
qDebug() << replyString;
int start = replyString.indexOf("{\n challenge : ");
if(start == -1) return;
int end = replyString.indexOf("'",start+19);
if(end == -1) return;
qDebug() << start << " " << end;
challenge = replyString.mid(start+19,end-start-19);
qDebug() << challenge;
getImage(challenge);
}

void Captcha::getImage(QString challenge){
qDebug() << "getting image";
if(challenge.isEmpty()) return;
replyImage = nc.jsonManager->get(QNetworkRequest(QUrl(urlImageBase+challenge)));
connect(replyImage,&QNetworkReply::finished,this,&Captcha::loadImage);
}

void Captcha::loadImage(){
qDebug() << "got image";
if(!replyImage){
emit fail();
return;
}
else if(replyImage->error()) {
qDebug().noquote() << "loading post error:" << replyImage->errorString();
replyImage->deleteLater();
return;
}
QByteArray rep = replyImage->readAll();
replyImage->deleteLater();
if(rep.isEmpty()) return;
QPixmap challengeImage;
challengeImage.loadFromData(rep);
emit challengeInfo(challenge,challengeImage);
}
42 changes: 42 additions & 0 deletions captcha.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#ifndef CAPTCHA_H
#define CAPTCHA_H
#include "netcontroller.h"
#include <QObject>
#include <QNetworkReply>
#include <QThread>
#include <QPixmap>
#include <QTimer>

class Captcha : public QObject
{
Q_OBJECT
int timeout = 120;
QString siteKey = "6Ldp2bsSAAAAAAJ5uyx_lx34lJeEpTLVkP5k04qc";
QString server = "https://www.google.com/recaptcha/api";
QString lang = "en";
QString urlChallenge = server+"/challenge?k="+siteKey+"&lang="+lang;
QString urlImageBase = server+"/image?c=";
QNetworkRequest requestChallenge = QNetworkRequest(QUrl(urlChallenge));
public:
explicit Captcha();
virtual ~Captcha();
QString challenge;
QString response;
QTimer timer;
bool loaded;
void getCaptcha();
void getImage(QString challenge);
private:
QNetworkReply *replyChallenge;
QNetworkReply *replyImage;
signals:
void challengeInfo(QString &challenge, QPixmap &challengeImage);
void timeOut();
void success();
void fail();
public slots:
void loadCaptcha();
void loadImage();
};

#endif // CAPTCHA_H
10 changes: 2 additions & 8 deletions mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ void MainWindow::setShortcuts()
});

ui->actionSettings->setShortcut(QKeySequence("Ctrl+p"));
ui->actionSettings->setShortcutContext(Qt::ApplicationShortcut);
connect(ui->actionSettings,&QAction::triggered,[=]{
if(settingsView.isVisible()){
qDebug() << "hiding settings window";
Expand Down Expand Up @@ -439,14 +440,7 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *event)
//int mod = keyEvent->modifiers();
//qDebug("Ate key press %d, key");
//qDebug("Modifers %d", mod);
if(key == 53) {
/*const QModelIndexList indexList = ui->treeView->selectionModel()->selectedRows();
int row = indexList.at(0).row();
qDebug() << (Tab::TabType)tabs.at(row).type;
((Tab::TabType)tabs.at(row).type) == Tab::TabType::Board ? ((BoardTab*)tabs.at(row).TabPointer)->updatePosts() :
((ThreadTab*)tabs.at(row).TabPointer)->updatePosts();*/
}
else if(key == 16777216){
if(key == 16777216){
if(ui->lineEdit->focusWidget() == ui->lineEdit && !ui->lineEdit->isHidden()){
ui->lineEdit->hide();
}
Expand Down
85 changes: 60 additions & 25 deletions postform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <QShortcut>
#include <iostream>
#include <QGraphicsEffect>
#include <QRegularExpressionMatch>
#include <QSettings>

PostForm::PostForm(QWidget *parent) :
Expand Down Expand Up @@ -94,28 +95,35 @@ void PostForm::postIt()
this->removeEventFilter(this);
qDebug().noquote() << "posting";
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

QHttpPart mode;
mode.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"mode\""));
mode.setBody("regist");
QHttpPart resto;
resto.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"resto\""));
resto.setBody(thread.toStdString().c_str());
multiPart->append(mode);

if(thread != ""){
QHttpPart resto;
resto.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"resto\""));
resto.setBody(thread.toStdString().c_str());
multiPart->append(resto);
}

QHttpPart name;
name.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"name\""));
name.setBody(ui->name->text().toStdString().c_str());
multiPart->append(name);

QHttpPart email;
email.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"email\""));
email.setBody(ui->email->text().toStdString().c_str());
multiPart->append(email);

QHttpPart com;
com.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"com\""));
qDebug().noquote() << ui->com->toPlainText().toStdString().c_str();
com.setBody(ui->com->toPlainText().toStdString().c_str());

multiPart->append(mode);
multiPart->append(resto);
multiPart->append(name);
multiPart->append(email);
multiPart->append(com);

QSettings settings;
if(settings.value("use4chanPass", false).toBool() == false){
QHttpPart captchaChallenge;
Expand Down Expand Up @@ -173,13 +181,28 @@ void PostForm::postFinished()
reply->setGeometry(0,0,this->width(),this->height());
qDebug().noquote() << temp;
qDebug() << "showing reply";
if(reply->toPlainText().contains(QRegularExpression("uploaded.$|Post successful!$")))
QString replyString(reply->toPlainText());
if(replyString.contains(QRegularExpression("uploaded.$|Post successful!$")))
{
overlay->displayText = "Post successful!";
overlay->displayText = replyString;
ui->com->clear();
ui->filename->setText("No file selected");
setFilenameText(empty);
filename = "";
ui->cancel->hide();
QTimer::singleShot(1000, this, &PostForm::close);
if(thread == ""){
//QRegularExpression re("<h1.*?>(?<upMessage>.*?)</h1><!-- thread:0,no:(?<threadNum>\\d+)");
QRegularExpression re("<!-- thread:0,no:(?<threadNum>\\d+)");
QRegularExpressionMatch match = re.match(temp);
if(match.hasMatch()){
qDebug() << "post successful; loading thread:" << match.captured("threadNum");
emit loadThread(match.captured("threadNum"));
}
else{
qDebug() << "post succesful; but some other error";
qDebug() << replyString;
}
}
//QTimer::singleShot(1000, reply, &QTextEdit::close);
}
else{
Expand Down Expand Up @@ -225,11 +248,6 @@ bool PostForm::eventFilter(QObject *obj, QEvent *event)
postIt();
return true;
}
if(key==53) {
addOverlay();
QTimer::singleShot(1000, this, &PostForm::removeOverlay);
//qDebug() << filename;
}
return QObject::eventFilter(obj, event);
} else if(event->type() == QEvent::DragEnter) {
static_cast<QDragEnterEvent*>(event)->acceptProposedAction();
Expand All @@ -250,29 +268,34 @@ bool PostForm::eventFilter(QObject *obj, QEvent *event)

void PostForm::fileChecker(const QMimeData *mimeData)
{
QString output;
qDebug().noquote() << "checking file";
if (mimeData->hasImage()) {
//ui->label->setPixmap(qvariant_cast<QPixmap>(mimeData->imageData()));
} else if (mimeData->hasHtml()) {
ui->filename->setText(mimeData->text());
output = QUrl::fromPercentEncoding(mimeData->text().toUtf8());
setFilenameText(output);
} else if (mimeData->hasText()) {
qDebug().noquote() << mimeData->text();
output = QUrl::fromPercentEncoding(mimeData->text().toUtf8());
#if defined(Q_OS_WIN)
filename = mimeData->text().mid(8); //remove file:///
filename = output.mid(8); //remove file:///
#else
filename = mimeData->text().mid(7); //remove file://
filename = output.mid(7); //remove file://
#endif
filename.remove(QRegularExpression("[\\n\\t\\r]"));
qDebug() << "added file to upload:" << filename;
ui->filename->setText(filename);
setFilenameText(filename);
} else if (mimeData->hasUrls()) {
QList<QUrl> urlList = mimeData->urls();
QString text;
for (int i = 0; i < urlList.size() && i < 32; ++i)
text += urlList.at(i).path() + QLatin1Char('\n');
ui->filename->setText(text);
output = QUrl::fromPercentEncoding(text.toUtf8());
setFilenameText(output);
} else {
ui->filename->setText("Cannot display data");
QString temp("Cannot display data");
setFilenameText(temp);
}
qDebug().noquote() << filename;
ui->cancel->show();
Expand All @@ -293,11 +316,11 @@ void PostForm::fileSelected(const QString &file)
//qDebug() << dialog->;
//qDebug() << dialog->getOpenFileName();
if(filename == "") {
ui->filename->setText("No file selected");
setFilenameText(empty);
ui->cancel->hide();
}
else {
ui->filename->setText(file);
setFilenameText(filename);
ui->cancel->show();
}
dialog->close();
Expand All @@ -307,11 +330,23 @@ void PostForm::fileSelected(const QString &file)
void PostForm::on_cancel_clicked()
{
filename = "";
ui->filename->setText("No file selected");
setFilenameText(empty);
ui->cancel->hide();
}

void PostForm::droppedItem()
{
qDebug().noquote() << "dropped!";
}

void PostForm::setFilenameText(QString &text){
QFontMetrics metrics(ui->filename->font());
QString elidedText = metrics.elidedText(text, Qt::ElideRight, ui->filename->width());
ui->filename->setText(elidedText);
}

void PostForm::resizeEvent(QResizeEvent *event){
if(filename != "") setFilenameText(filename);
else setFilenameText(empty);
return QWidget::resizeEvent(event);
}

0 comments on commit 74cf1c0

Please sign in to comment.