diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Identity.hs | 17 | ||||
| -rw-r--r-- | src/State.hs | 27 | 
2 files changed, 24 insertions, 20 deletions
| diff --git a/src/Identity.hs b/src/Identity.hs index 0f3e81b..0e3e318 100644 --- a/src/Identity.hs +++ b/src/Identity.hs @@ -5,6 +5,7 @@ module Identity (      idData, idDataF, idName, idOwner, idUpdates, idKeyIdentity, idKeyMessage,      emptyIdentityData, +    createIdentity,      validateIdentity, validateIdentityF,      loadIdentity, loadUnifiedIdentity, @@ -108,6 +109,22 @@ emptyIdentityData key = IdentityData      , iddKeyMessage = Nothing      } +createIdentity :: Storage -> Maybe Text -> Maybe UnifiedIdentity -> IO UnifiedIdentity +createIdentity st name owner = do +    (secret, public) <- generateKeys st +    (_secretMsg, publicMsg) <- generateKeys st + +    let signOwner idd +            | Just o <- owner = do +                Just ownerSecret <- loadKey (iddKeyIdentity $ fromStored $ signedData $ fromStored $ idData o) +                signAdd ownerSecret idd +            | otherwise = return idd + +    Just identity <- return . validateIdentity =<< wrappedStore st =<< signOwner =<< sign secret =<< +        wrappedStore st (emptyIdentityData public) +        { iddName = name, iddOwner = idData <$> owner, iddKeyMessage = Just publicMsg } +    return identity +  validateIdentity :: Stored (Signed IdentityData) -> Maybe UnifiedIdentity  validateIdentity = validateIdentityF . I.Identity diff --git a/src/State.hs b/src/State.hs index 8e9e320..55c55e1 100644 --- a/src/State.hs +++ b/src/State.hs @@ -90,32 +90,19 @@ loadLocalStateHead st = loadHeads st >>= \case          hFlush stdout          devName <- T.getLine -        (owner, secret) <- if -            | T.null name -> return (Nothing, Nothing) -            | otherwise -> do -                (secret, public) <- generateKeys st -                (_secretMsg, publicMsg) <- generateKeys st - -                return . (, Just secret) . Just =<< wrappedStore st =<< sign secret =<< -                    wrappedStore st (emptyIdentityData public) -                    { iddName = Just name, iddKeyMessage = Just publicMsg } - -        (devSecret, devPublic) <- generateKeys st -        (_devSecretMsg, devPublicMsg) <- generateKeys st - -        identity <- wrappedStore st =<< maybe return signAdd secret =<< sign devSecret =<< wrappedStore st (emptyIdentityData devPublic) -            { iddName = if T.null devName then Nothing else Just devName -            , iddOwner = owner -            , iddKeyMessage = Just devPublicMsg -            } +        owner <- if +            | T.null name -> return Nothing +            | otherwise -> Just <$> createIdentity st (Just name) Nothing + +        identity <- createIdentity st (if T.null devName then Nothing else Just devName) owner          shared <- wrappedStore st $ SharedState              { ssPrev = []              , ssType = Just $ sharedTypeID @(Signed IdentityData) Proxy -            , ssValue = [storedRef $ fromMaybe identity owner] +            , ssValue = [storedRef $ idData $ fromMaybe identity owner]              }          storeHead st $ LocalState -            { lsIdentity = identity +            { lsIdentity = idData identity              , lsShared = [shared]              } |