1 #include "jira-agent.h"
3 #include "branchitem.h"
4 #include "mainwindow.h"
11 extern Main *mainWindow;
12 extern QDir vymBaseDir;
13 extern Settings settings;
14 extern QTextStream vout;
17 bool JiraAgent::available()
19 if (!QSslSocket::supportsSsl())
21 if ( settings.value("/atlassian/jira/servers/size", 0).toInt() < 1)
27 JiraAgent::JiraAgent()
29 //qDebug ()<< "Constr. JiraAgent";
34 JiraAgent::~JiraAgent()
36 //qDebug() << "Destr. JiraAgent";
42 void JiraAgent::init()
50 networkManager = new QNetworkAccessManager(this);
52 modelID = 0; // invalid ID
54 killTimer = new QTimer(this);
55 killTimer->setInterval(15000);
56 killTimer->setSingleShot(true);
58 QObject::connect(killTimer, SIGNAL(timeout()), this, SLOT(timeout()));
60 // Reset credentials, these are server specific beginning in 2.9.18
61 authUsingPATInt = true;
62 personalAccessTokenInt = QString();
63 userNameInt = QString();
64 passwordInt = QString();
65 serverNameInt = QString();
67 // Set API rest point. baseUrlInt later on depends on different JIRA system
68 apiUrl = "/rest/api/2";
72 void JiraAgent::setJobType(JobType jt)
77 bool JiraAgent::setBranch(BranchItem *bi)
83 branchID = bi->getID();
84 modelID = bi->getModel()->getModelID();
90 bool JiraAgent::setTicket(const QString &id)
92 // Find ID part in parameter:
93 QRegExp re("(\\w+[-|\\s]\\d+)");
94 if (re.indexIn(id) < 0) {
95 qWarning() << "JiraAgent::setTicket invalid ID: " << id;
100 ticketID = re.cap(1);
101 ticketID.replace(" ", "-");
103 bool foundPattern = false;
105 settings.beginGroup("/atlassian/jira");
107 // Try to find baseUrl of server by looking through patterns in ticket IDs:
108 int size = settings.beginReadArray("servers");
109 for (int i = 0; i < size; ++i) {
110 settings.setArrayIndex(i);
111 foreach (QString p, settings.value("pattern").toString().split(",")) {
112 if (ticketID.contains(p)) {
115 baseUrlInt = settings.value("baseUrl","-").toString();
116 serverNameInt = settings.value("name","-").toString();
118 // Read credentials for this server
120 settings.value("authUsingPAT", true).toBool();
122 personalAccessTokenInt =
123 settings.value("PAT", "undefined").toString();
126 settings.value("username", "user_johnDoe").toString();
128 settings.value("password", "").toString();
140 QString JiraAgent::serverName()
142 if (baseUrlInt.isEmpty())
145 return serverNameInt;
148 QString JiraAgent::url()
150 return baseUrlInt + "/browse/" + ticketID;
153 void JiraAgent::startJob()
156 unknownStepWarning();
164 void JiraAgent::continueJob()
173 // qDebug() << "JA::contJob " << jobType << " Step: " << jobStep << "TicketID: " << ticketID;
179 // if (!requestedURL.toString().startsWith("http"))
180 // requestedURL.setPath("https://" + requestedURL.path());
181 startGetTicketRequest();
184 QJsonDocument jsdoc = QJsonDocument (jsobj);
186 // Insert references to original branch and model
187 jsobj["vymBranchId"] = QJsonValue(branchID);
188 jsobj["vymTicketUrl"] = QJsonValue(url());
190 emit (jiraTicketReady(QJsonObject(jsobj)));
195 unknownStepWarning();
200 qWarning() << "JiraAgent::continueJob unknown jobType " << jobType;
204 void JiraAgent::finishJob()
209 void JiraAgent::unknownStepWarning()
211 qWarning() << "JA::contJob unknown step in jobType = "
213 << "jobStep = " << jobStep;
216 void JiraAgent::startGetTicketRequest()
218 QUrl u = QUrl(baseUrlInt + apiUrl + "/issue/" + ticketID);
220 QNetworkRequest request = QNetworkRequest(u);
222 // Basic authentication in header
225 headerData = QString("Bearer %1").arg(personalAccessTokenInt);
227 QString concatenated = userNameInt + ":" + passwordInt;
228 QByteArray data = concatenated.toLocal8Bit().toBase64();
229 headerData = "Basic " + data;
232 request.setRawHeader("Authorization", headerData.toLocal8Bit());
235 qDebug() << "JA::startGetTicketRequest: url = " + request.url().toString();
239 connect(networkManager, &QNetworkAccessManager::finished,
240 this, &JiraAgent::ticketReceived);
242 networkManager->get(request);
245 void JiraAgent::ticketReceived(QNetworkReply *reply)
247 // qDebug() << "JA::ticketReceived";
251 networkManager->disconnect();
253 QString r = reply->readAll();
255 if (reply->error()) {
256 if (reply->error() == QNetworkReply::AuthenticationRequiredError)
257 QMessageBox::warning(
258 nullptr, tr("Warning"),
259 tr("Authentication problem when contacting JIRA"));
261 qWarning() << "JiraAgent::ticketRReveived reply error";
262 qWarning() << "Error: " << reply->error();
263 vout << "reply: " << Qt::endl << r << Qt::endl;
269 jsdoc = QJsonDocument::fromJson(r.toUtf8());
270 jsobj = jsdoc.object();
274 void JiraAgent::timeout()
276 qWarning() << "JiraAgent timeout!! jobType = " << jobType;
280 void JiraAgent::sslErrors(QNetworkReply *reply, const QList<QSslError> &errors)
283 foreach (const QSslError &error, errors) {
284 if (!errorString.isEmpty())
286 errorString += error.errorString();
289 reply->ignoreSslErrors();
290 qWarning() << "JiraAgent: One or more SSL errors has occurred: " << errorString;
291 qWarning() << "Errors ignored.";