Thursday, June 19, 2014

Core Protokol Jabber: XML Stanza

Core protokol jabber didefinisikan pada RFC 3920. Pada dokumen ini, terdapat dua pokok bahasan yang dijelaskan, yaitu  XML Stream dan XML Stanza. Seperti yang diketahui semua paket data yang ditransmisikan pada jaringan ini memiliki format XML. XML Stream yang hampir memenuhi isi dokumen mengenai bahasan (1) penggunaan protokol keamanan TLS (Transport Layer Security) pada jaringan jabber, (2) otentikasi menggunakan metode SASL (Simple Authentication and Security Layer) dan juga (3) mekanisme untuk binding sebuah resource untuk client koneksi yang terbentuk (Resource Binding). Setelah itu bahasan pada dokumen RFC 3920 akan beralih pada XML Stanza. Stanza ini merupakan salah satu dari child elemen XML Stream, seperti yang ditunjukkan pada gambar bawah. Dan pada artikel ini saya coba tulis hanya perbagian XML Stanza saja, hal ini karena memang pada prakteknya kita akan cukup banyak berurusan dengan ini untuk membangun sebuah sistem aplikasi yang berjalan pada jaringan jabber.
XML Stream dan XML Stanza
Terdapat tiga jenis XML Stanza yang ditransmisikan, antara lain message, presence, dan info query atau lebih dikenal dengan IQ.  Jenis pertama (1) message, merupakan general paket jabber berisi informasi yang dikirim dari satu entitas ke entitas lainnya. Pengiriman paket ini bersifat fire and forget, artinya entitas pengirim tidak akan mendapatkan result dari paket message yang telah dia kirimkan. Selain itu juga message ini dikirimkan dari dan ke one-to-one entitas atau one-to-many. Jenis yang kedua adalah (2) presence, dikirimkan dengan tujuan availability kehadiran entitas yang terhubung dalam jaringan. Entitas dapat mengetahui status online atau offline dari setiap entitas lain karena adanya aliran data presence ini. Tidak seperti message, presence dikirimkan ke semua entitas (broadcast) yang sudah subscribe ke entitas tersebut. Terakhir, jenis yang ketiga adalah (3) IQ, digunakan untuk mekanisme request-response antar entitas dalam jaringan jabber. Mirip dengan metode GET dan POST pada protokol HTTP. Terdapat sebuah entitas yang mengirimkan request ke entitas lain, dan akan menerima response balasan dari entitas tersebut.
XMPP Server

1. Message

Jabber menggunakan stanza message untuk mengirim pesan. Pesan dapat dikirm antara jabber client dengan jabber server atau antara jabber server dengan server jabber yang lain. Stanza message sangat sederhana, Entitas sender mengirim stanza message ke entitas recepient. Secara default tidak ada acknowledge ketika recepient menerima stanza message. Jika pesan dikirim dan recepient dalam keadaan offline maka server berkewajiban menyimpan pesan tersebut dan mengirimkannya ketika recepient sudah dalam keadaan online/available. Proses seperti ini mengacu pada proses store and foward. Pada dasarnya format untuk stanza message adalah sebagai berikut :

Message Stanza


  1. to="" from="" Mengidentifikasikan sender dan recepient. Format alamat jabber diatur dalam spesifikasi core jabber mengenai JID. Atribut ini diperlukan untuk semua paket stanza message.
  2. id="" Digunakan identifier yang unik pada pesan. Client dapat menggunakan id untuk mengidentifikasikan pesan jika paket message mengalami error. Atribut ini bersifat opsional.
  3. type="error" Mengindikasikan bahwa pesan adalah error message.
  4. type="chat" Mengindikasikan bahwa pesan ditampilkan dalam sebuat line-by-line chat interface (one-to-one chat).
  5. type="groupchat" Mengindikasikan bahwa pesan ditampilkan dalam room chat interface.

Stanza message mempunyai dua set subelemen (child element) didalamnya. Pertama adalah content atau payload paket (body elemen dan error elemen) dan kedua adalah subelemen yang merupakan informasi metadata dari paket message tersebut (x elemen).

