[pacman-dev] [PATCH] Add Keyring/--keyring option in alpm/pacman

geoffroy.carrier at koon.fr geoffroy.carrier at koon.fr
Mon Jun 2 19:25:31 EDT 2008


From: Geoffroy Carrier <geoffroy.carrier at koon.fr>

Keyring in pacman.conf, --keyring in pacman,
support for this option in libalpm and pacman.

Documentation in:
. pacman.conf(5)
. pacman(8)
. README
---
It is very similar to LogFile...

 README                 |    1 +
 doc/pacman.8.txt       |    3 +++
 doc/pacman.conf.5.txt  |    6 +++++-
 etc/pacman.conf.in     |    1 +
 lib/libalpm/alpm.h     |    3 +++
 lib/libalpm/handle.c   |   33 +++++++++++++++++++++++++++++++++
 lib/libalpm/handle.h   |    1 +
 src/pacman/Makefile.am |    2 ++
 src/pacman/conf.c      |    2 ++
 src/pacman/conf.h      |    1 +
 src/pacman/pacman.c    |    5 +++++
 11 files changed, 57 insertions(+), 1 deletions(-)

diff --git a/README b/README
index 46b5bb2..251862c 100644
--- a/README
+++ b/README
@@ -58,6 +58,7 @@ library is initialized.
 * dbpath: The base path to pacman's databases (Default: var/lib/pacman)
 * cachedir: The base path to pacman's download cache (Default: var/cache/pacman)
 * logfile: The base path to pacman's log file (Default: var/log/pacman.log)
+* keyring: The base path to pacman's GnuPG keyring (Default: etc/pacman.d/keyring.gpg)
 * usesyslog: Log to syslog instead of `logfile` for file-base logging.
 * xfercommand: The command to use for downloading instead of pacman's internal
              downloading functionality.
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index a6bc3d9..33ac7b5 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -129,6 +129,9 @@ Options
 *\--config* <'file'>::
 	Specify an alternate configuration file.
 
+*\--keyring* <'file'>::
+	Specify an alternate GnuPG keyring.
+
 *\--logfile* <'file'>::
 	Specify an alternate log file. This is an absolute path, regardless of
 	the installation root setting.
diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index eb9285c..44417be 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -49,7 +49,7 @@ Options
 	Set the default root directory for pacman to install to. This option is
 	used if you want to install a package on a temporary mounted partition
 	which is "owned" by another system, or for a chroot install.
-	*NOTE*: If database path or logfile are not specified on either the
+	*NOTE*: If database path, logfile or keyring are not specified on either the
 	command line or in linkman:pacman.conf[5], their default location will
 	be inside this root path.
 
@@ -68,6 +68,10 @@ Options
 	path, the root path is not automatically prepended. This behavior changed
 	in pacman 3.1.0.
 
+*Keyring =* '/path/to/file'::
+	Overrides the default location of the GnuPG keyring file. A typical default
+	is ``/etc/pacman.d/keyring.gpg''. If this file does not exist, packages
+	signatures will not be checked.
 
 *LogFile =* '/path/to/file'::
 	Log actions directly to a file. A typical default is
diff --git a/etc/pacman.conf.in b/etc/pacman.conf.in
index 582fe94..9d20a6e 100644
--- a/etc/pacman.conf.in
+++ b/etc/pacman.conf.in
@@ -13,6 +13,7 @@
 #DBPath      = @localstatedir@/lib/pacman/
 #CacheDir    = @localstatedir@/cache/pacman/pkg/
 #LogFile     = @localstatedir@/log/pacman.log
+#Keyring     = @sysconfdir@/pacman.d/keyring.gpg
 HoldPkg     = pacman glibc
 #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
 
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 62a517b..ab60a4b 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -110,6 +110,9 @@ int alpm_option_set_logfile(const char *logfile);
 const char *alpm_option_get_lockfile();
 /* no set_lockfile, path is determined from dbpath */
 
+const char *alpm_option_get_keyring();
+int alpm_option_set_keyring(const char *keyring);
+
 unsigned short alpm_option_get_usesyslog();
 void alpm_option_set_usesyslog(unsigned short usesyslog);
 
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index c01dd55..c7f2329 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -57,6 +57,7 @@ pmhandle_t *_alpm_handle_new()
 	handle->cachedirs = NULL;
 	handle->lockfile = NULL;
 	handle->logfile = NULL;
+	handle->keyring = NULL;
 	handle->usedelta = 0;
 
 	return(handle);
@@ -86,6 +87,7 @@ void _alpm_handle_free(pmhandle_t *handle)
 	FREE(handle->dbpath);
 	FREELIST(handle->cachedirs);
 	FREE(handle->logfile);
+	FREE(handle->keyring);
 	FREE(handle->lockfile);
 	FREE(handle->xfercommand);
 	FREELIST(handle->dbs_sync);
