PureBasic

Forums PureBasic
Nous sommes le Dim 20/Mai/2018 20:48

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 
Auteur Message
 Sujet du message: password Generator
MessagePosté: Mar 16/Aoû/2016 20:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1930
le revoilou :
Image
petit plus, les mots de pass conservés sont encodés Vigenere :)

Rappel : Password Generator permet en premier lieu de generer des mots de pass complexe
la variable Ref.s ligne 257 contient "l'alphabet" qui sert a generer les mots de pass

je vous conseille de personnaliser cet Alphabet ! c'est dans cet alphabet que seront choisi les carateres qui formeront le mot de pass
si vous demandez un mot de pass d'une longueur de 13 lettres, avec le meme Level
ce sera toujours le même mot de pass qui sera généré !!

c'est une sécurité pour pouvoir retrouver un mot de pass qu'on aurai perdu ....
il suffit de connaître la longueur du mot de pass et son level pour le retrouver (en ayant le meme Alphabet bien sur )


vous pouvez bien sur directement ecrire votre propre mot de pass dans le champs prevu a cette effet
vous entrez le login éventuellement

le bouton [sauve] permet de sauver la fiche ,
le prg vous demandera le nom de la fiche ... entrez par exemple "Site : http://www.meteo.fr"
soyez explicite dans le choix des noms, ça permet de s'y retrouver par la suite :)

le bouton [Supr] permet de supprimer une fiche

le bouton [edit] permet d'editer une fiche .. (ce point est sûrement a revoir )
on a plus vite fait de supprimer la fiche , et de la refaire ..

Le bouton [Genere] , va tout simplement générer un mot de pass qui utilisera les paramètres "Nbr de caractere" et "Level"

Le bouton [tri], permet de trier par ordre alphabetique la liste des fiches contenant le password

Le bouton [password Prg] , permet de proteger l'acces au prg par un mot de pass


Code:

