bool tldap_pull_binsid(struct tldap_message *msg, const char *attribute, struct dom_sid *sid) { DATA_BLOB val; if (!tldap_get_single_valueblob(msg, attribute, &val)) { return false; } return sid_parse((char *)val.data, val.length, sid); }
static bool parse_user_quota_record(const uint8_t *rdata, unsigned int rdata_count, unsigned int *offset, SMB_NTQUOTA_STRUCT *pqt) { int sid_len; SMB_NTQUOTA_STRUCT qt; ZERO_STRUCT(qt); if (!rdata||!offset||!pqt) { smb_panic("parse_quota_record: called with NULL POINTER!"); } if (rdata_count < 40) { return False; } /* offset to next quota record. * 4 bytes IVAL(rdata,0) * unused here... */ *offset = IVAL(rdata,0); /* sid len */ sid_len = IVAL(rdata,4); if (rdata_count < 40+sid_len) { return False; } /* unknown 8 bytes in pdata * maybe its the change time in NTTIME */ /* the used space 8 bytes (uint64_t)*/ qt.usedspace = BVAL(rdata,16); /* the soft quotas 8 bytes (uint64_t)*/ qt.softlim = BVAL(rdata,24); /* the hard quotas 8 bytes (uint64_t)*/ qt.hardlim = BVAL(rdata,32); if (!sid_parse((const char *)rdata+40,sid_len,&qt.sid)) { return false; } qt.qtype = SMB_USER_QUOTA_TYPE; *pqt = qt; return True; }
static BOOL smb_raw_query_posix_whoami(void *mem_ctx, struct torture_context *torture, struct smbcli_state *cli, struct smb_whoami *whoami, unsigned max_data) { struct smb_trans2 tp; NTSTATUS status; size_t offset; int i; uint16_t setup = TRANSACT2_QFSINFO; uint16_t info_level; ZERO_STRUCTP(whoami); tp.in.max_setup = 0; tp.in.flags = 0; tp.in.timeout = 0; tp.in.setup_count = 1; tp.in.max_param = 10; tp.in.max_data = (uint16_t)max_data; tp.in.setup = &setup; tp.in.trans_name = NULL; SSVAL(&info_level, 0, SMB_QFS_POSIX_WHOAMI); tp.in.params = data_blob_talloc(mem_ctx, &info_level, 2); tp.in.data = data_blob_talloc(mem_ctx, NULL, 0); status = smb_raw_trans2(cli->tree, mem_ctx, &tp); torture_assert_ntstatus_equal(torture, status, NT_STATUS_OK, "doing SMB_QFS_POSIX_WHOAMI"); /* Make sure we got back all the required fields. */ torture_assert(torture, tp.out.params.length == 0, "trans2 params should be empty"); torture_assert(torture, tp.out.data.length >= WHOAMI_REQUIRED_SIZE, "checking for required response fields"); whoami->mapping_flags = IVAL(tp.out.data.data, 0); whoami->mapping_mask = IVAL(tp.out.data.data, 4); whoami->server_uid = BVAL(tp.out.data.data, 8); whoami->server_gid = BVAL(tp.out.data.data, 16); whoami->num_gids = IVAL(tp.out.data.data, 24); whoami->num_sids = IVAL(tp.out.data.data, 28); whoami->num_sid_bytes = IVAL(tp.out.data.data, 32); whoami->reserved = IVAL(tp.out.data.data, 36); /* The GID list and SID list are optional, depending on the count * and length fields. */ if (whoami->num_sids != 0) { torture_assert(torture, whoami->num_sid_bytes != 0, "SID count does not match byte count"); } printf("\tmapping_flags=0x%08x mapping_mask=0x%08x\n", whoami->mapping_flags, whoami->mapping_mask); printf("\tserver UID=%lld GID=%lld\n", whoami->server_uid, whoami->server_gid); printf("\t%u GIDs, %u SIDs, %u SID bytes\n", whoami->num_gids, whoami->num_sids, whoami->num_sid_bytes); offset = WHOAMI_REQUIRED_SIZE; torture_assert_int_equal(torture, whoami->reserved, 0, "invalid reserved field"); if (tp.out.data.length == offset) { /* No SIDs or GIDs returned */ torture_assert_int_equal(torture, whoami->num_gids, 0, "invalid GID count"); torture_assert_int_equal(torture, whoami->num_sids, 0, "invalid SID count"); torture_assert_int_equal(torture, whoami->num_sid_bytes, 0, "invalid SID byte count"); return True; } if (whoami->num_gids != 0) { int remain = tp.out.data.length - offset; int gid_bytes = whoami->num_gids * 8; if (whoami->num_sids == 0) { torture_assert_int_equal(torture, remain, gid_bytes, "GID count does not match data length"); } else { torture_assert(torture, remain > gid_bytes, "invalid GID count"); } whoami->gid_list = talloc_array(mem_ctx, uint64_t, whoami->num_gids); torture_assert(torture, whoami->gid_list != NULL, "out of memory"); for (i = 0; i < whoami->num_gids; ++i) { whoami->gid_list[i] = BVAL(tp.out.data.data, offset); offset += 8; } } /* Check if there should be data left for the SID list. */ if (tp.out.data.length == offset) { torture_assert_int_equal(torture, whoami->num_sids, 0, "invalid SID count"); return True; } /* All the remaining bytes must be the SID list. */ torture_assert_int_equal(torture, whoami->num_sid_bytes, (tp.out.data.length - offset), "invalid SID byte count"); if (whoami->num_sids != 0) { whoami->sid_list = talloc_array(mem_ctx, struct dom_sid *, whoami->num_sids); torture_assert(torture, whoami->sid_list != NULL, "out of memory"); for (i = 0; i < whoami->num_sids; ++i) { if (!sid_parse(mem_ctx, torture, &tp.out.data, &offset, &whoami->sid_list[i])) { return False; } } }
static bool parse_user_quota_record(const char *rdata, unsigned int rdata_count, unsigned int *offset, SMB_NTQUOTA_STRUCT *pqt) { int sid_len; SMB_NTQUOTA_STRUCT qt; ZERO_STRUCT(qt); if (!rdata||!offset||!pqt) { smb_panic("parse_quota_record: called with NULL POINTER!"); } if (rdata_count < 40) { return False; } /* offset to next quota record. * 4 bytes IVAL(rdata,0) * unused here... */ *offset = IVAL(rdata,0); /* sid len */ sid_len = IVAL(rdata,4); if (rdata_count < 40+sid_len) { return False; } /* unknown 8 bytes in pdata * maybe its the change time in NTTIME */ /* the used space 8 bytes (uint64_t)*/ qt.usedspace = (uint64_t)IVAL(rdata,16); #ifdef LARGE_SMB_OFF_T qt.usedspace |= (((uint64_t)IVAL(rdata,20)) << 32); #else /* LARGE_SMB_OFF_T */ if ((IVAL(rdata,20) != 0)&& ((qt.usedspace != 0xFFFFFFFF)|| (IVAL(rdata,20)!=0xFFFFFFFF))) { /* more than 32 bits? */ return False; } #endif /* LARGE_SMB_OFF_T */ /* the soft quotas 8 bytes (uint64_t)*/ qt.softlim = (uint64_t)IVAL(rdata,24); #ifdef LARGE_SMB_OFF_T qt.softlim |= (((uint64_t)IVAL(rdata,28)) << 32); #else /* LARGE_SMB_OFF_T */ if ((IVAL(rdata,28) != 0)&& ((qt.softlim != 0xFFFFFFFF)|| (IVAL(rdata,28)!=0xFFFFFFFF))) { /* more than 32 bits? */ return False; } #endif /* LARGE_SMB_OFF_T */ /* the hard quotas 8 bytes (uint64_t)*/ qt.hardlim = (uint64_t)IVAL(rdata,32); #ifdef LARGE_SMB_OFF_T qt.hardlim |= (((uint64_t)IVAL(rdata,36)) << 32); #else /* LARGE_SMB_OFF_T */ if ((IVAL(rdata,36) != 0)&& ((qt.hardlim != 0xFFFFFFFF)|| (IVAL(rdata,36)!=0xFFFFFFFF))) { /* more than 32 bits? */ return False; } #endif /* LARGE_SMB_OFF_T */ if (!sid_parse(rdata+40,sid_len,&qt.sid)) { return false; } qt.qtype = SMB_USER_QUOTA_TYPE; *pqt = qt; return True; }