@@ -151,6 +153,15 @@ const char SYMEXPORT *alpm_option_get_logfile()
 	return handle->logfile;
 }
 
+const char SYMEXPORT *alpm_option_get_keyring()
+{
+	if (handle == NULL) {
+		pm_errno = PM_ERR_HANDLE_NULL;
+		return NULL;
+	}
+	return handle->keyring;
+}
+
 const char SYMEXPORT *alpm_option_get_lockfile()
 {
 	if (handle == NULL) {
@@ -427,6 +438,28 @@ int SYMEXPORT alpm_option_set_logfile(const char *logfile)
 	return(0);
 }
 
+int SYMEXPORT alpm_option_set_keyring(const char *keyring)
+{
+  char *oldkeyring = handle->keyring;
+
+  ALPM_LOG_FUNC;
+
+  if(!keyring) {
+    pm_errno = PM_ERR_WRONG_ARGS;
+    return(-1);
+  }
+
+  handle->keyring = strdup(keyring);
+
+  /* free the old keyring path string, and close the stream so logaction
+   * will reopen a new stream on the new logfile */
+  if(oldkeyring) {
+    FREE(oldkeyring);
+  }
+  _alpm_log(PM_LOG_DEBUG, "option 'keyring' = %s\n", handle->keyring);
+  return(0);
+}
+
 void SYMEXPORT alpm_option_set_usesyslog(unsigned short usesyslog)
 {
 	handle->usesyslog = usesyslog;
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index 9c537b1..2255f43 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -45,6 +45,7 @@ typedef struct _pmhandle_t {
 	char *dbpath;            /* Base path to pacman's DBs */
 	char *logfile;           /* Name of the log file */
 	char *lockfile;          /* Name of the lock file */
+	char *keyring;           /* Name of the GnuPG keyring */
 	alpm_list_t *cachedirs;  /* Paths to pacman cache directories */
 
 	/* package lists */
diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am
index 5d6fef3..16c0332 100644
--- a/src/pacman/Makefile.am
+++ b/src/pacman/Makefile.am
@@ -3,6 +3,7 @@ conffile  = ${sysconfdir}/pacman.conf
 dbpath    = ${localstatedir}/lib/pacman/
 cachedir  = ${localstatedir}/cache/pacman/pkg/
 logfile   = ${localstatedir}/log/pacman.log
+keyring   = ${sysconfdir}/pacman.d/keyring.gpg
 
 bin_PROGRAMS = pacman
 
@@ -16,6 +17,7 @@ DEFS = -DLOCALEDIR=\"@localedir@\" \
        -DDBPATH=\"$(dbpath)\" \
        -DCACHEDIR=\"$(cachedir)\" \
        -DLOGFILE=\"$(logfile)\" \
+       -DKEYRING=\"$(keyring)\" \
        @DEFS@
 INCLUDES = -I$(top_srcdir)/lib/libalpm
 
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 48c927b..ec9a370 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -47,6 +47,7 @@ config_t *config_new(void)
 	newconfig->rootdir = NULL;
 	newconfig->dbpath = NULL;
 	newconfig->logfile = NULL;
+	newconfig->keyring = NULL;
 	newconfig->syncfirst = NULL;
 
 	return(newconfig);
@@ -63,6 +64,7 @@ int config_free(config_t *oldconfig)
 	free(oldconfig->rootdir);
 	free(oldconfig->dbpath);
 	free(oldconfig->logfile);
+	free(oldconfig->keyring);
 	free(oldconfig);
 	oldconfig = NULL;
 
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 874ce70..8be6414 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -37,6 +37,7 @@ typedef struct __config_t {
 	char *rootdir;
 	char *dbpath;
 	char *logfile;
+	char *keyring;
 	/* TODO how to handle cachedirs? */
 
 	unsigned short op_q_isfile;
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 66fafa1..98bfa5f 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -131,6 +131,7 @@ static void usage(int op, const char * const myname)
 		}
 		printf(_("      --config <path>  set an alternate configuration file\n"));
 		printf(_("      --logfile <path> set an alternate log file\n"));
+		printf(_("      --keyring <path> set an alternate keyring\n"));
 		printf(_("      --noconfirm      do not ask for any confirmation\n"));
 		printf(_("      --noprogressbar  do not show a progress bar when downloading files\n"));
 		printf(_("      --noscriptlet    do not execute the install scriptlet if one exists\n"));
@@ -262,6 +263,10 @@ static void setlibpaths(void)
 				snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), LOGFILE);
 				config->logfile = strdup(path);
 			}
+			if(!config->keyring) {
+				snprintf(path, PATH_MAX, "%s%s", alpm_option_get_root(), KEYRING);
+				config->keyring = strdup(path);
+			}
 		}
 		/* Set other paths if they were configured. Note that unless rootdir
 		 * was left undefined, these two paths (dbpath and logfile) will have
-- 
1.5.5.3





More information about the pacman-dev mailing list