QDateTime ActionInstance::evaluateDateTime(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QDateTime(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString result; if(subParameter.isCode()) { QScriptValue evaluationResult = evaluateCode(ok, subParameter); if(evaluationResult.isDate()) return evaluationResult.toDateTime(); result = evaluationResult.toString(); } else result = evaluateText(ok, subParameter); if(!ok) return QDateTime(); QDateTime dateTime = QDateTime::fromString(result, QStringLiteral("dd/MM/yyyy hh:mm:ss")); if(!dateTime.isValid()) { ok = false; return QDateTime(); } return dateTime; }
void ScProcess::stopLanguage (void) { if(state() != QProcess::Running) { emit statusMessage(tr("Interpreter is not running!")); return; } evaluateCode("0.exit", true); closeWriteChannel(); mCompiled = false; mTerminationRequested = true; mTerminationRequestTime = QDateTime::currentDateTimeUtc(); bool finished = waitForFinished(200); if ( !finished && (state() != QProcess::NotRunning) ) { #ifdef Q_OS_WIN32 kill(); #else terminate(); #endif bool reallyFinished = waitForFinished(200); if (!reallyFinished) emit statusMessage(tr("Failed to stop interpreter!")); } mTerminationRequested = false; }
QPolygon ActionInstance::evaluatePolygon(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QPolygon(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString result; if(subParameter.isCode()) result = evaluateCode(ok, subParameter).toString(); else result = evaluateText(ok, subParameter); if(!ok) return QPolygon(); if(result.isEmpty() || result == QLatin1String(";")) return QPolygon(); QStringList pointStrings = result.split(QLatin1Char(';'), QString::SkipEmptyParts); QPolygon polygon; for(const QString &pointString: pointStrings) { QStringList pointComponents = pointString.split(QLatin1Char(':'), QString::SkipEmptyParts); if(pointComponents.size() != 2) continue; polygon << QPoint(pointComponents.at(0).toInt(), pointComponents.at(1).toInt()); } return polygon; }
void ScProcess::onStart() { if(!mIpcServer->isListening()) // avoid a warning on stderr mIpcServer->listen(mIpcServerName); QString command = QString("ScIDE.connect(\"%1\")").arg(mIpcServerName); evaluateCode ( command, true ); Main::documentManager()->sendActiveDocument(); }
QPoint ActionInstance::evaluatePoint(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QPoint(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); const SubParameter &unitSubParameter = retreiveSubParameter(parameterName, "unit"); QString result; if(subParameter.isCode()) { QScriptValue evaluationResult = evaluateCode(ok, subParameter); if(Code::Point *codePoint = qobject_cast<Code::Point*>(evaluationResult.toQObject())) { QPointF point = QPointF(codePoint->point().x(), codePoint->point().y()); computePercentPosition(point, unitSubParameter); return QPoint(point.x(), point.y()); } result = evaluationResult.toString(); } else result = evaluateText(ok, subParameter); if(!ok) return QPoint(); if(result.isEmpty() || result == ":") return QPoint(); QStringList positionStringList = result.split(":"); if(positionStringList.count() != 2) { ok = false; emit executionException(ActionException::InvalidParameterException, tr("\"%1\" is not a valid position.").arg(result)); return QPoint(); } QPointF point(positionStringList.at(0).toFloat(&ok), positionStringList.at(1).toFloat(&ok)); if(!ok) { emit executionException(ActionException::InvalidParameterException, tr("\"%1\" is not a valid position.").arg(result)); return QPoint(); } computePercentPosition(point, unitSubParameter); return QPoint(point.x(), point.y()); }
QColor ActionInstance::evaluateColor(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return {}; const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString result; if(subParameter.isCode()) { QScriptValue evaluationResult = evaluateCode(ok, subParameter); if(auto codeColor = qobject_cast<Code::Color*>(evaluationResult.toQObject())) return codeColor->color(); result = evaluationResult.toString(); } else result = evaluateText(ok, subParameter); if(!ok) return QColor(); if(result.isEmpty() || result == QLatin1String("::")) return QColor(); QStringList colorStringList = result.split(QStringLiteral(":")); if(colorStringList.count() != 3) { ok = false; emit executionException(ActionException::InvalidParameterException, tr("\"%1\" is not a valid color.").arg(result)); return QColor(); } QColor color = QColor(colorStringList.at(0).toInt(&ok), colorStringList.at(1).toInt(&ok), colorStringList.at(2).toInt(&ok)); if(!ok) { emit executionException(ActionException::InvalidParameterException, tr("\"%1\" is not a valid color.").arg(result)); return QColor(); } return color; }
QStringList ActionInstance::evaluateItemList(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QStringList(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString result; if(subParameter.isCode()) result = evaluateCode(ok, subParameter).toString(); else result = evaluateText(ok, subParameter); if(!ok) return QStringList(); return result.split(QLatin1Char('\n'), QString::SkipEmptyParts); }
QString ActionInstance::evaluateSubParameter(bool &ok, const SubParameter &subParameter) { if(!ok || subParameter.value().isEmpty()) return QString(); QString result; if(subParameter.isCode()) result = evaluateCode(ok, subParameter).toString(); else result = evaluateText(ok, subParameter); if(!ok) return QString(); return result; }
QImage ActionInstance::evaluateImage(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QImage(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString filename; if(subParameter.isCode()) { QScriptValue evaluationResult = evaluateCode(ok, subParameter); if(auto codeImage = qobject_cast<Code::Image*>(evaluationResult.toQObject())) return codeImage->image(); if(!evaluationResult.isString()) { ok = false; emit executionException(ActionException::InvalidParameterException, tr("Invalid image.")); return QImage(); } filename = evaluationResult.toString(); } else filename = evaluateText(ok, subParameter); if(!ok || filename.isEmpty()) return QImage(); QImage image(filename); if(!image.isNull()) return image; ok = false; emit executionException(ActionException::InvalidParameterException, tr("Unable to load image: %1").arg(filename)); return QImage(); }
QString ActionInstance::evaluateString(bool &ok, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QString(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString result; if(subParameter.isCode()) result = evaluateCode(ok, subParameter).toString(); else result = evaluateText(ok, subParameter); if(!ok) return QString(); return result; }
MenuBar::MenuBar(QWidget *parent) : QMenuBar(parent) { fileMenu = new QMenu("File"); fileMenu->addAction("New", this, SLOT(newFile()), QKeySequence("CTRL+N")); fileMenu->addAction("Open", this, SLOT(openFile()), QKeySequence("CTRL+O")); // fileMenu->addAction("Open Recent"); recentMenu = new QMenu("Open recent files"); fileMenu->addMenu(recentMenu); fileMenu->addAction("Save", this, SLOT(saveFile()), QKeySequence("CTRL+S")); fileMenu->addAction("Save As...", this, SLOT(saveFileAs()), QKeySequence("SHIFT+CTRL+S")); fileMenu->addSeparator(); fileMenu->addAction("Close", this, SLOT(closeFile()), QKeySequence("CTRL+W")); fileMenu->addAction("Close All", this, SLOT(closeAllFiles()), QKeySequence("SHIFT+CTRL+W")); fileMenu->addSeparator(); fileMenu->addAction("Quit", this, SLOT(quit()), QKeySequence("CTRL+Q")); sessionMenu = new QMenu("Session"); editMenu = new QMenu("Edit"); editMenu->addAction("Previous Buffer", this, SLOT(decrementBuffer()), QKeySequence("ALT+LEFT")); editMenu->addAction("Next Buffer", this, SLOT(incrementBuffer()), QKeySequence("ALT+RIGHT")); languageMenu = new QMenu("Language"); languageMenu->addAction("Evaluate code", this, SLOT(evaluateCode()), QKeySequence("SHIFT+RETURN")); languageMenu->addAction("Toggle OpenGL", this, SLOT(toggleOpenGL()), QKeySequence("F1")); helpMenu = new QMenu("Help"); helpMenu->addAction("About", this, SLOT(about())); addMenu(fileMenu); addMenu(sessionMenu); addMenu(editMenu); addMenu(languageMenu); addMenu(helpMenu); }
QString ActionInstance::evaluateEditableListElement(bool &ok, const Tools::StringListPair &listElements, const QString ¶meterName, const QString &subParameterName) { if(!ok) return QString(); const SubParameter &subParameter = retreiveSubParameter(parameterName, subParameterName); QString result; if(subParameter.isCode()) result = evaluateCode(ok, subParameter).toString(); else result = evaluateText(ok, subParameter); if(!ok) return QString(); //Search in the translated items for(int i=0;i<listElements.second.size();++i) { if(listElements.second.at(i) == result) return listElements.first.at(i); } if(result.isEmpty()) { ok = false; setCurrentParameter(parameterName, subParameterName); emit executionException(ActionException::InvalidParameterException, tr("Please choose a value for this field.")); return QString(); } return result; }
// // LaunchServices-layer document open. // We don't cache those at present. If we ever do, we need to authenticate CoreServicesUIAgent as the source of its risk assessment. // void PolicyEngine::evaluateDocOpen(CFURLRef path, SecAssessmentFlags flags, CFDictionaryRef context, CFMutableDictionaryRef result) { if (context) { if (CFStringRef riskCategory = CFStringRef(CFDictionaryGetValue(context, kLSDownloadRiskCategoryKey))) { FileQuarantine qtn(cfString(path).c_str()); if (CFEqual(riskCategory, kLSRiskCategorySafe) || CFEqual(riskCategory, kLSRiskCategoryNeutral) || CFEqual(riskCategory, kLSRiskCategoryUnknown) || CFEqual(riskCategory, kLSRiskCategoryMayContainUnsafeExecutable)) { cfadd(result, "{%O=#T}", kSecAssessmentAssessmentVerdict); addAuthority(result, "_XProtect"); } else if (qtn.flag(QTN_FLAG_HARD)) { MacOSError::throwMe(errSecCSFileHardQuarantined); } else if (qtn.flag(QTN_FLAG_ASSESSMENT_OK)) { cfadd(result, "{%O=#T}", kSecAssessmentAssessmentVerdict); addAuthority(result, "Prior Assessment"); } else if (!overrideAssessment()) { // no need to do more work if we're off try { evaluateCode(path, kAuthorityExecute, flags, context, result, false); } catch (...) { // some documents can't be code signed, so this may be quite benign } if (CFDictionaryGetValue(result, kSecAssessmentAssessmentVerdict) == NULL) { // no code signature to help us out cfadd(result, "{%O=#F}", kSecAssessmentAssessmentVerdict); addAuthority(result, "_XProtect"); } } addToAuthority(result, kLSDownloadRiskCategoryKey, riskCategory); return; } } // insufficient information from LS - deny by default cfadd(result, "{%O=#F}", kSecAssessmentAssessmentVerdict); addAuthority(result, "Insufficient Context"); }
void ScProcess::stopMain(void) { evaluateCode("thisProcess.stop", true); }
// // Installer archive. // Hybrid policy: If we detect an installer signature, use and validate that. // If we don't, check for a code signature instead. // void PolicyEngine::evaluateInstall(CFURLRef path, SecAssessmentFlags flags, CFDictionaryRef context, CFMutableDictionaryRef result) { const AuthorityType type = kAuthorityInstall; Xar xar(cfString(path).c_str()); if (!xar) { // follow the code signing path evaluateCode(path, type, flags, context, result); return; } SQLite3::int64 latentID = 0; // first (highest priority) disabled matching ID std::string latentLabel; // ... and associated label, if any if (!xar.isSigned()) { // unsigned xar if (SYSPOLICY_ASSESS_OUTCOME_UNSIGNED_ENABLED()) SYSPOLICY_ASSESS_OUTCOME_UNSIGNED(cfString(path).c_str(), type); cfadd(result, "{%O=%B}", kSecAssessmentAssessmentVerdict, false); addAuthority(result, "no usable signature"); return; } if (CFRef<CFArrayRef> certs = xar.copyCertChain()) { CFRef<CFTypeRef> policy = installerPolicy(); CFRef<SecTrustRef> trust; MacOSError::check(SecTrustCreateWithCertificates(certs, policy, &trust.aref())); // MacOSError::check(SecTrustSetAnchorCertificates(trust, cfEmptyArray())); // no anchors MacOSError::check(SecTrustSetOptions(trust, kSecTrustOptionAllowExpired | kSecTrustOptionImplicitAnchors)); SecTrustResultType trustResult; MacOSError::check(SecTrustEvaluate(trust, &trustResult)); CFRef<CFArrayRef> chain; CSSM_TP_APPLE_EVIDENCE_INFO *info; MacOSError::check(SecTrustGetResult(trust, &trustResult, &chain.aref(), &info)); if (flags & kSecAssessmentFlagRequestOrigin) setOrigin(chain, result); switch (trustResult) { case kSecTrustResultProceed: case kSecTrustResultUnspecified: break; default: { OSStatus rc; MacOSError::check(SecTrustGetCssmResultCode(trust, &rc)); MacOSError::throwMe(rc); } } SQLite::Statement query(*this, "SELECT allow, requirement, id, label, flags, disabled FROM scan_authority" " WHERE type = :type" " ORDER BY priority DESC;"); query.bind(":type").integer(type); while (query.nextRow()) { bool allow = int(query[0]); const char *reqString = query[1]; SQLite3::int64 id = query[2]; const char *label = query[3]; //sqlite_uint64 ruleFlags = query[4]; SQLite3::int64 disabled = query[5]; CFRef<SecRequirementRef> requirement; MacOSError::check(SecRequirementCreateWithString(CFTempString(reqString), kSecCSDefaultFlags, &requirement.aref())); switch (OSStatus rc = SecRequirementEvaluate(requirement, chain, NULL, kSecCSDefaultFlags)) { case noErr: // success break; case errSecCSReqFailed: // requirement missed, but otherwise okay continue; default: // broken in some way; all tests will fail like this so bail out MacOSError::throwMe(rc); } if (disabled) { if (latentID == 0) { latentID = id; if (label) latentLabel = label; } continue; // the loop } if (SYSPOLICY_ASSESS_OUTCOME_ACCEPT_ENABLED() || SYSPOLICY_ASSESS_OUTCOME_DENY_ENABLED()) { if (allow) SYSPOLICY_ASSESS_OUTCOME_ACCEPT(cfString(path).c_str(), type, label, NULL); else SYSPOLICY_ASSESS_OUTCOME_DENY(cfString(path).c_str(), type, label, NULL); } // not adding to the object cache - we could, but it's not likely to be worth it cfadd(result, "{%O=%B}", kSecAssessmentAssessmentVerdict, allow); addAuthority(result, label, id); return; } } if (SYSPOLICY_ASSESS_OUTCOME_DEFAULT_ENABLED()) SYSPOLICY_ASSESS_OUTCOME_DEFAULT(cfString(path).c_str(), type, latentLabel.c_str(), NULL); // no applicable authority. Deny by default cfadd(result, "{%O=#F}", kSecAssessmentAssessmentVerdict); addAuthority(result, latentLabel.c_str(), latentID); }
QScriptValue ActionInstance::evaluateCode(bool &ok, const SubParameter &toEvaluate) { return evaluateCode(ok, toEvaluate.value()); }
void stopMain(void) { evaluateCode("thisProcess.stop", false); }
void getMethodDefinitions(QString const & methodName) { evaluateCode(QString("ScIDE.sendMethodDefinitions(\"%1\")").arg(methodName), true); }
MainWindow::MainWindow(Main * main) : mMain(main) { setCorner( Qt::BottomLeftCorner, Qt::LeftDockWidgetArea ); // Construct status bar: mLangStatus = new StatusLabel(); mLangStatus->setText("Inactive"); mSynthStatus = new StatusLabel(); mSynthStatus->setText("Inactive"); QStatusBar *status = statusBar(); status->addPermanentWidget( new QLabel("Interpreter:") ); status->addPermanentWidget( mLangStatus ); status->addPermanentWidget( new QLabel("Synth:") ); status->addPermanentWidget( mSynthStatus ); // Code editor mEditors = new MultiEditor(main); // Docks mDocListDock = new DocumentsDock(main->documentManager(), this); mPostDock = new PostDock(this); // Layout // use a layout for tool widgets, to provide for separate margin control QVBoxLayout *tool_box = new QVBoxLayout; tool_box->addWidget(cmdLine()); tool_box->setContentsMargins(5,2,5,2); QVBoxLayout *center_box = new QVBoxLayout; center_box->setContentsMargins(0,0,0,0); center_box->setSpacing(0); center_box->addWidget(mEditors); center_box->addLayout(tool_box); QWidget *central = new QWidget; central->setLayout(center_box); setCentralWidget(central); addDockWidget(Qt::LeftDockWidgetArea, mDocListDock); addDockWidget(Qt::BottomDockWidgetArea, mPostDock); // A system for easy evaluation of pre-defined code: connect(&mCodeEvalMapper, SIGNAL(mapped(QString)), this, SIGNAL(evaluateCode(QString))); connect(this, SIGNAL(evaluateCode(QString,bool)), main->scProcess(), SLOT(evaluateCode(QString,bool))); // Interpreter: post output connect(main->scProcess(), SIGNAL( scPost(QString) ), mPostDock->mPostWindow, SLOT( post(QString) ) ); // Interpreter: monitor running state connect(main->scProcess(), SIGNAL( stateChanged(QProcess::ProcessState) ), this, SLOT( onInterpreterStateChanged(QProcess::ProcessState) ) ); // Interpreter: forward status messages connect(main->scProcess(), SIGNAL(statusMessage(const QString&)), status, SLOT(showMessage(const QString&))); // Document list interaction connect(mDocListDock->list(), SIGNAL(clicked(Document*)), mEditors, SLOT(setCurrent(Document*))); connect(mEditors, SIGNAL(currentChanged(Document*)), mDocListDock->list(), SLOT(setCurrent(Document*)), Qt::QueuedConnection); createMenus(); QIcon icon; icon.addFile(":/icons/sc-cube-128"); icon.addFile(":/icons/sc-cube-48"); icon.addFile(":/icons/sc-cube-32"); icon.addFile(":/icons/sc-cube-16"); QApplication::setWindowIcon(icon); }
void getClassDefinitions(QString const & classname) { QString commandString = QString("ScIDE.sendClassDefinitions('%1')").arg(classname); evaluateCode(commandString, true); }