Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
| Comment: | Handle automatic re-login on each separate curl call
I.e. rather than check the validity of the token each time by making a It's still messy, but I think this approach is right - it'll just be my |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | origin/issue1 | trunk | master |
| Files: | files | file ages | folders |
| SHA3-256: |
76a89c1a9bdfb7f3df1ac871310da342 |
| User & Date: | base@atomicules.co.uk 2017-10-29 17:10:37 |
|
2019-02-08
| ||
| 12:52 | Add comment for future list usage support check-in: 0fe877fd3b user: atomicules tags: master, origin/issue1, trunk | |
|
2017-10-29
| ||
| 17:10 |
Handle automatic re-login on each separate curl call
I.e. rather than check the validity of the token each time by making a It's still messy, but I think this approach is right - it'll just be my | |
|
2017-10-22
| ||
| 10:56 | Sort out markup in README check-in: a393b4c91b user: base@atomicules.co.uk tags: master, origin/issue1, trunk | |
Changes to haskerdeux.hs.
| ︙ | ︙ | |||
34 35 36 37 38 39 40 | time <- getClockTime >>= toCalendarTime --https://wiki.haskell.org/Unix_tools/Date let todays_date = formatCalendarTime defaultTimeLocale "%Y-%m-%d" time let tomorrows_date = show (addDays 1 $ read todays_date::Data.Time.Day) let todos_date | date == "today" = todays_date | date == "tomorrow" = tomorrows_date | otherwise = date when ((command `elem` ["todos"] && Data.List.null argList) || (command `elem` ["new", "crossoff", "putoff", "delete"] && length argList == 1) || (command == "moveto" && length argList == 2)) $ do | < < | > > > | | | > > > > > > | | | > > > > > > | | | > > > > > > | | | > > > | > > < < < < < < < < < | < < < > > > > > > > | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
time <- getClockTime >>= toCalendarTime --https://wiki.haskell.org/Unix_tools/Date
let todays_date = formatCalendarTime defaultTimeLocale "%Y-%m-%d" time
let tomorrows_date = show (addDays 1 $ read todays_date::Data.Time.Day)
let todos_date | date == "today" = todays_date
| date == "tomorrow" = tomorrows_date
| otherwise = date
when ((command `elem` ["todos"] && Data.List.null argList) || (command `elem` ["new", "crossoff", "putoff", "delete"] && length argList == 1) || (command == "moveto" && length argList == 2)) $ do
token <- login
dispatch command (token, todos_date:argList)
readnetrc = do
home <- getHomeDirectory
netrc <- lines Control.Applicative.<$> readFile (home ++ "/.netrc")
let netrc' = dropWhile (not . ("teuxdeux" `isInfixOf`)) netrc
let (username, password) = if "login" `isInfixOf` head netrc'
-- if entry is on one line
then (getcred "login", getcred "password")
-- if entry is on multiple lines
else (last $ words $ netrc' !! 1, last $ words $ netrc' !! 2)
where getcred c = dropWhile (not . (c `isInfixOf`)) (words $ head netrc') !! 1
return (username, password)
curlget (token, date) = do
let curlheader = "X-CSRF-Token: " ++ token
body <- readProcess "curl" ["-s", "-L", "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader, "https://teuxdeux.com/api/v1/todos/calendar?begin_date="++date++"&end_date="++date] []
let ok = not ("Invalid CSRF Token" `isInfixOf` body)
if ok
then do
let tds = decodeJSON body :: [Teuxdeux]
let tdsf = Data.List.filter (\td -> current_date td == date && not (done td)) tds
return tdsf
else do
token <- relogin
curlget (token, date)
curlpost (token, [date, key, value, apiurl, okresponse]) number = do
let curlheader = "X-CSRF-Token: " ++ token
--Can be much improved, but will do for now:
json <- if isJust number
then do
tdsf <- curlget (token, date)
let itemid = Main.id $ tdsf!!(read (fromJust number)::Int)
let modjson = "{ \"ids\" : [\""++show itemid++"\"], \""++key++"\" : \""++value++"\"}"
return modjson
else do
--Can't just straight return these strings, need to let them first
let newjson = "{ \"current_date\" : \""++date++"\", \""++key++"\" : \""++value++"\"}"
return newjson
body <- readProcess "curl" ["-s", "-XPOST", apiurl, "-L", "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader, "-H", "Content-Type: application/json", "-d", json] []
let ok = not ("Invalid CSRF Token" `isInfixOf` body)
if ok
then
if "done_updated_at" `isInfixOf` body
then putStrLn okresponse
else putStrLn "Uh Oh! Didn't work!"
else do
token <- relogin
curlpost (token, [date, key, value, apiurl, okresponse]) number
curldelete (token, [date, apiurl, okresponse]) number = do
tdsf <- curlget (token, date)
let itemid = Main.id $ tdsf!!(read number::Int)
let curlheader = "X-CSRF-Token: " ++ token
body <- readProcess "curl" ["-s", "-XDELETE", apiurl++show itemid, "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader] []
let ok = not ("Invalid CSRF Token" `isInfixOf` body)
if ok
then
if "done_updated_at" `isInfixOf` body
then putStrLn okresponse
else putStrLn "Uh Oh! Didn't work!"
else do
token <- relogin
curldelete (token, [date, apiurl, okresponse]) number
curlput (token, [date, json, apiurl, okresponse]) number = do
tdsf <- curlget (token, date)
let itemid = Main.id $ tdsf!!(read number::Int)
let curlheader = "X-CSRF-Token: " ++ token
body <- readProcess "curl" ["-s", "-XPUT", apiurl++show itemid, "-L", "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader, "-H", "Content-Type: application/json", "-d", json] []
let ok = not ("Invalid CSRF Token" `isInfixOf` body)
if ok
then
if "done_updated_at" `isInfixOf` body
then putStrLn okresponse
else putStrLn "Uh Oh! Didn't work!"
else do
token <- relogin
curlput (token, [date, json, apiurl, okresponse]) number
getauthtoken body = do
let bodylines = lines body
let authline = dropWhile (not . ("authenticity_token" `isInfixOf`)) bodylines
let authwords = words $ head authline
let authtokenword = stripPrefix "value=\"" $ last authwords
let revauthtokenword = reverse $ fromJust authtokenword
let authtoken = reverse $ fromJust $ stripPrefix ">\"" revauthtokenword
return authtoken
login = do
username <- fmap fst readnetrc
password <- fmap snd readnetrc
home <- getHomeDirectory
savedtoken <- doesFileExist (home ++ "/.haskerdeux-token")
if savedtoken
then do
token <- readFile (home ++ "/.haskerdeux-token")
return token
else do
body <- readProcess "curl" ["-s", "-L", "-c", "haskerdeux.cookies", "https://teuxdeux.com/login"] []
token <- getauthtoken body
writeFile (home ++ "/.haskerdeux-token") token
let curlheader = "X-CSRF-Token: " ++ token
let curlpostfields = "username=" ++ username ++ "&password=" ++ password ++ "&authenticity_token=" ++ token
body <- readProcess "curl" ["-s", "-L", "-c", "haskerdeux.cookies", "-b", "haskerdeux.cookies", "-H", curlheader, "-d", curlpostfields, "https://teuxdeux.com/login"] []
return token
relogin = do
home <- getHomeDirectory
removeFile (home ++ "/.haskerdeux-token")
token <- login
return token
todos (token, [todos_date]) = do
tdsf <- curlget (token, todos_date)
putStr $ unlines $ zipWith (\n td -> show n ++ " - " ++ td) [0..] $ Data.List.map text tdsf --numbering from LYAH
new (token, [todos_date, todo]) = do
|
| ︙ | ︙ |