Example #1
0
int http_range_detected(HASH * head, char *range)
{
	if (hash_exists(head, (UCHAR *) "Range", 5)) {
		memset(range, '\0', BUF_SIZE);
		strncpy(range, (char *)hash_get(head, (UCHAR *) "Range", 5),
			BUF_OFF1);
		return TRUE;
	}

	return FALSE;
}
Example #2
0
File: fptree.c Project: nionjo/dm
static FPTREE * _construct_fpt(const char * infile, FPTREE * fpt, HashTable * item_dict, char sep){
    FILE * fp = NULL;
    if ((fp = fopen(infile,"r")) == NULL){
        fprintf(stderr,"open input file failed\n");
        return NULL;
    }
    char buffer[LINE_LEN];
    char ** str_array = NULL;
    int items[LINE_LEN];
    int count = 0, item_no = 0, item_size_t = 0, line = 0;

    while (NULL != fgets(buffer,LINE_LEN,fp)){
        item_size_t = 0;
        str_array = split(trim(buffer,3),sep,&count);
        if (count < 3) {
            goto str_free;
        }
        int t_count = atoi(str_array[count-1]);
        for (int i = 0; i< count - 1; i++){
            if (strlen(str_array[i]) < 6)
                continue;
            if (EXISTS == hash_exists(item_dict, str_array[i])){
                hash_find(item_dict,str_array[i], &item_no);
                items[item_size_t++] = item_no;
            }
        }
        if (item_size_t > 1){
            qsort(items, item_size_t, sizeof(items[0]), intcompare);

            if (fpt->usindex + item_size_t >= fpt->nodespace){
                fpt = _expend_fpt(fpt);
                if (!fpt) {
                    fprintf(stderr, "expend fptree failed\n" );
                    return NULL;
                }
                fprintf(stderr, "expend fptree success\n" );
            }
            _insert_path(fpt, items, item_size_t, t_count);
        }

str_free:
        free(str_array[0]);
        free(str_array);

        if (++line % 100000 == 0){
            fprintf(stderr,"%d lines insertion done\n", line);
        }
    }
    fclose(fp);

    return fpt;
}
Example #3
0
File: fptree.c Project: nionjo/dm
static void _all_children(int n, FPTREE * fpt, HashTable * id_count_dict){
    int stack[LINE_LEN], i = -1, pitem = -1, pop = 0, psupp = 0, id_count = 0;
    do{
        int ci = fpt->nodelist[n].ci;
        if (ci != 0 && pop == 0){
            pitem = fpt->nodelist[ci].item;
            psupp = fpt->nodelist[ci].supp;
            id_count = 0;
            if (EXISTS == hash_exists(id_count_dict,pitem)){
                hash_find(id_count_dict,pitem,&id_count);
            }
            id_count += psupp;
            hash_add(id_count_dict,pitem,id_count);

            stack[++i] = ci;
            n = ci;
            pop = 0;
        }
        else if (i >= 0){
            n = stack[i--];
            pop = 1;
            int si = fpt->nodelist[n].si;
            if (si != 0){
                pitem = fpt->nodelist[si].item;
                psupp = fpt->nodelist[si].supp;
                id_count = 0;
                if (EXISTS == hash_exists(id_count_dict,pitem)){
                    hash_find(id_count_dict,pitem,&id_count);
                }
                id_count += psupp;
                hash_add(id_count_dict,pitem,id_count);

                stack[++i] = si;
                n = si;
                pop = 0;
            }
        }
    }while(i >= 0);
}
Example #4
0
int http_resource_modified(char *filename, HASH * head, char *lastmodified)
{
	str_gmttime(lastmodified, DATE_SIZE, file_mod(filename));

	if (!hash_exists(head, (UCHAR *) "If-Modified-Since", 17)) {
		return TRUE;
	}

	if (strcmp((char *)hash_get(head, (UCHAR *) "If-Modified-Since", 17),
		   lastmodified) != 0) {
		return TRUE;
	}

	return FALSE;
}
Example #5
0
void cache_put( UCHAR *session_id, int type ) {
	ITEM *item_sk = NULL;
	struct obj_key *sk = NULL;

	if( hash_exists( _main->cache->hash, session_id, SHA_DIGEST_LENGTH) ) {
		return;
	}

	sk = (struct obj_key *) myalloc( sizeof(struct obj_key), "cache_put" );

	/* Session id */
	memcpy( sk->session_id, session_id, SHA_DIGEST_LENGTH );

	/* Multicast or Unicast */
	sk->type = type;

	/* Availability */
	sk->time = time_add_1_min();

	item_sk = list_put( _main->cache->list, sk );
	hash_put( _main->cache->hash, sk->session_id, SHA_DIGEST_LENGTH, item_sk );
}
Example #6
0
int http_keepalive(HASH * head, char *keepalive)
{

	memset(keepalive, '\0', BUF_SIZE);

	if (!hash_exists(head, (UCHAR *) "Connection", 10)) {
		return HTTP_UNDEF;
	}

	if (strcasecmp((char *)hash_get(head, (UCHAR *) "Connection", 10),
		       "keep-alive") == 0) {
		strncpy(keepalive, "Connection: keep-alive\r\n", BUF_OFF1);
		return HTTP_KEEPALIVE;
	}

	if (strcasecmp((char *)hash_get(head, (UCHAR *) "Connection", 10),
		       "close") == 0) {
		strncpy(keepalive, "Connection: close\r\n", BUF_OFF1);
		return HTTP_CLOSE;
	}

	return HTTP_UNDEF;
}
Example #7
0
int main(int ac, char **av, char **env)
{
	char *hostname;
	int is_command = 0;
	int is_sftp = 0;

	create_hash();
	if (ac == 3 && av[1] != NULL && av[2] != NULL && strcmp("-c", av[1]) == 0
			&& (strstr(av[2], "sftp-server") != NULL || strstr(av[2], "MySecureShell") != NULL))
		is_sftp = 1;
	else if (ac >= 3 && av[1] != NULL && av[2] != NULL && strcmp("-c", av[1]) == 0)
		is_command = 1;
	else
		parse_args(ac, av);
	hostname = get_ip(0);
	(void) setenv("SSH_IP", hostname, 1);
	free(hostname);
	FileSpecInit();
	load_config(0);
	if (is_sftp == 1)
	{
		tGlobal	*params;
		char	*ptr;
		int		max, fd, sftp_version;

		hostname = get_ip(hash_get_int("ResolveIP"));
		if (hostname == NULL)
		{
			perror("unable to resolve ip");
			exit(16);
		}
		params = calloc(1, sizeof(*params));
		if (params == NULL)
		{
			perror("unable to alloc memory");
			exit(15);
		}
		ptr = hash_get("Home");
		params->home = strdup(ptr == NULL ? "{error home}" : ptr);
		ptr = hash_get("User");
		params->user = strdup(ptr == NULL ? "{error user}" : ptr);
		params->ip = strdup(hostname == NULL ? "{error ip}" : hostname);
		params->portSource = get_port_client();

		params->who = SftpWhoGetStruct(1);
		if (params->who != NULL)
		{
			params->who->time_begin = (u_int32_t) time(0);
			params->who->pid = (u_int32_t) getpid();
			(void) strncat(params->who->home, params->home, sizeof(params->who->home) - 1);
			(void) strncat(params->who->user, params->user, sizeof(params->who->user) - 1);
			(void) strncat(params->who->ip, params->ip, sizeof(params->who->ip) - 1);
		}
		//check if the server is up and user is not admin
		if ((fd = open(SHUTDOWN_FILE, O_RDONLY)) >= 0)
		{
			xclose(fd);
			if (hash_get_int("IsAdmin") == 0 && hash_get_int("IsSimpleAdmin") == 0)
			{
				SftpWhoReleaseStruct(params->who);
				delete_hash();
				FileSpecDestroy();
				exit(0);
			}
		}
		max = hash_get_int("LogSyslog");
		if (hash_get("LogFile") != NULL)
			mylog_open(strdup(hash_get("LogFile")), max);
		else
			mylog_open(strdup(MSS_LOG), max);
		if (params->who == NULL)
		{
			mylog_printf(MYLOG_ERROR, "[%s]Server '%s' reached maximum connexion (%i clients)",
					hash_get("User"), hash_get("SERVER_IP"), SFTPWHO_MAXCLIENT);
			SftpWhoReleaseStruct(NULL);
			delete_hash();
			FileSpecDestroy();
			mylog_close_and_free();
			exit(14);
		}
		max = hash_get_int("LimitConnectionByUser");
		if (max > 0 && count_program_for_uid(hash_get("User")) > max)
		{
			mylog_printf(MYLOG_ERROR, "[%s]Too many connection for this account",
					hash_get("User"));
			SftpWhoReleaseStruct(params->who);
			delete_hash();
			FileSpecDestroy();
			exit(10);
		}
		max = hash_get_int("LimitConnectionByIP");
		if (max > 0 && count_program_for_ip(hostname) > max)
		{
			mylog_printf(MYLOG_ERROR, "[%s]Too many connection for this IP : %s",
					hash_get("User"), hostname);
			SftpWhoReleaseStruct(params->who);
			delete_hash();
			FileSpecDestroy();
			exit(11);
		}
		max = hash_get_int("LimitConnection");
		if (max > 0 && count_program_for_uid(NULL) > max)
		{
			mylog_printf(MYLOG_ERROR, "[%s]Too many connection for the server : %s",
					hash_get("User"), hash_get("SERVER_IP"));
			SftpWhoReleaseStruct(params->who);
			delete_hash();
			FileSpecDestroy();
			exit(12);
		}
		if (hash_get_int("DisableAccount"))
		{
			mylog_printf(MYLOG_ERROR, "[%s]Account is closed", hash_get("User"));
			SftpWhoReleaseStruct(params->who);
			delete_hash();
			FileSpecDestroy();
			exit(13);
		}

		params->flagsGlobals
				|= (hash_get_int("StayAtHome") ? SFTPWHO_STAY_AT_HOME : 0)
						+ (hash_get_int("VirtualChroot") ? SFTPWHO_VIRTUAL_CHROOT : 0)
						+ (hash_get_int("ResolveIP") ? SFTPWHO_RESOLVE_IP : 0)
						+ (hash_get_int("IgnoreHidden") ? SFTPWHO_IGNORE_HIDDEN : 0)
						+ (hash_get_int("DirFakeUser") ? SFTPWHO_FAKE_USER : 0)
						+ (hash_get_int("DirFakeGroup") ? SFTPWHO_FAKE_GROUP : 0)
						+ (hash_get_int("DirFakeMode") ? SFTPWHO_FAKE_MODE : 0)
						+ (hash_get_int("HideNoAccess") ? SFTPWHO_HIDE_NO_ACESS : 0)
						+ (hash_get_int("ByPassGlobalDownload") ? SFTPWHO_BYPASS_GLB_DWN : 0)
						+ (hash_get_int("ByPassGlobalUpload") ? SFTPWHO_BYPASS_GLB_UPL : 0)
						+ (hash_get_int("ShowLinksAsLinks") ? SFTPWHO_LINKS_AS_LINKS : 0)
						+ (hash_get_int("IsAdmin") ? SFTPWHO_IS_ADMIN : 0)
						+ (hash_get_int("IsSimpleAdmin") ? SFTPWHO_IS_SIMPLE_ADMIN : 0)
						+ (hash_get_int("CanChangeRights") ? SFTPWHO_CAN_CHG_RIGHTS : 0)
						+ (hash_get_int("CanChangeTime") ? SFTPWHO_CAN_CHG_TIME : 0)
						+ (hash_get_int("CreateHome") ? SFTPWHO_CREATE_HOME : 0);
		params->flagsDisable
				= (hash_get_int("DisableRemoveDir") ? SFTP_DISABLE_REMOVE_DIR : 0)
						+ (hash_get_int("DisableRemoveFile") ? SFTP_DISABLE_REMOVE_FILE : 0)
						+ (hash_get_int("DisableReadDir") ? SFTP_DISABLE_READ_DIR : 0)
						+ (hash_get_int("DisableReadFile") ? SFTP_DISABLE_READ_FILE : 0)
						+ (hash_get_int("DisableWriteFile") ? SFTP_DISABLE_WRITE_FILE : 0)
						+ (hash_get_int("DisableSetAttribute") ? SFTP_DISABLE_SET_ATTRIBUTE : 0)
						+ (hash_get_int("DisableMakeDir") ? SFTP_DISABLE_MAKE_DIR : 0)
						+ (hash_get_int("DisableRename") ? SFTP_DISABLE_RENAME : 0)
						+ (hash_get_int("DisableSymLink") ? SFTP_DISABLE_SYMLINK : 0)
						+ (hash_get_int("DisableOverwrite") ? SFTP_DISABLE_OVERWRITE : 0)
						+ (hash_get_int("DisableStatsFs") ? SFTP_DISABLE_STATSFS : 0);
		params->who->status |= params->flagsGlobals;
		_sftpglobal->download_max = (u_int32_t) hash_get_int("GlobalDownload");
		_sftpglobal->upload_max = (u_int32_t) hash_get_int("GlobalUpload");
		if (hash_get_int("Download") > 0)
		{
			params->download_max = (u_int32_t) hash_get_int("Download");
			params->who->download_max = params->download_max;
		}
		if (hash_get_int("Upload") > 0)
		{
			params->upload_max = (u_int32_t) hash_get_int("Upload");
			params->who->upload_max = params->upload_max;
		}
		if (hash_get_int("IdleTimeOut") > 0)
			params->who->time_maxidle = (u_int32_t) hash_get_int("IdleTimeOut");
		if (hash_get_int("DirFakeMode") > 0)
			params->dir_mode = (u_int32_t) hash_get_int("DirFakeMode");
		sftp_version = hash_get_int("SftpProtocol");
		if (hash_get_int("ConnectionMaxLife") > 0)
			params->who->time_maxlife = (u_int32_t) hash_get_int("ConnectionMaxLife");
		if (hash_get("ExpireDate") != NULL)
		{
			struct tm tm;
			time_t currentTime, maxTime;

			if (strptime((const char *) hash_get("ExpireDate"),
					"%Y-%m-%d %H:%M:%S", &tm) != NULL)
			{
				maxTime = mktime(&tm);
				currentTime = time(NULL);
				if (currentTime > maxTime) //time elapsed
				{
					mylog_printf(MYLOG_ERROR, "[%s]Account has expired : %s",
							hash_get("User"), hash_get("ExpireDate"));
					SftpWhoReleaseStruct(params->who);
					delete_hash();
					mylog_close_and_free();
					exit(15);
				}
				else
				{ //check if expireDate < time_maxlife
					currentTime = maxTime - currentTime;
					if ((u_int32_t) currentTime < params->who->time_maxlife)
						params->who->time_maxlife = (u_int32_t) currentTime;
				}
			} DEBUG((MYLOG_DEBUG, "[%s][%s]ExpireDate time to rest: %i",
							params->who->user, params->who->ip, params->who->time_maxlife));
		}

		if (hash_exists("MaxOpenFilesForUser") == MSS_TRUE)
			params->max_openfiles = hash_get_int("MaxOpenFilesForUser");
		if (hash_exists("MaxReadFilesForUser") == MSS_TRUE)
			params->max_readfiles = hash_get_int("MaxReadFilesForUser");
		if (hash_exists("MaxWriteFilesForUser") == MSS_TRUE)
			params->max_writefiles = hash_get_int("MaxWriteFilesForUser");

		if (hash_get_int("MinimumRightsDirectory") > 0)
			params->minimum_rights_directory = hash_get_int(
					"MinimumRightsDirectory");
		if (hash_get_int("MinimumRightsFile") > 0)
			params->minimum_rights_file = hash_get_int("MinimumRightsFile");
		if (hash_get_int("MaximumRightsDirectory") > 0)
			params->maximum_rights_directory = hash_get_int(
					"MaximumRightsDirectory");
		else
			params->maximum_rights_directory = 07777;
		if (hash_get_int("MaximumRightsFile") > 0)
			params->maximum_rights_file = hash_get_int("MaximumRightsFile");
		else
			params->maximum_rights_file = 07777;
		if (hash_get_int("DefaultRightsDirectory") > 0)
			params->default_rights_directory = hash_get_int("DefaultRightsDirectory");
		else
			params->default_rights_directory = 0755;
		if (hash_get_int("DefaultRightsFile") > 0)
			params->default_rights_file = hash_get_int("DefaultRightsFile");
		else
			params->default_rights_file = 0644;
		if (hash_get_int("ForceRightsDirectory") > 0)
		{
			params->minimum_rights_directory = hash_get_int("ForceRightsDirectory");
			params->maximum_rights_directory = params->minimum_rights_directory;
		}
		if (hash_get_int("ForceRightsFile") > 0)
		{
			params->minimum_rights_file = hash_get_int("ForceRightsFile");
			params->maximum_rights_file = params->minimum_rights_file;
		}

		if (hash_get("ForceUser") != NULL)
			params->force_user = strdup(hash_get("ForceUser"));
		if (hash_get("ForceGroup") != NULL)
			params->force_group = strdup(hash_get("ForceGroup"));

		if (hash_get("Charset") != NULL)
			setCharset(hash_get("Charset"));
		if (hash_get("ApplyFileSpec") != NULL)
			FileSpecActiveProfils(hash_get("ApplyFileSpec"), 0);
		delete_hash();
		if (hostname != NULL)
			free(hostname);
		params->current_user = getuid();
		params->current_group = getgid();
		return (SftpMain(params, sftp_version));
	}
	else
	{
		char *ptr;

		if (getuid() != geteuid())
		//if we are in utset byte mode then we restore user's rights to avoid security problems
		{
			if (seteuid(getuid()) == -1 || setegid(getgid()) == -1)
			{
				perror("revoke root rights");
				exit(1);
			}
		}
		ptr = hash_get("Shell");
		if (ptr != NULL)
		{
			if (strcmp(ptr, av[0]) != 0)
			{
				av[0] = ptr;
				if (is_command == 1)
				{
					size_t	len = 0;
					char	**new_env;
					char	*cmd, *envVar;
					int		i;

					for (i = 2; i < ac; i++)
						len += strlen(av[i]);
					cmd = malloc(len + ac + 1);
					envVar = malloc(len + ac + 1 + 21);
					cmd[0] = '\0';
					for (i = 2; i < ac; i++)
					{
						if (i > 2)
							strcat(cmd, " ");
						strcat(cmd, av[i]);
					}
					av[2] = cmd;
					av[3] = NULL;
					strcpy(envVar, "SSH_ORIGINAL_COMMAND=");
					strcat(envVar, cmd);
					len = 0;
					for (i = 0; env[i] != NULL; i++)
						len++;
					new_env = calloc(len + 2, sizeof(*new_env));
					for (i = 0; i < len; i++)
						new_env[i] = env[i];
					new_env[len] = envVar;
					(void) execve(av[0], av, new_env);
				}
				else
					(void) execve(av[0], av, env);
				perror("execute shell");
			}
			else
				(void) fprintf(stderr, "You cannot specify MySecureShell has shell (in the MySecureShell configuration) !");
		}
		else
			(void) fprintf(stderr, "Shell access is disabled !");
		exit(1);
	}
}
Example #8
0
File: fptree.c Project: nionjo/dm
static int _buildHeader(const char* infile, FPTREE * fpt, HashTable * item_dict, char sep){
    FILE * fp = NULL;
    if ((fp = fopen(infile,"r")) == NULL){
        fprintf(stderr,"open input file failed\n");
        return -1;
    }
    char buffer[LINE_LEN];
    char ** str_array = NULL;
    int count = 0, item_count = 0;
    int line = 0;
    HashTable * tmp_dict = create_hashtable(5000000,char*,int);
    while (NULL != fgets(buffer,LINE_LEN,fp)){
        str_array = split(trim(buffer,3), sep ,&count);
        if (count < 3){
            goto str_free;
        }
        int t_count = atoi(str_array[count-1]);
        for (int i = 0; i< count - 1; i++){
            if (strlen(str_array[i]) < 6)
                continue;
            if (NOTEXISTS == hash_exists(tmp_dict,str_array[i])){
                hash_add(tmp_dict,str_array[i],t_count);
            }
            else{
                hash_find(tmp_dict,str_array[i],&item_count);
                item_count += t_count;
                hash_add(tmp_dict,str_array[i],item_count);
            }
        }
str_free:
        free(str_array[0]);
        free(str_array);
        if (++line % 1000000 == 0){
            fprintf(stderr,"load lines %d\n", line);
        }
    }
    fclose(fp);

    fprintf(stderr,"totle words %d\n", hash_num_elements(tmp_dict));

    for (reset(tmp_dict); isnotend(tmp_dict); next(tmp_dict)){
        char * key = skey(tmp_dict);
        int  item_sup = *((int*)value(tmp_dict));
        if (item_sup >= fpt->minsup){
            hash_add(item_dict,key,item_sup);
        }
    }


    hash_free(tmp_dict); tmp_dict = NULL;

    int item_size = 0;
    fpt->headsize = item_size = hash_num_elements(item_dict);
    fpt->header = (FPTLIST *)malloc(sizeof(FPTLIST) * item_size);
    ItemCount * ic = (ItemCount*)malloc(sizeof(ItemCount) * item_size);

    int i = 0;
    for (reset(item_dict); isnotend(item_dict); next(item_dict)){
        char * key = skey(item_dict);
        int item_sup = *((int*)value(item_dict));
        strncpy(ic[i].key,key,KEY_SIZE-1); ic[i].key[KEY_SIZE-1] = '\0';
        ic[i].count = item_sup;
        i += 1;
    }
    reset(item_dict);

    qsort(ic,item_size,sizeof(ItemCount),itemcompare);

    for (int i = 0; i< item_size; i++){
        strncpy(fpt->header[i].itemname,ic[i].key,KEY_SIZE-1);
        fpt->header[i].itemname[KEY_SIZE-1] = '\0';
        fpt->header[i].supp = ic[i].count;
        fpt->header[i].itemlink = 0;
        hash_add(item_dict,ic[i].key,i);
    }
    free(ic);ic = NULL;

    return 0;
}