Fix saving/loading trace(sniff) files

Fix file extension for RRG repo
Fix overwriting existing file
Add support for RRG v4.16717(path in prefs)
master
wh201906 1 year ago
parent 0738aff2bf
commit 184a9ed5f2
No known key found for this signature in database

@ -104,7 +104,9 @@
"cmd": "hf mf darkside" "cmd": "hf mf darkside"
}, },
"save sniff": { "save sniff": {
"cmd": "trace save -f <filename>" "cmd": "trace save -f <filename>",
"path cmd":"prefs show",
"path pattern":"trace save path\\.+\\s*(.+)$"
}, },
"load sniff": { "load sniff": {
"cmd": "trace load -f <filename>", "cmd": "trace load -f <filename>",

@ -1375,3 +1375,18 @@ quint16 Mifare::getTrailerBlockId(quint8 sectorId, qint8 cardTypeId)
// other cardTypeId: use current cardtype(include default -1) // other cardTypeId: use current cardtype(include default -1)
return (cardType.blks[sectorId] + cardType.blk[sectorId] - 1); return (cardType.blks[sectorId] + cardType.blk[sectorId] - 1);
} }
QString Mifare::getTraceSavePath()
{
QVariantMap config = configMap["save sniff"].toMap();
QString pathCmd = config["path cmd"].toString();
QString patternText = config["path pattern"].toString();
QRegularExpression pattern = QRegularExpression(patternText, QRegularExpression::MultilineOption);
if(pathCmd.isEmpty() || patternText.isEmpty())
return QString();
QString result = util->execCMDWithOutput(pathCmd, 500);
QRegularExpressionMatch reMatch = pattern.match(result);
if(!reMatch.hasMatch())
return QString();
return reMatch.captured(1).trimmed();
}

@ -115,6 +115,7 @@ public:
QString data_getUID(); QString data_getUID();
quint16 getTrailerBlockId(quint8 sectorId, qint8 cardTypeId = -1); // -1: use current cardtype quint16 getTrailerBlockId(quint8 sectorId, qint8 cardTypeId = -1); // -1: use current cardtype
void setConfigMap(const QVariantMap& configMap); void setConfigMap(const QVariantMap& configMap);
QString getTraceSavePath();
public slots: public slots:
signals: signals:

@ -956,18 +956,31 @@ void MainWindow::on_MF_Sniff_loadButton_clicked() // use a tmp file to support c
{ {
QString title = ""; QString title = "";
QString filename = ""; QString filename = "";
QString defaultExtension;
QDir clientTracePath;
if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL)
defaultExtension = ".trc";
else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN)
defaultExtension = ".trace";
QString userTraceSavePath = mifare->getTraceSavePath();
if(userTraceSavePath.isEmpty())
clientTracePath = *clientWorkingDir;
else
clientTracePath = QDir(userTraceSavePath); // For v4.16717 and later
title = tr("Plz select the trace file:"); title = tr("Plz select the trace file:");
filename = QFileDialog::getOpenFileName(this, title, clientWorkingDir->absolutePath(), tr("Trace Files(*.trc)") + ";;" + tr("All Files(*.*)")); filename = QFileDialog::getOpenFileName(this, title, clientTracePath.absolutePath(), tr("Trace Files") + "(*" + defaultExtension + ")" + ";;" + tr("All Files(*.*)"));
qDebug() << filename; qDebug() << filename;
if(filename != "") if(filename != "")
{ {
QString tmpFile = "tmp" + QString::number(QDateTime::currentDateTime().toTime_t()) + ".trc"; QString tmpFile = "tmp" + QString::number(QDateTime::currentDateTimeUtc().toTime_t()) + defaultExtension;
if(QFile::copy(filename, clientWorkingDir->absolutePath() + "/" + tmpFile)) if(QFile::copy(filename, clientTracePath.absolutePath() + "/" + tmpFile))
{ {
mifare->loadSniff(tmpFile); mifare->loadSniff(tmpFile);
util->delay(3000); util->delay(3000);
QFile::remove(clientWorkingDir->absolutePath() + "/" + tmpFile); QFile::remove(clientTracePath.absolutePath() + "/" + tmpFile);
} }
else else
{ {
@ -980,25 +993,41 @@ void MainWindow::on_MF_Sniff_saveButton_clicked()
{ {
QString title = ""; QString title = "";
QString filename = ""; QString filename = "";
QString defaultExtension;
QDir clientTracePath;
if(Util::getClientType() == Util::CLIENTTYPE_OFFICIAL)
defaultExtension = ".trc";
else if(Util::getClientType() == Util::CLIENTTYPE_ICEMAN)
defaultExtension = ".trace";
QString userTraceSavePath = mifare->getTraceSavePath();
if(userTraceSavePath.isEmpty())
clientTracePath = *clientWorkingDir;
else
clientTracePath = QDir(userTraceSavePath); // For v4.16717 and later
title = tr("Plz select the location to save trace file:"); title = tr("Plz select the location to save trace file:");
filename = QFileDialog::getSaveFileName(this, title, clientWorkingDir->absolutePath(), tr("Trace Files(*.trc)")); filename = QFileDialog::getSaveFileName(this, title, clientTracePath.absolutePath(), tr("Trace Files") + "(*" + defaultExtension + ")");
qDebug() << filename; qDebug() << filename;
if(filename != "") if(filename != "")
{ {
QString tmpFile = "tmp" + QString::number(QDateTime::currentDateTime().toTime_t()) + ".trc"; QString tmpFile = "tmp" + QString::number(QDateTime::currentDateTimeUtc().toTime_t()) + defaultExtension;
mifare->saveSniff(tmpFile); mifare->saveSniff(tmpFile);
for(int i = 0; i < 100; i++) for(int i = 0; i < 100; i++)
{ {
util->delay(100); util->delay(100);
if(QFile::exists(clientWorkingDir->absolutePath() + "/" + tmpFile)) if(QFile::exists(clientTracePath.absolutePath() + "/" + tmpFile))
break; break;
} }
if(!QFile::copy(clientWorkingDir->absolutePath() + "/" + tmpFile, filename)) // filename is not empty -> the user has chosen to overwrite the existing file
if(QFile::exists(filename))
QFile::remove(filename);
if(!QFile::copy(clientTracePath.absolutePath() + "/" + tmpFile, filename))
{ {
QMessageBox::information(this, tr("Info"), tr("Failed to save to") + "\n" + filename); QMessageBox::information(this, tr("Info"), tr("Failed to save to") + "\n" + filename);
} }
QFile::remove(clientWorkingDir->absolutePath() + "/" + tmpFile); QFile::remove(clientTracePath.absolutePath() + "/" + tmpFile);
} }
} }

Loading…
Cancel
Save