Author: lslezak
Date: Wed Jul 2 09:13:37 2008
New Revision: 48744
URL: http://svn.opensuse.org/viewcvs/yast?rev=48744&view=rev
Log:
- moved PolicyKit check from SCRAgent to ScriptingAgent
- added an example policy definition file for .resolver agent
Added:
branches/tmp/lslezak/workshop/core/agent-resolver/policy/
branches/tmp/lslezak/workshop/core/agent-resolver/policy/Makefile.am
branches/tmp/lslezak/workshop/core/agent-resolver/policy/org.opensuse.yast.resolver.policy
branches/tmp/lslezak/workshop/core/scr/src/PolKit.cc (contents, props changed)
- copied, changed from r48707, branches/tmp/lslezak/workshop/core/libscr/src/PolKit.cc
branches/tmp/lslezak/workshop/core/scr/src/PolKit.h (props changed)
- copied unchanged from r48707, branches/tmp/lslezak/workshop/core/libscr/src/PolKit.h
Removed:
branches/tmp/lslezak/workshop/core/libscr/src/PolKit.cc
branches/tmp/lslezak/workshop/core/libscr/src/PolKit.h
Modified:
branches/tmp/lslezak/workshop/core/agent-resolver/Makefile.am
branches/tmp/lslezak/workshop/core/libscr/src/Makefile.am
branches/tmp/lslezak/workshop/core/libscr/src/SCR.cc
branches/tmp/lslezak/workshop/core/libscr/src/SCRAgent.cc
branches/tmp/lslezak/workshop/core/libscr/src/include/scr/SCRAgent.h
branches/tmp/lslezak/workshop/core/libscr/src/include/scr/Y2AgentComponent.h
branches/tmp/lslezak/workshop/core/scr/src/Makefile.am
branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.cc
branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.h
branches/tmp/lslezak/workshop/core/wfm/src/Y2WFMComponent.cc
Modified: branches/tmp/lslezak/workshop/core/agent-resolver/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/agent-resolver/Makefile.am?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/agent-resolver/Makefile.am (original)
+++ branches/tmp/lslezak/workshop/core/agent-resolver/Makefile.am Wed Jul 2 09:13:37 2008
@@ -1,3 +1,3 @@
# Makefile.am for core/agent-resolver
-SUBDIRS = conf doc src testsuite
+SUBDIRS = conf doc src testsuite policy
Added: branches/tmp/lslezak/workshop/core/agent-resolver/policy/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/agent-resolver/policy/Makefile.am?rev=48744&view=auto
==============================================================================
--- branches/tmp/lslezak/workshop/core/agent-resolver/policy/Makefile.am (added)
+++ branches/tmp/lslezak/workshop/core/agent-resolver/policy/Makefile.am Wed Jul 2 09:13:37 2008
@@ -0,0 +1,6 @@
+
+
+policy_DATA = org.opensuse.yast.resolver.policy
+
+EXTRA_DIST = org.opensuse.yast.resolver.policy
+
Added: branches/tmp/lslezak/workshop/core/agent-resolver/policy/org.opensuse.yast.resolver.policy
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/agent-resolver/policy/org.opensuse.yast.resolver.policy?rev=48744&view=auto
==============================================================================
--- branches/tmp/lslezak/workshop/core/agent-resolver/policy/org.opensuse.yast.resolver.policy (added)
+++ branches/tmp/lslezak/workshop/core/agent-resolver/policy/org.opensuse.yast.resolver.policy Wed Jul 2 09:13:37 2008
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?><!--*-nxml-*-->
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+
+
+<policyconfig>
+ <vendor>Novell, Inc.</vendor>
+ http://www.novell.com
+
+ <action id="org.opensuse.yast.resolver.domain.read">
+ <description>Reading domain</description>
+ <message>Reading domain</message>
+ <defaults>
+ no
+ no
+ yes
+ </defaults>
+ </action>
+
+ <action id="org.opensuse.yast.resolver.domain.write">
+ <description>Writing domain</description>
+ <message>Writing domain</message>
+ <defaults>
+ no
+ no
+ auth_admin_keep_session
+ </defaults>
+ </action>
+
+</policyconfig>
Modified: branches/tmp/lslezak/workshop/core/libscr/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/libscr/src/Makefile.am?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/libscr/src/Makefile.am (original)
+++ branches/tmp/lslezak/workshop/core/libscr/src/Makefile.am Wed Jul 2 09:13:37 2008
@@ -11,14 +11,6 @@
libscr_la_SOURCES = \
SCRAgent.cc SCR.cc
-# add PolicyKit files if it is enabled
-if HAVE_POLKIT
- libscr_la_SOURCES += PolKit.cc PolKit.h
-# PolKitException.h PolKitException.cc
- libscr_la_CPPFLAGS = $(POLKIT_CFLAGS) $(DBUS_CFLAGS)
- libscr_la_LIBADD = $(POLKIT_LIBS) $(DBUS_LIBS)
-endif
-
INCLUDES = \
-I$(srcdir)/../../libycp/src/include \
-I$(srcdir)/../../liby2/src/include \
Modified: branches/tmp/lslezak/workshop/core/libscr/src/SCR.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/libscr/src/SCR.cc?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/libscr/src/SCR.cc (original)
+++ branches/tmp/lslezak/workshop/core/libscr/src/SCR.cc Wed Jul 2 09:13:37 2008
@@ -40,7 +40,7 @@
ycperror ( "No SCR instance found" );
return YCPVoid ();
}
- YCPValue ret = SCRAgent::instance()->Get( path, args, opt );
+ YCPValue ret = SCRAgent::instance()->Read( path, args, opt );
return ret;
}
@@ -63,7 +63,7 @@
return YCPVoid ();
}
y2debug( "Running SCR::Write (2 args) on SCR agent %p", SCRAgent::instance () );
- return SCRAgent::instance ()->Set(path, value);
+ return SCRAgent::instance ()->Write(path, value);
}
static YCPValue
@@ -74,7 +74,7 @@
return YCPVoid ();
}
y2debug( "Running SCR::Write (3 args) on SCR agent %p", SCRAgent::instance () );
- return SCRAgent::instance ()->Set(path, value, arg);
+ return SCRAgent::instance ()->Write(path, value, arg);
}
static YCPValue
@@ -85,7 +85,7 @@
return YCPVoid ();
}
y2debug( "Running SCR::Dir on SCR agent %p", SCRAgent::instance () );
- return SCRAgent::instance ()->List(path);
+ return SCRAgent::instance ()->Dir(path);
}
static YCPValue
@@ -96,7 +96,7 @@
return YCPVoid ();
}
y2debug( "Running SCR::Execute on SCR agent %p", SCRAgent::instance () );
- return SCRAgent::instance ()->Run(path);
+ return SCRAgent::instance ()->Execute(path);
}
static YCPValue
@@ -123,7 +123,7 @@
y2debug( "path: %s", path->toString ().c_str () );
y2debug( "args: %s", arg.isNull () ? "null" : arg->toString ().c_str () );
- return SCRAgent::instance ()->Run(path, arg);
+ return SCRAgent::instance ()->Execute(path, arg);
}
static YCPValue
@@ -137,7 +137,7 @@
y2debug( "path: %s", path->toString ().c_str () );
y2debug( "args: %s,%s", arg.isNull () ? "null" : arg->toString ().c_str (), opt.isNull () ? "null" : opt->toString ().c_str () );
- return SCRAgent::instance ()->Run(path, arg, opt);
+ return SCRAgent::instance ()->Execute(path, arg, opt);
}
static YCPValue
Modified: branches/tmp/lslezak/workshop/core/libscr/src/SCRAgent.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/libscr/src/SCRAgent.cc?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/libscr/src/SCRAgent.cc (original)
+++ branches/tmp/lslezak/workshop/core/libscr/src/SCRAgent.cc Wed Jul 2 09:13:37 2008
@@ -27,10 +27,6 @@
#include "ycp/YCPPath.h"
#include "ycp/YCPValue.h"
-#ifdef HAVE_POLKIT
-#include "PolKit.h"
-#endif
-
SCRAgent* SCRAgent::current_scr = 0;
YCPMap SCRAgent::unspecified_error;
@@ -112,91 +108,3 @@
return ret;
}
-
-YCPValue SCRAgent::Get(const YCPPath& path, const YCPValue& arg, const YCPValue& opt)
-{
-#ifdef HAVE_POLKIT
- std::string pathstr(path->toString().c_str());
- y2internal("Get: %s", pathstr.c_str());
-
- // check the policy here
- if (PolKit::isUserAuthorized(pathstr + "Read"))
- {
- y2internal("User is authorized to Read %s", pathstr.c_str());
- return Read(path, arg, opt);
- }
- else
- {
- return YCPError(("User is NOT authorized to Read " + pathstr).c_str(), YCPNull());
- }
-#else
- return Read(path, arg, opt);
-#endif
-}
-
-YCPBoolean SCRAgent::Set(const YCPPath& path, const YCPValue& value, const YCPValue& arg)
-{
-#ifdef HAVE_POLKIT
- std::string pathstr(path->toString().c_str());
- y2internal("Set: %s", pathstr.c_str());
-
- // check the policy here
- if (PolKit::isUserAuthorized(pathstr + "Write"))
- {
- y2internal("User is authorized to Write %s", pathstr.c_str());
- return Write(path, value, arg);
- }
- else
- {
- y2error("User is NOT authorized to Write %s", pathstr.c_str());
- return YCPBoolean(false);
- }
-#else
- return Write(path, value, arg);
-#endif
-}
-
-YCPList SCRAgent::List(const YCPPath& path)
-{
-#ifdef HAVE_POLKIT
- std::string pathstr(path->toString().c_str());
- y2internal("List: %s", pathstr.c_str());
-
- // check the policy here
- if (PolKit::isUserAuthorized(pathstr + "Dir"))
- {
- y2internal("User is authorized to Dir %s", pathstr.c_str());
- return Dir(path);
- }
- else
- {
- y2error("User is NOT authorized to Dir %s", pathstr.c_str());
- return YCPList();
- }
-#else
- return Dir(path);
-#endif
-}
-
-YCPValue SCRAgent::Run(const YCPPath& path, const YCPValue& /*value*/,
- const YCPValue& /*arg*/)
-{
-#ifdef HAVE_POLKIT
- std::string pathstr(path->toString().c_str());
- y2internal("List: %s", pathstr.c_str());
-
- // check the policy here
- if (PolKit::isUserAuthorized(pathstr + "Execute"))
- {
- y2internal("User is authorized to Execute %s", pathstr.c_str());
- return Execute(path, YCPNull(), YCPNull());
- }
- else
- {
- return YCPError(("User is NOT authorized to Execute " + pathstr).c_str(), YCPNull());
- }
-#else
- return Execute(path, YCPNull(), YCPNull());
-#endif
-}
-
Modified: branches/tmp/lslezak/workshop/core/libscr/src/include/scr/SCRAgent.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/libscr/src/include/scr/SCRAgent.h?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/libscr/src/include/scr/SCRAgent.h (original)
+++ branches/tmp/lslezak/workshop/core/libscr/src/include/scr/SCRAgent.h Wed Jul 2 09:13:37 2008
@@ -48,17 +48,6 @@
*/
virtual ~SCRAgent ();
- YCPValue Get(const YCPPath& path, const YCPValue& arg = YCPNull(), const YCPValue& opt = YCPNull());
-
- virtual YCPBoolean Set(const YCPPath& path, const YCPValue& value, const YCPValue& arg = YCPNull());
-
- virtual YCPList List(const YCPPath& path);
-
- virtual YCPValue Run(const YCPPath& path, const YCPValue& /*value*/ = YCPNull(),
- const YCPValue& /*arg*/ = YCPNull());
-
-private:
-
/**
* Reads data. Destroy the result after use.
* @param path Specifies what part of the subtree should
Modified: branches/tmp/lslezak/workshop/core/libscr/src/include/scr/Y2AgentComponent.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/libscr/src/include/scr/Y2AgentComponent.h?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/libscr/src/include/scr/Y2AgentComponent.h (original)
+++ branches/tmp/lslezak/workshop/core/libscr/src/include/scr/Y2AgentComponent.h Wed Jul 2 09:13:37 2008
@@ -53,7 +53,7 @@
*/
SCRAgent* getSCRAgent ();
- YCPValue Get (const YCPPath &path);
+ YCPValue Read (const YCPPath &path);
private:
@@ -126,13 +126,13 @@
// evaluate the term in native functions
if( command == "Read" ) {
- return getSCRAgent ()-> Get(args->value (0)->asPath (), args->size() > 1 ? args->value (1) : YCPNull ()) ;
+ return getSCRAgent ()-> Read(args->value (0)->asPath (), args->size() > 1 ? args->value (1) : YCPNull ()) ;
}
else if( command == "Write" ) {
- return getSCRAgent ()-> Set(args->value (0)->asPath (), args->value (1), args->size () > 2 ? args->value (2) : YCPNull ()) ;
+ return getSCRAgent ()-> Write(args->value (0)->asPath (), args->value (1), args->size () > 2 ? args->value (2) : YCPNull ()) ;
}
else if( command == "Dir" ) {
- return getSCRAgent ()-> List(args->value (0)->asPath ()) ;
+ return getSCRAgent ()-> Dir(args->value (0)->asPath ()) ;
}
else if( command == "Error" ) {
return getSCRAgent ()-> Error (args->value (0)->asPath ()) ;
@@ -141,11 +141,11 @@
y2debug( "Execute, arg size is %d", args->size() );
switch( args->size() ) {
case 1:
- return getSCRAgent ()->Run(args->value (0)->asPath ()) ;
+ return getSCRAgent ()->Execute(args->value (0)->asPath ()) ;
case 2:
- return getSCRAgent ()->Run(args->value (0)->asPath (), args->value (1)) ;
+ return getSCRAgent ()->Execute(args->value (0)->asPath (), args->value (1)) ;
default:
- return getSCRAgent ()->Run(args->value (0)->asPath (), args->value (1), args->value (2)) ;
+ return getSCRAgent ()->Execute(args->value (0)->asPath (), args->value (1), args->value (2)) ;
}
}
else {
@@ -177,10 +177,10 @@
return agent;
}
-template <class Agent> YCPValue Y2AgentComp<Agent>::Get (const YCPPath &path)
+template <class Agent> YCPValue Y2AgentComp<Agent>::Read(const YCPPath &path)
{
y2error( "Y2AgentComp::Read" );
- return getSCRAgent()->Get(path);
+ return getSCRAgent()->Read(path);
}
#endif // Y2AgentComponent_h
Modified: branches/tmp/lslezak/workshop/core/scr/src/Makefile.am
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/Makefile.am?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/Makefile.am (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/Makefile.am Wed Jul 2 09:13:37 2008
@@ -28,6 +28,15 @@
StdioSCRAgent.cc StdioSCRAgent.h \
SCRSubAgent.cc SCRSubAgent.h
+# add PolicyKit files if it is enabled
+if HAVE_POLKIT
+ libpy2scr_la_SOURCES += PolKit.cc PolKit.h
+# PolKitException.h PolKitException.cc
+ libpy2scr_la_CPPFLAGS = $(POLKIT_CFLAGS) $(DBUS_CFLAGS)
+ libpy2scr_la_LIBADD = $(POLKIT_LIBS) $(DBUS_LIBS)
+endif
+
+
libpy2scr_la_LDFLAGS = -version-info 2:0
INCLUDES = ${AGENT_INCLUDES}
Copied: branches/tmp/lslezak/workshop/core/scr/src/PolKit.cc (from r48707, branches/tmp/lslezak/workshop/core/libscr/src/PolKit.cc)
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/PolKit.cc?p2=branches/tmp/lslezak/workshop/core/scr/src/PolKit.cc&p1=branches/tmp/lslezak/workshop/core/libscr/src/PolKit.cc&r1=48707&r2=48744&rev=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/libscr/src/PolKit.cc (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/PolKit.cc Wed Jul 2 09:13:37 2008
@@ -6,7 +6,6 @@
#include "PolKit.h"
#include
-#include
#include
#include
@@ -23,10 +22,11 @@
bool PolKit::isUserAuthorized(const std::string &action_id)
{
+ y2milestone("Checking action %s", action_id.c_str());
// root is always authorized
if (getuid() == 0)
{
- y2debug("User root is authorized");
+ y2debug("User root is always authorized");
return true;
}
@@ -86,7 +86,7 @@
goto finish;
}
- printf("Action: %s Result: %s\n", action_id.c_str(), polkit_result_to_string_representation(polkit_result));
+ y2milestone("Action: %s Result: %s", action_id.c_str(), polkit_result_to_string_representation(polkit_result));
if (polkit_result == POLKIT_RESULT_ONLY_VIA_ADMIN_AUTH ||
polkit_result == POLKIT_RESULT_ONLY_VIA_ADMIN_AUTH_KEEP_SESSION ||
@@ -97,11 +97,11 @@
polkit_result == POLKIT_RESULT_ONLY_VIA_SELF_AUTH_KEEP_ALWAYS ||
polkit_result == POLKIT_RESULT_ONLY_VIA_SELF_AUTH_ONE_SHOT
) {
- printf("Obtaining the authentication...\n");
+ y2milestone("Obtaining the authentication...");
int obtained = polkit_auth_obtain(action_id.c_str(), 0, getpid(), &dbus_error);
- printf("Obtained: %d\n", obtained);
+ y2milestone("Obtained: %d", obtained);
if (obtained) {
polkit_result = POLKIT_RESULT_YES;
@@ -109,7 +109,7 @@
}
if (dbus_error_is_set(&dbus_error)) {
- printf("DBUS error\n");
+ y2error("DBUS error");
goto finish;
}
}
Modified: branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.cc?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.cc (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.cc Wed Jul 2 09:13:37 2008
@@ -24,6 +24,12 @@
#include
#include "ScriptingAgent.h"
+#include "config.h"
+
+#ifdef HAVE_POLKIT
+#include "PolKit.h"
+const char *polkit_prefix = "org.opensuse.yast";
+#endif
ScriptingAgent::ScriptingAgent ()
: done_sweep (false)
@@ -564,12 +570,45 @@
return findSubagent (path);
}
+std::string toLower( const std::string & s )
+{
+ if ( s.empty() )
+ return s;
+
+ std::string ret( s );
+ for ( std::string::size_type i = 0; i < ret.length(); ++i )
+ {
+ if ( isupper( ret[i] ) )
+ ret[i] = static_cast<char>(tolower( ret[i] ));
+ }
+ return ret;
+}
+
YCPValue
ScriptingAgent::executeSubagentCommand (const char *command,
const YCPPath &path,
const YCPValue &arg,
const YCPValue &optpar)
{
+#ifdef HAVE_POLKIT
+ std::string pathstr(path->toString().c_str());
+ y2internal("Path: %s", pathstr.c_str());
+
+ std::string action_id(polkit_prefix + pathstr + "." + toLower(command));
+
+ // check the policy here
+ if (PolKit::isUserAuthorized(action_id))
+ {
+ y2internal("User is authorized to do acion %s", action_id.c_str());
+ }
+ else
+ {
+ return YCPError(("User is NOT authorized to do " + action_id).c_str(), YCPNull());
+ }
+#else
+ y2milestone("PolicyKit is disabled");
+#endif
+
y2debug( "ScriptingAgent::executeSubagentCommand: %s", command );
y2debug( "path: %s", path->toString ().c_str ());
y2debug( "arg: %s", arg.isNull() ? "null" : arg->toString().c_str ());
@@ -620,3 +659,4 @@
return agents.end ();
}
+
Modified: branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.h
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.h?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.h (original)
+++ branches/tmp/lslezak/workshop/core/scr/src/ScriptingAgent.h Wed Jul 2 09:13:37 2008
@@ -43,6 +43,18 @@
*/
~ScriptingAgent ();
+/*
+ YCPValue Get(const YCPPath& path, const YCPValue& arg = YCPNull(), const YCPValue& opt = YCPNull());
+
+ virtual YCPBoolean Set(const YCPPath& path, const YCPValue& value, const YCPValue& arg = YCPNull());
+
+ virtual YCPList List(const YCPPath& path);
+*/
+// virtual YCPValue Run(const YCPPath& path, const YCPValue& /*value*/ = YCPNull(),
+// const YCPValue& /*arg*/ = YCPNull());
+
+private:
+
/**
* Reads data.
* @param path Specifies what part of the subtree should
Modified: branches/tmp/lslezak/workshop/core/wfm/src/Y2WFMComponent.cc
URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/lslezak/workshop/core/wfm/src/Y2WFMComponent.cc?rev=48744&r1=48743&r2=48744&view=diff
==============================================================================
--- branches/tmp/lslezak/workshop/core/wfm/src/Y2WFMComponent.cc (original)
+++ branches/tmp/lslezak/workshop/core/wfm/src/Y2WFMComponent.cc Wed Jul 2 09:13:37 2008
@@ -552,11 +552,11 @@
if (arg.isNull ())
{
- return local.agent ()->Get(p);
+ return local.agent ()->Read(p);
}
else
{
- return local.agent ()->Get(p, arg);
+ return local.agent ()->Read(p, arg);
}
}
@@ -589,7 +589,7 @@
YCPPath p = path->at (1);
- return local.agent ()->Set(p, arg1, arg2);
+ return local.agent ()->Write(p, arg1, arg2);
}
@@ -621,7 +621,7 @@
YCPPath p = path->at (1);
- return local.agent ()->Run(p, arg1);
+ return local.agent ()->Execute(p, arg1);
}
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org