mirror of
https://github.com/cmclark00/retro-imager.git
synced 2025-05-18 07:55:21 +01:00
Mac: open preferences for user if Imager is not allowed access
Normally the system will prompt the user to allow Imager access to removable volumes. Open preferences and ask user to allow Imager manually in a corner case in which this does not occur.
This commit is contained in:
parent
c4ab7b91a1
commit
7e4f5c9045
3 changed files with 20 additions and 9 deletions
|
@ -171,8 +171,17 @@ bool DownloadThread::_openAndPrepareDevice()
|
||||||
#ifdef Q_OS_DARWIN
|
#ifdef Q_OS_DARWIN
|
||||||
_filename.replace("/dev/disk", "/dev/rdisk");
|
_filename.replace("/dev/disk", "/dev/rdisk");
|
||||||
|
|
||||||
if (!_file.authOpen(_filename)) {
|
auto authopenresult = _file.authOpen(_filename);
|
||||||
emit error(tr("Error running authopen to gain access to disk device '%1'").arg(QString(_filename)));
|
|
||||||
|
if (authopenresult == _file.authOpenCancelled) {
|
||||||
|
/* User cancelled authentication */
|
||||||
|
emit error(tr("Authentication cancelled"));
|
||||||
|
return false;
|
||||||
|
} else if (authopenresult == _file.authOpenError) {
|
||||||
|
QString msg = tr("Error running authopen to gain access to disk device '%1'").arg(QString(_filename));
|
||||||
|
msg += "<br>"+tr("Please verify if 'Raspberry Pi Imager' is allowed access to 'removable volumes' in privacy settings (under 'files and folders' or alternatively give it 'full disk access').");
|
||||||
|
QProcess::execute("open x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles");
|
||||||
|
emit error(msg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -22,7 +22,7 @@ bool MacFile::isSequential() const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacFile::authOpen(const QByteArray &filename)
|
MacFile::authOpenResult MacFile::authOpen(const QByteArray &filename)
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
|
||||||
|
@ -34,13 +34,13 @@ bool MacFile::authOpen(const QByteArray &filename)
|
||||||
kAuthorizationFlagPreAuthorize;
|
kAuthorizationFlagPreAuthorize;
|
||||||
AuthorizationRef authRef;
|
AuthorizationRef authRef;
|
||||||
if (AuthorizationCreate(&rights, nullptr, flags, &authRef) != 0)
|
if (AuthorizationCreate(&rights, nullptr, flags, &authRef) != 0)
|
||||||
return false;
|
return authOpenCancelled;
|
||||||
|
|
||||||
AuthorizationExternalForm externalForm;
|
AuthorizationExternalForm externalForm;
|
||||||
if (AuthorizationMakeExternalForm(authRef, &externalForm) != 0)
|
if (AuthorizationMakeExternalForm(authRef, &externalForm) != 0)
|
||||||
{
|
{
|
||||||
AuthorizationFree(authRef, 0);
|
AuthorizationFree(authRef, 0);
|
||||||
return false;
|
return authOpenError;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *cmd = "/usr/libexec/authopen";
|
const char *cmd = "/usr/libexec/authopen";
|
||||||
|
@ -110,17 +110,17 @@ bool MacFile::authOpen(const QByteArray &filename)
|
||||||
if (wpid == -1)
|
if (wpid == -1)
|
||||||
{
|
{
|
||||||
qDebug() << "waitpid() failed executing authopen";
|
qDebug() << "waitpid() failed executing authopen";
|
||||||
return false;
|
return authOpenError;
|
||||||
}
|
}
|
||||||
if (WEXITSTATUS(status))
|
if (WEXITSTATUS(status))
|
||||||
{
|
{
|
||||||
qDebug() << "authopen returned failure code" << WEXITSTATUS(status);
|
qDebug() << "authopen returned failure code" << WEXITSTATUS(status);
|
||||||
return false;
|
return authOpenError;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "fd received:" << fd;
|
qDebug() << "fd received:" << fd;
|
||||||
}
|
}
|
||||||
AuthorizationFree(authRef, 0);
|
AuthorizationFree(authRef, 0);
|
||||||
|
|
||||||
return open(fd, QIODevice::ReadWrite | QIODevice::ExistingOnly | QIODevice::Unbuffered, QFileDevice::AutoCloseHandle);
|
return open(fd, QIODevice::ReadWrite | QIODevice::ExistingOnly | QIODevice::Unbuffered, QFileDevice::AutoCloseHandle) ? authOpenSuccess : authOpenError;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,11 @@ class MacFile : public QFile
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
|
enum authOpenResult {authOpenCancelled, authOpenSuccess, authOpenError };
|
||||||
|
|
||||||
MacFile(QObject *parent = nullptr);
|
MacFile(QObject *parent = nullptr);
|
||||||
virtual bool isSequential() const;
|
virtual bool isSequential() const;
|
||||||
bool authOpen(const QByteArray &filename);
|
authOpenResult authOpen(const QByteArray &filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MACFILE_H
|
#endif // MACFILE_H
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue