Page 1 of 1

help in F_AUTH

Posted: Sun Nov 11, 2012 3:16 pm
by 4mIRC
hello all

im using the module F_AUTH

and its work good ... my question is :

can any one make it to send the code private not in status ?

i want it because some of my clients are using there own scripts

so when they connect the script will join them to there auto connect channel

and then they cant see the code...

is i want it to send the code private better :)

here is my code

Code: Select all

/*
 * f_auth.c
 * by fez (c) 2007 - provides authentication requirement for IRC
 * this module is only a proof of concept.  It should be expanded for
 * specific authentication schema.  f_auth_local_connect() and
 * f_auth_command() would be the places to do those.
 */

// includes
#include "config.h"
#include "struct.h"
#include "common.h"
#include "sys.h"
#include "numeric.h"
#include "msg.h"
#include "proto.h"
#include "channel.h"
#include <time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <io.h>
#endif
#include <fcntl.h>
#include "h.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif

// ***** module-specific defines *****
#define MOD_AUTH_NAME		"f_auth"
#define MOD_AUTH_VERS		"$Id: f_auth.c, v1.0.2 2007/10/16 20:43:00 fez Exp $"
#define MOD_AUTH_DESC		"require AUTH before registering"
// defines:
#define MSG_AUTH		"AUTH"
#define TOK_AUTH		NULL
#define AUTH_DIRECTIVE		"require-auth"
#define MSG_NOTICE		"NOTICE"

// ***** Function Declarations *****
// config loading hook functions
DLLFUNC int f_auth_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs);
DLLFUNC int f_auth_config_posttest(int *errs);
DLLFUNC int f_auth_config_run(ConfigFile *cf, ConfigEntry *ce, int type);
DLLFUNC int f_auth_config_rehash();
// Hook functions:
DLLFUNC int f_auth_local_connect(aClient *sptr);
// commands:
DLLFUNC int f_auth_command(aClient *cptr, aClient *sptr, int parc, char *parv[]);

// ***** Global Variables *****
ModuleInfo *AuthModInfo = NULL;		// for local storage of modinfo
static int auth_conf_counter = 0;	// for config file
static Hook *AuthHookTest = NULL;	// for config hashiing
static Hook *AuthHookPosttest = NULL;	//
static Hook *AuthHookRun = NULL;	//
static Hook *AuthHookRehash = NULL;	//
static Hook *AuthHookLocalConnect = NULL;	// for local connection hook
static Command *AuthCmd;		// to store command hook status
static int auth_require = 0;		// whether to require AUTH

// a description of this module
ModuleHeader MOD_HEADER(f_auth)
  = {
	MOD_AUTH_NAME,
	MOD_AUTH_VERS,
	MOD_AUTH_DESC,
	"3.2.3",
	NULL
  };

// called before config test
DLLFUNC int MOD_TEST(f_auth)(ModuleInfo *modinfo)
{
	int ret = MOD_SUCCESS;
	AuthHookTest = HookAddEx(modinfo->handle, HOOKTYPE_CONFIGTEST, f_auth_config_test);
	AuthHookPosttest = HookAddEx(modinfo->handle, HOOKTYPE_CONFIGPOSTTEST, f_auth_config_posttest);
	auth_conf_counter = 0;
	return ret;
}

// called during module initialization
DLLFUNC int MOD_INIT(f_auth)(ModuleInfo *modinfo)
{
	int ret = MOD_SUCCESS;
	AuthModInfo = modinfo;
	AuthHookRun = HookAddEx(modinfo->handle, HOOKTYPE_CONFIGRUN, f_auth_config_run);
	AuthHookRehash = HookAddEx(modinfo->handle, HOOKTYPE_REHASH, f_auth_config_rehash);
	AuthHookLocalConnect = HookAddEx(modinfo->handle, HOOKTYPE_LOCAL_CONNECT, f_auth_local_connect);
	AuthCmd = CommandAdd(modinfo->handle, MSG_AUTH, TOK_AUTH, f_auth_command, MAXPARA, M_UNREGISTERED|M_USER);
	if (!AuthCmd)
		ret = MOD_FAILED;
	return ret;
}

// called when ircd is 100% ready
DLLFUNC int MOD_LOAD(f_auth)(int module_load)
{
	int ret = MOD_SUCCESS;
	return ret;
}

// called when unloading a module
DLLFUNC int MOD_UNLOAD(f_auth)(int module_unload)
{
	int ret = MOD_SUCCESS;
	CommandDel(AuthCmd);
	HookDel(AuthHookTest);
	HookDel(AuthHookPosttest);
	HookDel(AuthHookRun);
	HookDel(AuthHookRehash);
	HookDel(AuthHookLocalConnect);
	AuthCmd = NULL;
	AuthHookLocalConnect =
	AuthHookTest = AuthHookPosttest = AuthHookRun = AuthHookRehash = NULL;
	return ret;
}

// this is where we TEST the config file
DLLFUNC int f_auth_config_test(ConfigFile *cf, ConfigEntry *ce, int type, int *errs)
{
	int errors = 0;
	if (type != CONFIG_SET)
		return 0;
	if (!strcmp(ce->ce_varname, AUTH_DIRECTIVE))
	{
		if (ce->ce_vardata)
		{
			config_error("%s:%i: set::%s with unnecessary value",
				ce->ce_fileptr->cf_filename,
				ce->ce_varlinenum, ce->ce_varname );
			errors++;
		}
		else if (auth_conf_counter)
		{
			config_error("%s:%i: set::%s already defined on line %i",
				ce->ce_fileptr->cf_filename,
				ce->ce_varlinenum, ce->ce_varname,
				auth_conf_counter );
				errors++;
		}
		else
		{
			auth_conf_counter = ce->ce_varlinenum;
			!auth_conf_counter && ++auth_conf_counter;
		}
		*errs = errors;
		return errors ? -1 : 1;
	}
	return 0;
}

// this is run AFTER testing the config file
DLLFUNC int f_auth_config_posttest(int *errs)
{
	int errors = 0;
	if (!auth_conf_counter)
	{
		//config_error("set::%s not set.", AUTH_DIRECTIVE );
		//errors++;
		////or...
		auth_require = 0;
	}
	*errs = errors;
	return errors ? -1 : 1;
}

// this is run WHEN LOADING SETTINGS from the config file
DLLFUNC int f_auth_config_run(ConfigFile *cf, ConfigEntry *ce, int type)
{
	if (type != CONFIG_SET)
		return 0;
	if (!strcmp(ce->ce_varname, AUTH_DIRECTIVE))
	{
		auth_require = 1;
		return 1;
	}
	return 0;
}

// this is run when REHASHING the config file
DLLFUNC int f_auth_config_rehash()
{
	auth_conf_counter = 0;
	return 1;
}

// this is the local connect hook function
DLLFUNC int f_auth_local_connect(aClient *sptr)
{
	if (!auth_require || !MyConnect(sptr) || !IsClient(sptr))
		return 0;
	sendto_one(sptr, "%s %s %s :To connect please type /quote %s %X",
		me.name, MSG_NOTICE, sptr->name,
		MSG_AUTH, sptr->firsttime );
	SetUnknown(sptr);
	IRCstats.unknown++;
	IRCstats.clients--;
	IRCstats.me_clients--;
	me.serv->users--;
	return 0;
}

// this is the AUTH command
DLLFUNC int f_auth_command(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
	char authcode[32];
	if (!auth_require || !MyConnect(sptr) || !IsUnknown(sptr))
		return 0;
	sprintf(authcode, "%X", sptr->firsttime);
	if (parc > 1 && !strcmp(parv[1], authcode))
	{
		sendto_one(sptr, "%s %s %s :%s code accepted.",
			me.name, MSG_NOTICE, sptr->name, MSG_AUTH );
		SetClient(sptr);
		IRCstats.unknown--;
		IRCstats.clients++;
		IRCstats.me_clients++;
		me.serv->users++;
	}
	else
	{
		sendto_one(sptr, "%s %s %s :%s code invalid.",
			me.name, MSG_NOTICE, sptr->name, MSG_AUTH );
	}
	return 0;
}

/* end of code */
thanks

Re: help in F_AUTH

Posted: Tue Nov 13, 2012 5:29 pm
by 4mIRC
hello ,,,,

is there any idea how to fix it?

Thanks

Re: help in F_AUTH

Posted: Wed Nov 14, 2012 8:33 pm
by Jobe1986
The NOTICE is sent ONLY to the user. So although the user's client may display it in the channel window, the other users in that channel CANNOT see it.

And in addition to that, UnrealIRCd has absolutely NO choice where a client chooses to display a NOTICE sent privately to a user (such as this one is)

Re: help in F_AUTH

Posted: Sun Nov 18, 2012 7:49 pm
by 4mIRC
Jobe1986 wrote:The NOTICE is sent ONLY to the user. So although the user's client may display it in the channel window, the other users in that channel CANNOT see it.

And in addition to that, UnrealIRCd has absolutely NO choice where a client chooses to display a NOTICE sent privately to a user (such as this one is)
Thanks for the reply

i want to change the idea from notice to private msg
example :
FROM define MSG_NOTICE "NOTICE"
TO define MSG_NOTICE "PRIVATE"

im not asking to make the notice sent to private
im asking how to change the code from notice the user to private msg to the user


Thanks

Re: help in F_AUTH

Posted: Sun Nov 18, 2012 8:33 pm
by katsklaw
The proper name of the command is PRIVMSG, however conventionally IRCd should not sent private message to nicks and its extremely annoying to most users to the point you may lose them.

It is never a good idea to make the ircd or services cater to client scripts. I have found that in nearly every case the problem is a simple case of some "scripter" not knowing how to parse the messages in question which is a poor excuse to change how irc is supposed to work.