Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 30 additions & 12 deletions src/gmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -19436,8 +19436,14 @@ handle_get_targets (gmp_parser_t *gmp_parser, GError **error)
{
credential_t found;

ssh_name = credential_name (ssh_credential);
ssh_uuid = credential_uuid (ssh_credential);
/* The iterator owns its row buffer, so the values are
* copied. The free() calls at the end of the loop expect
* memory they own, as returned by credential_name() and
* credential_uuid(). */
ssh_name
= g_strdup (target_iterator_ssh_credential_name (&targets));
ssh_uuid
= g_strdup (target_iterator_ssh_credential_uuid (&targets));
if (find_credential_with_permission (ssh_uuid,
&found,
"get_credentials"))
Expand Down Expand Up @@ -19466,8 +19472,10 @@ handle_get_targets (gmp_parser_t *gmp_parser, GError **error)
{
credential_t found;

smb_name = credential_name (smb_credential);
smb_uuid = credential_uuid (smb_credential);
smb_name
= g_strdup (target_iterator_smb_credential_name (&targets));
smb_uuid
= g_strdup (target_iterator_smb_credential_uuid (&targets));
if (find_credential_with_permission (smb_uuid,
&found,
"get_credentials"))
Expand Down Expand Up @@ -19498,8 +19506,10 @@ handle_get_targets (gmp_parser_t *gmp_parser, GError **error)
{
credential_t found;

esxi_name = credential_name (esxi_credential);
esxi_uuid = credential_uuid (esxi_credential);
esxi_name
= g_strdup (target_iterator_esxi_credential_name (&targets));
esxi_uuid
= g_strdup (target_iterator_esxi_credential_uuid (&targets));
if (find_credential_with_permission (esxi_uuid,
&found,
"get_credentials"))
Expand Down Expand Up @@ -19530,8 +19540,10 @@ handle_get_targets (gmp_parser_t *gmp_parser, GError **error)
{
credential_t found;

snmp_name = credential_name (snmp_credential);
snmp_uuid = credential_uuid (snmp_credential);
snmp_name
= g_strdup (target_iterator_snmp_credential_name (&targets));
snmp_uuid
= g_strdup (target_iterator_snmp_credential_uuid (&targets));
if (find_credential_with_permission (snmp_uuid,
&found,
"get_credentials"))
Expand Down Expand Up @@ -19562,8 +19574,12 @@ handle_get_targets (gmp_parser_t *gmp_parser, GError **error)
{
credential_t found;

ssh_elevate_name = credential_name (ssh_elevate_credential);
ssh_elevate_uuid = credential_uuid (ssh_elevate_credential);
ssh_elevate_name
= g_strdup (target_iterator_ssh_elevate_credential_name
(&targets));
ssh_elevate_uuid
= g_strdup (target_iterator_ssh_elevate_credential_uuid
(&targets));
if (find_credential_with_permission (ssh_elevate_uuid,
&found,
"get_credentials"))
Expand Down Expand Up @@ -19594,8 +19610,10 @@ handle_get_targets (gmp_parser_t *gmp_parser, GError **error)
{
credential_t found;

krb5_name = credential_name (krb5_credential);
krb5_uuid = credential_uuid (krb5_credential);
krb5_name
= g_strdup (target_iterator_krb5_credential_name (&targets));
krb5_uuid
= g_strdup (target_iterator_krb5_credential_uuid (&targets));
if (find_credential_with_permission (krb5_uuid,
&found,
"get_credentials"))
Expand Down
132 changes: 132 additions & 0 deletions src/manage_sql_targets.c
Original file line number Diff line number Diff line change
Expand Up @@ -2073,6 +2073,138 @@ target_iterator_krb5_trash (iterator_t* iterator)
DEF_ACCESS (target_iterator_allow_simultaneous_ips,
GET_ITERATOR_COLUMN_COUNT + 22);

/* Credential names and UUIDs straight from the iterator.
*
* The name columns (23 to 28) already existed for filtering and sorting,
* they simply had no accessor. The UUID columns are 31 to 36; 29 and 30
* are the "hosts" and "ips" filter columns that sit between them.
*
* Only valid on the non-trash iterator. TARGET_ITERATOR_TRASH_COLUMNS
* ends after index 22, so calling these on a trash iterator would read
* past the column list. Callers must branch on get.trash first, as
* gmp.c does.
*/

/**
* @brief Get the SSH credential name from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential name, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_ssh_credential_name,
GET_ITERATOR_COLUMN_COUNT + 23);

/**
* @brief Get the SMB credential name from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential name, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_smb_credential_name,
GET_ITERATOR_COLUMN_COUNT + 24);

/**
* @brief Get the ESXi credential name from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential name, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_esxi_credential_name,
GET_ITERATOR_COLUMN_COUNT + 25);

/**
* @brief Get the SNMP credential name from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential name, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_snmp_credential_name,
GET_ITERATOR_COLUMN_COUNT + 26);

/**
* @brief Get the SSH elevate credential name from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential name, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_ssh_elevate_credential_name,
GET_ITERATOR_COLUMN_COUNT + 27);

/**
* @brief Get the KRB5 credential name from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential name, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_krb5_credential_name,
GET_ITERATOR_COLUMN_COUNT + 28);

/**
* @brief Get the SSH credential UUID from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential UUID, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_ssh_credential_uuid,
GET_ITERATOR_COLUMN_COUNT + 31);

/**
* @brief Get the SMB credential UUID from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential UUID, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_smb_credential_uuid,
GET_ITERATOR_COLUMN_COUNT + 32);

/**
* @brief Get the ESXi credential UUID from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential UUID, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_esxi_credential_uuid,
GET_ITERATOR_COLUMN_COUNT + 33);

/**
* @brief Get the SNMP credential UUID from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential UUID, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_snmp_credential_uuid,
GET_ITERATOR_COLUMN_COUNT + 34);

/**
* @brief Get the SSH elevate credential UUID from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential UUID, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_ssh_elevate_credential_uuid,
GET_ITERATOR_COLUMN_COUNT + 35);

/**
* @brief Get the KRB5 credential UUID from a target iterator.
*
* @param[in] iterator Iterator.
*
* @return Credential UUID, or NULL if iteration is complete.
*/
DEF_ACCESS (target_iterator_krb5_credential_uuid,
GET_ITERATOR_COLUMN_COUNT + 36);

/**
* @brief Initialise a target task iterator.
*
Expand Down
64 changes: 64 additions & 0 deletions src/manage_sql_targets.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,70 @@
{ "max_hosts (hosts, exclude_hosts)", \
"ips", \
KEYWORD_TYPE_INTEGER }, \
/* The credential UUIDs. Appended after "ips" on purpose: the \
* accessors address these columns by position, so inserting further \
* up would silently shift every index behind it and the iterator \
* would hand out a different credential's name than the target uses. \
* \
* Deliberately not in TARGET_ITERATOR_TRASH_COLUMNS, which is shorter \
* and has no name columns either. The accessors are therefore only \
* valid on the non-trash iterator; gmp.c branches on get.trash and \
* uses trash_credential_uuid() there. \
*/ \
{ \
"(SELECT uuid FROM credentials" \
" WHERE credentials.id" \
" = (SELECT credential FROM targets_login_data" \
" WHERE target = targets.id" \
" AND type = CAST ('ssh' AS text)))", \
NULL, \
KEYWORD_TYPE_STRING \
}, \
{ \
"(SELECT uuid FROM credentials" \
" WHERE credentials.id" \
" = (SELECT credential FROM targets_login_data" \
" WHERE target = targets.id" \
" AND type = CAST ('smb' AS text)))", \
NULL, \
KEYWORD_TYPE_STRING \
}, \
{ \
"(SELECT uuid FROM credentials" \
" WHERE credentials.id" \
" = (SELECT credential FROM targets_login_data" \
" WHERE target = targets.id" \
" AND type = CAST ('esxi' AS text)))", \
NULL, \
KEYWORD_TYPE_STRING \
}, \
{ \
"(SELECT uuid FROM credentials" \
" WHERE credentials.id" \
" = (SELECT credential FROM targets_login_data" \
" WHERE target = targets.id" \
" AND type = CAST ('snmp' AS text)))", \
NULL, \
KEYWORD_TYPE_STRING \
}, \
{ \
"(SELECT uuid FROM credentials" \
" WHERE credentials.id" \
" = (SELECT credential FROM targets_login_data" \
" WHERE target = targets.id" \
" AND type = CAST ('elevate' AS text)))", \
NULL, \
KEYWORD_TYPE_STRING \
}, \
{ \
"(SELECT uuid FROM credentials" \
" WHERE credentials.id" \
" = (SELECT credential FROM targets_login_data" \
" WHERE target = targets.id" \
" AND type = CAST ('krb5' AS text)))", \
NULL, \
KEYWORD_TYPE_STRING \
}, \
{ NULL, NULL, KEYWORD_TYPE_UNKNOWN } \
}

Expand Down
39 changes: 39 additions & 0 deletions src/manage_targets.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,45 @@ target_iterator_ssh_elevate_credential (iterator_t *);
int
target_iterator_krb5_credential (iterator_t *);

/* Credential names and UUIDs from the iterator itself, so that get_targets
* does not need one statement per target and credential type. Only valid on
* the non-trash iterator - see the note in manage_sql_targets.c. */
const char *
target_iterator_ssh_credential_name (iterator_t *);

const char *
target_iterator_smb_credential_name (iterator_t *);

const char *
target_iterator_esxi_credential_name (iterator_t *);

const char *
target_iterator_snmp_credential_name (iterator_t *);

const char *
target_iterator_ssh_elevate_credential_name (iterator_t *);

const char *
target_iterator_krb5_credential_name (iterator_t *);

const char *
target_iterator_ssh_credential_uuid (iterator_t *);

const char *
target_iterator_smb_credential_uuid (iterator_t *);

const char *
target_iterator_esxi_credential_uuid (iterator_t *);

const char *
target_iterator_snmp_credential_uuid (iterator_t *);

const char *
target_iterator_ssh_elevate_credential_uuid (iterator_t *);

const char *
target_iterator_krb5_credential_uuid (iterator_t *);

int
target_iterator_ssh_trash (iterator_t *);

Expand Down