Design Web Patterns for JavaCards (A PATTERN ORIENTED LIGHTWEIGHT MIDDLEWARE FOR SMARTCARDS) version du 10/Octobre/2004 jm Douin, Cnam/cédric 1
Sommaire JavaCard comme «WebServices» Ou la programmation Java côté serveur(javacard) Architecture «orientée objet» et Composite Gestion d un grand nombre de JavaCard, structuration, hiérarchie, Parcours distribué et Visiteur Mise à jour, interrogations globales ou sélectives, Exemples Deux TPs au Cnam Extensions Toujours possibles 2
Bibliographie(points d entrées) Publications : http://jfod.cnam.fr/tp_cdi/douin/collabpatterns.pdf et http://jfod.cnam.fr/tp_cdi/douin/cardis04.pdf Routaboul Joël, Lebougre Hervé. Présentation Java Card. ValeurC ISTR 04/2003 http://jfod.cnam.fr/tp_cdi/routaboul/javacard.pdf Barber, J. (1999) The Smart Card URL Programming Interface. Gemplus Developer Conference, http://www.microexpert.com/smartcardurl.html Di Georgio R. Develop, build, and test Java Card applications http://www.javaworld.com/javaworld/jw-04-1998/jw-04-ibuttons_p.html Harald Vogt, Michael Rohs, Roger Kilian-Kehr, Middleware for Smart Cards Chapter 16 of the book Middleware for Communications, John Wiley & Sons 2004 http://www.inf.ethz.ch/vs/publ/papers/chapter-16-mw4scs-webversion-031006.pdf Guthery, S., Kehr, R., Posegga, J. (2000) How to turn a GSM SIM into a Web Server. IFIP CARDIS 2000. Rees, J., Honeyman, P. (2000) Webcard: A Java Card Web Server. IFIP CARDIS 2000, CITI TechReport 99-3. http://smarty.citi.umich.edu/. // un serveur Web sur une JavaCard actif depuis plusieurs années Itoi, N., Fukuzawa, T., Honeyman, P. (2000) Secure Internet Smartcards. Java Card Workshop, Cannes, CITI Tech Report 00-6. Chen Sun Zhiqun Chen, Java Card Technology for Smart Cards - Architecture and Programmer's Guide, Addison- Wesley, ISBN 0-201-70329-7 http://www.javaworld.com/javaworld/jw-07-1999/jw-07-javacard_p.html http://java.sun.com/products/javacard/ http://java.sun.com/developer/books/consumerproducts/javacard/index.html Ortiz, Enrique, An Introduction to Java Card Technology http://developers.sun.com/techtopics/mobility/javacard/articles/javacard1/ /javacard2/ /javacard3/ Donsez, D. Transparents des cours http://www-adele.imag.fr/~donsez/cours/#smartcard Brazil http://www.experimentalstuff.com Dallas/JavaCard http://www.ibutton.com/ibuttons/java.html 3
Protocole HTTP Objectifs Intergiciel/middleware léger Les JavaCard sont accessibles depuis le Web Une URL par Applet/Cardlette Quel environnement? Postulat : Toute machine possède un serveur Web «Contraintes» matérielles Serveur Web de petite taille < 50 ko Station, PC, Cartes TINI, Tout type de JavaCard, smartcard 4
JavaCard comme «WebServices» internet Serveur HTTP PC Ajout, retrait Lecteur de cartes Applet == servlette est une des conséquences Une JavaCard devient un ensemble «mobile» de servlettes 5
Prototypes au Cnam Environnement matériel JavaCard de dallas compatible API JavaCard 2.0 Lecteurs sur ports séries et USB Cartes TINI 1-Wire natif PC, Station banalisées PocketPC, contrôle temporaire développements en cours avec d autres JavaCard API2.1(Shareable), API 2.2 (jcrmi) smart-cards OpenCard Framework, PC/SC 6
HTTP <-> APDU http PC ou adresse IP handler ou servlette javacardid ={jc1 jc2 jc3} AppletID = nom de la servlettejc PC /handler/ APDU Lecteur de cartes jc1 jc2 jc3 http://pc/handler/javacardid/appletid/ http://pc/handler/javacardid/appletid/?param=valeur AppletID de 5 à 16 caractères 7
HTTP <-> APDU Applet== servlette Premiers bénéfices escomptés Programmation JavaCard est-elle simplifiée? Nouvelles applications? Une seule classe d Applet Un seul point d entrée Unique format des paramètres en entrée comme en sortie HTTP = Couplage faible? http APDU Lecteur de cartes PC /handler/ jc1 jc2 jc3 http://pc/handler/javacardid/appletid/?clé=valeur http://pc/handler/jc1/crypter/?param=texte 8
HTTP<-> APDU Depuis le PC/Proxy Un exemple de requête (voir en annexe) http://pc/handler/jc1/crypter/?param=texte jc1.select("crypter"); byte[] DataIn = new byte{ {, p, a, r, a, m, =,, t, e, x, t, e, } }; response = jc1.sendapdu(new CommandAPDU(0, 0, 0, DataIn, 0); result = new String(response.getDataOut()); 9
HTTP<-> APDU Depuis la JavaCard Un exemple de servlette (voir en annexe) Requête : http://pc/handler/jc1/crypter/?param=texte apdudata = Réception des données (de type byte) //Toujours le même point d'entrée, if( buffer[iso.offset_ins] == SERVLET_METHOD){ byte[] texte = extrairebytearray(apdudata, param); if(texte!=null){ // traitement associé ici du cryptage 10
Mise en Œuvre du Proxy Serveur Web sur une station, TINI, PocketPC, De petite taille Portable Opensource Une seule servlette d accès aux javacard 11
Serveur Web Brazil : pour l embarqué Serveur Web sur carte TINI < 50 ko Sources Java disponibles, Ses 3 composantes Handler Servlettes légères, 2 méthodes : init et respond Filter Filtrage des transactions entre «handler» Templates Étiquettes XML, interprétées par le serveur avant l envoi d une page HTML aux clients 12
Serveur Web = Brazil Un handler Brazil assure l interface HTTP/APDU Un filtre/template assure l interprétation des balises venant des JavaCard Adéquation URL JavaCard L URL précise la javacard ainsi que la servlette Les paramètres de l URL sont transmis tels quels aux servlettes de la JavaCard JavaCard HTML Les servlettes de la JavaCard retournent un texte HTML, retourné au navigateur ou à une application cliente distante (ou locale) 13
Ou tout autre serveur (de petite taille) Un moteur de servlettes conviendrait Ex. le moteur de servlettes pour TINI n importe quel serveur HTTP ferait un bon candidat! Protocole HTTP/APDU Seul le format des paramètres destinés aux JavaCard est à respecter 14
Couplage faible Une JavaCard est un ensemble de servlettes Un ensemble de servlettes peut remplacer une JavaCard internet internet Serveur HTTP PC Serveur HTTP PC portail Ajout, retrait Lecteur de cartes internet Serveur HTTP servlettes 15
HTTP <-> APDU, quelques questions Quels sont paramètres pour une servlette? Comment découvre-t-on ces paramètres? Mobilité quelles sont les conséquences? Une JavaCard est mobile donc les servlettes sont mobiles Interaction avec l hébergeur comment? Variables partagées? Entre l hébergeur et une javacard, entre 2 javacard Exclusion mutuelle? Accès protégé à une javacard, à une servlette 16
URL et paramètres Quels sont paramètres pour une servlette? Comment les découvre-t-on? Choix effectué Paramètres ou signature = Formulaire HTML <FORM ACTION="http://PC/handler/javacardId/servletId/" > <input type="text" name="texte" size="20"> <input type="submit" name="exec" value="exec" size="10"> </FORM> Ici un seul paramètre : texte Plusieurs signatures par servlette 17
Signatures embarquées Chaque servlette contient la description des paramètres (signature) qu elle attend Plusieurs signatures par servlette sont possibles Une première implémentation : Les formulaires HTML sont compressés et embarqués Ces formulaires deviennent des signatures 18
Embarquées et compressées Méthode de compression inspiré de l algorithme des signatures des méthodes de la JVM <FORM ACTION="http://PC/handler/javacardId/servletId/" method="post" > <input type="text" name="texte" size="20"> <input type="submit" name="exec" value="exec"> </FORM> devient 5Ttexte20Sexec exec (ici codage sur 5 digits) Ou bien 2Tte20Sexex (codage sur 2 digits) Note : un outil est en http://163.173.228.80:8765/formulaire.html 19
Découverte des paramètres(1) Par convention l obtention de la signature n utilise cette URL (n>=0) Exemple : de requête : http://pc/handler/jc1/crypter/?sig=n http://pc/handler/javacardid/servletid/?sig=0 http://pc/handler/javacardid/servletid/?sig=n+1 Le nombre de formulaire est obtenu de la même manière http://pc/handler/javacardid/servletid/?nsig Note : ces implémentations sont à la responsabilité du développeur de la servlette 20
Découverte des paramètres(2) http://pc_a/handler/jc1/engras/?sig=0 Le Handler reçoit 5Ttexte20Sexec exec de jc1 Celui-ci peut le décompresser et le retourner le formulaire «original» au client Ajout, retrait handler PC_A Lecteur de cartes Ou bien http://pc_a/handler/jc1/engras/?texte=test Note : PC_A/Handler/ doit être une variable, servlettes mobiles jc1 21
Découverte des paramètres(3) Serveur HTTP PC_A Serveur HTTP PC_B Lecteur de cartes jc1 Lecteur de cartes jc1 Les JavaCard, (les servlettes) sont mobiles 22
Découverte des paramètres(4) 5Ttexte20Sexec exec devient <FORM ACTION="http://PC_B/handler/javacardId/servletId/" method="post" > <input type="text" name="texte" size="20"> <input type="submit" name="exec" value="exec"> </FORM> http://pc_b/handler/ dépend de la machine hôte C est l hébergeur qui s en charge ou bien une page html dans laquelle PC/Handler/ est un paramètre 23
URL paramétrée Une technique classique ( programmation coté serveur) : une des servlettes propose le formulaire attendu <tag>form action=<get URLHandler>javacardId/servletId/ </tag> <input type="text" size="40" name= "texte" value="formulaire retourné par la JavaCard"> <input type="submit" name="b1" value="exécuter servletid"> </form> balise <get URLHandler> le site d accueil + le nom du Handler Note : à essayer en http://163.173.228.80:8765/javacard/monitor/1c00900000205596/formengras2/ 24
Exemple de formulaire engendré FormEnGras2 retourne un formulaire pour EnGras2 EnGras2 est une servlette qui retourne ce <b> texte </b> Note : les 2 servlettes ne sont pas nécessairement sur la même JavaCard, le cas sur cet exemple 25
Filtre et Template bien utiles Interprétation de balises Les prédéfinies <set <sql <form <sendmail, etc SetTemplate, SqlTemplate, FormTemplate, EMailTemplate Définies par l utilisateur <user <clock <javacard ID <notify... UserTemplate, ClockTemplate, JavaCardTemplate 26
Un exemple <clock 1073414899> PC Serveur HTTP Balises délivrées par les servlettes de la JavaCard 27
Un exemple de page retournée <clock 1073414899> JavaCard ClockTemplate Hébergeur PC Serveur HTTP Client Note : voir en annexe, et à essayer en http://163.173.228.80:8765/javacard/monitor/1c00900000205596/tagclock/?tag=on 28
Un autre exemple <sql prefix=liste> select DATE,TP,NOTE from TP_CDI where MATRICULE='I044733' and tp like 'tp_' order by TP</sql> PC Serveur HTTP BDD Accès à une Base de données : une requête SQL 29
Paramètres et variables partagées Entre deux servlettes à l aide des formulaires (HTML) Champ rempli par une servlette et envoyé à une seconde servlette Ce champ est en «clair» ou «caché» <input type=hidden name= value=... Variables partagées( javacard API 2.1) En interne à l aide de l interface Shareable Encore une technique empruntée à la programmation coté serveur 30
Paramètres et variables partagées Entre une servlette et l hébergeur Balises (SetTemplate, ) <set name= value= <get name> Donc, en conséquence Variables partagées Entre deux servlettes Entre deux javacard «locales» Entre deux javacard distantes Entre une servlette et «internet» http PC APDU Lecteur de cartes variable jc1 jc2 <set.. Note : à essayer en http://163.173.228.80:8765/javacard/monitor/1c00900000205596/setparameter/ suivie de http://163.173.228.80:8765/lesjib.html 31
Accès en exclusion mutuelle Ressource partagée, Section critique sur le Web Exemple : Un classique porte-monnaie internet Serveur HTTP Client1 Client2 PC Un classique en programmation côté serveur Lecteur de cartes synchronized(servlette){ } 32
Exclusion mutuelle Implémentation Reprise de ETFA 2003, (voir pattern Itérateur) Identification du client, Association Client et Cookie Identification la servlette, lors d une requête, Association Servlette/URL et Verrou Gestion installée sur l hébergeur Par un Handler Brazil indépendant Les URLs deviennent les «objets» dont les accès peuvent être en exclusion mutuelle 33
Exclusion mutuelle et URL(1) ClientA http://site/javacardid/servletid/?beginmutex& ClientB http://site/javacardid/servletid/? beginmutex& Le clientb est bloqué ClientA http://site/javacardid/servletid/?endmutex& ClientB Le clientb peut accéder à l URL souhaitée, et entre en section critique Note: l attente contient un délai de garde et permet au clientb de poursuivre son exécution 34
Exclusion mutuelle et URL(2) Utilisation effective de http://sitec Fin du délai de garde clientb A R A R clienta A R A R D D D t A = http://sitec/?beginmutex D = http://sitec/ R = http://sitec/?endmutex Les clients sont distants en mode session 35
Exclusion mutuelle, une trace : ClientA autres requêtes, déconnexion, etc Alias de beginmutex : lock, endmutex : unlock 36
Exclusion mutuelle, une trace : ClientB Le client A possède la «ressource URL» B est bloqué Lorsque le client A libére la «ressource URL» Ou bien le délai est échu 37
Exclusion mutuelle? Que se passe-t-il si Le client bloque indéfiniment la ressource/url? Le client disparaît La JavaCard et ses servlettes sont retirées? Cette JavaCard s est déplacée Des solutions existent... voir avec l usage conjoint du modèle transactionnel JCSystem.beginTransaction(); JCSystem.commitTransaction(); JCSystem.abortTransaction(); 38
Conclusion HTTP<->APDU La conclusion de Barber 1999, Cross platform availability The use of HTTP as the communications protocol means that any browser at all can communicate with the card server. The use of Java to implement the card server means that any platform that supports a Java virtual machine can host the card server Flexibility Easy to add extra functionality in the form of modules. Remote administration is available, so module maintenance doesn't have to be the user's responsibility. Remote administration also means support and troubleshooting is easier Rapid development The use of HTTP allows parameters to be passed in a human readable form, so communication problems tend to be resolved quickly. The use of Java enables cross platform deployment without the problems traditionally associated with it. Security model considerations Responsibility for security now lies in the card server, not the browser. The card server can implement the appropriate model for its intended use, with the Java class library providing enough functionality to implement mechanisms such as code signing, access control lists and so on. 39
Conclusion HTTP<->APDU Programmation Java Côté Serveur Techniques «connues» de programmation des servlettes Retour à une programmation par les objets Adéquation servlette / instance de classes MAIS. 40
Intégration, accès depuis internet Quelle architecture pour Découverte locale des services? Ajout, retrait d une JavaCard Découverte globale des services? Depuis le Web Interrogation, mise à jour, déploiement 41
Découverte locale des services Ajout/retrait d une JavaCard Le Handler Brazil est un observateur(etfa2003) Une liste de toutes les servlettes est maintenue Commandes et gestion locales possibles http://localhost/handler/javacardid/servletid/ PC Lecteur de cartes 42
Gestion locale / HTTP, exemples Liste des commandes possibles http://pc/handler/?command=? Liste de toutes les servlettes disponibles http://pc/handler/?command=list Obtention de la version du firmware http://pc/handler/javacardid/?command=firmware Téléchargement d une servlette http://pc/handler/javacardid/servletid/?command=load Retrait d une servlette http://pc/handler/javacardid/?command=delete 43
Un exemple de gestion en local 44
La liste des servlettes Usage du formulaire ou avec cette URL depuis un navigateur ou une application http://62.147.219.116:8765/javacard/monitor/35009000003ea296/engras2/?texte=engras 45
Gestion locale ou distante / HTTP http://localhost:8765/commandes.html Tests en ligne, décembre 2003 http://vivaldi.cnam.fr:8765/commandes.html et http://lmi80.cnam.fr:8765/commandes.html et aussi http://lmi80.cnam.fr:8765/esiee/commandes.html (Cette URL est une indirection vers http://lse10.esiee.fr:8080, dont le seul client possible est lmi80, Plusieurs JavaCard sont installées dans les locaux de l ESIEE à Marne La Vallée, L accès à l une des servlettes devient http://lmi80.cnam.fr:8765/esiee/javacard/monitor/9000b000004f7296/engras2/?texte=maigre) 46
Découverte et gestion locales en 4 classes JavaCardListenerHandler HTTP <-> APDU JibServletList la liste des servlettes sur ce poste FileData Transfert de fichiers, extrait d un projet de Valeur C Formulaire Compression/Décompression d un formulaire HTML FormulaireHandler est un utilitaire accessible depuis un navigateur 47
Découverte globale des services Voir ETFA 2003 Pattern Observateur Généralisé avec le Modèle Vue Contrôleur Rappel : Environnement, postulat Tout machine possède un serveur Web ou est accessible par un portail (ayant son URL) 48
MVC Modèle Vue(s) Contrôleur, la base Evènements Contrôle Vue 1 modification Mise à jour Vue 2 Modèle 1) inscription des Vues, Modèle.addObserver( ) 2) une modification engendre une mise à jour des Vues -> Ajouts de vues et de contrôles simplifiés 49
MVC Web Evènements Contrôle Vue 1 Mise à jour http://vue1/update/?param.. Modification http://modèle/observable/notify/ Vue 2 Modèle http://vue2/update/?param... 1) inscription des Vues, http://modèle/addobserver/?url=http://vue1/update/ 2) une modification engendre les requêtes http://vue1/update/ 50
Découverte Globale Découverte sur le Web des JavaCard Ajout/retrait Une modification est effectuée La notification devient une requête HTTP Insérer une JavaCard engendre cette requête http://pc_m/notifyobservers/?observable=pc&arg=arrival_javacardid Retirer une JavaCard engendre cette requête http://pc_m/notifyobservers/?observable=pc&arg=departure_javacardid 51
Ajout/retrait de JavaCard ou servlettes internet PC_C1 Contrôle http://pc_m/notify/ http://pc_m/notify/ PC_C2 Contrôle Ajout, retrait Lecteur de cartes Ajout, retrait Lecteur de cartes 52
Le site Modèle/Web PC_M Pattern Observateur http://pc_m/ Les observateurs s inscrivent http://pc_m/notifyobservers/?url=http://pc_v1/update/ Le site reçoit une notification http://pc_m/notifyobservers/?observable=pc&arg=javacardid Les observateurs inscrits ou vues sont mis à jour http://pc_v1/update/?observable=http://pc/handler/&arg=state_javacardid STATE ::= {ARRIVAL DEPARTURE ADD_SERVLET DELETE_SERVLET DELETE_ALL_SERVLET} 53
Ajout retrait de cartes PC_V2 Vue PC_V1 Vue http://pc_v2/update/ http://pc_v1/update/ PC_M Modèle TINI PC_C3 Contrôle intranet http://pc_m/notify/ internet PC_C1 Contrôle http://pc_m/notify/ http://pc_m/notify/ PC_C2 Contrôle Ajout, retrait Lecteur de cartes Ajout, retrait Lecteur de cartes 54
PC_V1 une console/serveur Web LOG: 3 8777-163.173.228.59-63: request done LOG: 4 8777-163.173.228.59-63: socket close LOG: 4 8777-server: 163.173.228.80: new connection LOG: 3 8777-163.173.228.80-64: Request 24 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_1c00900000205596, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_1C00900000205596 LOG: 3 8777-163.173.228.80-64: request done LOG: 3 8777-163.173.228.80-64: Request 23 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_a10090000025d296, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_A10090000025D296 LOG: 3 8777-163.173.228.80-64: request done LOG: 3 8777-163.173.228.80-64: Request 22 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_6e00c00000173b96, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_6E00C00000173B96 LOG: 3 8777-163.173.228.80-64: request done LOG: 3 8777-163.173.228.80-64: Request 21 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_3900c0000018c696, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_3900C0000018C696 http://pc_v1/update/ 55
PC_V2 une applette/serveur Web Une applette peut contenir un serveur Web voir un extrait en annexe Ce serveur s installe dans n importe quel navigateur, n importe où Cette applette ne peut dialoguer qu avec le serveur dont elle est issue, ici le modèle 56
PC_V2 une applette/serveur Web http://pc_v2/update/ 57
PC_V3 une base de données/serveur Web BDD SQL PC_V3 Vue HTTP http://pc_v3/update/ Client/ navigateur HTTP internet Une table de la BDD maintient une liste : Toutes les JavaCard, Servlettes, Formulaires http://pc_v3/update INSERT INTO table VALUES(. 58
PC_V3, base de données, discussion Un table recensant toutes les JavaCard présentes Nom du propriétaire URL Formulaire(s) Informations diverses, (version, Interrogation à distance possible SQL/select, sélection (plus ou moins précise) Un exemple : 100 JavaCard * 10 Servlettes Soit 1000 URLs (au minimum) + formulaires -> Table (très,trop) volumineuse? Structuration faible, Gestion non objet, non répartie 59
PC_V4 maintenance/serveur Web PC_V4 Vue HTTP http://pc_v3/update/ internet http://pc_c1/handler/javacardid/servletid/?command=load&maj=servlet PC_C1 Contrôle Un observateur = Une autre fonctionnalité Dès l insertion, une mise à jour est effectuée Ajout, retrait Lecteur de cartes 60
Redondance, exemple PC_V2 Vue http://pc_v2/update/ PC_V1 Vue http://pc_v1/update/ PC_M1 Modèle PC_M2 Modèle http://pc_m/notify/ http://pc_m/notify/ http://pc_m/notify/ PC_C1 Contrôle PC_C2 Contrôle Ajout, retrait Lecteur de cartes Ajout, retrait Lecteur de cartes 61
Le site Modèle Défini lors de la configuration ou Peut être installé dynamiquement auprès des sites Contrôleurs Note : Une liste des serveurs inaccessibles obtenue par une variante du Pattern HeartBeat est mise en œuvre La notification peut-être conditionnelle (un filtre est transmis lors de l inscription) 62
Ajout dynamique de «modèle» Pour tous (ou certains) PC_Ci Inscrire PC_M2 comme Modèle de i=1 à n http://pc_ci/handler/?command=add& url=http://pc_m2/ 63
Le Modèle en interne Pattern Observateur, Adéquation requête HTTP/ méthodes Java usage de java.util.observable et java.util.observer http://pc_m/observable/addobserver/?url=.. Correspond à l appel addobserver(new urlrequest(url)) (un filtre appliqué aux arguments peut être transmis) http://pc_m/observable/deleteobserver/?url=.. Correspond à l appel deleteobserver(new urlrequest(url)) http://pc_m/observable/notifyobservers/?url=.. Correspond aux appels de setchanged();notifyobserver() (notification conditionnelle en utilisant le filtre) /tostring/ 64
Le Modèle en 2 Classes et 2 interfaces 65
La Vue en interne Un Handler acceptant ce type de requête HTTP ou une Applette contenant un serveur Web (dialogue avec PC_M) ou toute autre application acceptant une requête HTTP 66
Le Contrôleur en intene Un MVC en local Vue contrôle Modèle API de Dallas public void devicearrival(devicemonitorevent dme) public void devicedeparture(devicemonitorevent dme) 67
Le contrôleur en 4 classes JavaCardListener extends java.util.observable MVC Découverte locale, notification 68
Encore plus précis La version initiale assure une notification à la suite de Ajout/retrait de JavaCard, Ajout/retrait de servlettes «Remise à zéro» d une javacard Le «Grain» peut-être plus fin : Ajout/retrait d une JavaCard précise Ajout/retrait d un nom de servlette Seuil maximal de mémoire utilisée est atteint Seuil maximal du nombre de servlettes est atteint Ces observateurs peuvent être précisés dans le fichier de configuration ou ajoutés en cours d exécution 69
Premières conclusions Protocole uniforme Tout ordinateur connecté est un client/acteur Léger, portable, accessible quelques kilo-octets + 50Ko(serveur) + API Programmation Java côté serveur pour JavaCard Sécurité habituelle du Web, https, certificat,.. Cryptage/décryptage embarqués 70
Structuration et parcours Gestion d un grand nombre de serveurs? Plusieurs centaines, milliers de JavaCard? Accès sélectif? Seules quelques JavaCard sont à interroger Pour toutes les JavaCard, dès qu elles se présentent sur le réseau (intranet/internet)? Mise à jour? Déploiement, téléchargement, Distants? Sécurité? 71
Architecture orientée objet et Composite Gestion d un grand nombre de JavaCard Base de données centralisée ou Pattern Composite distribué Définition d une grammaire à l aide du Pattern Composite component ::= composite terminal composite ::= component terminal ::= [symbole] 72
Un Composite possible, ETFA 2003 73
Un Composite pour les JavaCard 74
Quelques classes ou interface public interface Visitable{ abstract public Object accept(visitor v); abstract public boolean isvisitable(string filter); } public abstract class HTTPObject implements Visitable { protected String url; abstract public String geturl(); } public boolean isvisitable(string filter){ return Glob.match(filter, geturl()); } public class Cardlet extends HTTPObject{ public Cardlet(String url){ } this.url = url; public String geturl(){ return url;} public String tostring(){return this.getclass().getname() + "_" + "_ " +geturl();} public Object accept(visitor v){ }} return v.visit(this); 75
Une des configuration(s) Une phrase issue de cette grammaire représente une configuration matérielle particulière Le découpage est logique, structuré par les clients selon leurs souhaits Architecture est (ne peut être que) configurée dynamiquement Collection collect = new Course("Clock","http://localhost:8765/"); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); Collection vivaldi = new List("vivaldi","http://vivaldi.cnam.fr:8765/"); collect.add(vivaldi); 76
MVC + Composite Comment? Un nœud du composite est un observateur d un Modèle ou le modèle lui-même Ce nœud est issu d une structuration logique des ordinateurs Ce nœud contient le Handler Brazil approprié Le client s adresse au Composite, racine ou à l un de ses composants 77
Un exemple 31 3 02 : Une salle de cours/tp au Cnam Une dizaine de PC avec lecteur Certains étudiants sont chez eux avec une JavaCard D autres utilisent à distance, les JavaCard installées en lmi80.cnam.fr 78
Une architecture possible vivaldi extérieurs lmi80 extérieurs lmi71 31-3-02 lmi72 31-3-02 «adsl» lmi73 31-3-02 lmi75 31-3-02 lmi74 31-3-02 lmi76 31-3-02 79
«Cartographie» vivaldi Collection cours = new Course("CSIML_B2","2003","http://localhost:8765/"); cours.add(new List("http://lmi80.cnam.fr:8080/"); cours.add(new List("http://lmi71.cnam.fr:80/"); cours.add(new List("http://lmi72.cnam.fr:8181/"); lmi80 Collection cours = new Group("http://localhost:8080/"); //ajout dynamique des clients «adsl» lmi71 Collection cours = new Group("http://localhost:80/"); cours.add(new List("http://lmi73.cnam.fr:81/"); cours.add(new List("http://lmi75.cnam.fr:82/"); Inscription des serveurs statique ou dynamique Fichier de configuration ou à l exécution 80
Une Requête en vivaldi http:// vivaldi extérieurs http:// http:// http:// lmi80 extérieurs lmi71 31-3-02 lmi72 31-3-02 http:// «adsl» http:// http:// http:// http:// lmi73 31-3-02 lmi75 31-3-02 lmi74 31-3-02 lmi76 31-3-02 81
Une requête en vivaldi http://adsl http://lmi80 http://lmi73 http://vivaldi http://lmi71 http://lmi75 http://lmi72 http://lmi74 http://lmi76 Collecte distribuée de tous les résultats (par exemple) Accès concurrent, parallélisme possible 82
Les classes du Composite Pattern Composite «classique» Accessible sur tous les serveurs Ajout/retrait dynamiques possibles Nécessaire aux javacard «mobiles» 83
Critiques/ réponses Critiques habituelles du Composite? À priori oui Supporte mal les modifications Ajout d un nouveau composite? Ajout d une nouvelle famille de JavaCard? Parcours : Itérateur ou Visiteur (ETFA2003) 84
Parcours distribué et Visiteur Mise à jour, Maintenance, Interrogations, Déploiement, Déclenchement de certaines servlettes 85
Un Visiteur Possible/ETFA 86
Un Visiteur possible pour JavaCard 87
La classe Visitor public abstract class Visitor{ public Object visit (HTTPObject object){ return object;} public Object visit (Cardlet cardlet){ return cardlet;} public Object visit (DS1957B ibutton){ return ibutton;} public Object visit (DS1955B ibutton){ return ibutton;} public Object visit (List list){ return list;} public Object visit (Course course){ return course;} } 88
Exemple : StringVisitor public class StringVisitor extends Visitor{ public Object visit (Cardlet cardlet){ return cardlet.tostring(); } public Object visit (DS1957B ibutton){ return ibutton.tostring(); } public Object visit (DS1955B ibutton){ return ibutton.tostring(); } public Object visit (Collection c){ } return c.tostring(); } public Object visit(list l){ return visit((collection)l);} public Object visit(course c){ return visit((collection)c);} 89
Exemple HTTPVisitor public Object visit (Cardlet cardlet){ if(cardlet.isvisitable(this.filter)) return cardlet + "[" + résultatdelaconnexion(cardlet.geturl()) + "]"; else return ""; } public Object visit (Collection c){ String str = new String("[" + c.geturl() + "_["); if(c.geturl().startswith("http://localhost")){ Iterator it = c.iterator(); while (it.hasnext()){ } } str = str + ((HTTPObject)it.next()).accept(this); if(it.hasnext()) str= str + ", "; return str + "]"; return str + résultatdelaconnexion(c.geturl() + "visit/?collection=" + c.getclass().getname()) + "]"; } public Object visit (DS1957B ibutton){return this.visit((collection)ibutton);}... 90
D autres visiteurs VisitorSave Sauvegarde d un état sur chaque machine VisitorDownServer Quels sont les serveurs qui ne répondent plus? Etc... 91
Visite distribuée Tout modèle contient un «VisitorHandler» Les ajouts sont dynamiques Un filtre permet de préciser si le nœud doit être visité 92
VisitorHandler Un Handler dédié à la visite adéquation URL <-> visite http://un_site/visit/?collection=list&filter=* http://un_site/visit/html/?collection=list&filter=* cohérence des visites, Ajout et retrait dynamiques de cardlette 93
Une requête en vivaldi http://adsl/visit/ http://lmi80/visit/ http://lmi73/visit/ http://vivaldi/visit/ http://lmi71/visit/ http://lmi75/visit/ http://lmi72/visit/ http://lmi74/visit/ http://lmi76/visit/ Visite distribuée : collecte de tous les résultats Accès concurrent 94
L exemple du composite revisité Sur le site lmi80 : Collection collect = new Course("Clock","http://localhost:8765/"); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); Collection vivaldi = new List("vivaldi","http://vivaldi.cnam.fr:8765/"); collect.add(vivaldi); System.out.println("HTTP = " + collect.accept(new HTTPVisitor())); System.out.println("String= " + collect.accept(new StringVisitor())); ou http://lmi80:8765/visit/html/?collection=course 95
Sur le site vivaldi : Un exemple, suite gr = new List("vivaldi","http://localhost:8765/"); gr.add(new Cardlet("http://163.173.228.59:8765/javacard/monitor/5000900000225F96/TB_Clock/")); 96
Visiteur : première mise en œuvre Un visiteur HTML Collecte de toutes les URLs accessibles Un visiteur HTTP Collecte de toutes les URLs accessibles http://vivaldi.cnam.fr:8765/commandes.html 97
Exemple : Visiteur HTML 98
Critiques/réponse Ajout d une nouvelle visite Ajout d un nouveau composite Version du serveur, une solution? Emploi de JavaWebStart (hors systèmes embarqués, hors TINI) 99
Exemples Deux tp au Cnam en janvier Lecture de l horloge interne à chaque JavaCard (Java ibutton) Collecte des résultats : http://../clock2/ Installation d une servlette type/un corrigé sur les javacard testées Énoncé en cours de rédaction Carte d auditeur, cryptage Lié à JFOD La javacard comme Unité de stockage de valeur, (DS2438?) Ecriture par http://./?ecrire= Lecture de la moyenne, min, max La javacard contient une page html constituée de balises html telles que <sql, <debug, <queue, <sendmail, À suivre 100
Discussion/Bilan 101
Extensions La JavaCard devient un acteur avec initiatives Premières idées : à compléter Usage de URLClassLoader http://site/javacardid/get/archive.jar http://site/javacardid/put/ post file = archive.jar Téléchargement et exécution d une archive contenu dans une JavaCard Cette archive peut contenir une application de dialogue avec les Servlettes d une ou des JavaCard 102
Une solution toute prête La Javacard contient une page HTML avec des templates adaptées <load archive.jar> URLClassLoader <execute Test.main> Instrospection ou findclass Ces templates sont analysées par le serveur, la machine hôte. A l insertion une requête HTTP particulière est effectuée 103
Un exemple lecture d informations issues d un capteur Dès son insertion au Cnam La «JavaCard» interroge et mémorise les dernières mesures du taux d humidité en 31 3 06, un ibutton DS2438 Ces mesures sont ensuite analysées (sur un autre poste) 104
Un exemple à suivre À vérifier Une javacard ou l hébergeur contient un.jnlp L archive téléchargée contient une application Usage de JavaWebStart possible? 105
Une Conclusion Programmation des JavaCard comme des serveurs Gestion d un grand nombre de JavaCard Déploiement, téléchargements facilités Communication entre deux javacard envisagée ksoap en cours de tests JXTA + TINI + JavaCard Intégration en cours de JiniCard 106
Annexes Installation des outils JavaCardListenerHandler Programmation des Servlettes Passage des Paramètres Signatures embarquées Utilitaires Extrait de l applette/serveur Web Les cookies en Java Les commandes : compilation et édition des liens 107
Installation des outils http://jfod.cnam.fr/tp_cdi/javacard/install.html Ib-IDE win32/other ftp://ftp.dalsemi.com/pub/ib-ide_2.0/ Outils indépendants (sans JavaCard) Compilation : un jdk option target 1.1 édition des liens BuilJibBlet Téléchargement depuis le Web, outil en ligne Formulaire compressé : outil en ligne 108
JavaCardListenerHandler MVC Local Global -> couplage faible Critiques Tests à faire (plusieurs utilisateurs) Accès en exclusion mutuelle à la liste des JavaCard, quelque soit le port physique utilisé 109
Programmation des servlettes Voir la bibliographie démarches Test Unitaire avec Bluej ib-ide mode simulé Enfin le Téléchargement Un exemple la servlette <B>EnGras2</B> 110
La servlette EnGras2, extraits public class EnGras2 extends Applet{ public static final byte SERVLET_METHOD = (byte)0; final static private byte SELECT_INS = (byte)0xa4; private byte[] apdudata; /* le formulaire compressé (20 octets): "5Ttexte20Sexec exec " */ private byte[] signature={'5','t','t','e','x','t','e','2','0','s','e','x','e','c',' ','e','x','e','c',' '}; private final byte[] sig ={'s','i','g'}; /* les paramètres de la servlette */ private final byte[] texte={'t','e','x','t','e'}; // public EnGras2(){/* Register this applet with the JCRE */ register();} public static void install(apdu apdu){ new EnGras2();} public void process(apdu apdu){ byte[] buffer = apdu.getbuffer(); //Determine if the applet is being selected. if((buffer[iso.offset_cla] == SELECT_CLA) && (buffer[iso.offset_ins] == SELECT_INS)){ return;} apdudata = new byte[buffer[iso.offset_lc] & 0x0FF]; short apdudataoffset = 0; 111
La servlette EnGras2, extraits short bytesread = apdu.setincomingandreceive(); //Read in the entire APDU. //Loop until all bytes have been read. while (bytesread > 0){ Util.arrayCopyNonAtomic(buffer, ISO.OFFSET_CDATA, apdudata, apdudataoffset, bytesread); apdudataoffset += bytesread; bytesread = apdu.receivebytes(iso.offset_cdata); } //Prepare the apdu for sending apdu.setoutgoing(); apdu.setoutgoinglength(max_send_length); //Toujours le même point d'entrée, if( buffer[iso.offset_ins] == SERVLET_METHOD){ byte[] txt = extrairebytearray(apdudata, texte); // /?texte=xxxxxxx&... if(txt!=null){ // texte est présent final byte[] pre={'<','b','>'}; final byte[] post={'<','/','b','>'}; sendbytearray(apdu, concat(pre,txt,post)); }else{ // est_ce la signature qui est souhaitée?? //?sig=0, seule 0 est implémentée byte[] sign = extrairebytearray(apdudata, sig); if(sign!=null && sign[0]==(byte)'0'){ sendbytearray(apdu,signature); }else{ ISOException.throwIt(ISO.SW_INS_NOT_SUPPORTED); } } // fin de la'analyse des paramètres de type CGI }else{ ISOException.throwIt(ISO.SW_INS_NOT_SUPPORTED); } } 112
Grammaire Passage des paramètres form ::= n {text other} avec n=n1 text ::= T {name} n1 size other ::= type {name} n1 {value} n1 type ::= S R H C name ::= byte value ::= byte size ::= digit digit n ::= 1 2 3 4 5 6 7 8 9 digit ::= 0 n Exemple 4Topr105Topr212Hidx 1000RRadistopScrypcryp 113
Signature embarquée, exemple <form action="http://jfod.cnam.fr" method="post"> <p><input type="submit" name="b1" value=b1> <input type="text" size="20" name="t1"> </p> </form> est compressé en 2SB1B1T120 2 le nombre significatifs de caractères pour les champs name et value S type="submit" B1 name="b1" B1 value="b1" T type="text" T1 name="t1" 20 size="20" 114
Signatures embarquées Un utilitaire en http://lmi80.cnam.fr:8765/formulaire.html http://vivaldi.cnam.fr:8765/formulaire.html Compression/Vérification Décompression d'une signature retournée par une JavaCard Le source Java (en byte[]) Le contenu d un fichier (en byte[]) 115
Compression/Vérification 116
Compression/Vérification 117
Décompression d'une signature retournée par une JavaCard 118
Le source Java (en byte[]) 119
Déclencher une servlette sur un JiB private synchronized String execute(string servletprefix, byte method, byte[] params) throws OneWireException{ ResponseAPDU response; String result = null; String appletname = extractappletname(servletprefix); OneWireContainer16 jib = (OneWireContainer16)table.get(servletPrefix); if(jib==null) throw new OneWireException("pas de servlettes, ce nom : " + servletprefix); DSPortAdapter adapter = jib.getadapter(); adapter.beginexclusive(true); adapter.setsearchalldevices(); adapter.targetallfamilies(); adapter.setspeed(dsportadapter.speed_regular); } if (jib.select(appletname).getsw() == 0x9000) { response = jib.sendapdu(new CommandAPDU((byte)0x0, method, (byte)0x0, (byte)0x0, params, (byte)0),0); if (response.getsw() == 0x9000){ if(response.getdata()==null) result = new String("success"); else result = new String(response.getData()); }else{ int errorcode = response.getsw(); result = "code failure : 0x" + Integer.toString(errorCode,16) + " soit : " + JibServletList.decodeSW(errorCode); } } adapter.endexclusive(); return result; 120
Côté servlette, schéma de programme A lire deux extraits de l ib-ide de dallas et une présentation de Sun http://jfod.cnam.fr/tp_cdi/javacard/ib-ide/helpdata/ib-idehelp/ib-idehelp/ibutton/fundamentals.html La structure d une Applet http://jfod.cnam.fr/tp_cdi/javacard/ib-ide/helpdata/ib-idehelp/ib-idehelp/ibutton/appletstructure.html Et http://developers.sun.com/techtopics/mobility/javacard/articles/javacard1/ La structure d une Servlette idem Une seule classe CLA = 0x00 à choisir (e.g. 0xA0 GSM) Un seul point d entrée Même type de paramètres 121
Côté servlette, quelques utilitaires Un seul point d entrée Extraction des paramètres en entrée http://site/handler/./?clé=valeur&clé2=valeur2 valeur est un texte, extrairebytearray public static byte[] extrairebytearray(byte[] apdudata, byte[] param) valeur2 est un entier! extraireint public static byte[] extraireint(byte[] apdudata, byte[] param) Renvoi de paramètres Utilitaires de conversion, classe Conversions public static byte[] convertinteger(int num) public static byte[] converthexa(short num) public static byte[] convertserialid(byte[] ID) 122
Paramètres de type CGI Paramètres envoyés à la Servlette Idem (ou presque) aux Paramètres en Brazil Paramètres PC(Brazil) -> Hashtable table = request.getquerydata(); Paramètres javacard apdudata ==table.tostring().getbytes(); 123
Un exemple http://lmi80.cnam.fr:8765/javacard/monitor/6e00c00000173b96/engras2/?texte=test&html=on //côté PC/hébergeur Hashtable table = request.getquerydata(); //côté JavaCard // apdudata = table.tostring().getbytes(); byte[] apdudata = new byte[]{ {, h, t, m, l, =, o, n,,,, t, e, x, t, e, =, t, e, s, t, } } 124
extraireint/javacard public static int extraireint(byte[] apdudata, byte[] param){ short i = 1;short lg = (short)param.length; // apdudata={param=valeur, param1=valeur1,...} while (i+lg < apdudata.length){ if(util.arraycompare(apdudata,i,param,(short)0,lg)==0 && apdudata[i+lg]==egal){ //if(parametres.arraycompare(apdudata,i,param,(short)0,lg)==0 && apdudata[i+lg]==egal){ //trouvé i+=lg +1; /* = */ boolean neg =false; int val=0; if(apdudata[i] == moins){i++;neg=true;} while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ val = (apdudata[i]-'0') + val*10; i++; } if(neg)return -val; else return val; /* au suivant */ }else{ i += lg; while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ i++; } i++;i++;// le blanc, ou l'accolade } } return 0; } http://jfod.cnam.fr/tp_cdi/javacard/util/parametres.java 125
extrairebytearray/javacard public static byte[] extrairebytearray(byte[] apdudata, byte[] param){ short i = 1;short lg = (short)param.length; // apdudata={param=valeur, param1=valeur1,...} while (i+lg < apdudata.length){ if(util.arraycompare(apdudata,i,param,(short)0,lg)==0 && apdudata[i+lg]==egal){ i+=lg +1; /* = */ short debut = i; while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ i++; } short fin = i; byte[] result = new byte[fin-debut]; Util.arrayCopy(apduData, debut, result, (byte)0, (byte)(fin-debut)); return result; /* au suivant */ }else{ i += lg; while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ i++; } i++;i++;// le blanc, ou l'accolade } } return null; } http://jfod.cnam.fr/tp_cdi/javacard/util/parametres.java 126
PC_V2 une applette/serveur Web http://pc_v2/update/ http://lmi80.cnam.fr:8765/applettes/consolejib.java http://lmi80.cnam.fr:8765/applettebrazil/applettehandler.java 127
Une Applette/serveur pour un navigateur, un extrait public void run(){ ServerSocket listen = new ServerSocket(this.port); while(!local.isinterrupted()){ Socket socket = null; BufferedReader in = null; DataOutputStream out = null; try{ socket = listen.accept(); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new DataOutputStream( socket.getoutputstream()); String request = in.readline(); // requête GET en première ligne StringTokenizer st = new StringTokenizer(request); String token = st.nexttoken(); if(token.equals("get")){ String paramurl = st.nexttoken(); st = new StringTokenizer(paramUrl,"/&?= "); token = st.nexttoken(); if(token.equals(this.urlprefix)){ String observable = ""; String arg = ""; while (st.hasmoretokens()){ token = st.nexttoken(" &?="); if(token.equals(this.src)) observable = st.nexttoken(" &?="); if(token.equals(this.value)) arg = st.nexttoken(" &?="); } update(observable, arg); 128
Accès aux javacard depuis une application(1) HttpJavaCardClock2.java private static String javacardclock2(string urlsensor, Properties params) throws Exception{ URL url = new URL(urlSensor); URLConnection connection = url.openconnection(); connection.setdoinput(true); connection.setdooutput(true); PrintWriter out = new PrintWriter(connection.getOutputStream()); for(enumeration e = params.keys();e.hasmoreelements();){ String key = (String) e.nextelement(); String value = (String) params.get(key); out.print(key + "=" + value); if(e.hasmoreelements()) out.print("&"); } out.close(); // lecture en retour BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream())); String result= new String(""); String inputline = in.readline(); while(inputline!= null){ result = result + inputline; inputline = in.readline(); } in.close(); return result; } 129
Accès aux javacard depuis une application(2) HttpJavaCardClock2.java Properties props = new Properties(); props.setproperty("offset",integer.tostring(offset)); s = javacardclock2( "http://localhost:8765/javacard/monitor/35009000003ea296/clock2/", props); System.out.println(" valeur retournée : " + s); props s 130
Mise en Œuvre d une Template <clock value> JavaCard ClockTemplate Hébergeur Date Client 131
La JavaCard retourne <clock valeur> }else{ int ofs = extraireint(apdudata, offset); if(ofs>0) clockoffset = ofs; // (re)définition de clockoffset souhaitée int timesec = Clock.getClock(clockOffset); byte[] time = Conversions.convertInteger(timeSec); if(extrairebytearray(apdudata, tag)!=null){ byte[] tag_clock={'<','c','l','o','c','k',' ',' ',' ',' ',' ', ',' ',' ',' ',' ',' ',' ',' ','>'}; Util.arrayCopy(time,(short)0,tag_clock,(short)7,(short)time.length); sendbytearray(apdu, tag_clock); }else{ sendbytearray(apdu, time); } } 132
L hébergeur transforme cette étiquette public class ClockTemplate extends Template { public boolean init(rewritecontext hr) { return true; } public void tag_clock(rewritecontext hr){ int jibtime = Integer.parseInt(hr.getArgs().trim()); Date d = new Date(jibTime*1000L); } String date = DateFormat.getDateInstance( DateFormat.SHORT,Locale.FRANCE).format(d) + "-" + DateFormat.getTimeInstance( DateFormat.MEDIUM,Locale.FRANCE).format(d); hr.append(date); hr.killtoken(); 133
La configuration et le résultat filtre.class=sunlabs.brazil.filter.filterhandler filtre.handler=javacard filtre.filters=filtreget filtreclock filtreget.class=sunlabs.brazil.filter.templatefilter filtreget.templates=sunlabs.brazil.template.settemplate filtreclock.class=sunlabs.brazil.filter.templatefilter filtreclock.templates=cnam.ibutton.clocktemplate 134
Un autre exemple <sendmail.. Une servlette de la JavaCard déclenche l envoi d un mél <tag>sendmail from=douin@cnam.fr to=douin@free.fr body="accès à <get URLHandler>" subject="accès JiB" cc=douin@cnam.fr /</tag> Note : à essayer en http://163.173.228.80:8765/javacard/monitor/a10090000025d296/e_mail/ 135
Encore un exemple <sql.. Une servlette de la JavaCard déclenche une requête SQL, le résultat en HTML est envoyé au client <sql prefix=liste> select DATE,TP,NOTE from TP_CDI where MATRICULE='I044733' and tp like 'tp_' order by TP</sql> <table border="2"> <caption><b>mes notes en tp_cdi</b></caption> <tr><foreach name=field list="date TP NOTE"> <td><b><property name=field></b> </td> </foreach></tr> <foreach name=index property=liste.rows> <tr> <foreach name=field list="date TP NOTE"> <td><property name="liste.tp_cdi.${field}.${index}"></td> </foreach> </tr> </foreach> </table> Note : à essayer en http://163.173.228.80:8765/javacard/monitor/a10090000025d296/mesnotestpcdi/ 136
<sql, «mes» notes en TP_CDI/JFOD La configuration de l hébergeur filtre.class=sunlabs.brazil.filter.filterhandler filtre.handler=javacard filtre.filters=bsl get clock mail BSL.class=sunlabs.brazil.filter.TemplateFilter BSL.templates=sunlabs.brazil.template.SetTemplate \ sunlabs.brazil.sql.sqltemplate \ sunlabs.brazil.template.bsltemplate #la base est installée sur vivaldi... les données JFOD de 2001-2002 BSL.query=query. BSL.sessionTable=data BSL.headers=header. BSL.driver=org.hsqldb.jdbcDriver BSL.url=jdbc:hsqldb:http://vivaldi.cnam.fr:81/BASE_EAD BSL.sqlPrefix=param. param.user=sa param.password= 137
<notify un événement> Cette balise engendre une notification à tous les observateurs du système! Évènement initié par une javacard exemple : 138
Les cookies en Java(1) Ouverture de la connexion, le cookie est repéré URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.getresponsemessage(); This.cookieID = conn.getheaderfield(cookie_from_server); int index = this.cookieid.indexof(";"); if(index >= 0) this.cookieid = this.cookieid.substring(0, index); // cookieid est de la forme cookieid=5k0jfbno6h3bcuc7sam5k Avec private static final String COOKIE_FROM_SERVER = "Set-Cookie"; Et cookieid une variable d instance 139
Les cookies en Java(2) Envoi du Cookie lors d une nouvelle connexion URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setdooutput(true); conn.setinstancefollowredirects(false); conn.setrequestproperty(cookie_to_server, cookieid); conn.getresponsemessage(); return connection.getinputstream(); Avec private static final String COOKIE_TO_SERVER = "Cookie"; 140
Les commandes compilation et édition des liens Notice en http://jfod.cnam.fr/tp_cdi/javacard/install.html Et http://jfod.cnam.fr/tp_cdi/javacard/miseenoeuvre.html Compilation javac -verbose -target 1.1 -classpath.;d:/ib-ide/classes/ibutton52.jar; d:/ib-ide/classes/base-core.jar;d:/ib-ide/classes/selector.jar EnGras2.java Génération du fichier téléchargeable java -cp buildjibblet.jar;d:/ib-ide/classes/ibutton52.jar dallas.buildjiblet -f EnGras2.class -o EnGras2.jib -d d:/ib-ide/classes/jib52.jibdb Téléchargement avec cet utilitaire http://pc/commandes.html déc 2003 PC={lmi80.cnam.fr:8765 vivaldi.cnam.fr:8765 lmi80.cnam.fr:8765/esiee/} 141
La page d accueil http://vivaldi.cnam.fr:8765 142