summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2021-10-30 12:06:43 +0900
committerMichele Calgaro <[email protected]>2021-10-30 12:06:43 +0900
commit28de2ff84f59ac0b173670aa9c5331bc77c1e63f (patch)
tree43dcf0f461ee5552100b648e38979982c971597d /examples
downloadpolkit-tqt-28de2ff84f59ac0b173670aa9c5331bc77c1e63f.tar.gz
polkit-tqt-28de2ff84f59ac0b173670aa9c5331bc77c1e63f.zip
Initial import from polkit-qt-1 debian snapshot archive.
https://snapshot.debian.org/package/polkit-qt-1/0.103.0-1/ Signed-off-by: Michele Calgaro <[email protected]>
Diffstat (limited to 'examples')
-rw-r--r--examples/CMakeLists.txt89
-rw-r--r--examples/COPYING339
-rw-r--r--examples/PkExample.cpp240
-rw-r--r--examples/PkExample.h41
-rw-r--r--examples/PkExample.ui234
-rw-r--r--examples/PkExampleHelper.cpp110
-rw-r--r--examples/PkExampleHelper.h42
-rw-r--r--examples/agent/CMakeLists.txt24
-rw-r--r--examples/agent/klistener.cpp100
-rw-r--r--examples/agent/klistener.h56
-rw-r--r--examples/agent/main.cpp30
-rw-r--r--examples/agent/pkagentexample.cpp17
-rw-r--r--examples/agent/pkagentexample.h42
-rw-r--r--examples/icons/action-locked-default.pngbin0 -> 1686 bytes
-rw-r--r--examples/icons/action-locked.pngbin0 -> 1052 bytes
-rw-r--r--examples/icons/action-unlocked.pngbin0 -> 4744 bytes
-rw-r--r--examples/icons/custom-no.pngbin0 -> 1650 bytes
-rw-r--r--examples/icons/custom-yes.pngbin0 -> 1628 bytes
-rw-r--r--examples/icons/icons.qrc9
-rw-r--r--examples/main.cpp32
-rw-r--r--examples/mainHelper.cpp28
-rw-r--r--examples/org.qt.policykit.examples.conf20
-rw-r--r--examples/org.qt.policykit.examples.policy81
-rw-r--r--examples/org.qt.policykit.examples.policy.in85
-rw-r--r--examples/org.qt.policykit.examples.service.in5
-rw-r--r--examples/org.qt.policykit.examples.xml11
26 files changed, 1635 insertions, 0 deletions
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
new file mode 100644
index 000000000..f6af3fa10
--- /dev/null
+++ b/examples/CMakeLists.txt
@@ -0,0 +1,89 @@
+
+install(FILES org.qt.policykit.examples.policy DESTINATION ${SHARE_INSTALL_PREFIX}/polkit-1/actions/)
+
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/gui
+)
+
+set(polkit_example_SRCS
+ main.cpp
+ PkExample.cpp
+)
+
+SET(polkit_example_RESOUCES
+ icons/icons.qrc
+)
+
+QT4_WRAP_CPP(polkit_example_MOC_SRCS
+ PkExample.h
+)
+
+QT4_WRAP_UI(polkit_example_UI_SRCS
+ PkExample.ui
+)
+
+QT4_ADD_RESOURCES (qtsourceview_RC_SRCS ${polkit_example_RESOUCES})
+
+add_executable(polkit-example
+ ${polkit_example_SRCS}
+ ${polkit_example_MOC_SRCS}
+ ${polkit_example_UI_SRCS}
+ ${qtsourceview_RC_SRCS}
+)
+
+target_link_libraries(polkit-example
+ ${QT_QTCORE_LIBRARY}
+ ${QT_QTGUI_LIBRARY}
+ polkit-qt-gui-1
+ polkit-qt-core-1
+)
+
+#--------Helper Application
+
+# This macro is defined in FindPolkitQt.cmake
+macro(dbus_add_activation_system_service _sources)
+ foreach (_i ${_sources})
+ get_filename_component(_service_file ${_i} ABSOLUTE)
+ string(REGEX REPLACE "\\.service.*$" ".service" _output_file ${_i})
+ set(_target ${CMAKE_CURRENT_BINARY_DIR}/${_output_file})
+ configure_file(${_service_file} ${_target})
+ install(FILES ${_target} DESTINATION ${SHARE_INSTALL_PREFIX}/dbus-1/system-services )
+ #install(FILES ${_target} DESTINATION ${_install_dir})
+ endforeach (_i ${ARGN})
+endmacro(dbus_add_activation_system_service _sources)
+
+set(polkit_example_helper_SRCS
+ PkExampleHelper.cpp
+ mainHelper.cpp
+)
+
+qt4_add_dbus_adaptor(polkit_example_helper_SRCS
+ org.qt.policykit.examples.xml
+ PkExampleHelper.h
+ PkExampleHelper
+)
+
+QT4_WRAP_CPP(polkit_example_helper_MOC_SRCS
+ PkExampleHelper.h
+)
+
+add_executable(polkit-example-helper
+ ${polkit_example_helper_SRCS}
+ ${polkit_example_helper_MOC_SRCS}
+)
+
+# see our helper is pretty small :D
+target_link_libraries(polkit-example-helper
+ ${QT_QTCORE_LIBRARY}
+ polkit-qt-core-1
+)
+
+install(TARGETS polkit-example-helper DESTINATION ${BIN_INSTALL_DIR})
+
+dbus_add_activation_system_service(org.qt.policykit.examples.service.in)
+
+install(FILES org.qt.policykit.examples.conf DESTINATION ${SYSCONF_INSTALL_DIR}/dbus-1/system.d)
+
+add_subdirectory(agent)
diff --git a/examples/COPYING b/examples/COPYING
new file mode 100644
index 000000000..d511905c1
--- /dev/null
+++ b/examples/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/examples/PkExample.cpp b/examples/PkExample.cpp
new file mode 100644
index 000000000..2168a9117
--- /dev/null
+++ b/examples/PkExample.cpp
@@ -0,0 +1,240 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2009 Radek Novacek <[email protected]> *
+ * Copyright (C) 2008 Daniel Nicoletti <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#include "PkExample.h"
+
+#include "gui/polkitqt1-gui-actionbutton.h"
+#include "gui/polkitqt1-gui-actionbuttons.h"
+#include "core/polkitqt1-authority.h"
+#include <QtCore/QDebug>
+
+#include <QtDBus/QDBusMessage>
+#include <QtDBus/QDBusConnection>
+
+using namespace PolkitQt1;
+using namespace PolkitQt1::Gui;
+
+PkExample::PkExample(QMainWindow *parent)
+ : QMainWindow(parent)
+{
+ setupUi(this);
+
+ ActionButton *bt;
+
+ // Here we create an ActionButton that is a subclass of Action
+ // always pass a QAbstractButton pointer and action id
+ // You can change the action id later if you want
+ bt = new ActionButton(kickPB, "org.qt.policykit.examples.kick", this);
+ // Here we are setting the text and icon to all four states
+ // an action might have
+ bt->setText("Kick!");
+ bt->setIcon(QPixmap(":/Icons/custom-no.png"));
+ // By using set{Yes|No|Auth}Enabled you can set the states
+ // when the button is enabled
+ bt->setEnabled(true, Action::No);
+ // As ActionButton is also an Action we cast it to add to menu
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ // this signal is emitted when the user click on the action,
+ // it will only happen if it was inserted in a QMenu or a QToolBar
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ // This signal was propagated from the QAbstractButton just for
+ // convenience in this case we don't have any benefit but the code
+ // look cleaner
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ // this is the Action activated signal, it is always emmited whenever
+ // someone click and get authorized to do the action
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ bt = new ActionButton(cryPB, "org.qt.policykit.examples.cry", this);
+ bt->setText("Cry!");
+ bt->setIcon(QPixmap(":/Icons/custom-yes.png"));
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ bt = new ActionButton(bleedPB, "org.qt.policykit.examples.bleed", this);
+ bt->setText("Bleed!");
+ bt->setIcon(QPixmap(":/Icons/action-locked-default.png"));
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ // This action is more customized
+ bt = new ActionButton(playPB, "org.qt.policykit.examples.play", this);
+ bt->setText("Play!");
+ bt->setVisible(true, Action::No | Action::Auth | Action::Yes);
+ bt->setEnabled(true, Action::No | Action::Auth | Action::Yes);
+ // here we set the behavior of PolKitResul = No
+ bt->setText("Can't play!", Action::No);
+ bt->setIcon(QPixmap(":/Icons/custom-no.png"), Action::No);
+ bt->setToolTip("If your admin wasn't annoying, you could do this", Action::No);
+ // here we set the behavior of PolKitResul = Auth
+ bt->setText("Play?", Action::Auth);
+ bt->setIcon(QPixmap(":/Icons/action-locked-default.png"), Action::Auth);
+ bt->setToolTip("Only card carrying tweakers can do this!", Action::Auth);
+ // here we set the behavior of PolKitResul = Yes
+ bt->setText("Play!", Action::Yes);
+ bt->setIcon(QPixmap(":/Icons/custom-yes.png"), Action::Yes);
+ bt->setToolTip("Go ahead, play!", Action::Yes);
+
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ bt = new ActionButton(deletePB, "org.qt.policykit.examples.delete", this);
+ bt->setText("Delete!");
+ bt->setIcon(QPixmap(":/Icons/custom-no.png"), Action::No);
+ bt->setIcon(QPixmap(":/Icons/action-locked-default.png"), Action::Auth);
+ bt->setIcon(QPixmap(":/Icons/custom-yes.png"), Action::Yes);
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ bt = new ActionButton(listenPB, "org.qt.policykit.examples.listen", this);
+ bt->setText("Listen!");
+ bt->setIcon(QPixmap(":/Icons/custom-no.png"), Action::No);
+ bt->setIcon(QPixmap(":/Icons/action-locked-default.png"), Action::Auth);
+ bt->setIcon(QPixmap(":/Icons/custom-yes.png"), Action::Yes);
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ bt = new ActionButton(setPB, "org.qt.policykit.examples.set", this);
+ bt->setText("Set!");
+ bt->setIcon(QPixmap(":/Icons/custom-no.png"), Action::No);
+ bt->setIcon(QPixmap(":/Icons/action-locked-default.png"), Action::Auth);
+ bt->setIcon(QPixmap(":/Icons/custom-yes.png"), Action::Yes);
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ bt = new ActionButton(shoutPB, "org.qt.policykit.examples.shout", this);
+ bt->setIcon(QPixmap(":/Icons/custom-no.png"), Action::No);
+ bt->setIcon(QPixmap(":/Icons/action-locked-default.png"), Action::Auth);
+ bt->setIcon(QPixmap(":/Icons/custom-yes.png"), Action::Yes);
+ bt->setText("Can't shout!", Action::No);
+ bt->setText("Shout?", Action::Auth);
+ bt->setText("Shout!", Action::Yes);
+ menuActions->addAction(qobject_cast<Action *>(bt));
+ toolBar->addAction(qobject_cast<Action *>(bt));
+ connect(bt, SIGNAL(triggered(bool)), this, SLOT(activateAction()));
+ connect(bt, SIGNAL(clicked(QAbstractButton *, bool)), bt, SLOT(activate()));
+ connect(bt, SIGNAL(authorized()), this, SLOT(actionActivated()));
+
+ // test configChanged
+}
+
+PkExample::~PkExample()
+{
+}
+
+void PkExample::activateAction()
+{
+ // Here we cast the sender() to an Action and call activate()
+ // on it.
+ // Be careful in doing the same for ActionButton won't work as expected
+ // as action->activate() is calling Action::activate() and
+ // not ActionButton::activate which are different.
+ // You can cast then to ActionButton but be carefull
+ // an Action casted to ActionButton may crash you app
+ Action *action = qobject_cast<Action *>(sender());
+ // calling activate with winId() makes the auth dialog
+ // be correct parented with your application.
+ action->activate();
+}
+
+void PkExample::actionActivated()
+{
+ // This slot is called whenever an action is allowed
+ // here you will do your dirt job by calling a helper application
+ // that might erase your hardrive ;)
+ Action *action = qobject_cast<Action *>(sender());
+
+ // this is our Special Action that after allowed will call the helper
+ if (action->is("org.qt.policykit.examples.set")) {
+ qDebug() << "toggled for: org.qt.policykit.examples.set";
+
+ QDBusMessage message;
+ message = QDBusMessage::createMethodCall("org.qt.policykit.examples",
+ "/",
+ "org.qt.policykit.examples",
+ QLatin1String("set"));
+ QList<QVariant> argumentList;
+ argumentList << qVariantFromValue(setCB->currentText());
+ message.setArguments(argumentList);
+ // notice the systemBus here..
+ QDBusMessage reply = QDBusConnection::systemBus().call(message);
+ if (reply.type() == QDBusMessage::ReplyMessage
+ && reply.arguments().size() == 1) {
+ // the reply can be anything, here we receive a bool
+ QListWidgetItem *item;
+ if (reply.arguments().first().toBool())
+ item = new QListWidgetItem(QPixmap(":/Icons/custom-yes.png"),
+ QString("Implicit authorization for shout has been set to %0")
+ .arg(setCB->currentText()));
+ else
+ item = new QListWidgetItem(QPixmap(":/Icons/custom-no.png"),
+ QString("Can't change the implicit authorization. Denied."));
+ actionList->addItem(item);
+ qDebug() << reply.arguments().first().toString();
+ } else if (reply.type() == QDBusMessage::MethodCallMessage) {
+ qWarning() << "Message did not receive a reply (timeout by message bus)";
+ }
+ return;
+ }
+
+ // As debug message says we are pretending to be the mechanism for the
+ // following action, here you will actually call your DBus helper that
+ // will run as root (setuid is not needed, see DBus docs).
+ // In the helper application you will issue checkAuthorizationSync,
+ // passing the action id and the caller pid (which DBus will tell you).
+ qDebug() << "pretending to be the mechanism for action:" << action->actionId();
+
+ Authority::Result result;
+ UnixProcessSubject subject(static_cast<uint>(QCoreApplication::applicationPid()));
+
+ result = Authority::instance()->checkAuthorizationSync(action->actionId(), subject,
+ Authority::AllowUserInteraction);
+ if (result == Authority::Yes) {
+ // in the helper you will do the action
+ qDebug() << "caller is authorized to do:" << action->actionId();
+ QListWidgetItem *item = new QListWidgetItem(QPixmap(":/Icons/custom-yes.png"), action->actionId());
+ actionList->addItem(item);
+ } else {
+ // OR return false to notify the caller that the action is not authorized.
+ qDebug() << "caller is NOT authorized to do:" << action->actionId();
+ QListWidgetItem *item = new QListWidgetItem(QIcon(":/Icons/custom-no.png"), action->actionId());
+ actionList->addItem(item);
+ }
+}
diff --git a/examples/PkExample.h b/examples/PkExample.h
new file mode 100644
index 000000000..4ede9f630
--- /dev/null
+++ b/examples/PkExample.h
@@ -0,0 +1,41 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2008 Daniel Nicoletti <[email protected]> *
+ * Copyright (C) 2009 Radek Novacek <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#ifndef PKEXAMPLE_H
+#define PKEXAMPLE_H
+
+#include "ui_PkExample.h"
+
+class PkExample : public QMainWindow, Ui::PkExample
+{
+ Q_OBJECT
+
+public:
+ PkExample(QMainWindow *parent = 0);
+ ~PkExample();
+
+private Q_SLOTS:
+ void activateAction();
+ void actionActivated();
+};
+
+
+#endif
diff --git a/examples/PkExample.ui b/examples/PkExample.ui
new file mode 100644
index 000000000..8997e506a
--- /dev/null
+++ b/examples/PkExample.ui
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PkExample</class>
+ <widget class="QMainWindow" name="PkExample">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>600</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>PolicyKit-qt example</string>
+ </property>
+ <widget class="QWidget" name="centralwidget">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <layout class="QGridLayout" name="gridLayout" columnstretch="3,1">
+ <item row="0" column="0">
+ <widget class="QLabel" name="kickL">
+ <property name="text">
+ <string>Making the helper &lt;b&gt;Kick&lt;/b&gt; is not allowed. Action cannot be triggered.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="kickPB">
+ <property name="text">
+ <string>Kick!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="cryL">
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Making the helper &lt;span style=&quot; font-weight:600;&quot;&gt;Cry&lt;/span&gt; is always allowed. Action can be triggered without authentication.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="cryPB">
+ <property name="text">
+ <string>Cry!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="bleedL">
+ <property name="text">
+ <string>Making the helper &lt;b&gt;Bleed&lt;/b&gt; requires the user to authenticate. This is a one-shot authorization.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QPushButton" name="bleedPB">
+ <property name="text">
+ <string>Bleed!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="playL">
+ <property name="text">
+ <string>Making the helper &lt;b&gt;Play&lt;/b&gt; requires a system administrator to authenticate. This is a one-shot authorization.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QPushButton" name="playPB">
+ <property name="text">
+ <string>Play!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="listenL">
+ <property name="text">
+ <string>Making the helper &lt;b&gt;Listen&lt;/b&gt; requires the user to authenticate. The authorization will be kept for a brief period.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QPushButton" name="listenPB">
+ <property name="text">
+ <string>Listen!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="deleteL">
+ <property name="text">
+ <string>Making the helper &lt;b&gt;Delete&lt;/b&gt; requires a system administrator to authenticate. The authorization will be kept for a brief period.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QPushButton" name="deletePB">
+ <property name="text">
+ <string>Delete!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" rowspan="2">
+ <widget class="QLabel" name="deleteL_2">
+ <property name="text">
+ <string>&lt;b&gt;Set&lt;/b&gt; is special action. It sets the permissions for the &lt;b&gt;Shout&lt;/b&gt; action by actually using the helper application to change the implicit authorization.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QComboBox" name="setCB">
+ <item>
+ <property name="text">
+ <string>no</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>yes</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>auth_self</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>auth_admin</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>auth_self_keep</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>auth_admin_keep</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QPushButton" name="setPB">
+ <property name="text">
+ <string>Set!</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="deleteL_3">
+ <property name="text">
+ <string>The implicit authorization for the &lt;b&gt;Shout&lt;/b&gt; action is set by the &lt;b&gt;Set&lt;/b&gt; action. You can watch how different options can change behaviour of this action.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QPushButton" name="shoutPB">
+ <property name="text">
+ <string>Shout!</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QListWidget" name="actionList"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menubar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuActions">
+ <property name="title">
+ <string>Actions</string>
+ </property>
+ </widget>
+ <addaction name="menuActions"/>
+ </widget>
+ <widget class="QToolBar" name="toolBar">
+ <property name="windowTitle">
+ <string>toolBar</string>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextUnderIcon</enum>
+ </property>
+ <attribute name="toolBarArea">
+ <enum>TopToolBarArea</enum>
+ </attribute>
+ <attribute name="toolBarBreak">
+ <bool>false</bool>
+ </attribute>
+ </widget>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/examples/PkExampleHelper.cpp b/examples/PkExampleHelper.cpp
new file mode 100644
index 000000000..0258e700f
--- /dev/null
+++ b/examples/PkExampleHelper.cpp
@@ -0,0 +1,110 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2008 Daniel Nicoletti <[email protected]> *
+ * Copyright (C) 2009 Radek Novacek <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#include "PkExampleHelper.h"
+#include "examplesadaptor.h"
+
+#include "polkitqt1-authority.h"
+
+#include <QtDBus/QDBusConnection>
+#include <QtCore/QTimer>
+#include <QtCore/QDebug>
+#include <QtXml/QDomDocument>
+
+#define MINUTE 60000
+
+using namespace PolkitQt1;
+
+PkExampleHelper::PkExampleHelper(int &argc, char **argv)
+ : QCoreApplication(argc, argv)
+{
+ qDebug() << "Creating Helper";
+ (void) new ExamplesAdaptor(this);
+ // Register the DBus service
+ if (!QDBusConnection::systemBus().registerService("org.qt.policykit.examples")) {
+ qDebug() << QDBusConnection::systemBus().lastError().message();;
+ QTimer::singleShot(0, this, SLOT(quit()));
+ return;
+ }
+
+ if (!QDBusConnection::systemBus().registerObject("/", this)) {
+ qDebug() << "unable to register service interface to dbus";
+ QTimer::singleShot(0, this, SLOT(quit()));
+ return;
+ }
+ // Normally you will set a timeout so your application can
+ // free some resources of the poor client machine ;)
+ QTimer::singleShot(MINUTE, this, SLOT(quit()));
+}
+
+PkExampleHelper::~PkExampleHelper()
+{
+ qDebug() << "Destroying Helper";
+}
+
+bool PkExampleHelper::set(const QString &action)
+{
+ qDebug() << "PkExampleHelper::set" << action;
+ // message().service() is the service name of the caller
+ // We can check if the caller is authorized to the following action
+ Authority::Result result;
+ SystemBusNameSubject subject(message().service());
+
+ result = Authority::instance()->checkAuthorizationSync("org.qt.policykit.examples.set",
+ subject , Authority::AllowUserInteraction);
+ if (result == Authority::Yes) {
+ qDebug() << message().service() << QString("Implicit authorization set to") << action;
+ // Caller is authorized so we can perform the action
+ return setValue(action);
+ } else {
+ qDebug() << message().service() << QString("Can't set the implicit authorization");
+ // Caller is not authorized so the action can't be performed
+ return false;
+ }
+}
+
+bool PkExampleHelper::setValue(const QString &action)
+{
+ // This action must be authorized first. It will set the implicit
+ // authorization for the Shout action by editing the .policy file
+ QDomDocument doc = QDomDocument("policy");
+ QFile file("/usr/share/polkit-1/actions/org.qt.policykit.examples.policy");
+ if (!file.open(QIODevice::ReadOnly))
+ return false;
+ doc.setContent(&file);
+ file.close();
+ QDomElement el = doc.firstChildElement("policyconfig").
+ firstChildElement("action");
+ while (!el.isNull() && el.attribute("id", QString()) != "org.qt.policykit.examples.shout") {
+ el = el.nextSiblingElement("action");
+ }
+ el = el.firstChildElement("defaults");
+ el = el.firstChildElement("allow_active");
+ if (el.isNull())
+ return false;
+ el.firstChild().toText().setData(action);
+ if (!file.open(QIODevice::WriteOnly))
+ return false;
+ QTextStream stream(&file);
+ doc.save(stream, 2);
+ file.close();
+ return true;
+}
diff --git a/examples/PkExampleHelper.h b/examples/PkExampleHelper.h
new file mode 100644
index 000000000..bf69e03f7
--- /dev/null
+++ b/examples/PkExampleHelper.h
@@ -0,0 +1,42 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2008 Daniel Nicoletti <[email protected]> *
+ * Copyright (C) 2009 Radek Novacek <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#ifndef PKEXAMPLE_HELPER_H
+#define PKEXAMPLE_HELPER_H
+
+#include <QtDBus/QDBusContext>
+#include <QtCore/QCoreApplication>
+
+class PkExampleHelper : public QCoreApplication, protected QDBusContext
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.qt.policykit.examples")
+public:
+ PkExampleHelper(int &argc, char **argv);
+ ~PkExampleHelper();
+
+public Q_SLOTS:
+ bool set(const QString &action);
+ bool setValue(const QString &action);
+};
+
+
+#endif
diff --git a/examples/agent/CMakeLists.txt b/examples/agent/CMakeLists.txt
new file mode 100644
index 000000000..ba708cb46
--- /dev/null
+++ b/examples/agent/CMakeLists.txt
@@ -0,0 +1,24 @@
+include_directories(
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_SOURCE_DIR}/agent
+)
+
+set(polkit_agent_example_SRCS
+ main.cpp
+ pkagentexample.cpp
+ klistener.cpp
+)
+
+automoc4(polkit-agent-example polkit_agent_example_SRCS)
+
+add_executable(polkit-agent-example
+ ${polkit_agent_example_SRCS}
+)
+
+target_link_libraries(polkit-agent-example
+ ${QT_QTCORE_LIBRARY}
+ ${QT_QTGUI_LIBRARY}
+ polkit-qt-agent-1
+ polkit-qt-core-1
+)
diff --git a/examples/agent/klistener.cpp b/examples/agent/klistener.cpp
new file mode 100644
index 000000000..32bfb981a
--- /dev/null
+++ b/examples/agent/klistener.cpp
@@ -0,0 +1,100 @@
+/*
+ * This file is part of the Polkit-qt project
+ * Copyright (C) 2009 Jaroslav Reznik <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <QtCore/QDebug>
+#include <QInputDialog>
+
+#include "klistener.h"
+#include "agent/polkitqt1-agent-session.h"
+
+using namespace PolkitQt1::Agent;
+
+KListener::KListener(QObject *parent)
+ : Listener(parent)
+{
+ qDebug() << "Registering KDE listener";
+}
+
+// README: this is just testing code...
+
+void KListener::initiateAuthentication(const QString &actionId,
+ const QString &message,
+ const QString &iconName,
+ const PolkitQt1::Details &details,
+ const QString &cookie,
+ const PolkitQt1::Identity::List &identities,
+ AsyncResult *result)
+{
+ qDebug() << "initiateAuthentication for " << actionId << " with message " << message;
+ qDebug() << "iconName " << iconName;
+ qDebug() << details.keys();
+ qDebug() << "cookie" << cookie;
+
+ Q_FOREACH (const PolkitQt1::Identity &identity, identities) {
+ qDebug() << identity.toString();
+ Session *session;
+ session = new Session(identity, cookie, result);
+ connect(session, SIGNAL(request(QString, bool)), this, SLOT(request(QString, bool)));
+ connect(session, SIGNAL(completed(bool)), this, SLOT(completed(bool)));
+ connect(session, SIGNAL(showError(QString)), this, SLOT(showError(QString)));
+ connect(session, SIGNAL(showInfo(QString)), this, SLOT(showInfo(QString)));
+ session->initiate();
+ }
+}
+
+bool KListener::initiateAuthenticationFinish()
+{
+ qDebug() << "initiateAuthenticationFinish()";
+ return true;
+}
+
+void KListener::cancelAuthentication()
+{
+ qDebug() << "Cancelling authentication";
+}
+
+void KListener::request(const QString &request, bool echo)
+{
+ qDebug() << "Request: " << request;
+
+ Session *session = (Session *)sender();
+
+ session->setResponse("");
+}
+
+void KListener::completed(bool gainedAuthorization)
+{
+ qDebug() << "Completed: " << gainedAuthorization;
+ Session *session = (Session *)sender();
+
+ session->result()->setCompleted();
+
+ delete session;
+}
+
+void KListener::showError(const QString &text)
+{
+ qDebug() << "Error: " << text;
+}
+
+void KListener::showInfo(const QString &text)
+{
+ qDebug() << "Info: " << text;
+}
diff --git a/examples/agent/klistener.h b/examples/agent/klistener.h
new file mode 100644
index 000000000..2576acdca
--- /dev/null
+++ b/examples/agent/klistener.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the Polkit-qt project
+ * Copyright (C) 2009 Jaroslav Reznik <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef POLKIT_QT_AGENT_KDE_LISTENER_H
+#define POLKIT_QT_AGENT_KDE_LISTENER_H
+
+#include <QtCore/QObject>
+#include <QtCore/QString>
+
+#include "agent/polkitqt1-agent-listener.h"
+#include "core/polkitqt1-identity.h"
+#include "core/polkitqt1-details.h"
+#include "agent/polkitqt1-agent-session.h"
+
+class KListener : public PolkitQt1::Agent::Listener
+{
+ Q_OBJECT
+ Q_DISABLE_COPY(KListener)
+public:
+ KListener(QObject *parent = 0);
+ ~KListener() {};
+public Q_SLOTS:
+ void initiateAuthentication(const QString &actionId,
+ const QString &message,
+ const QString &iconName,
+ const PolkitQt1::Details &details,
+ const QString &cookie,
+ const PolkitQt1::Identity::List &identities,
+ PolkitQt1::Agent::AsyncResult *result);
+ bool initiateAuthenticationFinish();
+ void cancelAuthentication();
+
+ void request(const QString &request, bool echo);
+ void completed(bool gainedAuthorization);
+ void showError(const QString &text);
+ void showInfo(const QString &text);
+};
+
+#endif
diff --git a/examples/agent/main.cpp b/examples/agent/main.cpp
new file mode 100644
index 000000000..682b04747
--- /dev/null
+++ b/examples/agent/main.cpp
@@ -0,0 +1,30 @@
+/***************************************************************************
+ * Copyright (C) 2009 Jaroslav Reznik *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#include <QApplication>
+
+#define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE 1
+
+#include "pkagentexample.h"
+
+int main(int argc, char *argv[])
+{
+ PkAgentExample example(argc, argv);
+ return example.exec();
+}
diff --git a/examples/agent/pkagentexample.cpp b/examples/agent/pkagentexample.cpp
new file mode 100644
index 000000000..ed36363ba
--- /dev/null
+++ b/examples/agent/pkagentexample.cpp
@@ -0,0 +1,17 @@
+#define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE 1
+
+#include <polkitagent/polkitagent.h>
+#include "pkagentexample.h"
+#include <glib-object.h>
+#include <QtCore/QDebug>
+#include "polkitqt1-subject.h"
+
+PkAgentExample::PkAgentExample(int &argc, char **argv)
+ : QCoreApplication(argc, argv)
+{
+ g_type_init();
+
+ PolkitQt1::UnixSessionSubject session(getpid());
+
+ m_listener.registerListener(session, "/org/kde/PolicyKit1/AuthenticationAgent");
+}
diff --git a/examples/agent/pkagentexample.h b/examples/agent/pkagentexample.h
new file mode 100644
index 000000000..62c7035a5
--- /dev/null
+++ b/examples/agent/pkagentexample.h
@@ -0,0 +1,42 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2008 Daniel Nicoletti <[email protected]> *
+ * Copyright (C) 2009 Radek Novacek <[email protected]> *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#ifndef PKAGENTEXAMPLE_H
+#define PKAGENTEXAMPLE_H
+
+#define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE 1
+
+#include <QtDBus/QDBusContext>
+#include <QCoreApplication>
+#include "klistener.h"
+
+class PkAgentExample : public QCoreApplication
+{
+ Q_OBJECT
+public:
+ PkAgentExample(int &argc, char **argv);
+ ~PkAgentExample() {};
+private:
+ KListener m_listener;
+};
+
+
+#endif
diff --git a/examples/icons/action-locked-default.png b/examples/icons/action-locked-default.png
new file mode 100644
index 000000000..e334fb6ac
--- /dev/null
+++ b/examples/icons/action-locked-default.png
Binary files differ
diff --git a/examples/icons/action-locked.png b/examples/icons/action-locked.png
new file mode 100644
index 000000000..353a22ca2
--- /dev/null
+++ b/examples/icons/action-locked.png
Binary files differ
diff --git a/examples/icons/action-unlocked.png b/examples/icons/action-unlocked.png
new file mode 100644
index 000000000..0612191f7
--- /dev/null
+++ b/examples/icons/action-unlocked.png
Binary files differ
diff --git a/examples/icons/custom-no.png b/examples/icons/custom-no.png
new file mode 100644
index 000000000..9ea495347
--- /dev/null
+++ b/examples/icons/custom-no.png
Binary files differ
diff --git a/examples/icons/custom-yes.png b/examples/icons/custom-yes.png
new file mode 100644
index 000000000..95e73d93e
--- /dev/null
+++ b/examples/icons/custom-yes.png
Binary files differ
diff --git a/examples/icons/icons.qrc b/examples/icons/icons.qrc
new file mode 100644
index 000000000..9e90e6f21
--- /dev/null
+++ b/examples/icons/icons.qrc
@@ -0,0 +1,9 @@
+<RCC>
+ <qresource prefix="Icons" >
+ <file>action-locked-default.png</file>
+ <file>action-locked.png</file>
+ <file>action-unlocked.png</file>
+ <file>custom-no.png</file>
+ <file>custom-yes.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/main.cpp b/examples/main.cpp
new file mode 100644
index 000000000..e81f80409
--- /dev/null
+++ b/examples/main.cpp
@@ -0,0 +1,32 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2009 by Daniel Nicoletti *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#include <QtGui/QApplication>
+
+#include "PkExample.h"
+
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+ PkExample example;
+ example.show();
+ return app.exec();
+}
diff --git a/examples/mainHelper.cpp b/examples/mainHelper.cpp
new file mode 100644
index 000000000..4a690599c
--- /dev/null
+++ b/examples/mainHelper.cpp
@@ -0,0 +1,28 @@
+// This is an example not a library
+/***************************************************************************
+ * Copyright (C) 2009 by Daniel Nicoletti *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
+ ***************************************************************************/
+
+#include "PkExampleHelper.h"
+
+int main(int argc, char *argv[])
+{
+ PkExampleHelper example(argc, argv);
+ return example.exec();
+}
diff --git a/examples/org.qt.policykit.examples.conf b/examples/org.qt.policykit.examples.conf
new file mode 100644
index 000000000..304d269f6
--- /dev/null
+++ b/examples/org.qt.policykit.examples.conf
@@ -0,0 +1,20 @@
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+
+ <!-- This configuration file specifies the required security policies
+ for the PolicyKit examples to work. -->
+
+ <!-- Only user root can own the PackageKit service -->
+ <policy user="root">
+ <allow own="org.qt.policykit.examples"/>
+ </policy>
+
+ <!-- Allow anyone to call into the service - we'll reject callers using PolicyKit -->
+ <policy context="default">
+ <allow send_destination="org.qt.policykit.examples"/>
+ </policy>
+
+</busconfig>
+
diff --git a/examples/org.qt.policykit.examples.policy b/examples/org.qt.policykit.examples.policy
new file mode 100644
index 000000000..e42430c84
--- /dev/null
+++ b/examples/org.qt.policykit.examples.policy
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+ <vendor>KDE</vendor>
+ <vendor_url>http://www.kde.org</vendor_url>
+
+ <action id="org.qt.policykit.examples.kick">
+ <description>Kick</description>
+ <message>Prevents PolicyKit-Qt example from kicking</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>no</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.cry">
+ <description>Cry</description>
+ <message>Prevents PolicyKit-Qt example from crying</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.bleed">
+ <description>Bleed</description>
+ <message>Prevents PolicyKit-Qt example from bleeding</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_self</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.play">
+ <description>Play</description>
+ <message>Prevents PolicyKit-Qt example from playing</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.listen">
+ <description>Listen</description>
+ <message>Prevents PolicyKit-Qt example from listening</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_self_keep</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.delete">
+ <description>Delete</description>
+ <message>Prevents PolicyKit-Qt example from deleting</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin_keep</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.set">
+ <description>Push</description>
+ <message>Prevents PolicyKit-Qt example from setting permissions for the shout action</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin_keep</allow_active>
+ </defaults>
+ </action>
+
+ <action id="org.qt.policykit.examples.shout">
+ <description>Shout</description>
+ <message>Prevents PolicyKit-Qt example from shouting</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ <annotate key="org.qt.policykit.examples.shout">foo</annotate>
+ </action>
+</policyconfig>
diff --git a/examples/org.qt.policykit.examples.policy.in b/examples/org.qt.policykit.examples.policy.in
new file mode 100644
index 000000000..ddab0a9f2
--- /dev/null
+++ b/examples/org.qt.policykit.examples.policy.in
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+ <vendor>KDE</vendor>
+ <vendor_url>http://www.kde.org</vendor_url>
+ <action id="org.qt.policykit.examples.kick">
+ <description>Kick</description>
+ <message>Prevents PolicyKit-Qt example from kicking</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>no</allow_active>
+ </defaults>
+ </action>
+ <action id="org.qt.policykit.examples.cry">
+ <description>Cry</description>
+ <message>Prevents PolicyKit-Qt example from crying</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ </action>
+ <action id="org.qt.policykit.examples.play">
+ <description>Play</description>
+ <message>Prevents PolicyKit-Qt example from playing</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_self</allow_active>
+ </defaults>
+ </action>
+ <action id="org.qt.policykit.examples.bleed">
+ <description>Bleed</description>
+ <message>Prevents PolicyKit-Qt example from bleeding</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin</allow_active>
+ </defaults>
+ </action>
+ <action id="org.qt.policykit.examples.listen">
+ <description>Listen</description>
+ <message>Prevents PolicyKit-Qt example from listening</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_self_keep</allow_active>
+ </defaults>
+ </action>
+ <action id="org.qt.policykit.examples.delete">
+ <description>Delete</description>
+ <message>Prevents PolicyKit-Qt example from deleting</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>auth_admin_keep</allow_active>
+ </defaults>
+ </action>
+<!--
+ <action id="org.qt.policykit.examples.shout">
+ <description>Shout</description>
+ <message>Prevents PolicyKit-Qt example from shouting</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ <annotate key="org.qt.policykit.examples.shout">foo</annotate>
+ </action>
+ <action id="org.qt.policykit.examples.push">
+ <description>Push</description>
+ <message>Prevents PolicyKit-Qt example from pushing</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ <annotate key="org.qt.policykit.examples.push">bar</annotate>
+ </action>
+ <action id="org.qt.policykit.examples.blow-up">
+ <description>Blow Up</description>
+ <message>Prevents PolicyKit-Qt example from blowing up</message>
+ <defaults>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ <annotate key="org.qt.policykit.examples.blow-up">booo</annotate>
+ </action>
+-->
+</policyconfig>
diff --git a/examples/org.qt.policykit.examples.service.in b/examples/org.qt.policykit.examples.service.in
new file mode 100644
index 000000000..ae5edffd8
--- /dev/null
+++ b/examples/org.qt.policykit.examples.service.in
@@ -0,0 +1,5 @@
+[D-BUS Service]
+Name=org.qt.policykit.examples
+Exec=@BIN_INSTALL_DIR@/polkit-example-helper
+User=root
+
diff --git a/examples/org.qt.policykit.examples.xml b/examples/org.qt.policykit.examples.xml
new file mode 100644
index 000000000..e97c67e45
--- /dev/null
+++ b/examples/org.qt.policykit.examples.xml
@@ -0,0 +1,11 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.qt.policykit.examples">
+ <method name="set" >
+ <!-- IN: system user -->
+ <arg direction="in" type="s" name="user" />
+ <!-- OUT: whether the user gained the authorization -->
+ <arg direction="out" type="b" name="shadow_line">
+ </method>
+ </interface>
+</node>