TCL problème avec une variable
#1
Bonjour,


je poste ici le tcl pour mieux expliquer le probleme :

tcl
############################# Robot pour verifer les connexions (non fini) #####################
 
set active 0
 
bind raw - "NOTICE" myproc
bind msg - "MD5" exemple3:repond3
 
proc myproc { from keyword arg } {
if { ([string match "*connecting on port*" $arg]) } {
 
set nnickname [lindex $arg 9]

##Detection du message que le robot recoit en pv
##/PRIVMSG eggdrop :MD5 <le_code_md5_généré_par_un_applet>
proc exemple3:repond3 {nick uhost handle arg} {
 
##xxxxx c'est le mot de passe
set Pass "xxxxx"

## le md5  avec le nick et le Pass et le $arg dernier mot aprés message "MD5 <xxxxxxxxxxxxxxxxxxx>"
if { [md5 $nick$Pass] == $arg } {
putserv "PRIVMSG #connect :Verification OK pour $nick - hash [md5 $nick$Pass]"

##le set ne veut pas changer la variable je comprend pas - GROS PROBLEME sinon la personne risque le gline meme si le md5 est bon
set active 1
##changement de variable obligatoire pour pas que le if en bas ne s'execute
}
}

##Si le if ci-dessus change la valeur de la variable 'active' il execute pas le script ci-dessous
if { $active == 0 } {
putserv "PRIVMSG #connect :commande gline + commande privmsg pour connexion non autorisé."
}
 
}
}

 
 
############################# ####################### #####################




la detection de la notice est obligatoire : "*connecting on port*" car il y a 2 styles de clients sur le serveur irc:

1) Les gens de l'applet ils ont une variable MD5 (géneré par php) donc dés que l'applet est connecté il fait direct un /PRIVMSG eggdrop :MD5 <code_généré_par_php> et il verifie si c'est le meme code dans [md5 $nick$Pass] == $arg donc le md5 géneré par php c'est aussi le meme code avec md5("$pseudo$Pass");

2) les clients mirc/xchat/etc... donc ils envoient pas de pv et donc le seul truc qu'il faut faire c'est de détecté une Non-réception de pv pour que le message retourne "Non accepté" car il est pas sous l'applet.


le truc qui marche pas dans ce tcl c'est le changement de valeur dans "set active 1" , est-ce que quelqu'un sait comment faudrait faire ?

tcl
##le set ne veut pas changer la variable je comprend pas
##GROS PROBLEME sinon la personne risque le gline meme si le md5 est bon
set active 1
##changement de variable obligatoire pour pas que le if en bas ne s'execute



Script fait a la débutant donc j'espere que le code est assez correct.


Merci d'avance,
bonne journée.
Répondre Avertir
#2
tcl
set active "1"



Essai ça, même si je suis sur de rien (lol)
CrazyCat a écrit :La prochaine fois, essaye d'imaginer que j'ai un cerveau ...
Répondre Avertir
#3
salut,

lorsque tu set ta variable active au début du tcl, tu crées une variable globale. Par contre lorsqu'une variable est créée dans une procédure elle est dite locale. Ces 2 variables, même si elles portent le même nom, ne sont donc pas liées. Il faut donc appeler ta variable globale dans la procédure.
Pour cela, 2 manières:
tcl
#à placer au début de la proc
global active



ou:
tcl
#ici on indique à tcl ou chercher la variable (les :: indique que c est une variable globale)
set ::active 1



sinon pour le code, tu crées 2 procédures l'une dans l autre, je doutes que se soit ce que tu voulais faire, essais comme ça:
tcl
############################# Robot pour verifer les connexions (non fini) #####################
 
set active 0
 
bind raw - "NOTICE" myproc
bind msg - "MD5" exemple3:repond3
 
proc myproc { from keyword arg } {
  global active
  if {[string match "*connecting on port*" $arg]} {
    set nnickname [lindex $arg 9]
    ##Si le if ci-dessus change la valeur de la variable 'active' il execute pas le script ci-dessous
    #ici $active étant un bolean (1 ou 0) on  est pas obligé de mettre ==0 il sufi de mettre un ! devant et pour ==1 ne rien mettre
    if {!$active} {
      putserv "PRIVMSG #connect :commande gline + commande privmsg pour connexion non autorisé."
    }
  }
}

