static int pk_alpm_siglevel_parse (alpm_list_t *values, alpm_siglevel_t *storage, alpm_siglevel_t *storage_mask, GError **error) { alpm_siglevel_t level = *storage, mask = *storage_mask; alpm_list_t *i; int ret = 0; #define SLSET(sl) do { level |= (sl); mask |= (sl); } while(0) #define SLUNSET(sl) do { level &= ~(sl); mask |= (sl); } while(0) for(i = values; i; i = alpm_list_next(i)) { gboolean package = TRUE, database = TRUE; const char *original = i->data, *value; if (g_str_has_prefix (original, "Package")) { database = FALSE; value = original + 7; } else if (g_str_has_prefix (original, "Database")) { package = FALSE; value = original + 8; } else value = original; if (g_strcmp0 (value, "Never") == 0) { if (package) { SLUNSET(ALPM_SIG_PACKAGE); } if (database) { SLUNSET(ALPM_SIG_DATABASE); } } else if (g_strcmp0 (value, "Optional") == 0) { if (package) { SLSET(ALPM_SIG_PACKAGE | ALPM_SIG_PACKAGE_OPTIONAL); } if (database) { SLSET(ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL); } } else if (g_strcmp0 (value, "Required") == 0) { if (package) { SLSET(ALPM_SIG_PACKAGE); SLUNSET(ALPM_SIG_PACKAGE_OPTIONAL); } if (database) { SLSET(ALPM_SIG_DATABASE); SLUNSET(ALPM_SIG_DATABASE_OPTIONAL); } } else if (g_strcmp0 (value, "TrustedOnly") == 0) { if (package) { SLUNSET(ALPM_SIG_PACKAGE_MARGINAL_OK | ALPM_SIG_PACKAGE_UNKNOWN_OK); } if (database) { SLUNSET(ALPM_SIG_DATABASE_MARGINAL_OK | ALPM_SIG_DATABASE_UNKNOWN_OK); } } else if (g_strcmp0 (value, "TrustAll") == 0) { if (package) { SLSET(ALPM_SIG_PACKAGE_MARGINAL_OK | ALPM_SIG_PACKAGE_UNKNOWN_OK); } if (database) { } } else { g_set_error (error, PK_ALPM_ERROR, PK_ALPM_ERR_CONFIG_INVALID, "invalid SigLevel value: %s", value); ret = 0; } } #undef SLSET #undef SLUNSET if(!ret) { *storage = level; *storage_mask = mask; } return ret; }
/** * Parse a signature verification level line. * @param values the list of parsed option values * @param storage location to store the derived signature level; any existing * value here is used as a starting point * @param file path to the config file * @param linenum current line number in file * @return 0 on success, 1 on any parsing error */ static int process_siglevel(alpm_list_t *values, alpm_siglevel_t *storage, alpm_siglevel_t *storage_mask, const char *file, int linenum) { alpm_siglevel_t level = *storage, mask = *storage_mask; alpm_list_t *i; int ret = 0; #define SLSET(sl) do { level |= (sl); mask |= (sl); } while(0) #define SLUNSET(sl) do { level &= ~(sl); mask |= (sl); } while(0) /* Collapse the option names into a single bitmasked value */ for(i = values; i; i = alpm_list_next(i)) { const char *original = i->data, *value; int package = 0, database = 0; if(strncmp(original, "Package", strlen("Package")) == 0) { /* only packages are affected, don't flip flags for databases */ value = original + strlen("Package"); package = 1; } else if(strncmp(original, "Database", strlen("Database")) == 0) { /* only databases are affected, don't flip flags for packages */ value = original + strlen("Database"); database = 1; } else { /* no prefix, so anything found will affect both packages and dbs */ value = original; package = database = 1; } /* now parse out and store actual flag if it is valid */ if(strcmp(value, "Never") == 0) { if(package) { SLUNSET(ALPM_SIG_PACKAGE); } if(database) { SLUNSET(ALPM_SIG_DATABASE); } } else if(strcmp(value, "Optional") == 0) { if(package) { SLSET(ALPM_SIG_PACKAGE | ALPM_SIG_PACKAGE_OPTIONAL); } if(database) { SLSET(ALPM_SIG_DATABASE | ALPM_SIG_DATABASE_OPTIONAL); } } else if(strcmp(value, "Required") == 0) { if(package) { SLSET(ALPM_SIG_PACKAGE); SLUNSET(ALPM_SIG_PACKAGE_OPTIONAL); } if(database) { SLSET(ALPM_SIG_DATABASE); SLUNSET(ALPM_SIG_DATABASE_OPTIONAL); } } else if(strcmp(value, "TrustedOnly") == 0) { if(package) { SLUNSET(ALPM_SIG_PACKAGE_MARGINAL_OK | ALPM_SIG_PACKAGE_UNKNOWN_OK); } if(database) { SLUNSET(ALPM_SIG_DATABASE_MARGINAL_OK | ALPM_SIG_DATABASE_UNKNOWN_OK); } } else if(strcmp(value, "TrustAll") == 0) { if(package) { SLSET(ALPM_SIG_PACKAGE_MARGINAL_OK | ALPM_SIG_PACKAGE_UNKNOWN_OK); } if(database) { SLSET(ALPM_SIG_DATABASE_MARGINAL_OK | ALPM_SIG_DATABASE_UNKNOWN_OK); } } else { pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: invalid value for '%s' : '%s'\n"), file, linenum, "SigLevel", original); ret = 1; } level &= ~ALPM_SIG_USE_DEFAULT; } #undef SLSET #undef SLUNSET /* ensure we have sig checking ability and are actually turning it on */ if(!(alpm_capabilities() & ALPM_CAPABILITY_SIGNATURES) && level & (ALPM_SIG_PACKAGE | ALPM_SIG_DATABASE)) { pm_printf(ALPM_LOG_ERROR, _("config file %s, line %d: '%s' option invalid, no signature support\n"), file, linenum, "SigLevel"); ret = 1; } if(!ret) { *storage = level; *storage_mask = mask; } return ret; }