Privet | Cloud Print | Développeurs Google – Bien choisir son serveur d impression
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
Sommaire
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:
_
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
(
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êt En 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.
Commentaires
Laisser un commentaire