##Detection du message que le robot recoit en pv
##/PRIVMSG eggdrop :MD5 <le_code_md5_généré_par_un_applet>
proc exemple3:repond3 {nick uhost handle arg} {
  global active
  ##xxxxx c'est le mot de passe
  set Pass "xxxxx"
 
  ## le md5  avec le nick et le Pass et le $arg dernier mot aprés message "MD5 <xxxxxxxxxxxxxxxxxxx>"
  if {[md5 $nick$Pass]==$arg} {
    putserv "PRIVMSG #connect :Verification OK pour $nick - hash [md5 $nick$Pass]"
 
    ##le set ne veut pas changer la variable je comprend pas - GROS PROBLEME sinon la personne risque le gline meme si le md5 est bon
    #ici on a mis global au début de la proc donc pas besoin de mettre les :: devant active
    set active 1
    ##changement de variable obligatoire pour pas que le if en bas ne s'execute
  }
}


C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#4
Salut DjKenny, Merci pour le code, par contre le "connecting on port" il arrive bien avant le PRIVMSG et donc le bind raw - "NOTICE" myproc il sert a rien et il faudrait le remplacer par un autre bind mais je ne sais pas lequel.

Avec l'applet j'envoi ceci :

::Connexion Server
::NICK <Pseudodumec>
::USER <username> host 127.0.0.1 :<realname>
>Connexion établie sur le serveur irc
:RazzRIVMSG Eggdrop :MD5 <MD5_généré_par_php>

Donc l'eggdrop lui, il peut pas verifier le message privé car la notice serveur elle arrive aussitot que la connexion est faite:
>Connexion établie sur le serveur irc

ensuite il y a la reception du pv.



moi je croyais qu'il etait possible de faire la connexion au serveur, mettre en attente le pseudo pour voir si le pseudo arriverais en pv en lui mettant le md5 , c'est un probleme d'ordre il faudrait que le pv arrive bien avant la notice serveur et là le script il marcherait surement.



tcl
##Detection du message que le robot recoit en pv
##/PRIVMSG eggdrop :MD5 <le_code_md5_généré_par_un_applet>
proc exemple3:repond3 {nick uhost handle arg} {
  global active
  ##xxxxx c'est le mot de passe
  set Pass "xxxxx"
 
  ## le md5  avec le nick et le Pass et le $arg dernier mot aprés message "MD5 <xxxxxxxxxxxxxxxxxxx>"
  if {[md5 $nick$Pass]==$arg} {
    putserv "PRIVMSG #connect :Verification OK pour $nick - hash [md5 $nick$Pass]"

    #ici on a mis global au début de la proc donc pas besoin de mettre les :: devant active
    set active 1
  } else {
     putserv "PRIVMSG #connect :Faux code $nick - Gline"
}
 
}



J'aurais donc une question a poser tout en gardant le proc ci-dessus sans le SNotice:

-Est-ce que c'est possible de détecter une personne qui viens PAS dans le pv du robot aprés 1 ou 2 seconde maximum ? le privmsg a la connexion de l'applet il est surement immédiat et la reception du pv elle met peut etre moins de 1 seconde, est-ce que c'est possible de détecté une non-réception d'un pv ?



il faudrait comme un "else" aprés le proc exemple3:repond3 en mettant un message que le pv n'a pas été reçu et que donc le gline est autorisé.


J'arriverais jamais a monter un tel truc a moi tout seul et merci de m'avoir aidé jusqu'a présent.



=================

Sinon juste avant que tu me passe ce code, en attendant d'avoir une réponse j'avais fais un autre systeme mais avec mysql

la technique c'etait de verifier l'ident de chaque connexion, la personne se connecte et l'ident ne se trouve pas dans la bdd et donc le truc il marchait "PRIVMSG #test :$nnickname N'a pas été trouvé dans la bdd et donc gline ! " ou alors l'ident a été trouvé (car l'applet il enregistre l'ident dans mysql avant la connexion)


Mais je crois que la technique du pv (reception ou non) je crois que c'est mieux car en effet avec mysql il est tellement lent que la verification se fait plus de 60 secondes aprés.

donc l'idée du mysql pas si top.
Répondre Avertir
#5
avec un timer ou utimer
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#6
j'ai testé avec un utimer, mais en faite non je comprend pas comment ça marche, il faut le placer ou ce utimer?


un script tcl il lit dans l'ordre comme un script php ? a chaque fois qu'il recoit une notice il repart en haut du tcl et il lit? ou les proc sont en lecture jusqu'a tant que l'eggdrop quitte (die) ?
Répondre Avertir
#7
non tcl n'as rien a voir avec php, il charge les proc en mémoire et les lit lorsqu'elles sont appelées, soit par un bind soit en direct.
pour ton code en réalité je suis pas vraiment sur que se soit faisable, ou alors assez compliqué. pourquoi ne pas tout simplement mettre un mot de passe sur ton serveur?
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté