Пример #1
0
/* [email protected] */
static char *parse_chpass_clause (const char *clause, const char *username,
				  const char *defdomain, const char *newpass,
				  const char *newpass_crypt)
{
static struct var_data vd[]={
	    {"local_part",	NULL,	sizeof("local_part"),		0},
	    {"domain",		NULL,	sizeof("domain"),		0},
	    {"newpass",		NULL, 	sizeof("newpass"),		0},
	    {"newpass_crypt",	NULL,	sizeof("newpass_crypt"),	0},
	    {NULL,		NULL,	0,				0}};

	if (clause == NULL || *clause == '\0'		||
	    !username || *username == '\0'		||
	    !newpass || *newpass == '\0'		||
	    !newpass_crypt || *newpass_crypt == '\0')	return NULL;

	vd[0].value	= get_localpart (username);
	vd[1].value	= get_domain (username, defdomain);
	vd[2].value	= validate_password (newpass);
	vd[3].value	= validate_password (newpass_crypt);
	
	if (!vd[0].value || !vd[1].value ||
	    !vd[2].value || !vd[3].value)	return NULL;

	return (parse_string (clause, vd));
}
Пример #2
0
int main (int argc, const char * argv[]) {
	si4 i, num, numBlocks, l, blocks_per_cycle, start_block, end_block;
	si4 *data, *dp;
	ui8 numEntries, inDataLength, outDataLength, bytesDecoded, entryCounter;
	si1 password[16], outFileName[200], path[200], encryptionKey[240];
	ui1 *hdr_block, *in_data, *idp, *diff_buffer, *dbp;
	FILE *fp, *out_fp;
	MEF_HEADER_INFO header;
	RED_BLOCK_HDR_INFO RED_bk_hdr;
	INDEX_DATA *indx_array;

	blocks_per_cycle = 5000;
	memset(password, 0, 16);
	
	numEntries=0;
	
	if (argc < 2 || argc > 4) 
	{
		(void) printf("USAGE: %s file_name [password] \n", argv[0]);
		return(1);
	}
		
	if (argc > 2) { //check input arguments for password
		strncpy(password, argv[2], 16);
	}
	
	//allocate memory for (encrypted) header block
	hdr_block = calloc(MEF_HEADER_LENGTH, sizeof(ui1));
	
	fp = fopen(argv[1], "r");
	if (fp == NULL) {
		fprintf(stderr, "Error opening file %s\n", argv[1]);
		return 1;
	}
	
	num = fread(hdr_block, 1, MEF_HEADER_LENGTH, fp);
	if (num != MEF_HEADER_LENGTH) {
		fprintf(stderr, "Error reading file %s\n", argv[1]);
		return 1;
	}
		
	read_mef_header_block(hdr_block, &header, password);

	if (header.session_encryption_used && validate_password(hdr_block, password)==0) {
		fprintf(stderr, "Can not decrypt MEF header\n");
		free(hdr_block);
		return 1;
	}

	numBlocks = header.number_of_index_entries;
	numEntries = header.number_of_samples;

	//	inDataLength = header.index_data_offset - header.header_length;
	inDataLength = blocks_per_cycle * header.maximum_compressed_block_size;
	if (header.data_encryption_used) {
		AES_KeyExpansion(4, 10, encryptionKey, header.session_password); 
	}
	else
		*encryptionKey = 0;

	free(hdr_block);
	
	indx_array = calloc(header.number_of_index_entries, sizeof(INDEX_DATA));
	fseek(fp, header.index_data_offset, SEEK_SET);
	num = fread((void*)indx_array, sizeof(INDEX_DATA), header.number_of_index_entries, fp);
	if (num != header.number_of_index_entries) {
		fprintf(stderr, "Can not read block index array\n");
		free(indx_array);
		return 1;
	}
	
	diff_buffer = malloc(header.maximum_block_length * 4);
	in_data = malloc(inDataLength);
	outDataLength = blocks_per_cycle * header.maximum_block_length; //Note: this is only the max data length per decompression cycle....
	//data = calloc(numEntries, sizeof(ui4));	
	data = calloc(outDataLength, sizeof(ui4));
	if (data == NULL || in_data == NULL || diff_buffer == NULL) {
		fprintf(stderr, "malloc error\n");
		return 1;
	}

	//Assemble output filename
	l = (int)strlen(argv[1]);
	memcpy(path, argv[1], l-4);
	path[l-4] = '\0';
	sprintf(outFileName, "%s.raw32", path);
	
	//open output file for writing
	out_fp = fopen(outFileName, "w");
	if (out_fp == NULL) {
		fprintf(stderr, "Error opening file %s\n", outFileName);
		return 1;
	}
	
	fprintf(stdout, "\n\nReading file %s \n", argv[1]);
	start_block = 0;

	fprintf(stdout, "\nDecompressing and writing file %s: %ld entries \n", outFileName, header.number_of_samples);
	
	while( start_block < numBlocks ) {
		end_block = start_block + blocks_per_cycle;
		if (end_block > numBlocks) {
			end_block = numBlocks;
			inDataLength = header.index_data_offset - indx_array[start_block].file_offset;
		}
		else {
			inDataLength = indx_array[end_block].file_offset - indx_array[start_block].file_offset;
		}
		
		fseek(fp, indx_array[start_block].file_offset, SEEK_SET);
		num = fread(in_data, 1, inDataLength, fp);
		if (num != inDataLength) {
			fprintf(stderr, "Data read error \n");
			return 1;
		}
		
		dp = data;	idp = in_data;	dbp = diff_buffer;
		entryCounter = 0;
		for (i=start_block; i<end_block; i++)
		{
			bytesDecoded = RED_decompress_block(idp, dp, dbp, encryptionKey, 0, header.data_encryption_used, &RED_bk_hdr);
			idp += bytesDecoded;
			dp += RED_bk_hdr.sample_count;
			dbp = diff_buffer; //don't need to save diff_buffer- write over
			entryCounter += RED_bk_hdr.sample_count;
		}
		start_block = end_block;	

		num = fwrite(data, sizeof(si4), entryCounter, out_fp);
		if (num != entryCounter) {
			fprintf(stderr, "Error writing file %s\n", argv[1]);
			return 1;
		}
	} //end while()
	
	free(in_data); in_data = NULL;
	free(diff_buffer); diff_buffer = NULL;
	fprintf(stdout, "Decompression complete\n");
	fclose(fp);
	fclose(out_fp);

	free(data); data = NULL;
	return 0;
}