bool FaceRecognitionResetter::isDBCorrected() const { bool result = true; QDir dir(xdg_data_home); if (!dir.exists(data_root_dir)) { goto clean; } dir.cd(data_root_dir); if (!dir.exists(data_data_dir)) { goto clean; } dir.cd(data_data_dir); if (dir.exists(database_filename)) { QFile::Permissions filePermissions = QFile::permissions(dir.absoluteFilePath(database_filename)); result = filePermissions.testFlag(QFile::ReadOwner) && filePermissions.testFlag(QFile::WriteOwner); goto clean; } else { goto clean; } clean: return result; }
File::Permissions File::getPermissions(QFile::Permissions permissions) { File::Permissions myPerms; for (unsigned int i = 0; i < (sizeof(qtPermissions) / sizeof(QFile::Permission)); i++) { if (permissions.testFlag(qtPermissions[i])) { myPerms |= myPermissions[i]; } } return myPerms; }
bool Packaging::WriteTarEntry(const QString& filePath, QTemporaryFile *tarFile, const QString& entryFilename) { TarHeader tarHeader; memset(tarHeader.buffer, 0, TarHeader::kBlockLength); QFile file(filePath); if (!file.open(QFile::ReadOnly)) { Alerts::DisplayError(QString("Failed to open file: \n%1").arg(file.fileName())); return (false); } if (file.size() > Packaging::kMaxFileSize) { Alerts::DisplayError(QString("File is too large to be packaged:\n%1").arg(file.fileName())); return (false); } QFileInfo qtFileInfo(file); QByteArray utfFilename; utfFilename = entryFilename.toUtf8(); if (utfFilename.length() > 100) { Alerts::DisplayError(QString("File name is too long:\n%1").arg(qtFileInfo.fileName())); return (false); } strcpy(tarHeader.fields.name, utfFilename.constData()); unsigned int mode = 0; QFile::Permissions permissions = file.permissions(); // Other if (permissions.testFlag(QFile::ExeOther)) mode |= TarHeader::kModeOtherExecute; if (permissions.testFlag(QFile::WriteOther)) mode |= TarHeader::kModeOtherWrite; if (permissions.testFlag(QFile::ReadOther)) mode |= TarHeader::kModeOtherRead; // Group if (permissions.testFlag(QFile::ExeGroup)) mode |= TarHeader::kModeGroupExecute; if (permissions.testFlag(QFile::WriteGroup)) mode |= TarHeader::kModeGroupWrite; if (permissions.testFlag(QFile::ReadGroup)) mode |= TarHeader::kModeGroupRead; // Owner if (permissions.testFlag(QFile::ExeOwner)) mode |= TarHeader::kModeOwnerExecute; if (permissions.testFlag(QFile::WriteOwner)) mode |= TarHeader::kModeOwnerWrite; if (permissions.testFlag(QFile::ReadOwner)) mode |= TarHeader::kModeOwnerRead; sprintf(tarHeader.fields.mode, "%07o", mode); // Owner id uint id = qtFileInfo.ownerId(); if (id < 2097151) sprintf(tarHeader.fields.userId, "%07o", id); else sprintf(tarHeader.fields.userId, "%07o", 0); // Group id id = qtFileInfo.groupId(); if (id < 2097151) sprintf(tarHeader.fields.groupId, "%07o", id); else sprintf(tarHeader.fields.groupId, "%07o", 0); // Note: We don't support base-256 encoding. Support could be added later. sprintf(tarHeader.fields.size, "%011llo", file.size()); sprintf(tarHeader.fields.modifiedTime, "%011llo", qtFileInfo.lastModified().toMSecsSinceEpoch() / 1000); // Regular File tarHeader.fields.typeFlag = '0'; // Calculate checksum int checksum = 0; memset(tarHeader.fields.checksum, ' ', 8); for (int i = 0; i < TarHeader::kTarHeaderLength; i++) checksum += static_cast<unsigned char>(tarHeader.buffer[i]); sprintf(tarHeader.fields.checksum, "%07o", checksum); // Write the header to the TAR file. tarFile->write(tarHeader.buffer, TarHeader::kBlockLength); char buffer[TarHeader::kBlockWriteCount * TarHeader::kBlockLength]; qint64 offset = 0; while (offset < file.size()) { qint64 dataRead = file.read(buffer, TarHeader::kBlockWriteCount * TarHeader::kBlockLength); if (tarFile->write(buffer, dataRead) != dataRead) { Alerts::DisplayError("Failed to write data to the temporary TAR file."); return (false); } if (dataRead % TarHeader::kBlockLength != 0) { int remainingBlockLength = TarHeader::kBlockLength - dataRead % TarHeader::kBlockLength; memset(buffer, 0, remainingBlockLength); if (tarFile->write(buffer, remainingBlockLength) != remainingBlockLength) { Alerts::DisplayError("Failed to write data to the temporary TAR file."); return (false); } } offset += dataRead; } return (true); }