You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
8.7 KiB
236 lines
8.7 KiB
|
|
|
|
#include "test.h"
|
|
#include "core/polkittqt1-authority.h"
|
|
#include "agent/polkittqt1-agent-session.h"
|
|
#include "core/polkittqt1-details.h"
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <pwd.h>
|
|
#include <TQtDBus/TQDBusMessage>
|
|
#include <TQtDBus/TQDBusConnection>
|
|
using namespace PolkitTQt1;
|
|
using namespace PolkitTQt1::Agent;
|
|
|
|
void wait()
|
|
{
|
|
for (int i = 0; i < 100; i++) {
|
|
usleep(100);
|
|
TQCoreApplication::processEvents();
|
|
}
|
|
}
|
|
|
|
void TestAuth::test_Auth_checkAuthorization()
|
|
{
|
|
// This needs the file org.tqt.policykit.examples.policy from examples to be installed
|
|
UnixProcessSubject process(TQCoreApplication::applicationPid());
|
|
Authority::Result result;
|
|
// Check if this method returns good authorization results
|
|
Authority *authority = Authority::instance();
|
|
result = authority->checkAuthorizationSync("org.tqt.policykit.examples.kick", process, Authority::None);
|
|
TQCOMPARE(result, Authority::No);
|
|
TQVERIFY(!authority->hasError());
|
|
result = authority->checkAuthorizationSync("org.tqt.policykit.examples.cry", process, Authority::None);
|
|
TQCOMPARE(result, Authority::Yes);
|
|
TQVERIFY(!authority->hasError());
|
|
result = authority->checkAuthorizationSync("org.tqt.policykit.examples.bleed", process, Authority::None);
|
|
TQCOMPARE(result, Authority::Challenge);
|
|
TQVERIFY(!authority->hasError());
|
|
|
|
// Now we try async methods
|
|
TQSignalSpy spy(authority, SIGNAL(checkAuthorizationFinished(PolkitTQt1::Authority::Result)));
|
|
// Call asynchronous checkAuthorization
|
|
authority->checkAuthorization("org.tqt.policykit.examples.kick", process, Authority::None);
|
|
// Give the polkit time to obtain the result and emit the signal with it
|
|
wait();
|
|
// Test if the signal was emitted
|
|
TQCOMPARE(spy.count(), 1);
|
|
// Test the result
|
|
result = qVariantValue<PolkitTQt1::Authority::Result> (spy.takeFirst()[0]);
|
|
TQCOMPARE(result, Authority::No);
|
|
TQVERIFY(!authority->hasError());
|
|
spy.clear();
|
|
|
|
// Let's test the cancellability
|
|
authority->checkAuthorization("org.tqt.policykit.examples.kick", process, Authority::None);
|
|
authority->checkAuthorizationCancel();
|
|
// Wait and check if the signal arrieved
|
|
wait();
|
|
TQCOMPARE(spy.count(), 0);
|
|
|
|
// Check if it can cancel user authentication dialog
|
|
authority->checkAuthorization("org.tqt.policykit.examples.bleed", process, Authority::AllowUserInteraction);
|
|
// Show it for second
|
|
sleep(1);
|
|
// And now kill it
|
|
authority->checkAuthorizationCancel();
|
|
TQVERIFY(!authority->hasError());
|
|
// But how to test if it was successful?
|
|
tqWarning() << "You should see an authentication dialog for a short period.";
|
|
}
|
|
|
|
void TestAuth::test_Auth_enumerateActions()
|
|
{
|
|
// This needs the file org.tqt.policykit.examples.policy from examples to be installed
|
|
ActionDescription::List list = Authority::instance()->enumerateActionsSync();
|
|
TQVERIFY(!Authority::instance()->hasError());
|
|
// Check whether enumerateAction returns at least example actions
|
|
int count = 0;
|
|
Q_FOREACH(const ActionDescription &ad, list) {
|
|
if ((ad.actionId() == "org.tqt.policykit.examples.kick") ||
|
|
(ad.actionId() == "org.tqt.policykit.examples.cry") ||
|
|
(ad.actionId() == "org.tqt.policykit.examples.bleed"))
|
|
count++;
|
|
}
|
|
TQCOMPARE(count, 3);
|
|
|
|
|
|
// Test asynchronous version as well
|
|
list.clear();
|
|
count = 0;
|
|
TQSignalSpy spy(Authority::instance(), SIGNAL(enumerateActionsFinished(PolkitTQt1::ActionDescription::List)));
|
|
Authority::instance()->enumerateActions();
|
|
wait();
|
|
TQCOMPARE(spy.count(), 1);
|
|
list = qVariantValue<PolkitTQt1::ActionDescription::List> (spy.takeFirst()[0]);
|
|
TQVERIFY(!Authority::instance()->hasError());
|
|
Q_FOREACH(const ActionDescription &ad, list) {
|
|
if ((ad.actionId() == "org.tqt.policykit.examples.kick") ||
|
|
(ad.actionId() == "org.tqt.policykit.examples.cry") ||
|
|
(ad.actionId() == "org.tqt.policykit.examples.bleed"))
|
|
count++;
|
|
}
|
|
TQCOMPARE(count, 3);
|
|
|
|
// Test cancelling the enumeration
|
|
spy.clear();
|
|
Authority::instance()->enumerateActions();
|
|
Authority::instance()->enumerateActionsCancel();
|
|
wait();
|
|
TQCOMPARE(spy.count(), 0);
|
|
TQVERIFY(!Authority::instance()->hasError());
|
|
}
|
|
|
|
void TestAuth::test_Identity()
|
|
{
|
|
// Get real name and id of current user and group
|
|
struct passwd *userinfo = getpwuid(getuid());
|
|
TQString userName = userinfo->pw_name;
|
|
unsigned int userId = userinfo->pw_uid;
|
|
unsigned int groupId = userinfo->pw_gid;
|
|
|
|
// Try to create UnixUser from username
|
|
UnixUserIdentity user(userName);
|
|
TQVERIFY(user.identity());
|
|
|
|
// Create generic Identity from UnixUser via string representation
|
|
Identity id = Identity::fromString(user.toString());
|
|
// Compare obtained uid with real uid
|
|
TQCOMPARE(id.toUnixUserIdentity().uid(), userId);
|
|
|
|
// Create generic Identity from UnixGroup via string representation
|
|
UnixGroupIdentity group(groupId);
|
|
TQVERIFY(group.identity());
|
|
id = Identity::fromString(group.toString());
|
|
TQCOMPARE(id.toUnixGroupIdentity().gid(), groupId);
|
|
|
|
// Test setting gid to another value
|
|
group.setGid(9999U);
|
|
id = Identity::fromString(group.toString());
|
|
TQCOMPARE(id.toUnixGroupIdentity().gid(), 9999U);
|
|
}
|
|
|
|
void TestAuth::test_Authority()
|
|
{
|
|
Authority *authority = Authority::instance();
|
|
TQVERIFY(authority);
|
|
TQVERIFY(!authority->hasError());
|
|
|
|
// Verify emiting of the signals
|
|
TQSignalSpy spy(authority, SIGNAL(consoleKitDBChanged()));
|
|
TQDBusMessage msg = TQDBusMessage::createMethodCall("org.freedesktop.ConsoleKit",
|
|
"/org/freedesktop/ConsoleKit/Manager",
|
|
"org.freedesktop.ConsoleKit.Manager",
|
|
"OpenSession");
|
|
TQDBusMessage reply = TQDBusConnection::systemBus().call(msg);
|
|
TQString cookie;
|
|
cookie = qVariantValue<TQString> (reply.arguments()[0]);
|
|
|
|
|
|
msg = TQDBusMessage::createMethodCall("org.freedesktop.ConsoleKit",
|
|
"/org/freedesktop/ConsoleKit/Manager",
|
|
"org.freedesktop.ConsoleKit.Manager",
|
|
"CloseSession");
|
|
msg.setArguments(TQList<TQVariant> () << cookie);
|
|
TQDBusConnection::systemBus().call(msg);
|
|
// FIXME: Emitting consoleKitDBChanged is not working now
|
|
tqWarning() << "Emitting consoleKitDBChanged is not working now, test will be skipped";
|
|
//TQVERIFY(spy.count() > 0);
|
|
TQVERIFY(!authority->hasError());
|
|
|
|
// configChanged signal from authority requires changing some policy files
|
|
// and it would require user interaction (typing the password)
|
|
// so this is not covered by this test
|
|
}
|
|
|
|
void TestAuth::test_Subject()
|
|
{
|
|
// Get pid of this appication
|
|
tqint64 pid = TQCoreApplication::applicationPid();
|
|
// Create unix process for it
|
|
UnixProcessSubject *process = new UnixProcessSubject(pid);
|
|
// Test if pid doesn't differ
|
|
TQCOMPARE(process->pid(), pid);
|
|
|
|
// Serialize and deserialize subject
|
|
//Subject *subject = Subject::fromString(process->toString());
|
|
// and try it
|
|
//TQCOMPARE(((UnixProcess *) subject)->pid(), pid);
|
|
delete process;
|
|
}
|
|
|
|
void TestAuth::test_Session()
|
|
{
|
|
/*
|
|
UnixUser user(getuid());
|
|
Session *session = new Session(&user, "/org/freedesktop/ConsoleKit/Session2");
|
|
TQSignalSpy spy_completed(session, SIGNAL(completed(bool)));
|
|
TQSignalSpy spy_request(session, SIGNAL(request(TQString,bool)));
|
|
TQSignalSpy spy_error(session, SIGNAL(showError(TQString)));
|
|
TQSignalSpy spy_info(session, SIGNAL(showInfo(TQString)));
|
|
session->initiate();
|
|
session->response("aaa");
|
|
// Canceling should emit the "completed" signal
|
|
session->cancel();
|
|
TQCOMPARE(spy_completed.count(), 1);
|
|
|
|
//UnixProcess *process = new UnixProcess(TQCoreApplication::applicationPid());
|
|
//Authority::instance()->checkAuthorization("org.tqt.policykit.examples.kick", process, Authority::None);
|
|
|
|
tqDebug() << "COMPLETED:" << spy_completed.count();
|
|
tqDebug() << "REQUEST:" << spy_request.count();
|
|
tqDebug() << "ERROR:" << spy_error.count();
|
|
tqDebug() << "INFO:" << spy_info.count();
|
|
*/
|
|
}
|
|
|
|
void TestAuth::test_Details()
|
|
{
|
|
Details details;
|
|
details.insert("1", "aaa");
|
|
details.insert("2", "bbb");
|
|
details.insert("3", "ccc");
|
|
details.insert("4", "ddd");
|
|
TQCOMPARE(details.lookup("1"), TQString("aaa"));
|
|
TQCOMPARE(details.lookup("2"), TQString("bbb"));
|
|
TQCOMPARE(details.lookup("3"), TQString("ccc"));
|
|
TQCOMPARE(details.lookup("4"), TQString("ddd"));
|
|
TQList<TQString> list = details.keys();
|
|
TQVERIFY(list.contains("1"));
|
|
TQVERIFY(list.contains("2"));
|
|
TQVERIFY(list.contains("3"));
|
|
TQVERIFY(list.contains("4"));
|
|
}
|
|
|
|
TQTEST_MAIN(TestAuth)
|