From 484609fb8b0ee33831cf17ba8ce64aadc07e6d92 Mon Sep 17 00:00:00 2001 From: Danielle McLean Date: Wed, 4 Oct 2017 09:09:39 +1100 Subject: [PATCH] Add support for PGP keys on the h-card - can support an arbitrary number of keys, although I only have one --- config/models | 6 + src/Widget/Hcard.hs | 9 + .../ACA7BABE.asc | 171 ++++++++++++++++++ templates/hcard.hamlet | 5 + 4 files changed, 191 insertions(+) create mode 100644 static/pgp/83F3DCEC98D522B6A38AF5D927D076D2ACA7BABE/730bdc101033253892477f590e847fc0e494327d452a433f085ad1cd2db6cea4/ACA7BABE.asc diff --git a/config/models b/config/models index 8a5eb2e..60e52dc 100644 --- a/config/models +++ b/config/models @@ -7,6 +7,12 @@ User UniqueEmail email deriving Typeable +PgpKey + userId UserId + fingerprint Text maxlen=40 + hash Text maxlen=64 + UniqueFingerprint fingerprint + Site icon Text sqltype=varchar(255) url Text sqltype=varchar(255) diff --git a/src/Widget/Hcard.hs b/src/Widget/Hcard.hs index bd663df..74b7ebe 100644 --- a/src/Widget/Hcard.hs +++ b/src/Widget/Hcard.hs @@ -6,6 +6,7 @@ module Widget.Hcard (hcard) where import Import import Data.Maybe (fromJust) import qualified Data.Map as M +import qualified Data.Text as T import qualified Network.Libravatar as L entityToTuple :: Entity t -> (Key t, t) @@ -17,6 +18,13 @@ arrangeProfiles sites profiles = sortBy icon $ zip profileSites profiles profileSites = findSite <$> profiles icon = comparing $ siteIcon . fst +prettyPgp :: PgpKey -> Text +prettyPgp = T.unwords . T.chunksOf 4 . pgpKeyFingerprint + +routeFromPgp :: PgpKey -> Route App +routeFromPgp PgpKey { pgpKeyFingerprint = f, pgpKeyHash = h } = + StaticR $ StaticRoute ["pgp", f, h, T.takeEnd 8 f ++ ".asc"] [] + hcard :: Entity User -> Widget hcard (Entity userId user) = do maybeAvatar <- liftIO $ L.avatarUrl (L.Email $ userEmail user) def { L.optSecure = True, L.optSize = L.Size 512 } @@ -24,4 +32,5 @@ hcard (Entity userId user) = do profiles <- map entityVal <$> selectList [ProfileUserId ==. userId] [] sites <- M.fromList . map entityToTuple <$> selectList [SiteId <-. (profileSiteId <$> profiles)] [] return $ arrangeProfiles sites profiles + pgpKeys <- handlerToWidget . runDB $ map entityVal <$> selectList [PgpKeyUserId ==. userId] [] $(widgetFile "hcard") diff --git a/static/pgp/83F3DCEC98D522B6A38AF5D927D076D2ACA7BABE/730bdc101033253892477f590e847fc0e494327d452a433f085ad1cd2db6cea4/ACA7BABE.asc b/static/pgp/83F3DCEC98D522B6A38AF5D927D076D2ACA7BABE/730bdc101033253892477f590e847fc0e494327d452a433f085ad1cd2db6cea4/ACA7BABE.asc new file mode 100644 index 0000000..7a4a6c3 --- /dev/null +++ b/static/pgp/83F3DCEC98D522B6A38AF5D927D076D2ACA7BABE/730bdc101033253892477f590e847fc0e494327d452a433f085ad1cd2db6cea4/ACA7BABE.asc @@ -0,0 +1,171 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +6fGcFiSe50Klf2ctCTwAVg== +=8wOv +-----END PGP PUBLIC KEY BLOCK----- diff --git a/templates/hcard.hamlet b/templates/hcard.hamlet index e930dd7..3d800ea 100644 --- a/templates/hcard.hamlet +++ b/templates/hcard.hamlet @@ -3,6 +3,11 @@ Avatar for #{userFullName user}

#{userFullName user} + $forall key <- pgpKeys + + + #{prettyPgp key} +

#{userNote user}