Privet | Cloud Print | Développeurs Google – Bien choisir son serveur d impression
Author: Titanfall —
Short summary: Privet est une API de découverte locale d'appareils de nuage utilisée par les services de nuage. Ce document est organisé dans les sections suivantes: Introduction: introduction à Privet Découverte: mécanismes de découverte locaux Annonces: annonces de découverte locale API: API Privet pour les périphériques cloud généraux API d'imprimante: API Privet utilisées par les imprimantes Annexe: […]
Quick overview
- Site
- Tutos GameServer
- Canonical URL
- https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/
- LLM HTML version
- https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/llm
- LLM JSON version
- https://tutos-gameserver.fr/2019/10/13/privet-cloud-print-developpeurs-google-bien-choisir-son-serveur-d-impression/llm.json
- Manifest
- https://tutos-gameserver.fr/llm-endpoints-manifest.json
- Estimated reading time
- 54 minutes (3200 seconds)
- Word count
- 10666
Key points
- Privet est une API de découverte locale d'appareils de nuage utilisée par les services de nuage.
- Ce document est organisé dans les sections suivantes: Introduction: introduction à Privet Découverte: mécanismes de découverte locaux Annonces: annonces de découverte locale API: API Privet pour les périphériques cloud généraux API d'imprimante: API Privet utilisées par les imprimantes Annexe: schémas supplémentaires 1.
- Introduction Les appareils connectés au cloud présentent de nombreux avantages.
- Ils peuvent utiliser les services de conversion en ligne, le travail hôte file d'attente lorsque l'appareil est hors ligne et accessible de partout dans le monde.
Primary visual
Structured content
Privet est une API de découverte locale d'appareils de nuage utilisée par les services de nuage. Ce document est organisé dans les sections suivantes:
Introduction: introduction à Privet Découverte: mécanismes de découverte locaux Annonces: annonces de découverte locale API: API Privet pour les périphériques cloud généraux API d'imprimante: API Privet utilisées par les imprimantes Annexe: schémas supplémentaires
1. Introduction Les appareils connectés au cloud présentent de nombreux avantages. Ils peuvent utiliser les services de conversion en ligne, le travail hôte file d'attente lorsque l'appareil est hors ligne et accessible de partout dans le monde. Cependant, avec nombreux périphériques accessibles par un utilisateur donné dans le cloud, nous devons fournir une méthode permettant de appareil le plus proche en fonction de l'emplacement. Le protocole Privet a pour objectif de lier la flexibilité des périphériques cloud avec un mécanisme de découverte local approprié, de sorte que les périphériques soient facilement découverts nouveaux environnements. Les objectifs de ce protocole sont:
rendre les périphériques cloud détectables localement enregistrer des périphériques cloud avec un service cloud associer les appareils enregistrés à leur représentation dans le nuage activer la fonctionnalité hors ligne simplifier la mise en œuvre pour que les petits appareils puissent l'utiliser
Le protocole Privet comprend 2 parties principales: découverte et API. La découverte est utilisée pour trouver le périphérique sur le réseau local, et l’API permet d’obtenir des informations sur le périphérique et effectuer des actions. Tout au long de ce document, l'appareil désigne un appareil connecté au cloud implémenter le protocole Privet. 2. découverte Discovery est un protocole basé sur zeroconf (mDNS + DNS-SD). Le périphérique DOIT implémenter IPv4 Link-Local Adresser. L'appareil DOIT être conforme aux spécifications mDNS et DNS-SD. Le dispositif DOIT effectuer la résolution des conflits de noms conformément aux spécifications ci-dessus. 2.1. type de service La découverte de service DNS utilise le format suivant pour les types de service: _applicationprotocol._transportprotocol. Dans le cas du protocole Privet, le service type pour DNS-SD devrait être: _privet._tcp L'appareil peut également implémenter d'autres types de services. Il est conseillé d'utiliser le même service nom d'instance pour tous les types de services implémentés par le périphérique. Par exemple: une imprimante peut implémentez les services "Imprimante XYZ._privet._tcp" et "Imprimante XYZ._printer._tcp". Ça va simplifier configuration pour l'utilisateur. Cependant, les clients Privet rechercheront uniquement "_privet._tcp". En plus du type de service principal, l’appareil DOIT annoncer les enregistrements PTR pour ses sous-type (s) correspondant (voir spéc. DNS-SD: "7.1. Énumération d'instances sélective (sous-types)"). Le format devrait être le suivant: _._sub.privet._tcp Actuellement, le seul sous-type de périphérique pris en charge est imprimante. Donc, toutes les imprimantes DOIVENT annoncer deux enregistrements PTR:
_privet._tcp.local. _printer._sub._privet._tcp.local.
2.2. Enregistrement TXT le Découverte du service DNS définit des champs pour ajouter des informations facultatives sur un service dans les enregistrements TXT. Un enregistrement TXT est constitué de paires clé / valeur. Chaque paire clé / valeur commence à partir du longueur octet suivi de 255 octets de texte au maximum. La clé est le texte avant le premier Le caractère "=" et la valeur correspond au texte après le premier caractère "=" jusqu'à la fin. La spécification ne permet aucune valeur dans l'enregistrement, dans ce cas, il n'y aura aucune Caractère "=" OU pas de texte après le caractère "=". (Voir spéc. DNS-SD: "6.1. Règles générales de format pour les enregistrements DNS TXT" pour le format d'enregistrement DNS TXT et "6.2. DNS-SD TXT Taille d'enregistrement "pour la longueur recommandée). Privet exige que le périphérique envoie les paires clé / valeur suivantes dans l'enregistrement TXT. Valeur clé les chaînes ne respectent pas la casse, par exemple "CS = online" et "cs = ONLINE" sont le même. Les informations contenues dans l'enregistrement TXT DOIVENT être identiques à celles accessibles via l'API / info (voir 4.1. Section API). Il est recommandé de conserver une taille d’enregistrement TXT inférieure à 512 octets. 2.2.1. txtvers Version de la structure TXT. txtvers DOIT être le premier enregistrement de la structure TXT. Actuellement la seule version supportée est 1. txtvers = 1 2.2.2. ty Fournit un nom lisible par l'utilisateur du périphérique. Par exemple: ty = Modèle d'imprimante Google Cloud Ready XYZ 2.2.3. note (optionnel) Fournit un nom lisible par l'utilisateur du périphérique. Par exemple: note = Imprimeur de lobby au 1er étage Remarque: Ceci est une clé optionnelle et peut être ignorée. Cependant, si présent, l'utilisateur DEVRAIT pouvoir modifier cette valeur. La même description DOIT être utilisée lors de l'enregistrement d'un appareil. 2.2.4. url URL du serveur auquel cet appareil est connecté (protocole compris). Par exemple: url = https: //www.google.com/cloudprint 2.2.5. type Liste de sous-types de périphérique pris en charge par ce périphérique, séparés par des virgules. Le format est: "type = _subtype1, _subtype2". Actuellement, le seul sous-type de périphérique pris en charge est imprimante. type = imprimante Chaque sous-type répertorié doit être annoncé à l'aide d'un enregistrement PTR correspondant. Pour chaque supporté service, il doit y avoir un élément correspondant. Nom du sous-type de service (._sub.privet._tcp) devrait être égal au type de périphérique ici. 2.2.6. identifiant Reference de l'appareil. Si le périphérique n'a pas encore été enregistré, cette clé doit être présente, mais la valeur devrait être vide. Par exemple:
id = 11111111-2222-3333-4444-555555555555 id =
2.2.7. cs Indique l’état actuel de la connexion du périphérique. Quatre valeurs possibles sont définies dans cette spec.
"online" indique que l'appareil est actuellement connecté au cloud. "hors ligne" indique que le périphérique est disponible sur le réseau local, mais ne peux pas parler au serveur. "connexion" indique que le périphérique effectue sa séquence de démarrage et est en train de pas encore complètement en ligne. "non configuré" indique que l'accès Internet de l'appareil n'a pas été configuré pour le moment. Cette valeur n’est pas utilisée actuellement, mais peut être utile dans les futures versions du logiciel. spécification.
Par exemple:
cs = en ligne cs = hors ligne cs = connexion
Si le périphérique a été enregistré dans un nuage, il doit vérifier au démarrage la connectivité avec serveur pour détecter son état de connexion (par exemple, appeler une API cloud pour obtenir les paramètres du périphérique). le L’équipement peut utiliser l’état de la connexion de son canal de notification (XMPP, par exemple) pour signaler cette valeur. Les périphériques non enregistrés au démarrage peuvent envoyer un ping à un domaine afin de détecter leur état de connexion (par exemple, exemple, effectuez un ping sur www.google.com pour les périphériques d’impression dans le cloud 3. Annonces Au démarrage, à l'arrêt ou au changement d'état du périphérique, le périphérique DOIT exécuter l'étape de l'annonce décrit dans la spécification mDNS. Il DEVRAIT envoyer l'annonce correspondante au moins deux fois avec un intervalle d'au moins une seconde entre eux. 3.1. Commencez Au démarrage de l'appareil, il DOIT exécuter les étapes de vérification et d'annonce décrites dans le manuel mDNS. spécification. Les enregistrements SRV, PTR et TXT doivent être envoyés dans ce cas. Il est recommandé de grouper tous les enregistrements dans une réponse DNS si possible. Si non, l'ordre suivant est recommandé: SRV, PTR, enregistrements TXT. 3.2. Fermer Lors de l’arrêt de l’appareil, il DEVRAIT essayer d’en informer toutes les parties intéressées en envoyant un message. "Au revoir paquet" avec TTL = 0 (comme décrit dans la documentation de mDNS). 3.3. Mise à jour Si l’une des informations décrites dans TXT a changé, le périphérique DOIT envoyer une mise à jour. annonce. Dans ce cas, il suffit d’envoyer le nouvel enregistrement TXT. Par exemple, après un appareil est enregistré, il DOIT envoyer une annonce de mise à jour incluant le nouvel identifiant d'appareil. 4. API Une fois qu'un périphérique cloud a été découvert, la communication client est activée avec le périphérique. directement sur le réseau local. Toutes les API sont basées sur HTTP 1.1. Les formats de données sont basés sur JSON. API les requêtes peuvent être des requêtes GET ou POST. Chaque demande DOIT contenir un "X-Privet-Token"en-tête. La SEULE demande autorisé à avoir un en-tête "X-Privet-Token" vide est la requête / privet / info (note l'en-tête DOIT toujours être présent). Si l'en-tête "X-Privet-Token" est manquant, le le périphérique DOIT répondre avec l'erreur HTTP 400 suivante: HTTP / 1.1 400 En-tête X-Privet-Token manquant. Si l'en-tête "X-Privet-Token" est vide ou invalide, le périphérique DOIT répondre avec "erreur X-Privet-Token non valide" (invalid_x_privet_token, voir la section Erreurs pour plus de détails). détails). La seule exception est l'API / info. Pour voir plus d'informations sur pourquoi cela est fait et comment les jetons voir Annexe A: Attaques XSSI et XSRF et prévention. Si une API demandée n'existe pas ou n'est pas prise en charge, le périphérique DOIT renvoyer une erreur HTTP 404. 4.1. Disponibilité de l'API Avant TOUTE API ne soit exposée (y compris l’API / info), le périphérique DOIT contacter le serveur pour vérifier paramètres locaux. Les paramètres locaux DOIVENT être préservés entre redémarre. Si le serveur n'est pas disponible, les derniers paramètres locaux connus doivent être utilisés. Si la L'appareil n'a pas encore été enregistré, il devrait suivre les paramètres par défaut. Les périphériques Cloud Print DOIVENT suivre les étapes ci-dessous pour enregistrer, recevoir et mettre à jour les paramètres locaux. 4.1.1. enregistrement Lorsque le périphérique s'inscrit, il DOIT spécifier le paramètre "local_settings", comme suit:
"actuel": "local_discovery": true, "access_token_enabled": true, "printer / local_printing_enabled": true, "printer / conversion_printing_enabled": true, "xmpp_timeout_value": 300
Les paramètres suivants peuvent être définis:
Nom de la valeur Type de valeur La description
découverte_locale booléen Indique si la fonctionnalité de découverte locale est permis. Si "false", toutes les découvertes d'API locale (y compris / info) et DNS-SD doivent être désactivées. Par Par défaut, les périphériques nouvellement enregistrés doivent passer "true".
access_token_enabled booléen (optionnel) Indique si / accesstoken API devrait être exposé sur le réseau local. Par défaut devrait être "true".
printer / local_printing_enabled booléen (optionnel) Indique si local la fonctionnalité d’impression (/ printer / createjob, / printer / submitdoc, / printer / jobstate) devrait être exposés sur le réseau local. Par défaut devrait être "true".
printer / conversion_printing_enabled booléen (optionnel) Indique si local l'impression peut envoyer le travail au serveur pour la conversion. Cela n’a de sens que lorsque l’impression locale est activée.
xmpp_timeout_value int (facultatif) Indique le nombre de secondes entre Pingles de canal XMPP. Par défaut, DOIT être 300 (5 minutes) ou plus.
Important: L’absence de valeur optionnelle indique que le la fonctionnalité correspondante est complètement non prise en charge par le périphérique. 4.1.2. Commencez Au démarrage du périphérique, le serveur doit contacter le serveur pour vérifier quelles API sont disponibles pour être exposées dans le réseau local. Pour les imprimantes connectées à Cloud Print, elles doivent appeler: / cloudprint / printer? printerid = ou / cloudprint / list / cloudprint / printer est préférable à / cloudprint / list, mais les deux fonctionneront. Cette API renvoie les paramètres actuels du périphérique, y compris les paramètres de l'API locale. La réponse du Le serveur aura le format suivant:
"paramètres locaux": "actuel": "local_discovery": true, "access_token_enabled": true, "printer / local_printing_enabled": true, "printer / conversion_printing_enabled": true, "xmpp_timeout_value": 300 , "en attente": "local_discovery": true, "access_token_enabled": true, "printer / local_printing_enabled": false, "printer / conversion_printing_enabled": false, "xmpp_timeout_value": 500
L'objet "en cours" indique les paramètres en vigueur pour le moment. L'objet "en attente" indique les paramètres à appliquer au périphérique (cet objet peut être manquant). Une fois que le périphérique voit les paramètres "en attente", il DOIT mettre à jour son état (voir ci-dessous). 4.1.3. Mise à jour Si une mise à jour des paramètres est nécessaire, une notification XMPP sera envoyée au périphérique. La notification sera dans le format suivant: /mettre à jour les paramètres À la réception d'une telle notification, le périphérique DOIT interroger le serveur pour obtenir les derniers paramètres. Les périphériques Cloud Print DOIVENT utiliser: / cloudprint / printer? printerid = Une fois que le périphérique voit la section "en attente" suite à l’API / cloudprint / printer (à démarrage ou en raison de la notification), il DOIT mettre à jour son état interne pour se souvenir du nouveau paramètres. Il DOIT appeler l'API du serveur pour confirmer les nouveaux paramètres. Pour les imprimantes en nuage, le périphérique DOIT appeler / cloudprint / update API et utiliser le paramètre "local_settings" comme pendant enregistrement. Lors de la reconnexion au canal XMPP, le périphérique DOIT appeler / cloudprint / API pour vérifier si les paramètres locaux ont été modifiés depuis la dernière fois. 4.1.3.1. Paramètres locaux en attente Le paramètre "local_settings" utilisé par le périphérique pour appeler l'API du serveur NE DOIT JAMAIS contenir section "en attente". 4.1.3.2. Paramètres locaux actuels UNIQUEMENT l’appareil peut changer la section "actuelle" des "paramètres locaux". Tout le monde changera la section "en attente" et attendra que les modifications soient apportées. propagé à la section "en cours" par le périphérique. 4.1.4. Hors ligne Lorsqu'il est impossible de contacter le serveur au démarrage, après notification, le périphérique DOIT utiliser le dernier paramètres locaux. 4.1.5. Suppression de l'appareil du service Si le périphérique a été supprimé du service (GCP par exemple), une notification XMPP sera envoyée. envoyé à l'appareil. La notification sera au format suivant: /effacer À la réception d'une telle notification, le périphérique DOIT se rendre sur le serveur pour vérifier son état. Nuage Les périphériques d’impression DOIVENT utiliser: / cloudprint / printer? printerid = Le périphérique DOIT recevoir une réponse HTTP réussie avec success = false et aucun périphérique / imprimante. la description. Cela signifie que le périphérique a été retiré du serveur et que le périphérique DOIT effacer ses informations d’authentification et passer en mode de paramètres d’usine par défaut. TOUTE heure à laquelle le périphérique reçoit une réponse indiquant qu'il a été supprimé à la suite de la / cloudprint / API (démarrage, notification des paramètres de mise à jour, ping quotidien), elle DOIT supprimer ses informations d'identification et aller en mode par défaut. 4.2. API / privet / info L'info API est OBLIGATOIRE et DOIT être implémentée par tous les appareils. C'est une requête HTTP GET pour "/ privet / info" url: GET / privet / info HTTP / 1.1 L'API info renvoie des informations de base sur un périphérique et les fonctionnalités qu'il prend en charge. Cette API NE DOIT jamais changer l’état du dispositif ni effectuer aucune action, car il est vulnérable aux attaques XSRF. C'est la SEULE API autorisée à avoir un en-tête "X-Privet-Token" vide. Les clients devraient API call / privet / info avec en-tête "X-Privet-Token" définie sur X-Privet-Token: "" L'API info DOIT renvoyer des données cohérentes avec les données disponibles dans l'enregistrement TXT lors de la découverte. 4.2.1. Contribution / privet / info L'API n'a pas de paramètre d'entrée. 4.2.2. Revenir L'API / privet / info renvoie des informations de base sur le périphérique et les fonctionnalités prises en charge. La colonne TXT indique le champ correspondant dans l’enregistrement DNS-SD TXT.
Nom de la valeur Type de valeur La description SMS
version chaîne Version la plus récente (major.minor) de l'API prise en charge, actuellement 1,0
Nom chaîne Nom lisible par l'homme du périphérique. ty
la description chaîne (facultatif) Description de l'appareil. DEVRAIT être modifiable par utilisateur. Remarque
url chaîne URL du serveur avec lequel cet appareil parle. L'URL DOIT inclure spécification du protocole, par exemple: https://www.google.com/cloudprint. url
type liste de chaînes Liste des types d'appareils pris en charge. type
identifiant chaîne Identifiant de périphérique, vide si le périphérique n'a pas encore été enregistré. identifiant
état_périphérique chaîne Etat de l'appareil.tourner au ralenti signifie que l'appareil est prêtEn traitement signifie que le périphérique est occupé et que les fonctionnalités peuvent être limitées pendant un certain temps arrêté signifie que l'appareil ne fonctionne pas et que l'intervention de l'utilisateur est requise
état_connexion chaîne Etat de la connexion au serveur (base_url) en ligne – connexion disponible hors ligne – pas de connection de liaison – effectuer les étapes de démarrage pas configuré – la connexion n'a pas encore été configurée Un périphérique enregistré peut signaler son état de connexion en fonction de l'état de la notification. canal (par exemple, l'état de la connexion XMPP). cs
fabricant chaîne Nom du fabricant de l'appareil
modèle chaîne Modèle de l'appareil
numéro de série chaîne Identifiant unique de l'appareil. Dans cette spécification, cela DOIT être un UUID. (Spec GCP 1.1) (facultatif) Nous vous recommandons vivement d’utiliser le même identifiant de numéro de série partout, donc différent. les clients peuvent identifier le même appareil. Par exemple, les imprimeurs implémentant IPP peuvent utiliser cette interface série. numéro d'identification dans le champ "printer-device-id".
firmware chaîne Version du firmware de l'appareil
la disponibilité int Nombre de secondes à partir du démarrage du périphérique.
setup_url chaîne (facultatif) URL (protocole compris) de la page avec instructions d'installation
support_url chaîne (facultatif) URL (protocole compris) de la page avec support, informations FAQ
update_url chaîne (facultatif) URL (protocole compris) de la page avec mettre à jour les instructions du firmware
x-privet-token chaîne Valeur de la X-Privet-Token en-tête qui a à transmettre à toutes les API pour empêcher les attaques XSSI et XSRF. Voir 6.1. pour plus de détails.
api description des API Liste des API prises en charge (décrites ci-dessous)
état sémantique JSON (facultatif) Etat sémantique de l'appareil en Format CloudDeviceState.
api – est une liste JSON contenant la liste des API disponibles via le réseau local. Remarque toutes les API ne sont peut-être pas disponibles simultanément sur le réseau local. Par exemple, un nouveau L'appareil connecté ne doit supporter que l'API / Register:
"api": [ "/privet/register", ]
Une fois l'enregistrement de l'appareil terminé, l'appareil DEVRAIT cesser de prendre en charge l'API / register. le Le périphérique doit également vérifier auprès du service afin de déterminer quelles API peuvent être exposées sur le serveur local. réseau. Par exemple:
"api": [ "/privet/accesstoken", "/privet/capabilities", "/privet/printer/submitdoc", ]
Les API suivantes sont disponibles à ce moment:
/ privet / register – API pour l'enregistrement de périphérique sur le réseau local. (voir / privet / register API pour plus de détails). Cette API DOIT être cachée une fois le périphérique réussi. enregistré dans le nuage. / privet / accesstoken – API permettant de demander un jeton d’accès à l’appareil (voir / privet / accesstoken API pour plus de détails). / privet / capacités – API permettant de récupérer les capacités du périphérique (voir / privet / capacités API pour plus de détails). / privet / printer / * – API spécifique au type de périphérique "imprimante", voir imprimante API spécifiques pour plus de détails.
Voici un exemple de réponse / privet / info. (Notez le manque de l’API / privet / register, car ce périphérique est déjà enregistré):
"version": "1.0", "name": "l’imprimante de Gene", "description": "Imprimante connectée via un connecteur Chrome", "url": "https://www.google.com/cloudprint", "type": [ "printer" ], "id": "11111111-2222-3333-4444-555555555555", "device_state": "inactif", "connection_state": "en ligne", "fabricant": "Google", "modèle": "Google Chrome", "numéro de série": "1111-22222-33333-4444", "firmware": "24.0.1312.52", "disponibilité": 600, "setup_url": "http://support.google.com/cloudprint/answer/1686197/?hl=fr", "support_url": "http://support.google.com/cloudprint/?hl=fr", "update_url": "http://support.google.com/cloudprint/?hl=fr", "x-privet-token": "AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659", "api": [ "/privet/accesstoken", "/privet/capabilities", "/privet/printer/submitdoc", ]
Voici un exemple de réponse / privet / info pour une imprimante à court d’encre (avis état de sémantique):
{ "version": "1.0", "name": "l’imprimante de Gene", "description": "Imprimante connectée via un connecteur Chrome", "url": "https://www.google.com/cloudprint", "type": [ "printer" ], "id": "11111111-2222-3333-4444-555555555555", "device_state": "stoppé", "connection_state": "en ligne", "fabricant": "Google", "modèle": "Google Chrome", "numéro de série": "1111-22222-33333-4444", "firmware": "24.0.1312.52", "disponibilité": 600, "setup_url": "http://support.google.com/cloudprint/answer/1686197/?hl=fr", "support_url": "http://support.google.com/cloudprint/?hl=fr", "update_url": "http://support.google.com/cloudprint/?hl=fr", "x-privet-token": "AIp06DjQd80yMoGYuGmT_VDAApuBZbInsQ: 1358377509659", "api": [ "/privet/accesstoken", "/privet/capabilities", "/privet/printer/submitdoc", ], "état sémantique": "version": "1.0", "imprimante": "state": "STOPPED", "marker_state": "article": [ "vendor_id": "ink", "state": "EXHAUSTED", "level_percent": 0 ] }
4.2.3. les erreurs / privet / info API devrait SEULEMENT renvoyer une erreur si X-Privet-Token l'en-tête est manquant. Il DOIT être une erreur HTTP 400: HTTP / 1.1 400 En-tête X-Privet-Token manquant. 4.3. / privet / register API / privet / register est facultative. C'est une requête HTTP POST. / privet / register API DOIT vérifier pour une validité X-Privet-Token entête. Le périphérique DOIT implémenter cette API sur "/ privet / register" url:
POST /privet/register?action=start&user=user@domain.com HTTP / 1.1 POST /privet/register?action=complete&user=user@domain.com HTTP / 1.1
L’appareil doit exposer l’API / privet / register UNIQUEMENT lorsqu’il autorise l’enregistrement anonyme à la moment. Par exemple:
Lorsque le périphérique est allumé (ou après avoir cliqué sur un bouton spécial du périphérique) et n’a pas été enregistré, il devrait exposer l’API / privet / register pour permettre à un utilisateur du répertoire local réseau pour réclamer l’imprimante. Une fois l’enregistrement terminé, le périphérique doit cesser d’exposer l’API / privet / register à empêcher un autre utilisateur du réseau local de récupérer le périphérique. Certains appareils peuvent avoir différentes façons d’enregistrer des appareils et ne doivent pas exposer le / privet / register à tous (par exemple, le connecteur Chrome Cloud Print).
Le processus d’enregistrement se déroule en 3 étapes (voir Enregistrement anonyme pour Cloud Print).
Lancer le processus d'inscription anonyme. Un client initie ce processus en appelant l'API / privet / register. L'appareil peut attendre confirmation de l'utilisateur à ce moment. Obtenez le jeton de réclamation.
Le client interroge pour savoir quand l'appareil est prêt à continuer. Une fois que l'appareil est prêt, il envoie une demande au serveur pour récupérer le jeton d'enregistrement et l'URL d'inscription. Jeton reçu et URL DEVRAIT être retourné au client. Au cours de cette étape, si le périphérique reçoit un autre appel pour initialiser l'enregistrement, il devrait:
Si c’est le même utilisateur qui a commencé l’enregistrement, supprimez toutes les données précédentes (le cas échéant) et démarrez le système. un nouveau processus d'inscription. S'il s'agit d'un utilisateur différent, retourne une erreur device_busy et un délai d'attente de 30 secondes.
Processus d'inscription complet. Une fois que le client a réclamé le périphérique, il doit lui notifier son achèvement. enregistrement. Une fois le processus d'enregistrement terminé, l'appareil doit envoyer une mise à jour. annonce, y compris l'ID de périphérique nouvellement acquis. Remarque: lorsque le périphérique traite un appel d'API / privet / register, aucune autre API / privet / register les appels peuvent être traités simultanément. Le périphérique DOIT retourner l'erreur device_busy et 30 secondes temps libre. La confirmation de l'utilisateur pour l'enregistrement sur l'appareil est fortement recommandée. Si mis en œuvre, le le périphérique DOIT attendre la confirmation de l'utilisateur APRÈS qu'il reçoive un / privet / register? action = start API appel. Le client appellera / privet / register? Action = getClaimToken pour savoir quand la confirmation de l'utilisateur est terminée et le jeton de réclamation est disponible. Si l'utilisateur annule son inscription le l'appareil (par exemple, appuie sur le bouton Annuler), l'erreur user_cancel DOIT être renvoyée. Si l'utilisateur l’enregistrement n’a pas été confirmé dans un certain délai, l’erreur confirmation_timeout DOIT être revenu. Voir la section des valeurs par défaut pour plus de détails. 4.3.1. Contribution L'API / privet / register a les paramètres d'entrée suivants:
Nom Valeur
action Peut être l'un des suivants: début – pour commencer le processus d'inscription getClaimToken – récupérer le jeton de réclamation pour le périphérique Annuler – annuler le processus d'inscription Achevée – terminer le processus d'inscription
utilisateur Email de l'utilisateur qui réclamera cet appareil.
Le périphérique DOIT vérifier que l’adresse électronique de toutes les actions (start, getClaimToken, annuler, complète) correspond. 4.3.2. Revenir L'API / privet / register renvoie les données suivantes:
Nom de la valeur Type de valeur La description
action chaîne Même action que dans le paramètre d'entrée.
utilisateur chaîne (optionnel) Même utilisateur que dans le paramètre d'entrée (peut être manquant, si omis dans l'entrée).
jeton chaîne (optionnel) Jeton d'inscription (obligatoire pour Réponse "getClaimToken", omise pour "démarrer", "complète", "annuler").
claim_url chaîne (optionnel) URL d'enregistrement (obligatoire pour Réponse "getClaimToken", omise pour "démarrer", "complète", "annuler"). Pour les imprimantes en nuage, il faut être "complete_invite_url" reçu du serveur.
automation_claim_url chaîne (optionnel) URL d'enregistrement (obligatoire pour Réponse "getClaimToken", omise pour "démarrer", "complète", "annuler"). Pour les imprimantes en nuage, il faut être "automatic_invite_url" reçu du serveur.
Reference de l'appareil chaîne (optionnel) Nouvel identifiant d'appareil (omis pour la réponse "start", obligatoire pour "complet").
Le périphérique DOIT retourner son identifiant de périphérique dans la réponse de l'API / privet / info UNIQUEMENT après l'enregistrement. Achevée. Exemple 1:
"action": "start", "utilisateur": "utilisateur@domaine.com",
Exemple 2:
"action": "getClaimToken", "utilisateur": "utilisateur@domaine.com", "jeton": "AAA111222333444555666777", "claim_url": "https://domain.com/SoMeUrL",
Exemple 3:
"action": "complet", "utilisateur": "utilisateur@domaine.com", "device_id": "11111111-2222-3333-4444-555555555555",
4.3.3. les erreurs L'API / privet / register peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):
Erreur La description
device_busy Le périphérique est occupé et ne peut pas effectuer l’action demandée. Recommencez après timeout.
waiting_user_action En réponse à "getClaimToken", cette erreur indique que le le périphérique est toujours en attente de confirmation de l'utilisateur, et la requête "getClaimToken" doit être réessayée après temps libre.
user_cancel L'utilisateur a explicitement annulé le processus d'inscription depuis l'appareil.
confirmation_timeout La confirmation de l'utilisateur expire.
invalide_action Une action invalide est appelée. Par exemple, si le client appelé action = terminé avant d'appeler action = start et action = getClaimToken.
parent_invalide Paramètres non valides spécifiés dans la demande. (Paramètres inconnus doit être ignoré pour une compatibilité future). Par exemple, renvoyez ceci si le client appelé action = inconnu ou utilisateur =.
device_config_error La date / heure (ou certains autres paramètres) est incorrecte sur l'appareil côté. L'utilisateur doit aller (sur le site Web interne du périphérique) et configurer les paramètres du périphérique.
hors ligne L’appareil est actuellement hors ligne et ne peut pas communiquer avec le serveur.
erreur du serveur Erreur du serveur pendant le processus d'inscription.
invalid_x_privet_token X-Privet-Token est invalide ou vide dans la requête.
Le périphérique DOIT cesser d’exposer l’API / privet / register une fois l’enregistrement effectué avec succès. terminé. Si le périphérique n'expose pas l'API / privet / register, il DOIT renvoyer l'erreur HTTP 404. Par conséquent, si un périphérique est déjà enregistré, l'appel de cette API DOIT renvoyer 404. Si le L'en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l'erreur HTTP 400. 4.4. / privet / accesstoken API / privet / accesstoken API est FACULTATIF. C'est une requête HTTP GET. / privet / accesstoken API DOIT vérifier pour un en-tête "X-Privet-Token" valide. Le périphérique DOIT implémenter cette API sur le "/ privet / accesstoken" url: GET / privet / accesstoken HTTP / 1.1 Lorsque le périphérique reçoit l'appel de l'API / accesstoken, il doit appeler le serveur pour récupérer le jeton d'accès pour l'utilisateur donné et renvoyer le jeton au client. Le client utilisera ensuite le jeton d'accès pour accéder à cet appareil via le cloud. Les périphériques Cloud Print DOIVENT appeler l'API suivante: / cloudprint / proximitétoken et passez les paramètres "printerid =" et "user" du local API. En cas de succès, la réponse du serveur contiendra l'objet suivant:
"proximité_token": "utilisateur": "utilisateur@domaine.com", "jeton": "AAA111222333444555666777", "expires_in": 600
Les périphériques Cloud Print DOIVENT transmettre la valeur de l’objet "proximité_token" dans la réponse. aux appels d’API locaux / privet / accesstoken. Il est plus avantageux (à l’avenir) que l’appareil puisse passe TOUS les paramètres (y compris ceux qui ne sont pas décrits dans cette spécification). 4.4.1. Contribution L'API / privet / accesstoken a les paramètres d'entrée suivants:
Nom Valeur
utilisateur Email de l'utilisateur qui a eu l'intention d'utiliser ce jeton d'accès. Peut être vide dans le demande.
4.4.2. Revenir / privet / accesstoken L'API renvoie les données suivantes:
Nom de la valeur Type de valeur La description
jeton chaîne Jeton d'accès renvoyé par le serveur
utilisateur chaîne Même utilisateur que dans le paramètre d'entrée.
expire dans int Nombre de secondes jusqu'à l'expiration de ce jeton. Reçu de le serveur et passé dans cette réponse.
Exemple:
"jeton": "AAA111222333444555666777", "utilisateur": "utilisateur@domaine.com", "expires_in": 600
4.4.3. les erreurs L'API / privet / accesstoken peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):
Erreur La description
hors ligne L'appareil est actuellement hors ligne et ne peut pas parler au serveur.
accès refusé Droits insuffisants. Accès refusé. L'appareil doit renvoyer cette erreur lorsque la demande a été explicitement refusée par le serveur.
parent_invalide Paramètres non valides spécifiés dans la demande. (Paramètres inconnus doit être ignoré pour une compatibilité future). Par exemple, si le client appelé / accesstoken? user = ou / accesstoken.
erreur du serveur Erreur du serveur.
invalid_x_privet_token X-Privet-Token est invalide ou vide dans la demande.
Si le périphérique n'expose pas l'API / privet / accesstoken, il DOIT renvoyer l'erreur HTTP 404. Si la L'en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer l'erreur HTTP 400. 4.5 / privet / API de capacités / privet / features est facultatif. C'est une requête HTTP GET. / privet / functions API DOIT vérifier pour un en-tête "X-Privet-Token" valide. Le périphérique DOIT implémenter cette API sur URL "/ privet / capacités": GET / privet / capacités HTTP / 1.1 Lorsque le périphérique reçoit / appel de l'API de fonctionnalités, si le périphérique est capable, il DEVRAIT contacter le serveur pour obtenir des capacités mises à jour. Par exemple, si une imprimante prend en charge la publication d'un travail d'impression (reçu localement) à travers le service Cloud Print, il devrait renvoyer les fonctionnalités que le Le service d'impression en nuage reviendrait. Cloud Print dans ce cas peut altérer l'imprimante d'origine fonctions en ajoutant de nouvelles fonctionnalités avant d’envoyer le travail à l’imprimante. Le plus Le cas courant est une liste de types de documents pris en charge. Si l'imprimante est hors ligne, elle devrait renvoyer types de documents qu'il prend en charge. Cependant, si l'imprimante est en ligne et enregistrée auprès de Cloud Print it DOIT retourner "* / *" parmi les types pris en charge. Le service Cloud Print sera exécuté la conversion nécessaire dans ce cas. Pour l’impression hors ligne, l’imprimante DOIT prendre en charge au moins la format "image / pwg-raster". 4.5.1. Contribution L'API / privet / functions a les paramètres d'entrée suivants:
Nom Valeur
hors ligne (facultatif) Ne peut être que "hors ligne = 1". Dans ce cas, l'appareil doit retourner capacités pour une utilisation hors connexion (si elles sont différentes des capacités "en ligne").
4.5.2. Revenir L'API / privet / features renvoie les fonctionnalités de périphérique dans le fichier JSON CDD (Cloud Device Description) format (voir le document CDD pour plus de détails). Les imprimantes au minimum DOIVENT renvoyer une liste des types pris en charge ici. Par exemple, une imprimante Cloud Ready actuellement en ligne peut renvoyer quelque chose comme ceci (à le minimum):
"version": "1.0", "imprimante": "supported_content_type": [ "content_type": "application/pdf", "min_version": "1.4" , "content_type": "image/pwg-raster" , "content_type": "image/jpeg" , "content_type": "*/*" ]
et quand il est déconnecté du serveur, il peut retourner:
"version": "1.0", "imprimante": "supported_content_type": [ "content_type": "application/pdf", "min_version": "1.4" , "content_type": "image/pwg-raster" , "content_type": "image/jpeg" ]
Remarque: Les imprimantes expriment la priorité du type de contenu pris en charge en utilisant la commande. Pour Par exemple, dans les exemples ci-dessus, l’imprimante indique qu’elle préfère les données "application / pdf" à "image / pwg-raster" et "image / jpeg". Les clients doivent respecter les priorités des imprimantes si possible (voir le document CDD pour plus de détails). 4.5.3. les erreurs L'API / privet / features peut renvoyer les erreurs suivantes (voir la section Erreurs pour plus de détails):
Erreur La description
invalid_x_privet_token X-Privet-Token est invalide ou vide dans la requête.
Si le périphérique n'expose pas l'API / privet / features, il DOIT renvoyer HTTP 404. Erreur. Si l'en-tête X-Privet-Token est manquant, le périphérique DOIT renvoyer une erreur HTTP 400. 4.6. les erreurs Les erreurs sont renvoyées par les API ci-dessus au format suivant:
Nom de la valeur Type de valeur La description
Erreur chaîne Type d'erreur (défini par API)
la description chaîne (optionnel) Description lisible par l'homme de l'erreur.
server_api chaîne (optionnel) En cas d'erreur de serveur, ce champ contient l'API du serveur qui a échoué.
code_serveur int (facultatif) En cas d'erreur de serveur, ce champ contient ce code d'erreur que le serveur a renvoyé.
code_http_serveur int (facultatif) En cas d'erreur HTTP du serveur, ce champ contient le code d'erreur HTTP serveur renvoyé.
temps libre int (facultatif) Nombre de secondes que le client attend avant nouvelle tentative (pour les erreurs récupérables uniquement). Le client DOIT randomiser le délai d’expiration réel de cette valeur sur une valeur de + 20%.
Toutes les API DOIVENT renvoyer une erreur HTTP 400 si l'en-tête X-Privet-Token est manquant. HTTP / 1.1 400 En-tête X-Privet-Token manquant. Exemple 1:
"erreur": "erreur_serveur", "description": "Service indisponible", "server_api": "/ submit", "code_http_serveur": 503
Exemple 2:
"error": "printer_busy", "description": "L'imprimante est en train d'imprimer un autre travail", "timeout": 15
5. API d'imprimante L'un des types de périphérique pris en charge par ce protocole est le type imprimante. Les appareils supportant ce type PEUVENT implémenter certaines fonctionnalités spécifiques aux imprimantes. Idéalement, l’impression sur des imprimantes prêtes au cloud passer par un serveur Cloud Print:
Dans certains cas, un client peut avoir besoin d’envoyer un document localement. Cela peut être nécessaire lorsque le client ne le fait pas avoir un identifiant Google ou est incapable de parler au serveur Cloud Print. Dans ce cas, le travail d'impression sera être soumis localement à l'imprimante. L’imprimante utilisera à son tour le service Cloud Print pour mise en file d'attente et conversion. L’imprimante republiera le travail soumis localement sur le Cloud. Print service, puis demandez-le, car il a été envoyé via le cloud. Ce processus fournira une expérience utilisateur flexible en termes de service (conversion) et de gestion / suivi des travaux d'impression.
Since the Cloud Print service implements conversion, the printer SHOULD advertise supporting all input formats ("*/*") among the list of the supported content types:
"version": "1.0", "printer": "supported_content_type": [ "content_type": "image/pwg-raster" , "content_type": "*/*" ]
In some cases a completely offline solution is desired. Since printers support a limited number of input formats, a client will need to convert documents to a few natively supported printer formats.
This spec REQUIRES all printers to support at least the PWG Raster ("image/pwg-raster") format for the offline printing case. A printer may support other formats (for example JPEG) and if a client supports it, it may send documents in that format. The printer MUST expose supported types through the /capabilities API, for example:
"version": "1.0", "printer": "supported_content_type": [ "content_type": "image/pwg-raster" , "content_type": "image/jpeg" ]
There are two ways a client may initiate printing over the local network. Simple printing – client sends the document over the local network to /submitdoc API (without specifying the job_id parameter). The submitted document will be printed using default print ticket settings and no print job statuses are needed. If the printer ONLY supports this type of printing, it MUST advertise ONLY /submitdoc API in the /privet/info API response.
"api": [ "/privet/accesstoken", "/privet/capabilities", "/privet/printer/submitdoc", ]
Advanced printing – client should first create a print job on the printer by calling the /privet/printer/createjob API with a valid CJT job ticket in the request. The printer MUST store the print ticket in memory and return a job_id back to the client. Then the client will call the /printer/submitdoc API and specify the previously received job_id. At that time the printer will start printing. The client will poll the printer for print job status by calling le /privet/printer/jobstate API. In a multi-client environment, there is no guarantee how this API is called. It is possible for one client to call /createjob between another client’s /createjob->/submitdoc calls. To eliminate possible deadlocks and improve usability, we recommended having a small queue of pending print jobs on the printer (at least 3-5):
/createjob takes the first available spot in the queue. Job lifetime (in the queue) is at least 5 minutes. If all spots in the queue are taken, then the oldest, non-printing job shall be removed and a new one will be placed there. If there is a print job currently printing on the device (simple or advanced printing), /submitdoc should return status busy and propose a timeout to retry this print job. Si /submitdoc refers to a job that has been removed from the queue (due to replacement or timeout), the printer should return an error invalid_print_job et le client will retry the process from the /createjob step. The client MUST wait for a random timeout period of up to 5 seconds before retrying.
If memory constraints prevent storing multiple pending jobs on the device, it is possible to have a queue of 1 print job long. It should still follow the same protocol as above. After a job has completed or failed with an error, the printer should store information about the job’s status for at least 5 minutes. The queue size for storing completed job statuses should be at least 10. If there are more job statuses that need to be stored, the oldest one may be removed from the queue before the 5 minute timeout. Remarque: For now clients will poll for job status. In the future, we may require the printer to send TXT DNS notification when ANY print job status has changed. 5.1. /privet/printer/createjob API /privet/printer/createjob API is OPTIONAL (see Simple Printing above). It is an HTTP POST request. /privet/printer/createjob API MUST check for a valid "X-Privet-Token" header. The device MUST implement this API on "/privet/printer/createjob" url: POST /privet/printer/createjob HTTP/1.1 When receiving /privet/printer/createjob API call, the printer MUST create a new print job ID, store the received print ticket in the CJT format, and return print job id back to the client. 5.1.1. Input /privet/printer/createjob API has no input parameters in URL. The request body should contain the print job ticket data in CJT format. 5.1.2. Return /privet/printer/createjob API returns the following data:
Value name Value type La description
job_id chaîne ID of the newly created print job.
expires_in int Number of seconds this print job is valid.
Exemple:
"job_id": "123", "expires_in": 600
5.1.3. les erreurs /privet/printer/createjob API may return the following errors (see Errors section for details):
Erreur La description
invalid_ticket Submitted print ticket is invalid.
printer_busy Printer is busy and can’t currently process /createjob. Recommencez after timeout.
printer_error Printer is in error state and requires user interaction to fix it. Description should contain more detailed explanation (e.g. "Paper jam in Tray 1").
invalid_x_privet_token X-Privet-Token is invalid or empty in the request.
If device is not exposing /privet/printer/createjob it MUST return HTTP 404 error. Si X-Privet-Token header is missing, the device MUST return HTTP 400 error. 5.2. /privet/printer/submitdoc API /privet/printer/submitdoc API is REQUIRED to implement printing over a local network (offline or repost to Cloud Print). It is an HTTP POST request. /privet/printer/submitdoc API MUST check for a valid "X-Privet-Token" header. The device MUST implement this API on "/privet/printer/submitdoc" url: POST /privet/printer/submitdoc HTTP/1.1 When receiving the /privet/printer/submitdoc API call, the printer should start printing. If it is unable to begin printing, it MUST return the error printer_busy and a recommended timeout period for the client to wait before trying again. If the printer is not able to hold all of the data in its internal buffer, it SHOULD use TCP mechanisms to slow down data transfer until it prints a portion of the document, making part of the buffer available again. (For example, the printer may set windowsize=0 on TCP layers, which will make the client wait.) Submitting a document to the printer may take a significant amount of time. The client should be able to check the state of the printer and job (advanced printing) while printing is in progress. In order to do that, the printer MUST allow the client to call the /privet/info and /privet/printer/jobstate APIs while processing /privet/printer/submitdoc API calls. Il est recommended for all clients to start a new thread to execute the /privet/printer/submitdoc API call, so that the main thread can use the /privet/info and /privet/printer/jobstate APIs to check printer and job states. Remarque: Upon completion or abortion of the local print job, it is strongly recommended (and will be required in a future version of this spec) to report the final state of the job to the /cloudprint/submit interface for accounting and user experience purposes. le parameters "printerid", "title", "contentType" and "final_semantic_state" (in PrintJobState format) are required, and the parameters "tag" (repeated parameter) and "ticket" (the ticket of the job in CloudJobTicket format). Note that the provided PrintJobState must actually be final, i.e. its type must be DONE or ABORTED, and a cause must be provided in the case that it is ABORTED (see JobState for details). Also note that this use of the /cloudprint/submit interface to report local print jobs is not mentioned in its specification because that section is intended to describe the interface's primary use: submitting a print job with the document to print provided in the "content" parameter. 5.2.1. Input /privet/printer/submitdoc API has the following input parameters:
Name Valeur
job_id (optional) Print job id. May be omitted for simple printing case (voir au dessus). Must match the one returned by the printer.
user_name (optional) Human readable user name. This is not definitive, and should only be used for print job annotations. If job is re-posted to the Cloud Print service this string should be attached to the Cloud Print job.
client_name (optional) Name of the client application making this request. Pour display purposes only. If job is re-posted to the Cloud Print service this string should be attached to the Cloud Print job.
job_name (optional) Name of the print job to be recorded. If job is re-posted to the Cloud Print service this string should be attached to the Cloud Print job.
offline (optional) Could only be "offline=1". In this case printer should only try printing offline (no re-post to Cloud Print server).
Request body should contain a valid document for printing. "Content-Length" should include the correct length of the request. "Content-Type" header should be set to document MIME type and match one of the types in the CDD (unless CDD specifies "*/*"). Clients are HIGHLY recommended to provide a valid user name (or email), a client name and a job name with this request. Those fields are only used in UIs to improve user experience. 5.2.2. Return /privet/printer/submitdoc API returns following data:
Value name Value type La description
job_id chaîne ID of the newly created print job (simple printing) or job_id specified in the request (advanced printing).
expires_in int Number of seconds this print job is valid.
job_type chaîne Content-type of the submitted document.
job_size int 64 bit Size of the print data in bytes.
job_name chaîne (optional) Same job name as in input (if any).
Exemple:
"job_id": "123", "expires_in": 500, "job_type": "application/pdf", "job_size": 123456, "job_name": "My PDF document"
5.2.3. les erreurs /privet/printer/submitdoc API may return the following errors (see Errors section for details):
Erreur La description
invalid_print_job Invalid/expired job id is specified in the request. Retry after timeout.
invalid_document_type Document MIME-type is not supported by the printer.
invalid_document Submitted document is invalid.
document_too_large Document exceeds maximum size allowed.
printer_busy Printer is busy and can’t currently process document. Recommencez after timeout.
printer_error Printer is in error state and requires user interaction to fix it. Description should contain more detailed explanation (e.g. "Paper jam in Tray 1").
invalid_params Invalid parameters specified in the request. (Unknown parameters should be safely ignored for future compatibility)
user_cancel User explicitly cancelled printing process from the device.
server_error Posting document to Cloud Print has failed.
invalid_x_privet_token X-Privet-Token is invalid or empty in the request.
If the device is not exposing /privet/printer/submitdoc, it MUST return HTTP 404 error. Si la X-Privet-Token header is missing, the device MUST return HTTP 400 error. Remarque: /privet/printer/submitdoc API may require special handling on printer side (because of the large payload attached). In some cases (depends on the printer HTTP server implementation and platform), printer may close socket BEFORE returning HTTP error. In other, printer may return 503 error (instead of Privet error). Printers SHOULD try as much as possible to return Privet. However, every client implementing Privet specification SHOULD be able to handle socket close (no HTTP error) and 503 HTTP error cases for /privet/printer/submitdoc API. Dans ce case, client SHOULD handle it as a Privet "printer_busy" error with "timeout" set to 15 seconds. To avoid infinite retries, client may stop retrying after a reasonable number of attempts (for example, 3). 5.3. /privet/printer/jobstate API /privet/printer/jobstate API is OPTIONAL (see Simple Printing above). It is an HTTP GET request. /privet/printer/jobstate API MUST check for a valid "X-Privet-Token" header. The device MUST implement this API on "/privet/printer/jobstate" url: GET /privet/printer/jobstate HTTP/1.1 When receiving a /privet/printer/jobstate API call, a printer should return the status of the requested print job or invalid_print_job error. 5.3.1. Input /privet/printer/jobstate API has following input parameters:
Name Valeur
job_id Print job ID to return status for.
5.3.2. Return /privet/printer/jobstate API returns the following data:
Value name Value type La description
job_id chaîne Print job id there status information is for.
state chaîne draft – print job has been created on the device (no /privet/printer/submitdoc calls have been received yet). queued – print job has been received and queued, but printing has not started yet. in_progress – print job is in the progress of printing. stopped – print job has been paused, but can be restarted manually or automatically. terminé – print job is done. aborted – print job failed.
la description chaîne (optional) Human readable description of the print job status. Should include additional information if statestopped or aborted. le semantic_state field usually provides better and more meaningful description to the client.
expires_in int Number of seconds this print job is valid.
job_type chaîne (optional) Content-type of the submitted document.
job_size int 64 bit (optional) Size of the print data in bytes.
job_name chaîne (optional) Same job name as in input (if any).
server_job_id chaîne (optional) ID of the job returned from the server (if job has been posted to Cloud Print service). Omitted for offline printing.
semantic_state JSON (optional) Semantic state of the job in PrintJobState format.
Example (printing by reporting through Cloud Print):
"job_id": "123", "state": "in_progress", "expires_in": 100, "job_type": "application/pdf", "job_size": 123456, "job_name": "My PDF document", "server_job_id": "1111-2222-3333-4444"
Example (offline printing error):
"job_id": "123", "state": "stopped", "description": "Out of paper", "expires_in": 100, "job_type": "application/pdf", "job_size": 123456, "job_name": "My PDF document"
Example (print job aborted by the user):
"job_id": "123", "state": "aborted", "description": "User action", "expires_in": 100, "job_type": "application/pdf", "job_size": 123456, "job_name": "My PDF document", "semantic_state": "version": "1.0", "state": "type": "ABORTED", "user_action_cause": "action_code": "CANCELLED" , "pages_printed": 7
Example (print job stopped due to out of paper). Notice the reference to the device state. le client will need to call the /privet/info API to get more details about the device state:
"job_id": "123", "state": "stopped", "description": "Out of paper", "expires_in": 100, "job_type": "application/pdf", "job_size": "123456", "job_name": "My PDF document", "semantic_state": "version": "1.0", "state": "type": "STOPPED", "device_state_cause": "error_code": "INPUT_TRAY" , "pages_printed": 7
5.3.3. les erreurs /privet/printer/jobstate API may return the following errors (see Errors section for details):
Erreur La description
invalid_print_job Invalid/expired job ID is specified in the request.
server_error Getting print job status (for print jobs posted to Cloud Print) has failed.
invalid_x_privet_token X-Privet-Token is invalid or empty in the request.
If device is not exposing /privet/printer/jobstate, it MUST return HTTP 404 error. Si la X-Privet-Token header is missing, the device MUST return HTTP 400 error. 6. Appendix 6.1. Default behavior and settings This section will explain the default behavior we expect from ALL Privet-compatible devices.
Out-of-the-box devices should support only /privet/info et /privet/register APIs. All other APIs (e.g. /privet/accesstoken, local printing) should be disabled. Registration requires physical interaction with a device.
User MUST take a physical action on the device (e.g., pressing a button) to confirm their access to the device. After the user takes the action noted above, the printer should send the /cloudprint/register request. It should not send this request until after the action is taken (see Sequence Diagram 1). If the device is processing a /privet/register request (for instance, waiting on the action above), it must reject all other /privet/register requests. The device MUST return the device_busy error in this case. The device should timeout any /register request that does not receive the physical action mentioned above within 60 seconds. The device MUST return the confirmation_timeout error in this case. Optional: Recommended but not required, the following may improve user experience:
The printer might flash a light or its screen to indicate that the user needs to take an action to confirm registration. The printer might state on its screen that ‘it is being registered to Google Cloud Print for user ‘abc@def.com’ – press OK to continue’, where abc@def.com is the user parameter from the /register API call. This would make it clearer to a user that:
it is their registration request that s/he is confirming what is happening if s/he didn’t trigger the request.
In addition to a physical action to confirm from the printer (e.g., ‘Press the OK button’), a printer may also offer the user a button to cancel the request (e.g., ‘Press Cancel to reject’). This would allow users who did not trigger the registration request to cancel it before the 60 second timeout. The device MUST return the user_cancel error in this case.
Ownership transfers:
The device may be deleted explicitly from the Cloud service.
If the device receives success, but no device description as a result of /cloudprint/printer (for GCP) call, it MUST revert to default (out-of-the-box) mode. If the device’s credentials no longer work (explicitly because of "invalid credentials" response from the server), it MUST revert to default (out-of-the-box) mode.
Local factory reset MUST clear device’s credentials and set it to default state. Optional: The device may provide a menu item to clear credentials and put it into default mode.
Devices supporting XMPP notifications MUST include the ability to ping the server. The ping timeout MUST be controllable from the server through "local_settings". The device may explicitly ping the server (/cloudprint/printer API for GCP, in addition to XMPP pings) no more often than once a day (24 hours) to make sure they are in sync. Il est recommended to randomize the check window within 24-32 hour window. Optional: For Cloud Print devices, it is recommended but not required to have a manual way (button) to allow the user to initiate a check for new print jobs from the device. Some printers already have this. Optional. Enterprise printers may have an option to disable local discovery completely. Dans such case, the device MUST update these local settings on the server. New local settings MUST be empty (setting "local_discovery" to "false", means that it can be re-enabled from the GCP Service).
6.1.2 Default Registration Diagram
6.2. XSSI and XSRF attacks and prevention This section will explain the possibility of XSSI and XSRF attacks on the device and how to protect from them (including token generation techniques). More details are here:
http://googleonlinesecurity.blogspot.com/2011/05/website-security-for-webmasters.html Normally, XSSI and XSRF attacks are possible when a site is using cookie authentication mechanisms. While Google doesn’t use cookies with their Cloud Print Service, such attacks are still possible. Local network access, by design, implicitly trusts requests. 6.2.1. XSSI It is possible for a malicious website to guess the IP address and port number of a Privet-compatible device and to try to call the Privet API using "src="http://developers.google.com/inside of a tag:
Without protection, malicious websites would be able to execute API calls and access results. To prevent this type of attack, ALL Privet API calls MUST require the "X-Privet-Token" header in the request. "src="http://developers.google.com/script tags are not able to add headers, effectively guarding against this type of attack. 6.2.2. XSRF
http://en.wikipedia.org/wiki/Cross-site_request_forgery It is possible for a malicious website to guess the IP address and port number of a Privet-compatible device and try to call Privet API using an , forms, or some other cross-website loading mechanism. Attackers would not be able to access the results of the request, but if the request would perform an action (e.g. printing), they could trigger it. To prevent this attack, we require the following protection:
Leave /privet/info API open to XSRF /privet/info API MUST NOT perform any actions on the device Use /privet/info API to receive x-privet-token All other APIs MUST check for a valid x-privet-token in "X-Privet-Token" header. x-privet-token SHOULD be valid for only 24 hours.
Even if an attacker is able to execute the /privet/info API, they would not be able to read x-privet-token from the response and therefore would not be able to call any other API. It is strongly recommended to generate the XSRF token using the following algorithm: XSRF_token = base64( SHA1(device_secret + DELIMITER + issue_timecounter) + DELIMITER + issue_timecounter ) XSRF Token Generation Elements:
DELIMITER is a special character, usually ‘:’ issue_timecounter is a number of seconds since some event (epoch for timestamp) or device boot time (for CPU counters). issue_timecounter is constantly increasing when the device is up and running (see token verification below). SHA1 – hash function using SHA1 algorithm base64 – base64 encoding device_secret – secret specific to the device. Device secret MUST be updated on every restart.
Recommended ways to generate device secret:
Generate a new UUID on every restart Generate a 64 bit random number on every restart
The device is not required to store all of the XSRF tokens it has issued. When the device needs to verify a XSRF token for validity, it should base64-decode the token. Get the issue_timecounter from the second half (cleartext), and try to produce SHA1 hash of device_secret + DELIMITER + issue_timecounter où issue_timecounter is from the token. If the newly generated SHA1 matches the one in the token, device must now check if the issue_timecounter is within the validity period from (24 hours) of the current time counter. To do so, device takes the current time counter (CPU counter for example) and subtracts issue_timecounter à partir de cela. The result MUST be the number of seconds since token issue. Important: This is the recommended way to implement XSRF protection. Clients of the Privet specification shall not try to understand XSRF token, instead they shall treat is as a blackbox. Figure 6.2.3 illustrates a recommended way to implement the X-Privet-Token and verification of a typical request. 6.2.3 X-Privet Token Generation and Verification Sequence Diagram
6.3. Workflow diagrams This section will illustrate a workflow in different cases. 6.3.1. Printer out of the box workflow
6.3.2. Registered printer startup
6.3.3 XMPP notifications handling workflow
6.3.4. Check printer settings workflow
Click to rate this post! [Total: 0 Average: 0]
Topics and keywords
Themes: Serveur d'impression
License & attribution
License: CC BY-ND 4.0.
Attribution required: yes.
Manifest: https://tutos-gameserver.fr/llm-endpoints-manifest.json
LLM Endpoints plugin version 1.1.2.