shadow.c   shadow.c 
skipping to change at line 62 skipping to change at line 62
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include "seap.h" #include "seap.h"
#include "probe-api.h" #include "probe-api.h"
#include "probe/entcmp.h" #include "probe/entcmp.h"
#include "alloc.h" #include "alloc.h"
#ifndef HAVE_SHADOW_H #ifndef HAVE_SHADOW_H
int probe_main(SEXP_t *object, SEXP_t *probe_out, void *arg) int probe_main(probe_ctx *ctx, void *arg)
{ {
SEXP_t *item_sexp; SEXP_t *item_sexp;
if (object == NULL || probe_out == NULL) { (void)arg;
return (PROBE_EINVAL);
}
item_sexp = probe_item_creat ("shadow_item", NULL, NULL); item_sexp = probe_item_creat ("shadow_item", NULL, NULL);
probe_item_setstatus (item_sexp, OVAL_STATUS_NOTCOLLECTED); probe_item_setstatus (item_sexp, SYSCHAR_STATUS_NOT_COLLECTED);
probe_cobj_add_item(probe_out, item_sexp); probe_item_collect(ctx, item_sexp);
SEXP_free (item_sexp);
return 0; return 0;
} }
#else #else
/* shadow.h is present */ /* shadow.h is present */
#include <shadow.h> #include <shadow.h>
/* Convenience structure for the results being reported */ /* Convenience structure for the results being reported */
struct result_info { struct result_info {
const char *username; const char *username;
const char *password; const char *password;
long chg_lst; long chg_lst;
long chg_allow; long chg_allow;
long chg_req; long chg_req;
long exp_warn; long exp_warn;
long exp_inact; long exp_inact;
long exp_date; long exp_date;
unsigned long flag; unsigned long flag;
}; };
static void report_finding(struct result_info *res, SEXP_t *probe_out) static SEXP_t *parse_enc_mth(const char *pwd)
{ {
SEXP_t *item; char *mth_str;
switch (*pwd) {
case '_':
return SEXP_string_newf("BSDi");
case '$':
pwd++;
switch (*pwd) {
case '1':
mth_str = "MD5";
pwd++;
break;
case '2':
mth_str = "Blowfish";
pwd++;
if (*pwd == 'a')
pwd++;
break;
case '5':
mth_str = "SHA-256";
pwd++;
break;
case '6':
mth_str = "SHA-512";
pwd++;
break;
default:
if (strncmp(pwd, "md5", 3))
goto fail;
mth_str = "Sun MD5";
pwd += 3;
}
if (*pwd != '$')
goto fail;
return SEXP_string_newf(mth_str);
default:
return SEXP_string_newf("DES");
}
fail:
return NULL;
}
static void report_finding(struct result_info *res, probe_ctx *ctx)
{
SEXP_t *item, *enc_mth;
SEXP_t se_chl_mem, se_cha_mem, se_chr_mem; SEXP_t se_chl_mem, se_cha_mem, se_chr_mem;
SEXP_t se_exw_mem, se_exi_mem, se_exd_mem; SEXP_t se_exw_mem, se_exi_mem, se_exd_mem;
SEXP_t se_flg_mem; SEXP_t se_flg_mem;
item = probe_item_create(OVAL_UNIX_SHADOW, NULL, item = probe_item_create(OVAL_UNIX_SHADOW, NULL,
"username", OVAL_DATATYPE_STRING, res->us ername, "username", OVAL_DATATYPE_STRING, res->us ername,
"password", OVAL_DATATYPE_STRING, res->pa ssword, "password", OVAL_DATATYPE_STRING, res->pa ssword,
"chg_lst", OVAL_DATATYPE_SEXP, SEXP_stri "chg_lst", OVAL_DATATYPE_SEXP, SEXP_numb
ng_newf_r(&se_chl_mem, "%li", res->chg_lst), er_newi_64_r(&se_chl_mem, res->chg_lst),
"chg_allow", OVAL_DATATYPE_SEXP, SEXP_stri "chg_allow", OVAL_DATATYPE_SEXP, SEXP_numb
ng_newf_r(&se_cha_mem, "%li", res->chg_allow), er_newi_64_r(&se_cha_mem, res->chg_allow),
"chg_req", OVAL_DATATYPE_SEXP, SEXP_stri "chg_req", OVAL_DATATYPE_SEXP, SEXP_numb
ng_newf_r(&se_chr_mem, "%li", res->chg_req), er_newi_64_r(&se_chr_mem, res->chg_req),
"exp_warn", OVAL_DATATYPE_SEXP, SEXP_stri "exp_warn", OVAL_DATATYPE_SEXP, SEXP_numb
ng_newf_r(&se_exw_mem, "%li", res->exp_warn), er_newi_64_r(&se_exw_mem, res->exp_warn),
"exp_inact", OVAL_DATATYPE_SEXP, SEXP_stri "exp_inact", OVAL_DATATYPE_SEXP, SEXP_numb
ng_newf_r(&se_exi_mem, "%li", res->exp_inact), er_newi_64_r(&se_exi_mem, res->exp_inact),
"exp_date", OVAL_DATATYPE_SEXP, SEXP_stri "exp_date", OVAL_DATATYPE_SEXP, SEXP_numb
ng_newf_r(&se_exd_mem, "%li", res->exp_date), er_newi_64_r(&se_exd_mem, res->exp_date),
"flag", OVAL_DATATYPE_SEXP, SEXP_stri ng_newf_r(&se_flg_mem, "%lu", res->flag), "flag", OVAL_DATATYPE_SEXP, SEXP_stri ng_newf_r(&se_flg_mem, "%lu", res->flag),
NULL); NULL);
enc_mth = parse_enc_mth(res->password);
if (enc_mth) {
probe_item_ent_add(item, "encrypt_method", NULL, enc_mth);
SEXP_free(enc_mth);
}
probe_item_collect(ctx, item);
probe_cobj_add_item(probe_out, item);
SEXP_free(item);
SEXP_free_r(&se_chl_mem); SEXP_free_r(&se_chl_mem);
SEXP_free_r(&se_cha_mem); SEXP_free_r(&se_cha_mem);
SEXP_free_r(&se_chr_mem); SEXP_free_r(&se_chr_mem);
SEXP_free_r(&se_exw_mem); SEXP_free_r(&se_exw_mem);
SEXP_free_r(&se_exi_mem); SEXP_free_r(&se_exi_mem);
SEXP_free_r(&se_exd_mem); SEXP_free_r(&se_exd_mem);
SEXP_free_r(&se_flg_mem); SEXP_free_r(&se_flg_mem);
} }
static int read_shadow(SEXP_t *un_ent, SEXP_t *probe_out) static int read_shadow(SEXP_t *un_ent, probe_ctx *ctx)
{ {
int err = 1; int err = 1;
struct spwd *pw; struct spwd *pw;
while ((pw = getspent())) { while ((pw = getspent())) {
SEXP_t *un; SEXP_t *un;
_D("Have user: %s\n", pw->sp_namp); _D("Have user: %s\n", pw->sp_namp);
err = 0; err = 0;
un = SEXP_string_newf("%s", pw->sp_namp); un = SEXP_string_newf("%s", pw->sp_namp);
skipping to change at line 148 skipping to change at line 197
r.username = pw->sp_namp; r.username = pw->sp_namp;
r.password = pw->sp_pwdp; r.password = pw->sp_pwdp;
r.chg_lst = pw->sp_lstchg; r.chg_lst = pw->sp_lstchg;
r.chg_allow = pw->sp_min; r.chg_allow = pw->sp_min;
r.chg_req = pw->sp_max; r.chg_req = pw->sp_max;
r.exp_warn = pw->sp_warn; r.exp_warn = pw->sp_warn;
r.exp_inact = pw->sp_inact; r.exp_inact = pw->sp_inact;
r.exp_date = pw->sp_expire; r.exp_date = pw->sp_expire;
r.flag = pw->sp_flag; r.flag = pw->sp_flag;
report_finding(&r, probe_out); report_finding(&r, ctx);
} }
SEXP_free(un); SEXP_free(un);
} }
endspent(); endspent();
return err; return err;
} }
int probe_main(SEXP_t *object, SEXP_t *probe_out, void *arg, SEXP_t *filter s) int probe_main(probe_ctx *ctx, void *arg)
{ {
SEXP_t *ent; SEXP_t *ent;
(void)filters; ent = probe_obj_getent(probe_ctx_getobject(ctx), "username", 1);
if (object == NULL || probe_out == NULL) {
return (PROBE_EINVAL);
}
ent = probe_obj_getent(object, "username", 1);
if (ent == NULL) { if (ent == NULL) {
return PROBE_ENOVAL; return PROBE_ENOVAL;
} }
// Now we check the file... // Now we check the file...
read_shadow(ent, probe_out); read_shadow(ent, ctx);
SEXP_free(ent); SEXP_free(ent);
return 0; return 0;
} }
#endif /* HAVE_SHADOW_H */ #endif /* HAVE_SHADOW_H */
 End of changes. 13 change blocks. 
34 lines changed or deleted 77 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/