Esempio n. 1
0
static void wd_cmd_say(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wi_array_t		*array;
	wi_string_t		*string;
	wd_chat_t		*chat;
	wd_cid_t		cid;
	unsigned int	i, count;

	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	chat = wd_chat_with_cid(cid);
	
	if(!chat)
		return;

	if(!wd_chat_contains_client(chat, client))
		return;

	array = wi_string_components_separated_by_string(WI_ARRAY(arguments, 1), WI_STR("\n\r"));
	count = wi_array_count(array);
	
	wd_broadcast_lock();
	for(i = 0; i < count; i++) {
		string = WI_ARRAY(array, i);
		
		if(wi_string_length(string) > 0) {
			wd_broadcast(cid, 300, WI_STR("%u%c%u%c%#@"),
						 cid,			WD_FIELD_SEPARATOR,
						 client->uid,	WD_FIELD_SEPARATOR,
						 string);
		}
	}
	wd_broadcast_unlock();
}
Esempio n. 2
0
static void wd_cmd_icon(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wd_icon_t		icon;

	icon = wi_string_uint32(WI_ARRAY(arguments, 0));

	/* set icon if changed */
	if(client->icon != icon) {
		client->icon = icon;

		if(client->state == WD_CLIENT_STATE_LOGGED_IN) {
			wd_broadcast_lock();
			wd_client_broadcast_status(client);
			wd_broadcast_unlock();
		}
	}

	/* copy custom icon if changed */
	if(wi_array_count(arguments) > 1) {
		wi_release(client->image);
		client->image = wi_retain(WI_ARRAY(arguments, 1));

		if(client->state == WD_CLIENT_STATE_LOGGED_IN) {
			wd_broadcast_lock();
			wd_broadcast(WD_PUBLIC_CID, 340, WI_STR("%u%c%#@"),
						 client->uid,	WD_FIELD_SEPARATOR,
						 client->image);
			wd_broadcast_unlock();
		}
	}
}
Esempio n. 3
0
void wd_user_broadcast_status(wd_user_t *user) {
	wd_broadcast(wd_public_chat, 304, WI_STR("%u%c%u%c%u%c%u%c%#@%c%#@"),
				 wd_user_uid(user),			WD_FIELD_SEPARATOR,
				 wd_user_is_idle(user),		WD_FIELD_SEPARATOR,
				 wd_user_is_admin(user),	WD_FIELD_SEPARATOR,
				 wd_user_icon(user),		WD_FIELD_SEPARATOR,
				 wd_user_nick(user),		WD_FIELD_SEPARATOR,
				 wd_user_status(user));
}
Esempio n. 4
0
static void wd_cmd_broadcast(wi_array_t *arguments) {
	wd_client_t	*client = wd_client();

	if(!client->account->broadcast) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}

	wd_broadcast_lock();
	wd_broadcast(WD_PUBLIC_CID, 309, WI_STR("%u%c%#@"),
				 client->uid,	WD_FIELD_SEPARATOR,
				 WI_ARRAY(arguments, 0));
	wd_broadcast_unlock();
}
Esempio n. 5
0
void wd_server_send_server_info(wi_boolean_t broadcast) {
	wi_string_t		*string, *start_date;
	
	start_date = wi_date_rfc3339_string(wd_start_date);
	string = wi_string_with_format(WI_STR("%#@%c%#@%c%#@%c%#@%c%#@%c%u%c%llu"),
		wd_server_version_string,		WD_FIELD_SEPARATOR,
		wd_protocol_version_string,		WD_FIELD_SEPARATOR,
		wd_settings.name,				WD_FIELD_SEPARATOR,
		wd_settings.description,		WD_FIELD_SEPARATOR,
		start_date,						WD_FIELD_SEPARATOR,
		wd_files_count,					WD_FIELD_SEPARATOR,
		wd_files_size);
	
	if(broadcast)
		wd_broadcast(wd_public_chat, 200, WI_STR("%#@"), string);
	else
		wd_reply(200, WI_STR("%#@"), string);
}
Esempio n. 6
0
void wd_chat_broadcast_topic(wd_chat_t *chat) {
	wi_string_t		*string;
	wd_topic_t		*topic;
	
	topic = wd_chat_topic(chat);
	
	if(topic) {
		string = wi_date_rfc3339_string(topic->date);
		
		wd_broadcast(chat, 341, WI_STR("%u%c%#@%c%#@%c%#@%c%#@%c%#@"),
					 chat->cid,			WD_FIELD_SEPARATOR,
					 topic->nick,		WD_FIELD_SEPARATOR,
					 topic->login,		WD_FIELD_SEPARATOR,
					 topic->ip,			WD_FIELD_SEPARATOR,
					 string,			WD_FIELD_SEPARATOR,
					 topic->topic);
	}
}
Esempio n. 7
0
void wd_chat_add_user_and_broadcast(wd_chat_t *chat, wd_user_t *user) {
	wd_broadcast(chat, 302, WI_STR("%u%c%u%c%u%c%u%c%u%c%#@%c%#@%c%#@%c%#@%c%#@%c%#@"),
				 chat->cid,					WD_FIELD_SEPARATOR,
				 wd_user_uid(user),			WD_FIELD_SEPARATOR,
				 wd_user_is_idle(user),		WD_FIELD_SEPARATOR,
				 wd_user_is_admin(user),	WD_FIELD_SEPARATOR,
				 wd_user_icon(user),		WD_FIELD_SEPARATOR,
				 wd_user_nick(user),		WD_FIELD_SEPARATOR,
				 wd_user_login(user),		WD_FIELD_SEPARATOR,
				 wd_user_ip(user),			WD_FIELD_SEPARATOR,
				 wd_user_host(user),		WD_FIELD_SEPARATOR,
				 wd_user_status(user),		WD_FIELD_SEPARATOR,
				 wd_user_image(user));
	
	wi_array_wrlock(chat->users);
	wi_mutable_array_add_data(chat->users, user);
	wi_array_unlock(chat->users);
}
Esempio n. 8
0
void wd_apply_config(void) {
	char	start_time[WD_DATETIME_SIZE];

	/* change directory to the files path */
	if(strcmp(wd_settings.files, wd_previous_settings.files) != 0) {
		if(chdir(wd_settings.files) < 0) {
			wd_log(LOG_ERR, "Could not change directory to %s: %s", 
				wd_settings.files, strerror(errno));
		}
	}
	
	/* reload banner */
	if(wd_banner)
		free(wd_banner);

	if(strlen(wd_settings.banner) > 0)
		wd_banner = wd_base64_encode(wd_settings.banner);

	/* reload server information */
	if(strcmp(wd_settings.name, wd_previous_settings.name) != 0 ||
	   strcmp(wd_settings.description, wd_previous_settings.description) != 0) {
		/* format time string */
		wd_time_to_iso8601(wd_start_time, start_time, sizeof(start_time));
			
		/* reply a 200 */
		wd_broadcast(WD_PUBLIC_CHAT, 200, "%s%c%s%c%s%c%s%c%s%c%u%c%llu",
			 wd_version_string,
			 WD_FIELD_SEPARATOR,
			 WD_PROTOCOL_VERSION,
			 WD_FIELD_SEPARATOR,
			 wd_settings.name,
			 WD_FIELD_SEPARATOR,
			 wd_settings.description,
			 WD_FIELD_SEPARATOR,
			 start_time,
			 WD_FIELD_SEPARATOR,
			 wd_files_count,
			 WD_FIELD_SEPARATOR,
			 wd_files_size);
	}
	   
	/* apply SSL config */
	wd_apply_config_ssl();
}
Esempio n. 9
0
static void wd_cmd_ban(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wd_client_t		*peer;
	wd_uid_t		uid;
	
	if(!client->account->ban_users) {
		wd_reply(516, WI_STR("Permission Denied"));
		
		return;
	}

	uid = wi_string_uint32(WI_ARRAY(arguments, 0));
	peer = wd_client_with_uid(uid);

	if(!peer) {
		wd_reply(512, WI_STR("Client Not Found"));

		return;
	}

	if(peer->account->cannot_be_kicked) {
		wd_reply(515, WI_STR("Cannot Be Disconnected"));

		return;
	}

	wd_broadcast_lock();
	wd_broadcast(WD_PUBLIC_CID, 307, WI_STR("%u%c%u%c%#@"),
				 peer->uid,		WD_FIELD_SEPARATOR,
				 client->uid,	WD_FIELD_SEPARATOR,
				 WI_ARRAY(arguments, 1));
	wd_broadcast_unlock();

	wi_log_ll(WI_STR("%@/%@/%@ banned %@/%@/%@"),
		client->nick, client->login, client->ip,
		peer->nick, peer->login, peer->ip);

	wd_tempban(peer->ip);

	wi_lock_lock(peer->flag_lock);
	peer->state = WD_CLIENT_STATE_DISCONNECTED;
	wi_lock_unlock(peer->flag_lock);
}
Esempio n. 10
0
static void wd_cmd_decline(wi_array_t *arguments) {
	wd_client_t		*client = wd_client();
	wd_chat_t		*chat;
	wd_cid_t		cid;
	
	cid = wi_string_uint32(WI_ARRAY(arguments, 0));
	chat = wd_chat_with_cid(cid);
	
	if(!chat)
		return;

	if(wd_chat_contains_client(chat, client))
		return;

	wd_broadcast_lock();
	wd_broadcast(chat->cid, 332, WI_STR("%u%c%u"),
				 chat->cid,		WD_FIELD_SEPARATOR,
				 client->uid);
	wd_broadcast_unlock();
}
Esempio n. 11
0
void wd_chat_broadcast_user_leave(wd_chat_t *chat, wd_user_t *user) {
	wd_broadcast(chat, 303, WI_STR("%u%c%u"),
				 chat->cid,		WD_FIELD_SEPARATOR,
				 wd_user_uid(user));
}
Esempio n. 12
0
void wd_server_apply_settings(void) {
	wi_string_t		*string;
	wi_data_t		*data;

	/* reload banner */
	if(wd_settings.banner) {
		if(wd_settings.banner_changed) {
			data = wi_data_init_with_contents_of_file(wi_data_alloc(), wd_settings.banner);
			
			if(data) {
				wi_release(wd_banner);
				wd_banner = wi_retain(wi_data_base64(data));
			} else {
				wi_log_err(WI_STR("Could not open %@: %m"), wd_settings.banner);
			}

			wi_release(data);
		}
	} else {
		wi_release(wd_banner);
		wd_banner = NULL;
	}

	/* reload server name/description */
	if(wd_settings.name_changed || wd_settings.description_changed) {
		string = wi_date_iso8601_string(wd_start_date);
		
		wd_broadcast(wd_public_chat, 200, WI_STR("%#@%c%#@%c%#@%c%#@%c%#@%c%u%c%llu"),
					 wd_server_version_string,		WD_FIELD_SEPARATOR,
					 wd_protocol_version_string,	WD_FIELD_SEPARATOR,
					 wd_settings.name,				WD_FIELD_SEPARATOR,
					 wd_settings.description,		WD_FIELD_SEPARATOR,
					 string,						WD_FIELD_SEPARATOR,
					 wd_files_unique_count,			WD_FIELD_SEPARATOR,
					 wd_files_unique_size);
	}

	/* set SSL cipher list */
	if(wd_settings.controlcipher) {
		if(!wi_socket_context_set_ssl_ciphers(wd_control_socket_context, wd_settings.controlcipher)) {
			wi_log_err(WI_STR("Could not set SSL cipher list \"%@\": %m"),
				wd_settings.controlcipher);
		}
	}

	if(wd_settings.transfercipher) {
		if(!wi_socket_context_set_ssl_ciphers(wd_transfer_socket_context, wd_settings.transfercipher)) {
			wi_log_err(WI_STR("Could not set SSL cipher list \"%@\": %m"),
				wd_settings.transfercipher);
	   }
	}

	/* load SSL certificate */
	if(wd_settings.certificate) {
		if(!wi_socket_context_set_ssl_certificate(wd_control_socket_context, wd_settings.certificate) ||
		   !wi_socket_context_set_ssl_certificate(wd_transfer_socket_context, wd_settings.certificate)) {
			wi_log_err(WI_STR("Could not load certificate %@: %m"),
				wd_settings.certificate);
		}
	}
}