<body><body>
Subelemen ini membungkus isi pesan (payload) yang akan dikirimkan. Subelemen ini hanya diperbolehkan ada satu kali pada setiap paket stanza message dan juga harus berupa plain-text.

<x xlmns="jabber:x:"></x>
Subelemen ini digunakan untuk mengirim perintah antar client atau sebagai mekanisme tambahan. Setiap kali elemen ini digunakan, namespaces (xmlns) harus didefinisikan. Sebuah pesan dapat memiliki banyak elemen <x> ini. Sebagai contoh namespaces untuk out-of-bond extension dapat digunakan untuk mengirim file antar aplikasi.

Subelemen ini disertakan ketika atribut type dari pesan di set error. Error yang sebenarnya didefinisikan oleh atribut dengan type="nnn" yang menunjukkan jenis dari error tersebut.

  • 302 – redirect
  • 400 – Bad Request
  • 401 – Unauthorized
  • 402 – Payment Reuired
  • 407 – Registration Required
  • 408 – Request Timeout
  • 409 – Conflict
  • 500 – Internal Sevrer Error

Isi subelemen error adalah penjelasan teks untuk spesifik error yang sedang terjadi. Sebagai contoh, bad request akan memiliki format penulisan sebagai berikut :

<error type="400">Bad Request</error>

Contoh paket stanza message yang valid dikirim ke entitas/user tujuan adalah sebagai berikut:

<message from='mustofa@uin-malang.ac.id/kampus' to='haqqi@tomatech.mobi'>
   <body>Howdy</body>
</message>

2. Presence

Stanza presence ini bertanggung jawab terhadap dua hal dibawah ini, yaitu :

  1. Presence Update, menginformasikan pengguna lain status presence yang sedang kita digunakan.
  2. Presence Subscription Management, mengijinkan pengguna untuk mendaftarkan update presence dari pengguna lain dan mengatur siapa saja yang berhak mengetahui status kehadirannya.

Dalam kedua peran tersebut server jabber bertindak sebagai penengah antara presence information generator dan presence recepients. Server tidak memiliki kewenangan untuk secara pasif mengatur rute dari paket presence namun secara aktif server berpartisipasi di dalam paket presence untuk memastikan operasi dilakukan dengan benar.

Presence update menggunakan  model pesan satu arah atau one-way message. Client mengirim stanza presence untuk memperbarui status kehadirannya kepada server, kemudian server meneruskan salinan dari paket tersebut kepada semua pihak yang terdaftar pada presence subscription list dari client pengirim. Subscription list tersebut dinamakan roster di dalam jabber, namun lebih umum dikenal dengan sebutan buddy list.

Entitas jabber dapat dapat meminta subscribe presence dari entitas/client lainnya. Proses subscribing tersebut adalah sebuah mekanisme/kesepakatan untuk mengetahui status kehadiran dari entitas yang satu dengan yang lain. Sebagai contoh, kita dapat meminta subscribe presence teman sehingga ketika teman tersebut available/online, kita akan mendapatkan paket kehadirannya, tapi tidak sebaliknya.
Beberapa atribut stanza presence diasosiasikan sama dengan stanza message, seperti atribut to dan from. Presence memiliki memiliki tipe atribut yang memiliki 7 state sebagai berikut:

  1. unavailable : client tidak lama tersedia untuk berkomunikasi
  2. subscribe: pengirim mengirimkan request untuk subscribe terhadap presence penerima
  3. subscribed: pengirim yang telah diizinkan terhadap recipient untuk menerima presence mereka.
  4. unsubscribe : subscription request yang telah ditolak atau subscription yang telah di cancel sebelumnya.
  5. probe: request dari client yang presence saat ini
  6. error: pesan kesalahan yang berlangsung berdasarkan pemrosesan atau menyediakan paket presence yang telah dikirim sebelumnya.