;***********************************************
;Titre  :*password_generator
;Auteur  : Dobro
;Date  :11/01/2016
;Heure  :16:53:16
;Version Purebasic :  PureBasic 5.50 (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune
; info : le password est generé avec le contenu de la variable Ref.s (dans la procedure password )
; on peut y mettre ce que l'on veux comme caractere !! genre :    ref.s="01"
;***********************************************
Declare gadgetballoontooltip(windownumber.l, gadgetnumber.l, text.s)
Declare changegadgetballoontooltip(tooltip.l, gadgetnumber.l, text.s)
Declare freeballoontooltip(tooltip.l)
Declare openwindow_win()
Declare.s password(longueur, level.i)
Declare sauvegarde_fiche()
Declare charge_fiche()
Declare.s rallonge_password(pass.s,longueur_pass)
Declare.s vigenere(txt.s,pass.s,mode)
;{- Enumerations / DataSections
;{ Windows
Enumeration
      #Win
      #file
EndEnumeration
;}
;{ Gadgets
Enumeration
      #Button_pass
      #Button_gen
      #Button_sauve
      #Button_edit
      #button_supr
      #button_tri
      #Text_1
      #Text_2
      #String_nbr_car
      #String_level
      #Text_Auteur
      #String_out
      #liste
      #Text_login
      #String_Login
      #Text_pass
      #Text_titre
      #font
EndEnumeration
;}
;{ Fonts
Enumeration
      #Font_Text_titre
EndEnumeration

Structure fiche
      nom.s
      Longueur.i
      Level.i
      password.s
      login.s
EndStructure
Global NewList fiche.fiche()
Global Button_gen_Tooltip,level.i,longueur.i,nom_pass.s,index
Global Clef.s="dobro" ; clef qui sert a l'encryptage/decryptage
; on lit le fichier de mot de pass
OpenFile(#file,"pass.inf") ; on le lit
      pass_gen.s=ReadString(#file)
CloseFile(#file)
pass_gen.s=vigenere(pass_gen.s,clef.s,0)
p.s=InputRequester("Question","entrez le mot de pass","",#PB_InputRequester_Password)
If p.s<>pass_gen.s
      End
EndIf
;}
OpenWindow_Win()
charge_fiche()
;{- Event loop
Repeat
      Event = WaitWindowEvent(12)
      Select Event
            ; ///////////////////
            Case #PB_Event_Gadget
            Select EventGadget()
                  Case #Button_gen
                  longueur.i=Val(GetGadgetText(#String_nbr_car)) ; recup la longueur
                  level.i=Val(GetGadgetText(#String_level)) ; recupe le level ...et zou²
                  passwrd.s=password(longueur.i, level.i) ; genere le passwords
                  SetGadgetText(#String_out,passwrd.s)
                  ;;SetGadgetText(#string_login,login.s)
                  ;;SetClipboardText(passwrd.s)
                  Case #Text_1
                  Case #Text_2
                  Case #String_nbr_car
                  longueur.i=Val(GetGadgetText(#String_nbr_car))
                  Case #String_level
                  level.i=Val(GetGadgetText(#String_level))
                  Case #Text_Auteur
                  Case #button_tri
                  SortStructuredList(  Fiche(),#PB_Sort_Ascending |#PB_Sort_NoCase  , OffsetOf(Fiche\nom.s), TypeOf(Fiche\nom.s) )                  
                  
                  ClearGadgetItems(#liste)
                  ForEach Fiche()
                        AddGadgetItem(#liste,-1, fiche()\nom.s)
                  Next
                  Sauvegarde_fiche()
                  
                  Case #Button_pass
                  pass_gen.s=InputRequester("Question","entrez un mot pass pour proteger vos données","",#PB_InputRequester_Password)
                  pass_gen.s=vigenere(pass_gen.s,clef.s,1)
                  OpenFile(#file,"pass.inf",#PB_Ascii  )
                        WriteStringN(#file,pass_gen.s,#PB_Ascii  )
                  CloseFile(#file)
                  MessageRequester("Info","Ok mot de pass Sauvé")
                  Case #String_out
                  Case #String_Login
                  Case #liste
                  If GetGadgetState(#liste)<>-1
                        index=GetGadgetState(#liste)
                        SelectElement(Fiche(),index)
                        SetGadgetText(#String_level,Str(fiche()\Level.i))
                        SetGadgetText(#String_nbr_car,Str(fiche()\Longueur.i))
                        SetGadgetText(#String_out,fiche()\password.s)
                        SetGadgetText(#string_login,fiche()\login.s)
                  EndIf
                  Case #Button_sauve
                  nom_pass.s=""
                  nom_pass.s = InputRequester("nom de la fiche", "entrez un nom pour cette fiche","")
                  AddGadgetItem(#liste,-1, nom_pass.s )
                  AddElement(fiche())
                  fiche()\nom.s=nom_pass.s   ; recup le nom de la fiche
                  fiche()\Longueur.i=Val(GetGadgetText(#String_nbr_car)) ; recup la longueur
                  fiche()\Level.i=Val(GetGadgetText(#String_level)) ; recupe le level
                  fiche()\password.s=GetGadgetText(#String_out); recup le password
                  fiche()\login.s=GetGadgetText(#string_login); recup le login
                  Sauvegarde_fiche()
                  charge_fiche()
                  Case #button_edit
                  nom_pass.s="": Resultat$=""
                  If GetGadgetState(#liste)<>-1
                        index=GetGadgetState(#liste)
                        Resultat$ = GetGadgetItemText(#liste,index)
                        nom_pass.s = InputRequester("nom de la fiche", "entrez un nom pour cette fiche", Resultat$)
                        If nom_pass.s<>""
                              RemoveGadgetItem(#liste,index)
                              SetGadgetItemText(#liste, index, nom_pass.s)
                              SelectElement(fiche(), index)
                              fiche()\nom.s=nom_pass.s  ; pose le nom dans la fiche
                              Sauvegarde_fiche()
                              charge_fiche()
                        EndIf
                  Else
                        MessageRequester("info,","selectionnez un element dans la liste avant edition .")
                  EndIf
                  Case #button_supr
                  If GetGadgetState(#liste)<>-1
                        index=GetGadgetState(#liste)
                        Resultat$ = GetGadgetItemText(#liste,GetGadgetState(#liste))
                        If Resultat$ <>""
                              RemoveGadgetItem(#liste,index)
                              SelectElement(fiche(),  index)
                              DeleteElement(fiche())
                              Sauvegarde_fiche()
                              charge_fiche()
                        EndIf
                  Else
                        MessageRequester("info,","selectionnez un element dans la liste avant suppression .")
                  EndIf
            EndSelect
            ; ////////////////////////
            Case #PB_Event_CloseWindow
            Select EventWindow()
                  Case #Win
                  Sauvegarde_fiche()
                  CloseWindow(#Win)
                  Break
            EndSelect
      EndSelect
ForEver
;
;}
; Zone procedures
; Create tooltip
Procedure GadgetBalloonToolTip(WindowNumber.l, GadgetNumber.l, Text.s)
      Protected Tooltip.l, Balloon.TOOLINFO
      Tooltip = CreateWindowEx_(0, "ToolTips_Class32", "", #WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON, 0, 0, 0, 0, WindowID(WindowNumber), 0, GetModuleHandle_(0), 0)
      SendMessage_(Tooltip, #TTM_SETTIPTEXTCOLOR, GetSysColor_(#COLOR_INFOTEXT), 0)
      SendMessage_(Tooltip, #TTM_SETTIPBKCOLOR, GetSysColor_(#COLOR_INFOBK), 0)
      SendMessage_(Tooltip, #TTM_SETMAXTIPWIDTH, 0, 180)
      Balloon\cbSize = SizeOf(TOOLINFO)
      Balloon\uFlags = #TTF_IDISHWND | #TTF_SUBCLASS
      If IsGadget(GadgetNumber)
            Balloon\hwnd = GadgetID(GadgetNumber)
            Balloon\uId = GadgetID(GadgetNumber)
      Else
            Balloon\hwnd = GadgetNumber
            Balloon\uId = GadgetNumber
      EndIf
      Balloon\lpszText = @Text
      SendMessage_(Tooltip, #TTM_ADDTOOL, 0, @Balloon)
      ProcedureReturn Tooltip
EndProcedure
; Change tooltip text
Procedure ChangeGadgetBalloonToolTip(Tooltip.l, GadgetNumber.l, Text.s)
      Protected Balloon.TOOLINFO
      Balloon\cbSize = SizeOf(TOOLINFO)
      Balloon\uFlags = #TTF_IDISHWND | #TTF_SUBCLASS
      If IsGadget(GadgetNumber)
            Balloon\hwnd = GadgetID(GadgetNumber)
            Balloon\uId = GadgetID(GadgetNumber)
      Else
            Balloon\hwnd = GadgetNumber
            Balloon\uId = GadgetNumber
      EndIf
      Balloon\lpszText = @Text
      SendMessage_(Tooltip, #TTM_ADDTOOL, 0, @Balloon)
EndProcedure
; Free tooltip
Procedure FreeBalloonTooltip(Tooltip.l)
      DestroyWindow_(Tooltip.l)
EndProcedure
;
;}
Procedure OpenWindow_Win()
      LoadFont(#font,"Arial",10,#PB_Font_Bold       )
      x_espace=100 :y_espace=50
      If OpenWindow(#Win, 583, 160, 308+x_espace, 390+y_espace, "password_generator", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
            ;If CreateGadgetList(WindowID(#Win))
            ButtonGadget(#button_tri, 215+x_espace, 305, 85, 25, "Tri")
            ButtonGadget(#Button_pass, 215+x_espace, 345, 85, 25, "password prg")
            ButtonGadget(#Button_gen, 215+x_espace, 60, 85, 25, "Genere")
            ButtonGadget(#Button_sauve, 220+x_espace, 150, 85, 25, "Sauve")
            ButtonGadget(#Button_edit, 220+x_espace, 180, 85, 25, "Edit")
            ButtonGadget(#button_supr, 220+x_espace, 210, 85, 25, "Supr")
            TextGadget(#Text_1, 0, 65, 75, 20, "Nbr Caracteres:")
            TextGadget(#Text_2, 115, 65, 35, 20, "Level :")
            StringGadget(#String_nbr_car, 75, 60, 30, 20, "6", #PB_String_Numeric)
            StringGadget(#String_level, 150, 60, 25, 20, "1", #PB_String_Numeric)
            TextGadget(#Text_Auteur, 0, 370+y_espace, 50, 20, "By Dobro")
            StringGadget(#String_out, 70, 120, 230, 20, "")    
            ListViewGadget(#liste, 10, 145, 200+x_espace, 220+y_espace)            
            SetGadgetFont(#liste, FontID(#font))
SetGadgetColor(#liste, #PB_Gadget_BackColor ,RGB(136,213,0))

            TextGadget(#Text_login, 25, 90, 35, 20, "Login")
            StringGadget(#String_Login, 70, 90, 230, 20, "")
            
            TextGadget(#Text_pass, 20, 120, 40, 20, "Passwrd")
            TextGadget(#Text_titre, 45, 5, 225, 35, "PassWord_Generator", #PB_Text_Center)
            ; Gadget Fonts
            SetGadgetFont(#Text_titre, LoadFont(#Font_Text_titre, "Microsoft Sans Serif", 14, #PB_Font_HighQuality))
            ;EndIf
      EndIf
EndProcedure
Procedure.s password(longueur, level.i)
      ;by Dobro   
      ref.s="abcdABC34DEFGefgh_0129ijklmnopMNOPqrstu56$@&%78vUXYZVWwxyzHIJKLQRST" ; les caracteres qui vont composer le passWord; ça peut etre n'importe quoi !! (hehe)
      long_ref=Len(ref.s)-CountString(ref.s,",")
      RandomSeed(level.i)
      For i=1 To  longueur   
            ;
            ; prends une lettre au hasard dans Ref.s
            de=Random(long_ref,1)
            car.s=Mid( ref.s,de,1) : cari.i=Asc(car.s)
            ;
            text_sorti.s=text_sorti.s+car.s  ;
      Next i
      ProcedureReturn text_sorti.s
EndProcedure
Procedure Sauvegarde_fiche()
      If FileSize("fiches_password.inf")<>-1
            DeleteFile("fiches_password.inf", #PB_FileSystem_Force)
      EndIf
      OpenFile(#file,"fiches_password.inf"  )
            ForEach  fiche()
                  encode=1
                  Select Encode
                        Case 1
                        ;nom.s=Encode_text(8,clef.s,fiche()\nom.s)
                        nom.s=vigenere(fiche()\nom.s,clef.s,1)
                        WriteStringN(#file,nom.s  )  ; ecrit le nom de la fiche
                        ;   Longueur1.s=Encode_text(8,clef.s,str(fiche()\Longueur.i))
                        Longueur1.s=vigenere(Str(fiche()\Longueur.i),clef.s,1)
                        WriteStringN(#file,Longueur1.s  ); ecrit la longueur
                        ;   Level1.s =Encode_text(8,clef.s,str(fiche()\Level.i ))
                        Level1.s =vigenere(Str(fiche()\Level.i ),clef.s,1)
                        WriteStringN(#file,Level1.s   ); ecrit le level
                        ;password1.s=Encode_text(8,clef.s,fiche()\password.s)
                        password1.s=vigenere(fiche()\password.s,clef.s,1)
                        WriteStringN(#file,password1.s  ) ; ecrit le password
                        ;login1.s=Encode_text(8,clef.s,fiche()\login.s)
                        login1.s=vigenere(fiche()\login.s,clef.s,1)
                        WriteStringN(#file,login1.s  ) ; ecrit le password
                        Case 0; pour eventuellement sauver tout en clair !!
                        nom.s=fiche()\nom.s
                        WriteStringN(#file,nom.s  )  ; ecrit le nom de la fiche
                        Longueur1.s=Str(fiche()\Longueur.i)
                        WriteStringN(#file,Longueur1.s  ); ecrit la longueur
                        Level1.s =Str(fiche()\Level.i )
                        WriteStringN(#file,Level1.s   ); ecrit le level
                        password1.s=fiche()\password.s
                        WriteStringN(#file,password1.s  ) ; ecrit le password
                        login1.s=fiche()\login.s
                        WriteStringN(#file,login1.s  ) ; ecrit le password
                  EndSelect
            Next
      CloseFile(#file)
EndProcedure
;
Procedure charge_fiche()
      ClearGadgetItems(#liste)
      If FileSize("fiches_password.inf")<>-1
            OpenFile(#file,"fiches_password.inf" )
                  compteur=0
                  ClearList(Fiche())
                  While Eof(#file) = 0
                        AddElement(fiche())
                        charge_clair=1 ; ici mettre a 0 pour charger une fiche non crypté (ancien code )
                        If charge_clair=1
                              fiche()\nom.s=vigenere(ReadString(#file),clef.s,0)
                              fiche()\Longueur.i=Val(vigenere(ReadString(#file),clef.s,0))
                              fiche()\Level.i=Val(vigenere(ReadString(#file),clef.s,0))
                              fiche()\password.s=vigenere(ReadString(#file),clef.s,0)
                              fiche()\login.s=vigenere(ReadString(#file),clef.s,0)
                        Else
                              ;pour rendre compatible avec l'ancienne version , charge la fiche non crypté
                              fiche()\nom.s=ReadString(#file  )    ; ecrit le nom de la fiche
                              fiche()\Longueur.i=Val(ReadString(#file  ));lit la longueur
                              fiche()\Level.i=Val(ReadString(#file  )); lit le level
                              fiche()\password.s=ReadString(#file  ) ; lit le password            
                              fiche()\login.s=ReadString(#file  ) ; lit le login
                        EndIf
                        
                        ; affiche dans la liste
                        AddGadgetItem(#liste, compteur, fiche()\nom.s)
                        compteur=compteur+1
                  Wend
            CloseFile(#file)
            
      EndIf
EndProcedure
;
Procedure.s rallonge_password(pass.s,longueur_pass)
      ; By Zorro
      ; le but de cette procedure, est de rallonger un mot de pass en prenant des lettres de ce mot de pass
      ; de la sorte, on peut avoir un mot de pass aussi long que le truc qu'on encode/decode
      ; ce qui garantie un quasi inviolabilité du codage :o)
      Protected passwrd.s,long
      RandomSeed(8) ; <<<< ceci pour etre sur qu'avec un mot de pass precis, on est toujours le meme résultat une fois rallongé !! (pour le decodage c'est mieux LOL )
      ; par exemple avec le pass "Soleil" et la longueur 23 on aura toujours ceci de genréré : "SoleilieoeSeiolollilieS"  :o)
      long= Len(pass.s)-1      
      If long<longueur_pass            
            manque=(longueur_pass-long)-1
            passwrd.s=pass.s
            For y= 1 To manque
                  pos=Random(long,1)                  
                  passwrd.s=passwrd.s+Mid(pass.s,pos,1)               
            Next y
            ProcedureReturn passwrd.s
      Else
            ProcedureReturn pass.s
      EndIf
EndProcedure

Procedure.s Vigenere(txt.s,pass.s,mode)
      ; By Zorro
      ; ici j'utilise un alphabet tres classique, mais le mieux serai de melanger les lettres de l'alphabet
      ; pour ne pas rendre prévisible l'emplacement de telle ou telle lettre ;o)
      ; tout caractere n'etant pas dans l'alphabet , est utilisé telquel (je prends son code Ascii)
      ; j'ai Ajouté l'espace, pour  ne pas avoir une découpe des mots qui aparaitrait dans le resultat codé :o)
      Alphabet.s="abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
      sortie.s=""
      If Len(pass.s)<Len(txt.s)
            pass.s=rallonge_password(pass.s,Len(txt.s))
      Else
            pass.s=Left(pass.s,Len(txt.s))
      EndIf
      Select mode
            Case 1 ; Action encodage            
            For p=1 To Len(txt.s)
                  car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
                  car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))
                  car_encode=(car_clair+car_pass)
                  If car_encode >Len(Alphabet.s)
                        car_encode=car_encode-Len(Alphabet.s)
                  EndIf
                  If car_clair=0               
                        sortie.s=sortie.s+Mid(txt.s,p,1)
                  Else
                        sortie.s=sortie.s+Mid(Alphabet.s,car_encode,1)
                  EndIf
                  
            Next p
            Case 0 ; Action décodage
            For p=1 To Len(txt.s)
                  car_clair=FindString(Alphabet.s,Mid(txt.s,p,1))
                  car_pass=FindString(Alphabet.s,Mid(pass.s,p,1))   
                  
                  car_decode=(car_clair-car_pass)
                  If car_decode<1:car_decode=Len(Alphabet.s)+car_decode   :EndIf
                  If car_clair=0                  
                        sortie.s=sortie.s+Mid(txt.s,p,1)
                  Else
                        sortie.s=sortie.s+Mid(Alphabet.s,car_decode,1)
                  EndIf
            Next p
            
      EndSelect
      
      ProcedureReturn sortie.s
EndProcedure
; Epb

_________________
Image
Image
Site: http://stline.ddns.net/STLINE/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Dernière édition par Zorro le Lun 27/Nov/2017 17:17, édité 11 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: password Generator
MessagePosté: Ven 19/Aoû/2016 14:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1930
suite a correction de ma procedure Vigenere()
j'ai aussi mis a jour ce code :)

_________________
Image
Image
Site: http://stline.ddns.net/STLINE/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: password Generator
MessagePosté: Sam 20/Aoû/2016 9:13 
Hors ligne

Inscription: Mar 22/Mar/2016 10:12
Messages: 284
Localisation: En France
Merci pour ce partage


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: password Generator
MessagePosté: Lun 27/Nov/2017 16:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1930
Ajout dans le code d'un bouton [Tri]
qui permet de trier par ordre alphabetique la liste des passwords

modification du bouton [Edit] qui permet maintenant de vraiment éditer une fiche password
en remplaçant celle existante (avant ça ajoutait, il fallait ensuite effacer l'ancienne )

j'ai Grossi les caractères de la liste des fiches car je n'y voyais plus rien :mrgreen:
et mis un peut de couleur car j'aime bien le vert ... :)

n'oubliez pas de personaliser la chaine contenant les caracteres qui servent a la generation du mot de pass (Ligne 373)
on peut mettre ce qu'on veux , par exemple si vous mettez que "01" ça va vous generer des mots de pass type binaire :)

a savoir, on peut aussi entrer ses propres mots de pass , a la main sans faire generer , ils seront sauvés lorsque vous quitterez le prg
ou bien en utilisant le bouton [Tri]

le bouton [Password Prg] permet de proteger votre liste de mots de pass par un passwords (password d'acces au prg )
la liste des mots de pass etant sauvée "codé" Vigenere ....

pour info , le password d'acces au prg est sauvé dans un fichier a coté du prg, si ce fichier est effacé
ça permet d'avoir acces au prg quand meme...(et donc de pouvoir avoir acces a nos passwords)
j'ai laissé volontairement cette faille facilement corrigeable
pour pouvoir acceder quand meme a notre liste de mots de pass , si on a oublié le passord d'acces au prg ....

_________________
Image
Image
Site: http://stline.ddns.net/STLINE/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: password Generator
MessagePosté: Lun 27/Nov/2017 18:12 
Hors ligne

Inscription: Jeu 05/Fév/2009 17:58
Messages: 815
Cool Zorro :lol:


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: password Generator
MessagePosté: Lun 27/Nov/2017 19:29 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 1930
Merci :)

_________________
Image
Image
Site: http://stline.ddns.net/STLINE/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 6 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye