imagepaste-0.2.0.0: src/EngineRadikal.hs
module EngineRadikal (config, handler) where
import Data.Maybe
import Network.HTTP.Headers
import Network.HTTP
import Control.Monad.State (modify, get, put)
import Control.Monad.Reader (ask)
import Control.Monad.IO.Class (liftIO)
import qualified Control.Arrow
import qualified Data.Map as Map
import qualified Data.List as List
import qualified Engine
import qualified Tools
import qualified Processing
import qualified Configuration
import Log (msgDebug, msgInfo)
radikalUploadUrl = "http://radikal.ru/action.aspx"
radikalAuthUrl = "http://radikal.ru/REGISTER/PageLogin.aspx"
radikalFields = [
Engine.TextField "upload" "yes",
Engine.TextField "GEO_POINT_ID" "",
Engine.TextField "URLF" "",
Engine.TextField "" "0",
Engine.TextField "M" "640",
Engine.TextField "JQ" "85",
Engine.TextField "IM" "7",
Engine.TextField "VM" "180",
Engine.TextField "R" "0",
Engine.TextField "VE" "yes",
Engine.TextField "V" "Uvelishit'",
Engine.TextField "X" "",
Engine.TextField "FS" ""]
authFields = [
Engine.TextField "postpass" "yes",
Engine.TextField "rurl" "http://www.radikal.ru/default.aspx"]
config = Engine.PasteContext {
Engine.pcUploadLink = radikalUploadUrl,
Engine.pcFileTagName = "F",
Engine.pcFileName = "",
Engine.pcFields = radikalFields,
Engine.pcEncodingType = Engine.MultipartFormData,
Engine.pcContents = "",
Engine.pcResultLink = Nothing,
Engine.pcCustomFields = Map.empty,
Engine.pcAllowRedirect = False,
Engine.pcCustomHeaders = []
}
authConfig = Engine.PasteContext {
Engine.pcUploadLink = radikalAuthUrl,
Engine.pcFileTagName = "",
Engine.pcFileName = "",
Engine.pcFields = authFields,
Engine.pcEncodingType = Engine.MultipartFormData,
Engine.pcContents = "",
Engine.pcResultLink = Nothing,
Engine.pcCustomFields = Map.empty,
Engine.pcAllowRedirect = False,
Engine.pcCustomHeaders = []
}
handler :: Engine.PasteHandler ()
handler = do
config <- ask
returnHandler (Configuration.getEngineAuth config "radikal") where
returnHandler Nothing = getLoginPage >> sendFile
returnHandler _ = getLoginPage >> auth >> sendFile
-- | Retrieves UID and SID from login page
getLoginPage :: Engine.PasteHandler ()
getLoginPage = do
-- start login page
context <- get
liftIO $ msgDebug "Getting login page..."
loginPage <- liftIO $ Engine.fetch (getRequest radikalAuthUrl) True
let cookies = Engine.cookiesRemoveSet loginPage
liftIO $ msgDebug $ "cookies: " ++ show cookies
put $ Engine.addCustomHeaders context [cookies]
auth :: Engine.PasteHandler ()
auth = do
config <- ask
context <- get
-- add username and password form fields to authConfig context
-- add cookies (UID, SID) to authConfig from the context
let
auth = Configuration.getEngineAuth config "radikal"
(name, password) = maybe ("", "") (Configuration.eaName Control.Arrow.&&& Configuration.eaPassword) auth
withFields = Engine.addFields authConfig [Engine.TextField "username" name,
Engine.TextField "upassword" password]
withCookies = Engine.addCustomHeaders withFields $ Engine.pcCustomHeaders context
liftIO $ msgDebug "Sending post without file"
liftIO $ msgDebug $ "withFields: " ++ show withFields
liftIO $ msgDebug $ "withCookies: " ++ show withCookies
-- send login request
liftIO $ msgDebug "Sending HTTP FORM POST..."
response <- liftIO $ Engine.sendPostWithoutFile withCookies
let cookies = Engine.cookiesRemoveSet response
newHeaders = cookies : Engine.pcCustomHeaders withCookies
mergedCookie = Engine.mergeCookies newHeaders "; "
authorizedContext = context { Engine.pcCustomHeaders = [mergedCookie] }
liftIO $ msgDebug $ "newHeaders: " ++ show newHeaders
liftIO $ msgDebug $ "newCookies: " ++ show cookies
liftIO $ msgDebug $ "mergedCookie: " ++ show mergedCookie
put authorizedContext
sendFile :: Engine.PasteHandler ()
sendFile = Engine.uploadAndGrabHtml (Engine.grabExtractLinks "input" "value" Engine.FileExtension)
>>= Engine.saveFirstLink