Server menggunakan probe presence packet untuk request spesifik entitas dari presence packet. Dalam hal ini entitas yang dimaksud adalah menentukan apakan entitas tersebut available atau unavailable. Entity Probe mengijinkan informasi presence untuk dikirimkan
Elemen request probe presence dikirim dengan menggunakan format dibawah ini

<presence type="probe">
Elemen-elemen dibawah ini digunakan di dalam elemen <presence>.

<status></status>
Elemen ini digunakan untuk menampilkan deskripsi status dari user yang dapat langsung dilihat oleh user lain. Misal, pengguna ingin menampilkan status yang menunjukkan deskripsi dari apa yang sedang ia lakukan, “i’m at lunch" atau "be back in 5 minutes"

<priority><priority>
Elemen ini memberi prioritas dari presence pada satu entitas pengguna. Misal mustofa@uin-malang.ac.id mungkin login dengan menggunakan multiple resources (home computer, work dan work computer). Elemen ini memberikan prioritas angka untuk setiap resources. Semua pesan dan komunikasi akan diarahkan kepada resources yang mempunyai nilai prioritas paling tinggi. Ketika prioritas resources paling tinggi tersebut menjadi unavailable, pesan dan komunikasi akan dikirim ke resources lainnya yang mempunyai nilai prioritas tertinggi kedua. Prioritas yang bernilai negatif menunjukkan bahwa resources tidak dapat digunakan untuk direct atau immediate contact.

Elemen ini menunjukkan bagaimana status kehadiran seorang user kepada entitas/user lain.

  • show : menggambarkan status yang tersedia dari entities atau resource yang spesifik. show memiliki empat nilai yang digunakan :
  • away : temporarily away
  • chat : bebas untuk chat
  • xa : extended away
  • dnd : do not disturb
  • status : merupakan deskripsi bahasa natural yang bersifat opsional yang mendeskripsikan status yang tersedia.
  • priority : bilangan integer bukan negatif yang menampilkan level prioritas pada resource yang terkoneksi, dengan 0 sebagai prioritas terendah.
  • error : deskripsi pesan kesalahan

Contoh stanza presence adalah sebagai berikut :

<presence from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard'>
 <show>away</show>
 <status>be right back</status>
 <priority>0</priority>
</presence>

Presence Stanza


3. Info/Query

Meskipun secara garis besar trafik jabber terdiri dari message dan presence, sebagian besar pekerjaan implementasi arsitektur client-server adalah mengatur urusan administrasi dan manajemen. Pada protokol jabber tugas tersebut menggunakan  generic query protocol yang disebut IQ. Tipe atribut pada stanza info/query memiliki 4 nilai yang dapat digunakan,

  1. get : informasi request
  2. set : menyediakan data yang dibutuhkan
  3. result : respon terhadap get dan set request yang sukses
  4. error : kesalahan yang terjadi dalam pemrosesan dan layanan get dan set request

Di dalam setiap IQ, sebuah namaspaces mendefinisikan tipe dari query yang akan dilakukan. Namespaces didefinisikan di dalam elemen query seperti yang ditunjukkan dibawah ini.

<query xmlns="*"/>
Paket IQ

Sebagai contoh, client mengirim query-set dengan client authentication namespaces ke server untuk login.

<iq type="set" to="mustofa@uin-malang.ac.id">
 <query xmlns="jabber:iq:auth"></query>
</iq>
Format protokol IQ yang digunakan pada jabber dapat dirumuskan seperti yang ditunjukkan dibawah ini.

<iq
 type='set|get|result|error'
 to='handler_jid'
 from='originator_jid'
 id='unique'>
 <query xmlns='iq extension namespace'>
 <query_field1/>
 <query_field2/>
 </query>
</iq>
Stanza IQ sangat penting jika ingin membangun server berdasarkan kebijakan keamanan sistem yang harus dipenuhi oleh client. Jika keamanan client telah terpenuhi maka harus mendukung pula terhadap keamanan pada sisi server.
Tipe IQ


No comments:

Post a Comment