module Network.Google.Contacts (
listContacts
, extractGnuPGNotes
) where
import Control.Monad ((<=<), (>>), liftM)
import Crypto.GnuPG (Recipient, decrypt, encrypt)
import Data.List (stripPrefix)
import Data.Maybe (fromJust, fromMaybe, mapMaybe)
import Network.Google (AccessToken, doRequest, makeRequest, makeRequestValue)
import Network.HTTP.Conduit (Request(..), def, httpLbs, responseBody, withManager)
import Text.XML.Light (Element, elChildren, filterChildName, parseXMLDoc, qName, strContent)
contactsHost :: String
contactsHost = "www.google.com"
contactsApi :: (String, String)
contactsApi = ("Gdata-version", "3.0")
listContacts ::
AccessToken
-> IO Element
listContacts accessToken =
do
let
request = listContactsRequest accessToken
doRequest request
listContactsRequest ::
AccessToken
-> Request m
listContactsRequest accessToken =
(makeRequest accessToken contactsApi "GET" (contactsHost, "/m8/feeds/contacts/default/full/"))
{
queryString = makeRequestValue "?max-results=100000"
}
extractGnuPGNotes ::
[Recipient]
-> Element
-> IO String
extractGnuPGNotes recipients text =
do
let
passwords = extractGnuPGNotes' text
replacePassword (t, o, p) =
do
p' <- decrypt p
return $ unlines ["-----", "", t, o, "", p']
passwords' <- mapM replacePassword passwords
(if null recipients then return . id else encrypt recipients) $ unlines passwords'
extractGnuPGNotes' ::
Element
-> [(String, String, String)]
extractGnuPGNotes' xml =
let
findChildName :: String -> Element -> Maybe Element
findChildName x = filterChildName (\z -> qName z == x)
checkPrefix :: String -> String -> Maybe String
checkPrefix p x = liftM (const x) . stripPrefix p $ x
getTitle :: Element -> Maybe String
getTitle = liftM strContent . findChildName "title"
getOrganization :: Element -> Maybe String
getOrganization = liftM strContent . findChildName "orgName" <=< findChildName "organization"
getPGP :: Element -> Maybe String
getPGP = checkPrefix "-----BEGIN PGP MESSAGE-----" <=< liftM strContent . findChildName "content"
getEntry :: Element -> Maybe (String, String, String)
getEntry x =
do
let
t = fromMaybe "" $ getTitle x
o = fromMaybe "" $ getOrganization x
p <- getPGP x
return (t, o, p)
in
mapMaybe getEntry $ elChildren xml