3 changed files with 0 additions and 593 deletions
@ -1,593 +0,0 @@
@@ -1,593 +0,0 @@
|
||||
#LyX 2.0 created this file. For more info see http://www.lyx.org/ |
||||
\lyxformat 413 |
||||
\begin_document |
||||
\begin_header |
||||
\textclass article |
||||
\use_default_options true |
||||
\maintain_unincluded_children false |
||||
\language english |
||||
\language_package default |
||||
\inputencoding auto |
||||
\fontencoding global |
||||
\font_roman default |
||||
\font_sans default |
||||
\font_typewriter default |
||||
\font_default_family default |
||||
\use_non_tex_fonts false |
||||
\font_sc false |
||||
\font_osf false |
||||
\font_sf_scale 100 |
||||
\font_tt_scale 100 |
||||
|
||||
\graphics default |
||||
\default_output_format default |
||||
\output_sync 0 |
||||
\bibtex_command default |
||||
\index_command default |
||||
\paperfontsize default |
||||
\spacing single |
||||
\use_hyperref false |
||||
\papersize default |
||||
\use_geometry false |
||||
\use_amsmath 1 |
||||
\use_esint 1 |
||||
\use_mhchem 1 |
||||
\use_mathdots 1 |
||||
\cite_engine basic |
||||
\use_bibtopic false |
||||
\use_indices false |
||||
\paperorientation portrait |
||||
\suppress_date false |
||||
\use_refstyle 1 |
||||
\index Index |
||||
\shortcut idx |
||||
\color #008000 |
||||
\end_index |
||||
\secnumdepth 3 |
||||
\tocdepth 3 |
||||
\paragraph_separation indent |
||||
\paragraph_indentation default |
||||
\quotes_language english |
||||
\papercolumns 1 |
||||
\papersides 1 |
||||
\paperpagestyle default |
||||
\tracking_changes false |
||||
\output_changes false |
||||
\html_math_output 0 |
||||
\html_css_as_file 0 |
||||
\html_be_strict false |
||||
\end_header |
||||
|
||||
\begin_body |
||||
|
||||
\begin_layout Title |
||||
Pontarius 1.0 Manual (Fifth Draft) |
||||
\end_layout |
||||
|
||||
\begin_layout Author |
||||
Nejla |
||||
\end_layout |
||||
|
||||
\begin_layout Date |
||||
March 25, 2012 |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset CommandInset toc |
||||
LatexCommand tableofcontents |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Section |
||||
Introduction |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Pontarius is a work in progress of a minimal XMPP client implementation |
||||
with all the required client features and behaviours of the RFC 6120 ("XMPP |
||||
Core") specification |
||||
\begin_inset Foot |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
http://tools.ietf.org/html/rfc6120 |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
. |
||||
Pontarius has been developed by the Pontarius project (mainly by Jon Kristensen |
||||
), and has now been taken over by Nejla. |
||||
|
||||
\series bold |
||||
|
||||
\series default |
||||
Being licensed under the Apache License (Version 2), Pontarius is free and |
||||
open source software. |
||||
\end_layout |
||||
|
||||
\begin_layout Section |
||||
Features and Implementation Specifics |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Pontarius 1.0 will implement the XMPP Core specification (RFC 6120). |
||||
Features include the following: |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Connecting and disconnecting from an XMPP server |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Opening the XMPP streams |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Securing XMPP streams with TLS |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Authenticate using SASL |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Perform resource binding |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Send and receive stanzas (message, presence, and IQ) and stanza errors |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Send and receive stream errors |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Below are the specifics of our implementation: |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
Pontarius XMPP is a client library; the application using Pontarius XMPP |
||||
is always the |
||||
\begin_inset Quotes eld |
||||
\end_inset |
||||
|
||||
initiating entity |
||||
\begin_inset Quotes erd |
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
A client-to-server connection always consists of exactly one TCP connection |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
For stream security through TLS, only the TLS_RSA_WITH_AES_128_CBC_SHA cipher |
||||
suite is supported |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
TLS renegotiation is not supported |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
TLS channel binding is not supported |
||||
\end_layout |
||||
|
||||
\begin_layout Itemize |
||||
For (SASL) authentication, the SHA-1 variant of SASL Salted Challenge Response |
||||
Authentication Mechanism (SCRAM-SHA-1) is the only supported mechanism |
||||
\end_layout |
||||
|
||||
\begin_layout Section |
||||
Future Development |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
The current goal for Pontarius XMPP 2.0 is to serve as a library for an XMPP |
||||
server. |
||||
\end_layout |
||||
|
||||
\begin_layout Section |
||||
Usage |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
|
||||
\noun on |
||||
Note that the information provided below is out-of-date. |
||||
It will be updated before the next release. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Working with Pontarius is mostly done asynchronously; Pontarius XMPP ``owns'' |
||||
the XMPP thread, and calls different StateT s m a callback functions in |
||||
the client. |
||||
StateT is a monad transformer which allows the functions to be stateful |
||||
(being able to access and modify the arbitrary client-defined state of |
||||
type s) and to be executed on top of a MonadIO m monad (typically IO). |
||||
\end_layout |
||||
|
||||
\begin_layout Subsection |
||||
Creating the session |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Setting up an XMPP session is done through the (blocking) session function: |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
session :: (MonadIO m, ClientState s m) => s -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
[ClientHandler s m] -> (StateT s m ()) -> m () |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
The first parameter (of type s) is an arbitrary state that is defined by |
||||
the client. |
||||
This is the initial state, and it will be passed to the stateful client |
||||
callbacks. |
||||
It will typically be modified by the client. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
The second parameter is the list of client handlers to deal with XMPP callbacks. |
||||
The reason why we have a list is because we want to provide a ``layered'' |
||||
system of XMPP event handlers. |
||||
For example, XMPP client developers may want to have a dedicated handler |
||||
to manage messages, implement a spam protection system, and so on. |
||||
Messages are piped through these handlers one by one, and any handler may |
||||
block the message from being sent to the next handler(s) above in the stack. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
data MonadIO m => ClientHandler s m = ClientHandler { |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
messageReceived :: Maybe (Message -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
StateT s m Bool), presenceReceived :: Maybe |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
(Presence -> StateT s m Bool), iqReceived :: |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Maybe (IQ -> StateT s m Bool), |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
sessionTerminated :: Maybe (TerminationReason -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
StateT s m ()) } |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
ClientHandler is a record which specifies four callback functions. |
||||
The first three deals with the three XMPP stanzas, and are called once |
||||
an XMPP stanza is received. |
||||
These functions take the stanza in question, and are stateful with the |
||||
current client state. |
||||
The boolean value returned signals whether or not the message should be |
||||
blocked to clients further down the stack. |
||||
For example, a XEP-0030: Service Discovery handler may choose to hide disco#inf |
||||
o requests handlers above it in the stack. |
||||
The last function is the callback that is used when the XMPP session is |
||||
terminated. |
||||
All callbacks are optional. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
The third argument to session is a callback function that will be called |
||||
when the session has been initialized. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Any function with access to the Session object can operate with the XMPP |
||||
session, such as connecting the XMPP client or sending stanzas. |
||||
More on this below. |
||||
\end_layout |
||||
|
||||
\begin_layout Subsection |
||||
Connecting the client |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Different clients connect to XMPP in different ways. |
||||
Some secure the stream with TLS, and some authenticate with the server. |
||||
Pontarius XMPP provides a flexible function to help out with this in a |
||||
convenient way: |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
connect :: MonadIO m => Session s m -> HostName -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
PortNumber -> Maybe (Certificate, (Certificate -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Bool)) -> Maybe (UserName, Password, Maybe |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Resource) -> (ConnectResult -> StateT s m ()) -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
StateT s m () |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
This function simply takes the host name and port number to connect to, |
||||
an optional tuple of the certificate to use and a function evaluating certifica |
||||
tes for TLS (if Nothing is provided, the connection will not be TLS secured), |
||||
and another optional tuple with user name, password, and an optional resource |
||||
for authentication (analogously, providing Nothing here causes Pontarius |
||||
XMPP not to authenticate). |
||||
The final paramter is a callback function providing the result of the connect |
||||
action. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
For more fine-grained control of the connection, use the openStream, secureWithT |
||||
LS, and authenticate functions. |
||||
\end_layout |
||||
|
||||
\begin_layout Subsection |
||||
Managing XMPP addresses |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
As with email, XMPP uses globally unique addresses (or JIDs, as they are |
||||
also called) in order to route and deliver messages over the network. |
||||
All XMPP entities are addressable on the local network. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
There are four functions dealing with XMPP addresses: |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
fromString :: String -> Maybe Address |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
fromStrings :: Maybe String -> String -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Maybe String -> Maybe Address |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
isBare :: Address -> Bool |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
isFull :: Address -> Bool |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
These functions should be pretty self-explainatory to those who know the |
||||
XMPP: Core standard. |
||||
The fromString functions takes one to three strings and tries to construct |
||||
an XMPP address. |
||||
isBare and isFull checks whether or not the bare is full (has a resource |
||||
value). |
||||
\end_layout |
||||
|
||||
\begin_layout Subsection |
||||
Sending stanzas |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Sending messages is done using this function: |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
sendMessage :: MonadIO m => Session s m -> Message -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Maybe (Message -> StateT s m Bool) -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Maybe (Timeout, StateT s m ()) -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Maybe (StreamError -> StateT s m ()) -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
StateT s m () |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Like in section 3.2, the first parameter is the session object. |
||||
The second is the message (check the Message record type in the API). |
||||
The third parameter is an optional callback function to be executed if |
||||
a reply to the message is received. |
||||
The fourth parameter contains a Timeout (Integer) value, and a callback |
||||
that Pontarius XMPP will call when a reply has not been received in the |
||||
window of the timeout. |
||||
The last parameter is an optional callback that is called if a stream error |
||||
occurs. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Presence and IQ stanzas are sent in a very similar way. |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Stanza IDs will be set for you if you leave them out. |
||||
If, however, you want to know what ID you send, you can acquire a stanza |
||||
ID by calling the getID function: |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
getID :: MonadIO m => Session s m -> StateT s m String |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Subsection |
||||
Concurrent usage |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
Sometimes clients will want to perform XMPP actions from more than one thread, |
||||
or in other words, they want to perform actions from code that is not a |
||||
Pontarius XMPP callback. |
||||
For these use cases, use injectAction: |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
\begin_inset listings |
||||
inline false |
||||
status open |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
injectAction :: MonadIO m => Session s m -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
Maybe (StateT s m Bool) -> StateT s m () -> |
||||
\end_layout |
||||
|
||||
\begin_layout Plain Layout |
||||
|
||||
StateT s m () |
||||
\end_layout |
||||
|
||||
\end_inset |
||||
|
||||
|
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
The second parameter is an optional predicate callback to be executed right |
||||
before the third parameter callback is called. |
||||
If it is provided and evaluates to False, then the action will not be called. |
||||
Otherwise, the action will be called. |
||||
\end_layout |
||||
|
||||
\begin_layout Subsection |
||||
Example echo server |
||||
\end_layout |
||||
|
||||
\begin_layout Standard |
||||
We provide an example to further illustrate the Pontarius XMPP API and to |
||||
make it easier for developers to get started with the library. |
||||
The program illustrates how to connect, authenticate, set a presence, and |
||||
echo all messages received. |
||||
It only uses one client handler. |
||||
The contents of this example may be used freely, as if it is in the public |
||||
domain. |
||||
You find it in the Examples directory of the Pontarius XMPP source code. |
||||
\end_layout |
||||
|
||||
\end_body |
||||
\end_document |
||||
Loading…
Reference in new issue