+gumd (0.0.4-2) unstable; urgency=low
+
+ * Added support for scripts which can be run after a user/group is added
+ or before a user/group is deleted
+
+ -- Imran Zaman <imran.zaman@intel.com> Thu, 21 Aug 2014 16:31:03 +0300
+
gumd (0.0.4-1) unstable; urgency=low
* Fix access permissions for user home directory
/usr/bin/gumd
-/etc/gumd.conf
+/etc/gumd/gumd.conf
/usr/share/dbus-1/system-services/*UserManagement*.service
/etc/dbus-1/system.d/gumd-dbus.conf
ldconfig
groupadd -f -r gumd
chmod 4755 /usr/bin/gumd
+ mkdir -p /etc/gumd/useradd.d
+ mkdir -p /etc/gumd/userdel.d
+ mkdir -p /etc/gumd/groupadd.d
+ mkdir -p /etc/gumd/groupdel.d
;;
abort-upgrade|abort-remove|abort-deconfigure)
Name: gumd
Summary: User management daemon and client library
Version: 0.0.4
-Release: 1
+Release: 2
Group: System/Daemons
License: LGPL-2.1+
Source: %{name}-%{version}.tar.gz
/sbin/ldconfig
chmod u+s %{_bindir}/%{name}
groupadd -f -r gumd
+mkdir -p %{_sysconfdir}/%{name}/useradd.d
+mkdir -p %{_sysconfdir}/%{name}/userdel.d
+mkdir -p %{_sysconfdir}/%{name}/groupadd.d
+mkdir -p %{_sysconfdir}/%{name}/groupdel.d
%postun -p /sbin/ldconfig
%defattr(-,root,root,-)
%doc AUTHORS COPYING.LIB INSTALL NEWS README
%{_bindir}/%{name}
-%config(noreplace) %{_sysconfdir}/gumd.conf
+%config(noreplace) %{_sysconfdir}/%{name}/gumd.conf
%if %{dbus_type} == "session"
%dir %{_datadir}/dbus-1/services
%{_datadir}/dbus-1/services/*UserManagement*.service
%changelog
+* Thu Aug 21 2014 Imran Zaman <imran.zaman@intel.com>
+- Added support for scripts which can be run after a user/group is added
+ or before a user/group is deleted
+
* Tue Aug 12 2014 Imran Zaman <imran.zaman@intel.com>
- Fix access permissions for user home directory
+* Thu Aug 21 2014 Imran Zaman <imran.zaman@intel.com>
+- Added support for scripts which can be run after a user/group is added
+ or before a user/group is deleted
+
* Tue Aug 12 2014 Imran Zaman <imran.zaman@intel.com>
- Fix access permissions for user home directory
Name: gumd
Summary: User management daemon and client library
Version: 0.0.4
-Release: 1
+Release: 2
Group: Security/Accounts
License: LGPL-2.1+
Source: %{name}-%{version}.tar.gz
%package -n libgum
Summary: User management client library
-Group: Security/Accounts
+Group: Security/Libraries
%description -n libgum
%package -n libgum-devel
Summary: Development files for user management client library
-Group: SDK/Libraries
+Group: Security/Development
Requires: libgum = %{version}-%{release}
%package doc
Summary: Documentation files for %{name}
-Group: SDK/Documentation
+Group: Security/Documentation
Requires: libgum = %{version}-%{release}
%make_install
cp -a %{SOURCE1001} %{buildroot}%{_datadir}/%{name}.manifest
cp -a %{SOURCE1002} %{buildroot}%{_datadir}/libgum.manifest
-cp -a %{SOURCE1003} %{buildroot}%{_sysconfdir}/%{name}.conf
+cp -a %{SOURCE1003} %{buildroot}%{_sysconfdir}/%{name}/%{name}.conf
%post
/sbin/ldconfig
-chmod u+s %{_bindir}/%{name}
-getent group gumd > /dev/null || /usr/sbin/groupadd -r gumd
+/usr/bin/chmod u+s %{_bindir}/%{name}
+/usr/bin/getent group gumd > /dev/null || /usr/sbin/groupadd -r gumd
+/usr/bin/mkdir -p %{_sysconfdir}/%{name}/useradd.d
+/usr/bin/mkdir -p %{_sysconfdir}/%{name}/userdel.d
+/usr/bin/mkdir -p %{_sysconfdir}/%{name}/groupadd.d
+/usr/bin/mkdir -p %{_sysconfdir}/%{name}/groupdel.d
%postun -p /sbin/ldconfig
%manifest %{_datadir}/%{name}.manifest
%doc AUTHORS COPYING.LIB INSTALL NEWS README
%{_bindir}/%{name}
-%config(noreplace) %{_sysconfdir}/%{name}.conf
+%dir %{_sysconfdir}/%{name}
+%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%if %{dbus_type} == "session"
%dir %{_datadir}/dbus-1/services
%{_datadir}/dbus-1/services/*UserManagement*.service
gum_utils_generate_nonce
gum_utils_drop_privileges
gum_utils_gain_privileges
+gum_utils_run_user_scripts
+gum_utils_run_group_scripts
</SECTION>
<SECTION>
<a class="link" href="gumd-Gum-Utils.html#gum-utils-generate-nonce" title="gum_utils_generate_nonce ()">gum_utils_generate_nonce</a>, function in <a class="link" href="gumd-Gum-Utils.html" title="Gum Utils">Gum Utils</a>
</dt>
<dd></dd>
+<dt>
+<a class="link" href="gumd-Gum-Utils.html#gum-utils-run-group-scripts" title="gum_utils_run_group_scripts ()">gum_utils_run_group_scripts</a>, function in <a class="link" href="gumd-Gum-Utils.html" title="Gum Utils">Gum Utils</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gumd-Gum-Utils.html#gum-utils-run-user-scripts" title="gum_utils_run_user_scripts ()">gum_utils_run_user_scripts</a>, function in <a class="link" href="gumd-Gum-Utils.html" title="Gum Utils">Gum Utils</a>
+</dt>
+<dd></dd>
<a name="idxV"></a><h3 class="title">V</h3>
<dt>
<a class="link" href="gumd-Gum-Validate.html#gum-validate-db-secret-entry" title="gum_validate_db_secret_entry ()">gum_validate_db_secret_entry</a>, function in <a class="link" href="gumd-Gum-Validate.html" title="Gum Validate">Gum Validate</a>
<a name="GUM-CONFIG-GENERAL-UMASK:CAPS"></a><h3>GUM_CONFIG_GENERAL_UMASK</h3>
<pre class="programlisting">#define GUM_CONFIG_GENERAL_UMASK</pre>
<p>Value used to set the mode of home directories created for new users.
-Default value is: 022</p>
+Default value is: 077</p>
</div>
<hr>
<div class="refsect2">
<a class="link" href="gumd-Gum-Utils.html#gum-utils-gain-privileges" title="gum_utils_gain_privileges ()">gum_utils_gain_privileges</a> <span class="c_punctuation">()</span>
</td>
</tr>
+<tr>
+<td class="function_type">
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gumd-Gum-Utils.html#gum-utils-run-user-scripts" title="gum_utils_run_user_scripts ()">gum_utils_run_user_scripts</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gumd-Gum-Utils.html#gum-utils-run-group-scripts" title="gum_utils_run_group_scripts ()">gum_utils_run_group_scripts</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
</tbody>
</table></div>
</div>
gum_utils_gain_privileges ();</pre>
<p>Gains the privileges for the calling process. Effective uid is to 0.</p>
</div>
+<hr>
+<div class="refsect2">
+<a name="gum-utils-run-user-scripts"></a><h3>gum_utils_run_user_scripts ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gum_utils_run_user_scripts (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *script_dir</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *username</code></em>,
+ <em class="parameter"><code><span class="type">uid_t</span> uid</code></em>,
+ <em class="parameter"><code><span class="type">gid_t</span> gid</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *homedir</code></em>);</pre>
+<p>Runs the user scripts in sorted order.</p>
+<div class="refsect3">
+<a name="id-1.5.11.7.5.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>script_dir</p></td>
+<td class="parameter_description"><p>path to the scripts directory</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>username</p></td>
+<td class="parameter_description"><p>name of the user</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>uid</p></td>
+<td class="parameter_description"><p>uid of the user</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>gid</p></td>
+<td class="parameter_description"><p>gid of the user</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>homedir</p></td>
+<td class="parameter_description"><p>home directory of the user</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.5.11.7.5.6"></a><h4>Returns</h4>
+<p> TRUE if successful, FALSE otherwise</p>
+<p></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gum-utils-run-group-scripts"></a><h3>gum_utils_run_group_scripts ()</h3>
+<pre class="programlisting"><a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gum_utils_run_group_scripts (<em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *script_dir</code></em>,
+ <em class="parameter"><code>const <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *groupname</code></em>,
+ <em class="parameter"><code><span class="type">gid_t</span> gid</code></em>);</pre>
+<p>Runs the group scripts in sorted order.</p>
+<div class="refsect3">
+<a name="id-1.5.11.7.6.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>script_dir</p></td>
+<td class="parameter_description"><p>path to the scripts directory</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>groupname</p></td>
+<td class="parameter_description"><p>name of the group</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>gid</p></td>
+<td class="parameter_description"><p>gid of the group</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.5.11.7.6.6"></a><h4>Returns</h4>
+<p> TRUE if successful, FALSE otherwise</p>
+<p></p>
+</div>
+</div>
</div>
<div class="refsect1">
<a name="gumd-Gum-Utils.other_details"></a><h2>Types and Values</h2>
<keyword type="function" name="gum_utils_generate_nonce ()" link="gumd-Gum-Utils.html#gum-utils-generate-nonce"/>
<keyword type="function" name="gum_utils_drop_privileges ()" link="gumd-Gum-Utils.html#gum-utils-drop-privileges"/>
<keyword type="function" name="gum_utils_gain_privileges ()" link="gumd-Gum-Utils.html#gum-utils-gain-privileges"/>
+ <keyword type="function" name="gum_utils_run_user_scripts ()" link="gumd-Gum-Utils.html#gum-utils-run-user-scripts"/>
+ <keyword type="function" name="gum_utils_run_group_scripts ()" link="gumd-Gum-Utils.html#gum-utils-run-group-scripts"/>
<keyword type="enum" name="enum GumUserType" link="gumd-User-types.html#GumUserType"/>
<keyword type="enum" name="enum GumGroupType" link="gumd-Group-types.html#GumGroupType"/>
<keyword type="function" name="GumUserCb ()" link="GumUser.html#GumUserCb"/>
<ANCHOR id="gum-utils-generate-nonce" href="gumd/gumd-Gum-Utils.html#gum-utils-generate-nonce">
<ANCHOR id="gum-utils-drop-privileges" href="gumd/gumd-Gum-Utils.html#gum-utils-drop-privileges">
<ANCHOR id="gum-utils-gain-privileges" href="gumd/gumd-Gum-Utils.html#gum-utils-gain-privileges">
+<ANCHOR id="gum-utils-run-user-scripts" href="gumd/gumd-Gum-Utils.html#gum-utils-run-user-scripts">
+<ANCHOR id="gum-utils-run-group-scripts" href="gumd/gumd-Gum-Utils.html#gum-utils-run-group-scripts">
<ANCHOR id="gumd-Gum-Utils.other_details" href="gumd/gumd-Gum-Utils.html#gumd-Gum-Utils.other_details">
<ANCHOR id="gumd-User-types" href="gumd/gumd-User-types.html">
<ANCHOR id="gumd-User-types.other" href="gumd/gumd-User-types.html#gumd-User-types.other">
* GUM_CONFIG_GENERAL_UMASK:
*
* Value used to set the mode of home directories created for new users.
- * Default value is: 022
+ * Default value is: 077
*/
#define GUM_CONFIG_GENERAL_UMASK GUM_CONFIG_GENERAL \
"/UMASK"
#define _GUM_UTILS_H_
#include <glib.h>
+#include <pwd.h>
G_BEGIN_DECLS
void
gum_utils_gain_privileges ();
+gboolean
+gum_utils_run_user_scripts (
+ const gchar *script_dir,
+ const gchar *username,
+ uid_t uid,
+ gid_t gid,
+ const gchar *homedir);
+
+gboolean
+gum_utils_run_group_scripts (
+ const gchar *script_dir,
+ const gchar *groupname,
+ gid_t gid);
+
G_END_DECLS
#endif /* _GUM_UTILS_H_ */
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
#include "common/gum-utils.h"
#include "common/gum-log.h"
WARN ("seteuid() failed");
DBG ("After set: r-uid %d e-uid %d", getuid (), geteuid ());
}
+
+static gint
+_script_sort (
+ gconstpointer a,
+ gconstpointer b,
+ gpointer data)
+{
+ (void)data;
+ return g_strcmp0 ((const gchar *) a, (const gchar *) b);
+}
+
+void
+_run_script (const gchar *script_dir,
+ gchar **args)
+{
+ gint status;
+ gboolean ret = FALSE;
+ const gchar *script = args[0];
+ GError *error = NULL;
+
+ if (!script ||
+ !g_file_test(script, G_FILE_TEST_EXISTS)) {
+ DBG ("script file does not exist: %s", script);
+ return;
+ }
+
+ ret = g_spawn_sync (NULL, args, NULL,
+ G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_STDERR_TO_DEV_NULL, NULL,
+ NULL, NULL, NULL, &status, &error);
+ if (!ret) {
+ WARN ("g_spawn failed as retval %d and status %d", ret, status);
+ }
+ if (error) {
+ WARN ("script failed with error %s", error->message);
+ g_error_free (error);
+ }
+}
+
+gboolean
+_run_scripts (
+ const gchar *script_dir,
+ gchar **args)
+{
+ GDir *dir = NULL;
+ const gchar *script_fname = NULL;
+ gchar *script_filepath = NULL;
+ struct stat stat_entry;
+ GSequence *scripts = NULL;
+ GSequenceIter *scripts_iter = NULL;
+ gboolean stop = FALSE;
+
+ DBG ("");
+
+ if (!script_dir ||
+ !g_file_test(script_dir, G_FILE_TEST_EXISTS) ||
+ !g_file_test (script_dir, G_FILE_TEST_IS_DIR)) {
+ DBG ("script dir check failed %s", script_dir);
+ g_strfreev (args);
+ return FALSE;
+ }
+ dir = g_dir_open (script_dir, 0, NULL);
+ if (!dir) {
+ DBG ("unable to open script dir %s", script_dir);
+ g_strfreev (args);
+ return FALSE;
+ }
+
+ scripts = g_sequence_new ((GDestroyNotify) g_free);
+ while ((script_fname = g_dir_read_name (dir))) {
+ if (g_strcmp0 (script_fname, ".") == 0 ||
+ g_strcmp0 (script_fname, "..") == 0) {
+ continue;
+ }
+ script_filepath = g_build_filename (script_dir, script_fname, NULL);
+ stop = (lstat(script_filepath, &stat_entry) != 0);
+ if (stop) goto _free_data;
+
+ if (!S_ISDIR (stat_entry.st_mode)) {
+ DBG ("insert script file %s", script_filepath);
+ g_sequence_insert_sorted (scripts,
+ (gpointer) script_filepath,
+ _script_sort,
+ NULL);
+ script_filepath = NULL;
+ }
+
+_free_data:
+ g_free (script_filepath);
+ if (stop) {
+ WARN ("failure in reading script dir %s", script_dir);
+ g_sequence_free (scripts);
+ scripts = NULL;
+ break;
+ }
+ }
+ g_dir_close (dir);
+
+ if (!scripts) {
+ g_strfreev (args);
+ return FALSE;
+ }
+
+ gchar* tmp = args[0];
+ scripts_iter = g_sequence_get_begin_iter (scripts);
+ while (!g_sequence_iter_is_end (scripts_iter)) {
+ args[0] = (gchar *)g_sequence_get (scripts_iter);
+ _run_script (script_dir, args);
+ scripts_iter = g_sequence_iter_next (scripts_iter);
+ }
+ args[0] = tmp;
+ g_sequence_free (scripts);
+ g_strfreev (args);
+ return TRUE;
+}
+
+/**
+ * gum_utils_run_user_scripts:
+ * @script_dir: path to the scripts directory
+ * @username: name of the user
+ * @uid: uid of the user
+ * @gid: gid of the user
+ * @homedir: home directory of the user
+ *
+ * Runs the user scripts in sorted order.
+ *
+ * Returns: TRUE if successful, FALSE otherwise
+ */
+gboolean
+gum_utils_run_user_scripts (
+ const gchar *script_dir,
+ const gchar *username,
+ uid_t uid,
+ gid_t gid,
+ const gchar *homedir)
+{
+ gchar **args = NULL;
+ DBG ("");
+
+ if (!username || !homedir) {
+ DBG ("script invalid username/homedir for script dir");
+ return FALSE;
+ }
+ args = g_new0 (gchar *, 6);
+ args[0] = g_strdup (""); /* script path to be added later on */
+ args[1] = g_strdup (username);
+ args[2] = g_strdup_printf ("%u", uid);
+ args[3] = g_strdup_printf ("%u", gid);
+ args[4] = g_strdup (homedir);
+ /* ownership of 'args' is transferred to _run_scripts */
+ return _run_scripts (script_dir, args);;
+}
+
+/**
+ * gum_utils_run_group_scripts:
+ * @script_dir: path to the scripts directory
+ * @groupname: name of the group
+ * @gid: gid of the group
+ *
+ * Runs the group scripts in sorted order.
+ *
+ * Returns: TRUE if successful, FALSE otherwise
+ */
+gboolean
+gum_utils_run_group_scripts (
+ const gchar *script_dir,
+ const gchar *groupname,
+ gid_t gid)
+{
+ gchar **args = NULL;
+ DBG ("");
+
+ if (!groupname) {
+ DBG ("script invalid groupname for script dir");
+ return FALSE;
+ }
+ args = g_new0 (gchar *, 4);
+ args[0] = g_strdup (""); /* script path to be added later on */
+ args[1] = g_strdup (groupname);
+ args[2] = g_strdup_printf ("%u", gid);
+ /* ownership of 'args' is transferred to _run_scripts */
+ return _run_scripts (script_dir, args);;
+}
$(GUMD_INCLUDES) \
$(GUMD_CFLAGS) \
-I$(top_srcdir)/src \
+ -DUSERADD_SCRIPT_DIR='"${sysconfdir}/gumd/useradd.d"' \
+ -DUSERDEL_SCRIPT_DIR='"${sysconfdir}/gumd/userdel.d"' \
+ -DGROUPADD_SCRIPT_DIR='"${sysconfdir}/gumd/groupadd.d"' \
+ -DGROUPDEL_SCRIPT_DIR='"${sysconfdir}/gumd/groupdel.d"' \
$(NULL)
gumd_LDADD = \
EXTRA_DIST = \
gumd.conf.in
-sysconf_DATA = gumd.conf
+gumdconfdir = ${sysconfdir}/gumd
+gumdconf_DATA = gumd.conf
if SET_PERMISSIONS
install-exec-hook:
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = gumd.conf
CONFIG_CLEAN_VPATH_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sysconfdir)"
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gumdconfdir)"
PROGRAMS = $(bin_PROGRAMS)
am__objects_1 =
am_gumd_OBJECTS = gumd-main.$(OBJEXT) gumd-gumd-daemon.$(OBJEXT) \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
-DATA = $(sysconf_DATA)
+DATA = $(gumdconf_DATA)
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
am__recursive_targets = \
$(GUMD_INCLUDES) \
$(GUMD_CFLAGS) \
-I$(top_srcdir)/src \
+ -DUSERADD_SCRIPT_DIR='"${sysconfdir}/gumd/useradd.d"' \
+ -DUSERDEL_SCRIPT_DIR='"${sysconfdir}/gumd/userdel.d"' \
+ -DGROUPADD_SCRIPT_DIR='"${sysconfdir}/gumd/groupadd.d"' \
+ -DGROUPDEL_SCRIPT_DIR='"${sysconfdir}/gumd/groupdel.d"' \
$(NULL)
gumd_LDADD = \
EXTRA_DIST = \
gumd.conf.in
-sysconf_DATA = gumd.conf
+gumdconfdir = ${sysconfdir}/gumd
+gumdconf_DATA = gumd.conf
CLEANFILES = *.gcno *.gcda
all: all-recursive
clean-libtool:
-rm -rf .libs _libs
-install-sysconfDATA: $(sysconf_DATA)
+install-gumdconfDATA: $(gumdconf_DATA)
@$(NORMAL_INSTALL)
- @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
+ @list='$(gumdconf_DATA)'; test -n "$(gumdconfdir)" || list=; \
if test -n "$$list"; then \
- echo " $(MKDIR_P) '$(DESTDIR)$(sysconfdir)'"; \
- $(MKDIR_P) "$(DESTDIR)$(sysconfdir)" || exit 1; \
+ echo " $(MKDIR_P) '$(DESTDIR)$(gumdconfdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(gumdconfdir)" || exit 1; \
fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
done | $(am__base_list) | \
while read files; do \
- echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(sysconfdir)'"; \
- $(INSTALL_DATA) $$files "$(DESTDIR)$(sysconfdir)" || exit $$?; \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(gumdconfdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(gumdconfdir)" || exit $$?; \
done
-uninstall-sysconfDATA:
+uninstall-gumdconfDATA:
@$(NORMAL_UNINSTALL)
- @list='$(sysconf_DATA)'; test -n "$(sysconfdir)" || list=; \
+ @list='$(gumdconf_DATA)'; test -n "$(gumdconfdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
- dir='$(DESTDIR)$(sysconfdir)'; $(am__uninstall_files_from_dir)
+ dir='$(DESTDIR)$(gumdconfdir)'; $(am__uninstall_files_from_dir)
# This directory's subdirectories are mostly independent; you can cd
# into them and run 'make' without going through this Makefile.
all-am: Makefile $(PROGRAMS) $(DATA)
installdirs: installdirs-recursive
installdirs-am:
- for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sysconfdir)"; do \
+ for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(gumdconfdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-recursive
info-am:
-install-data-am:
+install-data-am: install-gumdconfDATA
install-dvi: install-dvi-recursive
install-dvi-am:
-install-exec-am: install-binPROGRAMS install-sysconfDATA
+install-exec-am: install-binPROGRAMS
@$(NORMAL_INSTALL)
$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
install-html: install-html-recursive
ps-am:
-uninstall-am: uninstall-binPROGRAMS uninstall-sysconfDATA
+uninstall-am: uninstall-binPROGRAMS uninstall-gumdconfDATA
.MAKE: $(am__recursive_targets) install-am install-exec-am \
install-strip
dvi-am html html-am info info-am install install-am \
install-binPROGRAMS install-data install-data-am install-dvi \
install-dvi-am install-exec install-exec-am install-exec-hook \
- install-html install-html-am install-info install-info-am \
- install-man install-pdf install-pdf-am install-ps \
- install-ps-am install-strip install-sysconfDATA installcheck \
+ install-gumdconfDATA install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
installcheck-am installdirs installdirs-am maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-compile \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \
- uninstall-sysconfDATA
+ uninstall-gumdconfDATA
@SET_PERMISSIONS_TRUE@install-exec-hook:
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
+#include "config.h"
+
#include <stdio.h>
#include <sys/types.h>
#include <gshadow.h>
#include "common/gum-defines.h"
#include "common/gum-log.h"
#include "common/gum-error.h"
+#include "common/gum-utils.h"
struct _GumdDaemonGroupPrivate
{
*gid = self->priv->group->gr_gid;
}
+ const gchar *scrip_dir = GROUPADD_SCRIPT_DIR;
+# ifdef ENABLE_DEBUG
+ const gchar *env_val = g_getenv("UM_GROUPADD_DIR");
+ if (env_val)
+ scrip_dir = env_val;
+# endif
+
+ gum_utils_run_group_scripts (scrip_dir, self->priv->group->gr_name,
+ self->priv->group->gr_gid);
+
gum_lock_pwdf_unlock ();
return TRUE;
}
"Group is a primary group of an existing user", error, FALSE);
}
+ const gchar *scrip_dir = GROUPDEL_SCRIPT_DIR;
+# ifdef ENABLE_DEBUG
+ const gchar *env_val = g_getenv("UM_GROUPDEL_DIR");
+ if (env_val)
+ scrip_dir = env_val;
+# endif
+
+ gum_utils_run_group_scripts (scrip_dir, self->priv->group->gr_name,
+ self->priv->group->gr_gid);
+
if (!gum_file_update (G_OBJECT (self), GUM_OPTYPE_DELETE,
(GumFileUpdateCB)_update_daemon_group_entry,
gum_config_get_string (self->priv->config,
#include "common/gum-defines.h"
#include "common/gum-log.h"
#include "common/gum-error.h"
+#include "common/gum-utils.h"
struct _GumdDaemonUserPrivate
{
*uid = self->priv->pw->pw_uid;
}
+ const gchar *scrip_dir = USERADD_SCRIPT_DIR;
+# ifdef ENABLE_DEBUG
+ const gchar *env_val = g_getenv("UM_USERADD_DIR");
+ if (env_val)
+ scrip_dir = env_val;
+# endif
+
+ gum_utils_run_user_scripts (scrip_dir, self->priv->pw->pw_name,
+ self->priv->pw->pw_uid, self->priv->pw->pw_gid,
+ self->priv->pw->pw_dir);
+
gum_lock_pwdf_unlock ();
return TRUE;
}
"unable to terminate user active sessions", error, FALSE);
}
+ const gchar *scrip_dir = USERDEL_SCRIPT_DIR;
+# ifdef ENABLE_DEBUG
+ const gchar *env_val = g_getenv("UM_USERDEL_DIR");
+ if (env_val)
+ scrip_dir = env_val;
+# endif
+
+ gum_utils_run_user_scripts (scrip_dir, self->priv->pw->pw_name,
+ self->priv->pw->pw_uid, self->priv->pw->pw_gid,
+ self->priv->pw->pw_dir);
+
if (!gum_file_update (G_OBJECT (self), GUM_OPTYPE_DELETE,
(GumFileUpdateCB)_update_passwd_entry,
gum_config_get_string (self->priv->config,
--- /dev/null
+#!/bin/bash
+
+echo "New group $1($2) is added"
+
+
--- /dev/null
+#!/bin/bash
+
+echo "Group $1($2) is about to be deleted"
+
+
#PASS_WARN_AGE=7
# Value used to set the mode of home directories created for new users.
-# Default value is: 022
-#UMASK=022
+# Default value is: 077
+#UMASK=077
# Value used to set the encryption algorithm. Default
# value is: 'SHA512' (other supported options are: 'MD5', 'SHA256', 'DES')
--- /dev/null
+[D-BUS Service]
+Name=org.tizen.SecurityAccounts.gUserManagement
+Exec=/home/imran/work/um/gumd/src/daemon/gumd
--- /dev/null
+<busconfig>
+ <type>session</type>
+ <listen>unix:tmpdir=/tmp/</listen>
+ <servicedir>/home/imran/work/um/gumd/test/data/services</servicedir>
+ <policy context="default">
+ <!-- Allow everything to be sent -->
+ <allow send_destination="*" eavesdrop="true"/>
+
+ <!-- Allow everything to be received -->
+ <allow eavesdrop="true"/>
+
+ <!-- Allow anyone to own anything -->
+ <allow own="*"/>
+ </policy>
+</busconfig>
--- /dev/null
+#!/bin/bash
+
+echo "New user $1($2) is added"
+
+
--- /dev/null
+#!/bin/bash
+
+echo "User $1($2) is about to be deleted"
+
+
TESTS = clienttest
TESTS_ENVIRONMENT += \
- UM_BIN_DIR=$(top_builddir)/src/daemon/.libs
+ UM_BIN_DIR=$(top_builddir)/src/daemon/.libs \
+ UM_USERADD_DIR=$(abs_top_srcdir)/test/data/useradd.d \
+ UM_USERDEL_DIR=$(abs_top_srcdir)/test/data/userdel.d \
+ UM_GROUPADD_DIR=$(abs_top_srcdir)/test/data/groupadd.d \
+ UM_GROUPDEL_DIR=$(abs_top_srcdir)/test/data/groupdel.d
VALGRIND_TESTS_DISABLE=
top_srcdir = @top_srcdir@
TESTS_ENVIRONMENT = G_MESSAGES_DEBUG="all" \
LD_LIBRARY_PATH="$(top_builddir)/src/common/.libs:$(top_builddir)/src/daemon/.libs:$(top_builddir)/src/daemon/dbus/.libs" \
- UM_BIN_DIR=$(top_builddir)/src/daemon/.libs
+ UM_BIN_DIR=$(top_builddir)/src/daemon/.libs \
+ UM_USERADD_DIR=$(abs_top_srcdir)/test/data/useradd.d \
+ UM_USERDEL_DIR=$(abs_top_srcdir)/test/data/userdel.d \
+ UM_GROUPADD_DIR=$(abs_top_srcdir)/test/data/groupadd.d \
+ UM_GROUPDEL_DIR=$(abs_top_srcdir)/test/data/groupdel.d
TEST_CFLAGS = -DGUM_TEST_DATA_DIR=\"$(abs_top_srcdir)/test/data/\"
VALGRIND_TESTS_DISABLE =
SUPPRESSIONS = $(top_srcdir)/test/valgrind.supp