[buildd-tools-devel] [PATCH 09/11] [chroot-source] Cleanup clonable handling

Jan-Marek Glogowski glogow at fbihome.de
Mon Aug 10 18:12:18 UTC 2009


Currently we have a facet "source", a facet "source-clonable",
which also has a "source_clonable" member and a get/set pair -
to much redundant information about the clonable status.

As a solution we define: the facet "source" is always clonable.
(a non-clonable source doesn't make any sense).

Therefore a chroot with the source face is clonable and a
cloned chroot can simply drop the facet if it's not clonable
itself.

As a result this patch renames the facet "source-clonable" to
"source" and fixes all clonable handling.
---
 sbuild/Makefile.am                             |    2 -
 sbuild/sbuild-chroot-block-device-base.cc      |    5 +-
 sbuild/sbuild-chroot-config.cc                 |    6 +-
 sbuild/sbuild-chroot-facet-session-clonable.cc |    4 +-
 sbuild/sbuild-chroot-facet-session.cc          |    4 +-
 sbuild/sbuild-chroot-facet-source-clonable.cc  |  224 ------------------------
 sbuild/sbuild-chroot-facet-source-clonable.h   |  198 ---------------------
 sbuild/sbuild-chroot-facet-source.cc           |  103 +++++++++++-
 sbuild/sbuild-chroot-facet-source.h            |   90 ++++++++++
 sbuild/sbuild-chroot-facet-union.cc            |   29 +---
 sbuild/sbuild-chroot-facet-union.h             |    3 -
 sbuild/sbuild-chroot-file.cc                   |    8 +-
 sbuild/sbuild-chroot-lvm-snapshot.cc           |    8 +-
 test/test-sbuild-chroot.h                      |   27 ++--
 14 files changed, 230 insertions(+), 481 deletions(-)
 delete mode 100644 sbuild/sbuild-chroot-facet-source-clonable.cc
 delete mode 100644 sbuild/sbuild-chroot-facet-source-clonable.h

diff --git a/sbuild/Makefile.am b/sbuild/Makefile.am
index d7df89a..3715453 100644
--- a/sbuild/Makefile.am
+++ b/sbuild/Makefile.am
@@ -39,7 +39,6 @@ sbuild_public_h_sources =			\
 	sbuild-chroot-facet-session.h		\
 	sbuild-chroot-facet-session-clonable.h	\
 	sbuild-chroot-facet-source.h		\
-	sbuild-chroot-facet-source-clonable.h	\
 	sbuild-chroot-file.h			\
 	sbuild-chroot-plain.h			\
 	sbuild-chroot-config.h			\
@@ -113,7 +112,6 @@ sbuild_public_cc_sources =			\
 	sbuild-chroot-facet-session.cc		\
 	sbuild-chroot-facet-session-clonable.cc	\
 	sbuild-chroot-facet-source.cc		\
-	sbuild-chroot-facet-source-clonable.cc	\
 	sbuild-chroot-file.cc			\
 	sbuild-chroot-plain.cc			\
 	sbuild-chroot-config.cc			\
diff --git a/sbuild/sbuild-chroot-block-device-base.cc b/sbuild/sbuild-chroot-block-device-base.cc
index 4fcc5f2..026e280 100644
--- a/sbuild/sbuild-chroot-block-device-base.cc
+++ b/sbuild/sbuild-chroot-block-device-base.cc
@@ -23,6 +23,7 @@
 #include "sbuild-chroot-facet-mountable.h"
 #ifdef SBUILD_FEATURE_UNION
 #include "sbuild-chroot-facet-union.h"
+#include "sbuild-chroot-facet-source.h"
 #endif // SBUILD_FEATURE_UNION
 #include "sbuild-format-detail.h"
 #include "sbuild-lock.h"
@@ -140,7 +141,9 @@ chroot_block_device_base::setup_lock (chroot::setup_type type,
 	  chroot_facet_union::const_ptr puni
 	    (base->get_facet<chroot_facet_union>());
 	  assert(puni);
-	  if (puni->get_union_configured())
+	  chroot_facet_source::const_ptr psrc
+            (base->get_facet<chroot_facet_source>());
+	  if (puni->get_union_configured() && psrc)
 	    return;
 #endif
 
diff --git a/sbuild/sbuild-chroot-config.cc b/sbuild/sbuild-chroot-config.cc
index a35a261..d9e5249 100644
--- a/sbuild/sbuild-chroot-config.cc
+++ b/sbuild/sbuild-chroot-config.cc
@@ -19,7 +19,7 @@
 #include <config.h>
 
 #include "sbuild-chroot.h"
-#include "sbuild-chroot-facet-source-clonable.h"
+#include "sbuild-chroot-facet-source.h"
 #include "sbuild-chroot-config.h"
 #include "sbuild-dirstream.h"
 #include "sbuild-lock.h"
@@ -519,8 +519,8 @@ chroot_config::load_keyfile (keyfile& kconfig,
       add(chroot, kconfig);
 
       {
-	chroot_facet_source_clonable::const_ptr psrc
-	  (chroot->get_facet<sbuild::chroot_facet_source_clonable>());
+	chroot_facet_source::const_ptr psrc
+	  (chroot->get_facet<sbuild::chroot_facet_source>());
 
 	if (psrc && !chroot->get_active())
 	  {
diff --git a/sbuild/sbuild-chroot-facet-session-clonable.cc b/sbuild/sbuild-chroot-facet-session-clonable.cc
index 0b82edc..1554588 100644
--- a/sbuild/sbuild-chroot-facet-session-clonable.cc
+++ b/sbuild/sbuild-chroot-facet-session-clonable.cc
@@ -21,7 +21,7 @@
 #include "sbuild-chroot.h"
 #include "sbuild-chroot-facet-session.h"
 #include "sbuild-chroot-facet-session-clonable.h"
-#include "sbuild-chroot-facet-source-clonable.h"
+#include "sbuild-chroot-facet-source.h"
 #include "sbuild-chroot-plain.h"
 #ifdef SBUILD_FEATURE_LVMSNAP
 #include "sbuild-chroot-lvm-snapshot.h"
@@ -92,7 +92,7 @@ chroot_facet_session_clonable::clone_session_setup (chroot::ptr&       clone,
     % clone->get_name() << endl;
 
   // Disable source cloning.
-  clone->remove_facet<chroot_facet_source_clonable>();
+  clone->remove_facet<chroot_facet_source>();
 
   /* If a chroot mount location has not yet been set, and the
      chroot is not a plain chroot, set a mount location with the
diff --git a/sbuild/sbuild-chroot-facet-session.cc b/sbuild/sbuild-chroot-facet-session.cc
index a689c9b..c404a96 100644
--- a/sbuild/sbuild-chroot-facet-session.cc
+++ b/sbuild/sbuild-chroot-facet-session.cc
@@ -20,7 +20,7 @@
 
 #include "sbuild-chroot.h"
 #include "sbuild-chroot-facet-session.h"
-#include "sbuild-chroot-facet-source-clonable.h"
+#include "sbuild-chroot-facet-source.h"
 #include "sbuild-chroot-plain.h"
 #ifdef SBUILD_FEATURE_LVMSNAP
 #include "sbuild-chroot-lvm-snapshot.h"
@@ -87,7 +87,7 @@ chroot_facet_session::clone_session_setup (chroot::ptr&       clone,
     % clone->get_name() << endl;
 
   // Disable source cloning.
-  clone->remove_facet<chroot_facet_source_clonable>();
+  clone->remove_facet<chroot_facet_source>();
 
   /* If a chroot mount location has not yet been set, and the
      chroot is not a plain chroot, set a mount location with the
diff --git a/sbuild/sbuild-chroot-facet-source-clonable.cc b/sbuild/sbuild-chroot-facet-source-clonable.cc
deleted file mode 100644
index c807d8b..0000000
--- a/sbuild/sbuild-chroot-facet-source-clonable.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-/* Copyright © 2005-2009  Roger Leigh <rleigh at debian.org>
- *
- * schroot 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 3 of the License, or
- * (at your option) any later version.
- *
- * schroot 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, see
- * <http://www.gnu.org/licenses/>.
- *
- *********************************************************************/
-
-#include <config.h>
-
-#include "sbuild-chroot.h"
-#include "sbuild-chroot-facet-source-clonable.h"
-#include "sbuild-chroot-facet-source.h"
-
-#include <cassert>
-
-using boost::format;
-using std::endl;
-using namespace sbuild;
-
-chroot_facet_source_clonable::chroot_facet_source_clonable ():
-  chroot_facet(),
-  source_clonable(true),
-  source_users(),
-  source_groups(),
-  source_root_users(),
-  source_root_groups()
-{
-}
-
-chroot_facet_source_clonable::~chroot_facet_source_clonable ()
-{
-}
-
-chroot_facet_source_clonable::ptr
-chroot_facet_source_clonable::create ()
-{
-  return ptr(new chroot_facet_source_clonable());
-}
-
-chroot_facet::ptr
-chroot_facet_source_clonable::clone () const
-{
-  return ptr(new chroot_facet_source_clonable(*this));
-}
-
-std::string const&
-chroot_facet_source_clonable::get_name () const
-{
-  static const std::string name("source-clonable");
-
-  return name;
-}
-
-void
-chroot_facet_source_clonable::clone_source_setup (chroot::ptr& clone) const
-{
-  clone->set_name(clone->get_name() + "-source");
-  clone->set_description
-    (clone->get_description() + ' ' + _("(source chroot)"));
-  clone->set_original(false);
-  clone->set_users(this->get_source_users());
-  clone->set_groups(this->get_source_groups());
-  clone->set_root_users(this->get_source_root_users());
-  clone->set_root_groups(this->get_source_root_groups());
-  string_list const& aliases = clone->get_aliases();
-  string_list source_aliases;
-  for (string_list::const_iterator alias = aliases.begin();
-       alias != aliases.end();
-       ++alias)
-    source_aliases.push_back(*alias + "-source");
-  clone->set_aliases(source_aliases);
-
-  clone->remove_facet<chroot_facet_source_clonable>();
-  clone->add_facet(chroot_facet_source::create());
-}
-
-bool
-chroot_facet_source_clonable::get_source_clonable () const
-{
-  return this->source_clonable;
-}
-
-void
-chroot_facet_source_clonable::set_source_clonable (bool clonable)
-{
-  this->source_clonable = clonable;
-}
-
-string_list const&
-chroot_facet_source_clonable::get_source_users () const
-{
-  return this->source_users;
-}
-
-void
-chroot_facet_source_clonable::set_source_users (string_list const& source_users)
-{
-  this->source_users = source_users;
-}
-
-string_list const&
-chroot_facet_source_clonable::get_source_groups () const
-{
-  return this->source_groups;
-}
-
-void
-chroot_facet_source_clonable::set_source_groups (string_list const& source_groups)
-{
-  this->source_groups = source_groups;
-}
-
-string_list const&
-chroot_facet_source_clonable::get_source_root_users () const
-{
-  return this->source_root_users;
-}
-
-void
-chroot_facet_source_clonable::set_source_root_users (string_list const& users)
-{
-  this->source_root_users = users;
-}
-
-string_list const&
-chroot_facet_source_clonable::get_source_root_groups () const
-{
-  return this->source_root_groups;
-}
-
-void
-chroot_facet_source_clonable::set_source_root_groups (string_list const& groups)
-{
-  this->source_root_groups = groups;
-}
-
-void
-chroot_facet_source_clonable::setup_env (chroot const& chroot,
-					 environment&  env) const
-{
-}
-
-chroot::session_flags
-chroot_facet_source_clonable::get_session_flags (chroot const& chroot) const
-{
-  // Cloning is only possible for non-source and inactive chroots.
-  if (chroot.get_active())
-    return chroot::SESSION_NOFLAGS;
-  else
-    return chroot::SESSION_CLONE;
-}
-
-void
-chroot_facet_source_clonable::get_details (chroot const&  chroot,
-					   format_detail& detail) const
-{
-  detail
-    .add(_("Source Users"), get_source_users())
-    .add(_("Source Groups"), get_source_groups())
-    .add(_("Source Root Users"), get_source_root_users())
-    .add(_("Source Root Groups"), get_source_root_groups());
-}
-
-void
-chroot_facet_source_clonable::get_keyfile (chroot const& chroot,
-					   keyfile&      keyfile) const
-{
-  keyfile::set_object_list_value(*this, &chroot_facet_source_clonable::get_source_users,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-users");
-
-  keyfile::set_object_list_value(*this, &chroot_facet_source_clonable::get_source_groups,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-groups");
-
-  keyfile::set_object_list_value(*this, &chroot_facet_source_clonable::get_source_root_users,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-root-users");
-
-  keyfile::set_object_list_value(*this, &chroot_facet_source_clonable::get_source_root_groups,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-root-groups");
-}
-
-void
-chroot_facet_source_clonable::set_keyfile (chroot&        chroot,
-					   keyfile const& keyfile,
-					   string_list&   used_keys)
-{
-  keyfile::get_object_list_value(*this, &chroot_facet_source_clonable::set_source_users,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-users",
-				 keyfile::PRIORITY_OPTIONAL);
-  used_keys.push_back("source_clonable-users");
-
-  keyfile::get_object_list_value(*this, &chroot_facet_source_clonable::set_source_groups,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-groups",
-				 keyfile::PRIORITY_OPTIONAL);
-  used_keys.push_back("source-groups");
-
-  keyfile::get_object_list_value(*this, &chroot_facet_source_clonable::set_source_root_users,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-root-users",
-				 keyfile::PRIORITY_OPTIONAL);
-  used_keys.push_back("source-root-users");
-
-  keyfile::get_object_list_value(*this, &chroot_facet_source_clonable::set_source_root_groups,
-				 keyfile, chroot.get_keyfile_name(),
-				 "source-root-groups",
-				 keyfile::PRIORITY_OPTIONAL);
-  used_keys.push_back("source-root-groups");
-}
diff --git a/sbuild/sbuild-chroot-facet-source-clonable.h b/sbuild/sbuild-chroot-facet-source-clonable.h
deleted file mode 100644
index 36aee9b..0000000
--- a/sbuild/sbuild-chroot-facet-source-clonable.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/* Copyright © 2005-2009  Roger Leigh <rleigh at debian.org>
- *
- * schroot 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 3 of the License, or
- * (at your option) any later version.
- *
- * schroot 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, see
- * <http://www.gnu.org/licenses/>.
- *
- *********************************************************************/
-
-#ifndef SBUILD_CHROOT_FACET_SOURCE_CLONABLE_H
-#define SBUILD_CHROOT_FACET_SOURCE_CLONABLE_H
-
-#include <sbuild/sbuild-chroot-facet.h>
-
-namespace sbuild
-{
-
-  /**
-   * Chroot support for kernel personalities (execution domains).
-   */
-  class chroot_facet_source_clonable : public chroot_facet
-  {
-  public:
-    /// A shared_ptr to a chroot facet object.
-    typedef std::tr1::shared_ptr<chroot_facet_source_clonable> ptr;
-
-    /// A shared_ptr to a const chroot facet object.
-    typedef std::tr1::shared_ptr<const chroot_facet_source_clonable> const_ptr;
-
-  private:
-    /// The constructor.
-    chroot_facet_source_clonable ();
-
-  public:
-    /// The destructor.
-    virtual ~chroot_facet_source_clonable ();
-
-    /**
-     * Create a chroot facet.
-     *
-     * @returns a shared_ptr to the new chroot facet.
-     */
-    static ptr
-    create ();
-
-    virtual chroot_facet::ptr
-    clone () const;
-
-    virtual std::string const&
-    get_name () const;
-
-    /**
-     * Set the defaults in the cloned sourceg chroot.
-     *
-     * @param clone the chroot to set up.
-     */
-    virtual void
-    clone_source_setup (chroot::ptr& clone) const;
-
-    /**
-     * Get the users allowed to access the source chroot.
-     *
-     * @returns a list of users.
-     */
-    virtual string_list const&
-    get_source_users () const;
-
-    /**
-     * Set the users allowed to access the source chroot.
-     *
-     * @param users a list of users.
-     */
-    virtual void
-    set_source_users (string_list const& users);
-
-    /**
-     * Get the groups allowed to access the source chroot.
-     *
-     * @returns a list of groups.
-     */
-    virtual string_list const&
-    get_source_groups () const;
-
-    /**
-     * Set the groups allowed to access the source chroot.
-     *
-     * @param groups a list of groups.
-     */
-    virtual void
-    set_source_groups (string_list const& groups);
-
-    /**
-     * Get the users allowed to access the source chroot as root.
-     * Members of these users can switch to root without
-     * authenticating themselves.
-     *
-     * @returns a list of users.
-     */
-    virtual string_list const&
-    get_source_root_users () const;
-
-    /**
-     * Set the users allowed to access the source chroot as root.
-     * Members of these users can switch to root without
-     * authenticating themselves.
-     *
-     * @param users a list of users.
-     */
-    virtual void
-    set_source_root_users (string_list const& users);
-
-    /**
-     * Get the groups allowed to access the source chroot as root.
-     * Members of these groups can switch to root without
-     * authenticating themselves.
-     *
-     * @returns a list of groups.
-     */
-    virtual string_list const&
-    get_source_root_groups () const;
-
-    /**
-     * Set the groups allowed to access the source chroot as root.
-     * Members of these groups can switch to root without
-     * authenticating themselves.
-     *
-     * @param groups a list of groups.
-     */
-    virtual void
-    set_source_root_groups (string_list const& groups);
-
-    /**
-     * Get if the chroot is a clonable source chroot or not.
-     *
-     * @returns true if the chroot is a clonable source chroot, otherwise false.
-     */
-    virtual bool
-    get_source_clonable () const;
-
-    /**
-     * Set if the chroot is a clonable source chroot or not.
-     *
-     * @param clonable true if a clonable source chroot, or false if not.
-     */
-    virtual void
-    set_source_clonable (bool clonable);
-
-    virtual void
-    setup_env (chroot const& chroot,
-	       environment&  env) const;
-
-    virtual chroot::session_flags
-    get_session_flags (chroot const& chroot) const;
-
-    virtual void
-    get_details (chroot const&  chroot,
-		 format_detail& detail) const;
-
-    virtual void
-    get_keyfile (chroot const& chroot,
-		 keyfile&      keyfile) const;
-
-    virtual void
-    set_keyfile (chroot&        chroot,
-		 keyfile const& keyfile,
-		 string_list&   used_keys);
-
-  private:
-    /// Is the chroot source or clone?
-    bool          source_clonable;
-    /// Users allowed to access the source chroot.
-    string_list   source_users;
-    /// Groups allowed to access the source chroot.
-    string_list   source_groups;
-    /// Users allowed to access the source chroot as root.
-    string_list   source_root_users;
-    /// Groups allowed to access the source chroot as root.
-    string_list   source_root_groups;
-  };
-
-}
-
-#endif /* SBUILD_CHROOT_FACET_SOURCE_CLONABLE_H */
-
-/*
- * Local Variables:
- * mode:C++
- * End:
- */
diff --git a/sbuild/sbuild-chroot-facet-source.cc b/sbuild/sbuild-chroot-facet-source.cc
index ece5e17..71c338c 100644
--- a/sbuild/sbuild-chroot-facet-source.cc
+++ b/sbuild/sbuild-chroot-facet-source.cc
@@ -28,7 +28,11 @@ using std::endl;
 using namespace sbuild;
 
 chroot_facet_source::chroot_facet_source ():
-  chroot_facet()
+  chroot_facet(),
+  source_users(),
+  source_groups(),
+  source_root_users(),
+  source_root_groups()
 {
 }
 
@@ -57,27 +61,120 @@ chroot_facet_source::get_name () const
 }
 
 void
+chroot_facet_source::clone_source_setup (chroot::ptr& clone) const
+{
+  clone->set_name(clone->get_name() + "-source");
+  clone->set_description
+    (clone->get_description() + ' ' + _("(source chroot)"));
+  clone->set_original(false);
+  clone->set_users(this->get_source_users());
+  clone->set_groups(this->get_source_groups());
+  clone->set_root_users(this->get_source_root_users());
+  clone->set_root_groups(this->get_source_root_groups());
+  string_list const& aliases = clone->get_aliases();
+  string_list source_aliases;
+  for (string_list::const_iterator alias = aliases.begin();
+       alias != aliases.end();
+       ++alias)
+    source_aliases.push_back(*alias + "-source");
+  clone->set_aliases(source_aliases);
+  clone->remove_facet<chroot_facet_source>();
+}
+
+string_list const&
+chroot_facet_source::get_source_users () const
+{
+  return this->source_users;
+}
+
+void
+chroot_facet_source::set_source_users (string_list const& source_users)
+{
+  this->source_users = source_users;
+}
+
+string_list const&
+chroot_facet_source::get_source_groups () const
+{
+  return this->source_groups;
+}
+
+void
+chroot_facet_source::set_source_groups (string_list const& source_groups)
+{
+  this->source_groups = source_groups;
+}
+
+string_list const&
+chroot_facet_source::get_source_root_users () const
+{
+  return this->source_root_users;
+}
+
+void
+chroot_facet_source::set_source_root_users (string_list const& users)
+{
+  this->source_root_users = users;
+}
+
+string_list const&
+chroot_facet_source::get_source_root_groups () const
+{
+  return this->source_root_groups;
+}
+
+void
+chroot_facet_source::set_source_root_groups (string_list const& groups)
+{
+  this->source_root_groups = groups;
+}
+
+void
 chroot_facet_source::setup_env (chroot const& chroot,
-				environment&  env) const
+					 environment&  env) const
 {
 }
 
 chroot::session_flags
 chroot_facet_source::get_session_flags (chroot const& chroot) const
 {
-  return chroot::SESSION_NOFLAGS;
+  // Cloning is only possible for non-source and inactive chroots.
+  if (chroot.get_active())
+    return chroot::SESSION_NOFLAGS;
+  else
+    return chroot::SESSION_CLONE;
 }
 
 void
 chroot_facet_source::get_details (chroot const&  chroot,
 				  format_detail& detail) const
 {
+  detail
+    .add(_("Source Users"), get_source_users())
+    .add(_("Source Groups"), get_source_groups())
+    .add(_("Source Root Users"), get_source_root_users())
+    .add(_("Source Root Groups"), get_source_root_groups());
 }
 
 void
 chroot_facet_source::get_keyfile (chroot const& chroot,
 				  keyfile&      keyfile) const
 {
+  keyfile::set_object_list_value(*this, &chroot_facet_source::get_source_users,
+				 keyfile, chroot.get_keyfile_name(),
+				 "source-users");
+
+  keyfile::set_object_list_value(*this, &chroot_facet_source::get_source_groups,
+				 keyfile, chroot.get_keyfile_name(),
+				 "source-groups");
+
+  keyfile::set_object_list_value(*this, &chroot_facet_source::get_source_root_users,
+				 keyfile, chroot.get_keyfile_name(),
+				 "source-root-users");
+
+  keyfile::set_object_list_value(*this, &chroot_facet_source::get_source_root_groups,
+				 keyfile, chroot.get_keyfile_name(),
+				 "source-root-groups");
 }
 
 void
diff --git a/sbuild/sbuild-chroot-facet-source.h b/sbuild/sbuild-chroot-facet-source.h
index bc1961c..1fe0867 100644
--- a/sbuild/sbuild-chroot-facet-source.h
+++ b/sbuild/sbuild-chroot-facet-source.h
@@ -58,6 +58,86 @@ namespace sbuild
     virtual std::string const&
     get_name () const;
 
+    /**
+     * Set the defaults in the cloned sourceg chroot.
+     *
+     * @param clone the chroot to set up.
+     */
+    virtual void
+    clone_source_setup (chroot::ptr& clone) const;
+
+    /**
+     * Get the users allowed to access the source chroot.
+     *
+     * @returns a list of users.
+     */
+    virtual string_list const&
+    get_source_users () const;
+
+    /**
+     * Set the users allowed to access the source chroot.
+     *
+     * @param users a list of users.
+     */
+    virtual void
+    set_source_users (string_list const& users);
+
+    /**
+     * Get the groups allowed to access the source chroot.
+     *
+     * @returns a list of groups.
+     */
+    virtual string_list const&
+    get_source_groups () const;
+
+    /**
+     * Set the groups allowed to access the source chroot.
+     *
+     * @param groups a list of groups.
+     */
+    virtual void
+    set_source_groups (string_list const& groups);
+
+    /**
+     * Get the users allowed to access the source chroot as root.
+     * Members of these users can switch to root without
+     * authenticating themselves.
+     *
+     * @returns a list of users.
+     */
+    virtual string_list const&
+    get_source_root_users () const;
+
+    /**
+     * Set the users allowed to access the source chroot as root.
+     * Members of these users can switch to root without
+     * authenticating themselves.
+     *
+     * @param users a list of users.
+     */
+    virtual void
+    set_source_root_users (string_list const& users);
+
+    /**
+     * Get the groups allowed to access the source chroot as root.
+     * Members of these groups can switch to root without
+     * authenticating themselves.
+     *
+     * @returns a list of groups.
+     */
+    virtual string_list const&
+    get_source_root_groups () const;
+
+    /**
+     * Set the groups allowed to access the source chroot as root.
+     * Members of these groups can switch to root without
+     * authenticating themselves.
+     *
+     * @param groups a list of groups.
+     */
+    virtual void
+    set_source_root_groups (string_list const& groups);
+
     virtual void
     setup_env (chroot const& chroot,
 	       environment&  env) const;
@@ -77,6 +157,16 @@ namespace sbuild
     set_keyfile (chroot&        chroot,
 		 keyfile const& keyfile,
 		 string_list&   used_keys);
+
+  private:
+    /// Users allowed to access the source chroot.
+    string_list   source_users;
+    /// Groups allowed to access the source chroot.
+    string_list   source_groups;
+    /// Users allowed to access the source chroot as root.
+    string_list   source_root_users;
+    /// Groups allowed to access the source chroot as root.
+    string_list   source_root_groups;
   };
 
 }
diff --git a/sbuild/sbuild-chroot-facet-union.cc b/sbuild/sbuild-chroot-facet-union.cc
index 2535e13..fca5d7c 100644
--- a/sbuild/sbuild-chroot-facet-union.cc
+++ b/sbuild/sbuild-chroot-facet-union.cc
@@ -21,7 +21,7 @@
 
 #include "sbuild-chroot.h"
 #include "sbuild-chroot-facet-union.h"
-#include "sbuild-chroot-facet-source-clonable.h"
+#include "sbuild-chroot-facet-source.h"
 
 #include <cassert>
 
@@ -90,8 +90,8 @@ chroot_facet_union::clone_source_setup (chroot::ptr& clone) const
   const chroot *base = dynamic_cast<const chroot *>(this->owner);
   assert(base);
 
-  chroot_facet_source_clonable::const_ptr psrc
-    (base->get_facet<chroot_facet_source_clonable>());
+  chroot_facet_source::const_ptr psrc
+    (base->get_facet<chroot_facet_source>());
   if (psrc)
     psrc->clone_source_setup(clone);
 
@@ -102,19 +102,6 @@ chroot_facet_union::clone_source_setup (chroot::ptr& clone) const
 }
 
 bool
-chroot_facet_union::get_source_clonable () const
-{
-  const chroot *base = dynamic_cast<const chroot *>(this);
-  assert(base);
-  chroot_facet_source_clonable::const_ptr psrc
-    (base->get_facet<chroot_facet_source_clonable>());
-  assert(psrc);
-
-  return psrc->get_source_clonable() &&
-    get_union_configured();
-}
-
-bool
 chroot_facet_union::get_union_configured () const
 {
   return get_union_type() != "none";
@@ -173,11 +160,11 @@ chroot_facet_union::set_union_type (std::string const& type)
 
   if (this->union_type != "none")
     {
-      if (!base->get_facet<chroot_facet_source_clonable>())
-	base->add_facet(chroot_facet_source_clonable::create());
+      if (!base->get_facet<chroot_facet_source>())
+	base->add_facet(chroot_facet_source::create());
     }
   else
-    base->remove_facet<chroot_facet_source_clonable>();
+    base->remove_facet<chroot_facet_source>();
 }
 
 std::string const&
@@ -276,8 +263,8 @@ chroot_facet_union::set_keyfile (chroot&        chroot,
   used_keys.push_back("union-type");
 
   // If we are a union, add specific source options here.
-  chroot_facet_source_clonable::ptr psrc
-    (chroot.get_facet<chroot_facet_source_clonable>());
+  chroot_facet_source::ptr psrc
+    (chroot.get_facet<chroot_facet_source>());
   if (psrc)
     psrc->set_keyfile(chroot, keyfile, used_keys);
 
diff --git a/sbuild/sbuild-chroot-facet-union.h b/sbuild/sbuild-chroot-facet-union.h
index f7871b7..442f183 100644
--- a/sbuild/sbuild-chroot-facet-union.h
+++ b/sbuild/sbuild-chroot-facet-union.h
@@ -79,9 +79,6 @@ namespace sbuild
     void
     clone_source_setup (chroot::ptr& clone) const;
 
-    bool
-    get_source_clonable () const;
-
     /**
      * Get fs union configured state.
      *
diff --git a/sbuild/sbuild-chroot-file.cc b/sbuild/sbuild-chroot-file.cc
index a12db42..34906a6 100644
--- a/sbuild/sbuild-chroot-file.cc
+++ b/sbuild/sbuild-chroot-file.cc
@@ -20,7 +20,7 @@
 
 #include "sbuild-chroot-file.h"
 #include "sbuild-chroot-facet-session-clonable.h"
-#include "sbuild-chroot-facet-source-clonable.h"
+#include "sbuild-chroot-facet-source.h"
 #include "sbuild-format-detail.h"
 #include "sbuild-lock.h"
 
@@ -38,7 +38,7 @@ chroot_file::chroot_file ():
   file(),
   repack(false)
 {
-  add_facet(sbuild::chroot_facet_source_clonable::create());
+  add_facet(sbuild::chroot_facet_source::create());
 }
 
 chroot_file::chroot_file (const chroot_file& rhs):
@@ -77,8 +77,8 @@ chroot_file::clone_source () const
   chroot_file *clone_file = new chroot_file(*this);
   ptr clone(clone_file);
 
-  chroot_facet_source_clonable::const_ptr psrc
-    (get_facet<chroot_facet_source_clonable>());
+  chroot_facet_source::const_ptr psrc
+    (get_facet<chroot_facet_source>());
   assert(psrc);
 
   psrc->clone_source_setup(clone);
diff --git a/sbuild/sbuild-chroot-lvm-snapshot.cc b/sbuild/sbuild-chroot-lvm-snapshot.cc
index 040ca9e..2583ef7 100644
--- a/sbuild/sbuild-chroot-lvm-snapshot.cc
+++ b/sbuild/sbuild-chroot-lvm-snapshot.cc
@@ -21,7 +21,7 @@
 #include "sbuild-chroot-lvm-snapshot.h"
 #include "sbuild-chroot-block-device.h"
 #include "sbuild-chroot-facet-session-clonable.h"
-#include "sbuild-chroot-facet-source-clonable.h"
+#include "sbuild-chroot-facet-source.h"
 #include "sbuild-chroot-facet-mountable.h"
 #include "sbuild-format-detail.h"
 #include "sbuild-lock.h"
@@ -40,7 +40,7 @@ chroot_lvm_snapshot::chroot_lvm_snapshot ():
   snapshot_device(),
   snapshot_options()
 {
-  add_facet(sbuild::chroot_facet_source_clonable::create());
+  add_facet(sbuild::chroot_facet_source::create());
 }
 
 chroot_lvm_snapshot::chroot_lvm_snapshot (const chroot_lvm_snapshot& rhs):
@@ -78,8 +78,8 @@ chroot_lvm_snapshot::clone_source () const
 {
   ptr clone(new chroot_block_device(*this));
 
-  chroot_facet_source_clonable::const_ptr psrc
-    (get_facet<chroot_facet_source_clonable>());
+  chroot_facet_source::const_ptr psrc
+    (get_facet<chroot_facet_source>());
   assert(psrc);
 
   psrc->clone_source_setup(clone);
diff --git a/test/test-sbuild-chroot.h b/test/test-sbuild-chroot.h
index 6257d27..fca3c98 100644
--- a/test/test-sbuild-chroot.h
+++ b/test/test-sbuild-chroot.h
@@ -25,7 +25,6 @@
 #include <sbuild/sbuild-chroot-facet-session.h>
 #include <sbuild/sbuild-chroot-facet-session-clonable.h>
 #include <sbuild/sbuild-chroot-facet-source.h>
-#include <sbuild/sbuild-chroot-facet-source-clonable.h>
 #include <sbuild/sbuild-chroot-facet-union.h>
 #include <sbuild/sbuild-i18n.h>
 #include <sbuild/sbuild-util.h>
@@ -87,20 +86,17 @@ public:
 	  }
       }
 
-    sbuild::chroot_facet_source_clonable::const_ptr psrc
+    sbuild::chroot_facet_source::const_ptr psrc
       (this->chroot->
-       template get_facet<sbuild::chroot_facet_source_clonable>());
+       template get_facet<sbuild::chroot_facet_source>());
     if (psrc)
       this->source = this->chroot->clone_source();
     if (this->source)
       {
-	sbuild::chroot_facet_source_clonable::const_ptr ssrc
+	sbuild::chroot_facet_source::const_ptr ssrc
 	  (this->source->
-	   template get_facet<sbuild::chroot_facet_source_clonable>());
-	if (ssrc)
-	  {
-	    CPPUNIT_ASSERT(ssrc->get_source_clonable() == true);
-	  }
+	   template get_facet<sbuild::chroot_facet_source>());
+	CPPUNIT_ASSERT(!ssrc);
       }
 
     this->chroot_union = sbuild::chroot::ptr(new T);
@@ -124,11 +120,14 @@ public:
 
 	this->session_union =
 	  this->chroot_union->clone_session("test-union-session-name");
-	this->source_union = chroot_union->clone_source();
-
 	CPPUNIT_ASSERT(this->session_union);
-	CPPUNIT_ASSERT(this->session_union->get_active() == true);
+
+	this->source_union = chroot_union->clone_source();
 	CPPUNIT_ASSERT(this->source_union);
+	sbuild::chroot_facet_source::const_ptr ssrc
+	  (this->source_union->
+	   template get_facet<sbuild::chroot_facet_source>());
+	CPPUNIT_ASSERT(!ssrc);
       }
   }
 
@@ -151,8 +150,8 @@ public:
       pfac->set_persona(sbuild::personality("undefined"));
     chroot->set_priority(3);
 
-    sbuild::chroot_facet_source_clonable::ptr usrc
-      (chroot->template get_facet<sbuild::chroot_facet_source_clonable>());
+    sbuild::chroot_facet_source::ptr usrc
+      (chroot->template get_facet<sbuild::chroot_facet_source>());
     if (usrc)
       {
 	usrc->set_source_users(sbuild::split_string("suser1,suser2", ","));
-- 
1.6.4




More information about the Buildd-tools-devel mailing list