webmasterMemory

muqaddarmuqaddar Administrateur
juin 2005 modifié dans Vos applications #1
En tant que WebMaster, je compte faire une appli pour sauvegarder tous les passwords associés à  tous les sites.
Histoire de s'y retrouver. :-)

Pour l'instant, elle tourne mais je vais l'améliorer : feuilles et fenêtres tiroirs.

D'autre part, je me retrouve avec 2 tables donc j'ai fait 2 controlleurs avec les mêmes méthodes, et je suis s?r que c'est pas la bonne démarche. :-(
«13

Réponses

  • muqaddarmuqaddar Administrateur
    19:44 modifié #2
    Voilà, j'ai fusionné les 2 classes controllers.

    Je me retrouve confronté à un certain nombre de problèmes.
    Des méthodes tableView doublées, logique.

    - (id)tableView:(NSTableView *)aTableView 
    objectValueForTableColumn:(NSTableColumn *)aTableColumn 
    row:(int)rowIndex {
        id theRecord, theValue; 
        theRecord = [sites objectAtIndex:rowIndex];
        theValue = [theRecord objectForKey:[aTableColumn identifier]]; 
        return theValue;
    }


    - (id)tableView:(NSTableView *)aTableView
    objectValueForTableColumn:(NSTableColumn *)aTableColumn 
    row:(int)rowIndex {
        id theRecord, theValue; 
        theRecord = [serveurs objectAtIndex:rowIndex];
        theValue = [theRecord objectForKey:[aTableColumn identifier]]; 
        return theValue;
    }

    Lorsque j'ai le message [tableViewSites reloadData];
    il va vers la méthode tableView or je voudrais lui donner un paramètre en plus pour lui indiquer quoi faire dans la méthode tableView.

    En effet, le contenu des 2 méthodes n'est pas identique... On ne s'occupe pas du même tableau (serveurs ou sites)...
    Donc comment donner en paramètre le nom du tableau ?



  • TiffTiff Membre
    19:44 modifié #3
    De mémoire, tu dois pouvoir mettre une étiquette à chacun des objets de l'interface dans IB.
    Ce doit être dans la fenêtre des attributes. Mets un numéro à chacune des tables dans le champ Tag, puis, dans le code, tu as accès aux étiquettes par [aTableView tag].
    ¿ vérifier, mais c'est une piste.
    Tiens, je viens de retrouver ce que j'avais écrit à l'époque :

    - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:
        (NSTableColumn *)aTableColumn row:(int)rowIndex
    {
        int numTable = [aTableView tag];
        if (numTable == 0) {
            NSString *colonne = [aTableColumn identifier];
            Film *film = [selection objectAtIndex: rowIndex];
            return [film valueForKey: colonne]; }
        int index = [tableFilms selectedRow];
        Film *film = [selection objectAtIndex: index];
        if (numTable == 1) {
            return [[film reals] objectAtIndex: rowIndex]; }
        if (numTable == 2) {
            return [[film acts] objectAtIndex: rowIndex]; }
        return @";";
    }
  • muqaddarmuqaddar Administrateur
    19:44 modifié #4
    Ah, je sèche.

    Merci pour cette astuce, voici le code :

    - (id)tableView:(NSTableView *)aTableView 
    objectValueForTableColumn:(NSTableColumn *)aTableColumn 
    row:(int)rowIndex {

        id theRecord, theValue;
        int numTable = [aTableView tag];
       
        if (numTable == 0) theRecord = [sites objectAtIndex:rowIndex];
        else if (numTable == 1) theRecord = [serveurs objectAtIndex:rowIndex];
       
        theValue = [theRecord objectForKey:[aTableColumn identifier]]; 
        return theValue;
    }

    Aucun bug, mais l'appli ne marche que pour la première table... :-(
  • muqaddarmuqaddar Administrateur
    19:44 modifié #5
    Il y a un truc qui me turlupine.

    Je suis confronté encore au même problème d'identification de table pour la gestion d'une sheet.

    Le code :

    - (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
    {
        NSEnumerator *enumerator;
        NSNumber *index;
        NSMutableArray *tempArray = [NSMutableArray array];
        id tempObject;

        if (returnCode == NSAlertDefaultReturn) {

    enumerator = [tableViewSites selectedRowEnumerator];
    tempArray = [NSMutableArray array];

    while ((index = [enumerator nextObject])) {
        tempObject = [sites objectAtIndex:[index intValue]];
        [tempArray addObject:tempObject];
    }

    [sites removeObjectsInArray:tempArray];
    [tableViewSites reloadData];
    [self saveData];
        }
    }

    Cette fonction récupère la confirmation ou non du delete d'enregistrements, et les efface si besoin est.
    Cette fonction est appelée par 2 autres fonctions où sont envoyés les paramètres pour l'affichage de la feuille.

    Mon problème est toujours le même : comment identifier laquelle de mes tables est concernée ? Ici, je ne peux pas récupérer le tag, pas de aTableView dans la fonction.

    Plus généralement, en php, j'envoie ce genre de paramètres :
    function toto (param1, param2, param3...) {
        if (param1==titi) echo...
        else if (param2==tutu) echo...
    }

    Ici, il faudrait que param1 soit l'identification de la table, mais comment l'envoyer ?
  • muqaddarmuqaddar Administrateur
    19:44 modifié #6
    En fait, je viens de lire qu'il suffit d'identifier la table par son nom d'oultet :

        if (aTableView == tableViewSites) theRecord = [sites objectAtIndex:rowIndex];
        else if (aTableView == tableViewServeurs) theRecord = [serveurs objectAtIndex:rowIndex];

    Reste toujours le pb de l'identification dans les autres méthodes.
  • 19:44 modifié #7
    Sinon une autre solution consiste à faire une sous-classe de NSTableView qui inclus son propre datasource (et des méthodes d'accès pour les données). De cette façon, quand tu crées ta table dans IB, tu spécifies simplement que ta table est du type de ta sous-classe, et cette table gérera d'elle même son contenu. Si cette méthode t'intéresse, n'hésite pas à me contacter, et je t'envoie un fichier tout fait (enfin presque, ça manque un peu de finition ;), mais ça fonctionne nickel).
  • TiffTiff Membre
    19:44 modifié #8
    Sinon, les bindings, c'est bien. Si tu as plusieurs tables, tu crées plusieurs contrôleurs dans Interface Builder. Et pas de code.
  • muqaddarmuqaddar Administrateur
    19:44 modifié #9
    Arldon, je t'ai envoyé un message privé.

    Les bindings, je vais m'y atteler, promis Tiff, avec le tutorial de ClicCool.
  • muqaddarmuqaddar Administrateur
    octobre 2004 modifié #10
    Bon, 4 mois après, et aussi après avoir avalé de la doc en pagaille et fait pas mal de tutorials, je vous livre une première version de ma petite application (je ne sais pas si il y aura d'autres versions de celle-ci). Merci à  tous ceux qui m'ont aidé sur ce site (directement ou pas) !

    L'inconvénient avec Cocoa, c'est que l'application semble marcher, sans bug je pense, et parfois je me demande même pourquoi ça marche.  ::)

    En tout cas, je me suis bien régalé. Et c'est cool de faire un petit projet bien concret.

    Je vous rappelle le rôle de cette application. Elle se destine avant tout aux webmasters qui disposent de pleins de comptes hébergement/sites à  mémoriser. Si ils la remplissent au fur et à  mesure, ils n'auront pas besoin de passer leur temps à  chercher leurs nombreux mots de passe dans leurs papiers...

    webmasterMemory, permet de :
    - mémoriser les sites avec comptes et pass FTP, comptes et pass SQL, emails
    - mémoriser les serveurs dédiés si les sites sont hébergés dessus (login/pass du serveur...etc)
    - mémoriser les différents hébergeurs (comptes hébergement : amen, OVH...etc)

    Bien entendu, les serveurs sont en relation avec les hébergeurs et les sites avec les serveurs, sauf s'ils sont sur serveur mutualisé.
    Les données sont enregistrés dans un dossier spécial dans Application Support dans votre dossier user. L'enregistrement se fait au fur et à  mesure de la frappe comme le carnet d'adresses par exemple.

    Je sais que ça n'intéressera pas grand monde ici (ça traà®ne pas les webmasters dans le coin) mais je suis tout fier de cette première petite appli après quelques mois de cocoa. ;D

    Inutile de chercher une connection FTP, ce n'est pas le but du soft. Et ceux-ci sont déjà  très nombreux sur Mac.

    Je vous joins une capture et le programme.
    Merci de vos réactions.

    [Fichier joint supprimé par l'administrateur]
  • 19:44 modifié #11
    Nice job ;)

    Je mettrais quand même une sérieuse critique à  ce programme. Le fait d'afficher les mots de passe en clair est une erreur. Il existe bien des contextes où un ordi est à  la merci des curieux (que ce soit un portable laissé dans une bibliothèque, un ordi familial,...). Il serait bien de permettre en un clic de masquer les mots de passe, et d'exiger un mot de passe pour les avoir à  nouveau.
  • muqaddarmuqaddar Administrateur
    19:44 modifié #12
    Salut Renaud,

    C'est à  dire que le programme était destiné à  afficher les mots de passe dont on se souvient plus. Un client FTP retient les passwords également, et on peut se connecter comme on veut depuis l'ordi... Mais là , tu as raison, si quelqu'un veut nous voler le pass.

    Donc, comme tu m'as dit par chat, j'envisage de faire une preférence "password" où l'utilisateur choisit un password pour sécuriser les champ password, ainsi avec une petite icone à  côté des champs, on débloque ce champ là  et on peut le modifier ou le lire, le reste du temps, il est encodé...
  • Eddy58Eddy58 Membre
    19:44 modifié #13
    Ouai ça a l'air pas mal ton soft Oxitan :)
    Pour les passwords c'est vrai que leur sécurisation est importante, quelque soit le contexte.
    Je vais proposer l'appli à  un ami webmaster, peut-être qu'elle va lui servir.
  • muqaddarmuqaddar Administrateur
    19:44 modifié #14
    Attends que je fasse les modifs alors, Eddy. ;-)
    Merci.
  • Eddy58Eddy58 Membre
    19:44 modifié #15
    dans 1097321087:

    Attends que je fasse les modifs alors, Eddy. ;-)
    Merci.


    Ok sans problème  :D
  • nucleusnucleus Membre
    19:44 modifié #16
    dans 1097313940:
    C'est à  dire que le programme était destiné à  afficher les mots de passe dont on se souvient plus. Un client FTP retient les passwords également, et on peut se connecter comme on veut depuis l'ordi... Mais là , tu as raison, si quelqu'un veut nous voler le pass.

    Donc, comme tu m'as dit par chat, j'envisage de faire une preférence "password" où l'utilisateur choisit un password pour sécuriser les champ password, ainsi avec une petite icone à  côté des champs, on débloque ce champ là  et on peut le modifier ou le lire, le reste du temps, il est encodé...


    Avec une p'tite intégration au Keyring, et un vérouillage automatique au bout d'un certains délai écoulé, ca serait parfait!

    Moi j'utilise GNU Keyring sur Palm qui fonctionne sur ce principe..
    Il y a une même une visioneuse OSX pour les mots de passe dans le referentiel CVS..

  • muqaddarmuqaddar Administrateur
    19:44 modifié #17
    Merci pour ces infos nucleus.
    Tu peux m'en dure plus sur le keyring ? ça se rapporte au password admin ou pas ?
    merci
  • nucleusnucleus Membre
    octobre 2004 modifié #18
    dans 1097503917:

    Tu peux m'en dure plus sur le keyring ?


    Heu je voulais dire intégration OS X avec Keychain Services (à  partir de 10.2) :-\

    Il y a quelques articles sur l'ADC
    Voiçi une introduction (en anglais) avec des exemples en C (il y a une API préliminaire "pure" Objective-C, mais tu peux faire les appels en C à  partir d'Objective C malgré tout).

    dans 1097503917:
    ça se rapporte au password admin ou pas ?


    Si tu veux parler des formulaires qui te demandent une identification avant d'effectuer une opération "administrateur" (ex: lors d'une installation), c'est les Authorization Services
  • muqaddarmuqaddar Administrateur
    19:44 modifié #19
    Ok nucleus.
    Merci pour tous ces liens, je potasse dès que j'ai un moment. :-)
  • muqaddarmuqaddar Administrateur
    octobre 2004 modifié #20
    Me revoilà .

    Bon, je voudrai faire "au plus simple", c'est à  dire que je mets un petit cadenas dans mon application, et que quand je clique dessus, et bien ça me demande mon mot de passe (celui de la session en cours), si la valeur est bonne, ça me démasque mes 5 champs qui contiennent des passwords et je peux les éditer. Je veux aussi ajouter un temps en secondes (disons 5 minutes, soit 300 secondes) pour que le délai soit écoulé et que les champs soient à  nouveau masqués. On doit ensuite recliquer sur le cadenas...

    Si j'ai bien compris, je dois me servir de ça.

    Mais je patauge, toute aide serait la bienvenue. :)
  • mpergandmpergand Membre
    19:44 modifié #21
    Salut oxitan,

    Tu comprends rien avec la doc Apple ? C'est pas vrai ! T'inquiéte moi non plus  :D

    Va sur cette page Authentication and Authorization using the Security Framework et tout va s'éclaircir
  • muqaddarmuqaddar Administrateur
    19:44 modifié #22
    Ah bein là , oui la doc Apple sur ce coup je comprends rien... je commencai à  me demander si ça venait pas de l'Anglais aussi...

    Ton lien a l'air bien sympa, je commence à  lire ça, y'a aussi une petite application sympathique en bas à  télécharger.

    Merci mpergand !
  • mpergandmpergand Membre
    19:44 modifié #23
    Mais je me demande dans ton cas, si  keychainServConcepts ne serait pas la solution ?
  • muqaddarmuqaddar Administrateur
    19:44 modifié #24
    J'ai bien vu ces keychainServConcepts mais dans mon cas, ça a l'air démesuré, et c'est encore plus compliqué que les authorization services !
  • Eddy58Eddy58 Membre
    19:44 modifié #25
    Oui, pas besoin de trucs compliqués comme les keychainServ, c'est déjà  pas commode d'implémenter une fenêtre d'autorisation ! :(
    Apple aurait pu prévoir une méthode Objective-Cocoa, pour ouvrir une fenêtre ou plus fun, un sheet d'autorisation, ensuite il suffirait de vérifier la valeur retournée pour savoir si le mot de passe est correct ou pas. :)
  • muqaddarmuqaddar Administrateur
    octobre 2004 modifié #26
    C'est bien ce que je me dis depuis 8h30 Eddy... :(
    Ils ont développé un framework, mais il est balaise...
    Une sheet avec quelques arguments aurait été la bienvenue en effet...
  • mpergandmpergand Membre
    19:44 modifié #27
    Y a bien une classe Cocoa : SFAuthorization super bien documenté comme dab >:( mais finalement c'est pas plus dur en Carbon, je trouve.

    Le plus simple serait peut-être AppleScript, puisque le Trousseau d'accès est scriptable ( Keychain Scripting) mais j'y connais rien en AppleScript  :(
  • nucleusnucleus Membre
    19:44 modifié #28
    Tu veux faire quoi exactement?

    Tu veux ouvrir une sheet qui demande un identifiant et un mot de passe pour authoriser le dévérouillage de tes champs?

    Comment sont stockés tes mots de passe sur ldisque dur? Sont-ils cryptés?
  • muqaddarmuqaddar Administrateur
    19:44 modifié #29
    Tu veux ouvrir une sheet qui demande un identifiant et un mot de passe pour authoriser le dévérouillage de tes champs?


    Tout à  fait.

    En me servant du travail de Brian R. Hill (lien mpergand), j'arrive à  avoir ma boite de dialogue en cliquant sur mon cadenas, à  m'identifier, et le cadenas s'ouvre. Joie. Je peux le refermer.

    J'ai deux notifications qui surveillent l'état de l'autorisation et deux méthodes void dans lesquelles je vais changer l'état de mes champs passwords. (crypté en noir et non éditable).
    Voilà  où j'en suis.

    Mon principal soucis est que mes champs sont bindés déjà  par rapport à  un autre bouton, le setEditable est bindé (qd je clique sur edit websites). J'ai créé un outlet en plus pour ce champ, mais il risque grandement d'y avoir conflit entre le binding du bouton d'édition des champs et le cadenas qui s'occupe de masquer que les champs passwords. Vous me suivez ?



    [Fichier joint supprimé par l'administrateur]
  • muqaddarmuqaddar Administrateur
    19:44 modifié #30
    Bon, j'arrive à  faire disparaà®tre mon champ avec setHidden :)
    Quelle est la fonction qui s'occupe de mettre les cacatères en puces svp ? merci
    Je la trouve pas...
  • BruBru Membre
    19:44 modifié #31
    dans 1098710884:

    Bon, j'arrive à  faire disparaà®tre mon champ avec setHidden :)
    Quelle est la fonction qui s'occupe de mettre les cacatères en puces svp ? merci
    Je la trouve pas...


    Pas de chance, ce n'est pas une fonction qui met les caractères en puce, mais c'est une sous classe de NSTextfield qui est NSSecureTextField.

    .
Connectez-vous ou Inscrivez-vous pour répondre.