Skip to content

Commit

Permalink
Merge branch 'feature/logging'
Browse files Browse the repository at this point in the history
  • Loading branch information
haf committed Aug 7, 2016
2 parents 98c8712 + 7b5685a commit 360efb9
Show file tree
Hide file tree
Showing 15 changed files with 126 additions and 82 deletions.
4 changes: 2 additions & 2 deletions .semver
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
:major: 3
:major: 4
:minor: 0
:patch: 5
:patch: 0
:special: ''
:metadata: ''
23 changes: 23 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
---
language: csharp

mono:
- 4.2.3
- 4.4.1
- weekly
- latest

before_install:
- rvm install 2.2.3

install:
- gem install bundler
- bundle

script:
- bundle exec rake

matrix:
allow_failures:
- mono: latest
- mono: weekly
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
source 'https://rubygems.org'
gem 'albacore', '~> 2.3.8'
gem 'albacore'
18 changes: 10 additions & 8 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
GEM
remote: https://rubygems.org/
specs:
albacore (2.3.22)
albacore (2.6.0)
map (~> 6.5)
nokogiri (~> 1.5)
rake (~> 10)
semver2 (~> 3.4)
map (6.5.5)
mini_portile (0.6.2)
nokogiri (1.6.6.2)
mini_portile (~> 0.6.0)
rake (10.4.2)
map (6.6.0)
mini_portile2 (2.1.0)
nokogiri (1.6.8)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
pkg-config (1.1.7)
rake (10.5.0)
semver2 (3.4.2)

PLATFORMS
ruby

DEPENDENCIES
albacore (~> 2.3.8)
albacore

BUNDLED WITH
1.10.5
1.12.5
15 changes: 15 additions & 0 deletions appveyor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
version: 4.0.{build}

build_script:
- cmd: gem sources -r https://rubygems.org/
- cmd: gem install bundler --no-ri --no-rdoc --source https://rubygems.org/
- cmd: bundle install
- cmd: bundle exec rake

artifacts:
- path: build\pkg\*.nupkg

test: off

nuget:
project_feed: true
2 changes: 1 addition & 1 deletion paket.lock
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ NUGET
GITHUB
remote: haf/YoLo
specs:
YoLo.fs (f122eebb2ab82e06ac31ce51f3b4632fb26fd130)
YoLo.fs (54c0a81be5bce9db211420dc8315c3daab0d1462)
remote: logary/logary
specs:
src/Logary.Facade/Facade.fs (50abd2450d629491120418718dbd6f74408872a7)
13 changes: 6 additions & 7 deletions src/Logibit.Hawk.Suave.Tests/Hawk.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ open System.Net
open System.Net.Http
open System.Net.Http.Headers
open Fuchu
open NodaTime
open Suave
open Suave.Web
open Suave.Filters
Expand All @@ -16,8 +17,6 @@ type HM = HttpMethod
open Logibit.Hawk
open Logibit.Hawk.Server
open Logibit.Hawk.Client
open NodaTime
open Fuchu
open Suave.Http

module Helpers =
Expand Down Expand Up @@ -84,7 +83,7 @@ let serverClientAuthentication =
)

yield testCase "signing GET request" <| fun _ ->
let opts = ClientOptions.mkSimple (credsInner "1")
let opts = ClientOptions.createSimple (credsInner "1")
let request = setAuthHeader HM.GET opts

runWithDefaultConfig hawkAuthenticate |> req HttpMethod.GET None request (fun resp ->
Expand All @@ -97,7 +96,7 @@ let serverClientAuthentication =

yield testCase "signing POST request" <| fun _ ->
let opts =
{ ClientOptions.mkSimple (credsInner "1")
{ ClientOptions.createSimple (credsInner "1")
with payload = Some [| 0uy; 1uy |] }

let request =
Expand All @@ -116,7 +115,7 @@ let serverClientAuthentication =
Hawk.authenticate proxySettings Hawk.bindHeaderReq unauthed authed

yield testCase "signing POST request" <| fun _ ->
let opts = { ClientOptions.mkSimple (credsInner "1") with payload = Some [| 0uy; 1uy |] }
let opts = { ClientOptions.createSimple (credsInner "1") with payload = Some [| 0uy; 1uy |] }

let request =
setAuthHeader HM.POST opts
Expand Down Expand Up @@ -170,7 +169,7 @@ let bewitServerClientAuth =
localClockOffset = Duration.Zero
clock = clock
ext = None
logger = Logging.NoopLogger }
logger = Logging.Targets.create Logging.Warn }

let requestf =
setBewitQuery opts
Expand All @@ -193,7 +192,7 @@ let bewitServerClientAuth =
localClockOffset = Duration.Zero
clock = clock
ext = None
logger = Logging.NoopLogger }
logger = Logging.Targets.create Logging.Warn }

let requestf =
setBewitQuery opts
Expand Down
27 changes: 13 additions & 14 deletions src/Logibit.Hawk.Tests/Bewit.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@ open System.Net
open System.Diagnostics
open Fuchu
open NodaTime

open Logibit.Hawk
open Logibit.Hawk.Bewit
open Logibit.Hawk.Encoding
open Logibit.Hawk.Logging
open Logibit.Hawk.Types

open Logibit.Hawk.Tests.Shared

let ts i = Instant.FromTicksSinceUnixEpoch(i * NodaConstants.TicksPerMillisecond)
Expand All @@ -21,12 +19,13 @@ let clock =

type DebugPrinter (name : string) =
interface Logger with
member x.Verbose fLine =
Debug.WriteLine (sprintf "%s: %A" name (fLine ()))
member x.Debug fLine =
Debug.WriteLine (sprintf "%s: %A" name (fLine ()))
member x.Log line =
Debug.WriteLine (sprintf "%s: %A" name line)
member x.logSimple msg =
Debug.WriteLine (sprintf "%s: %A" name msg)
member x.log level msg =
Debug.WriteLine (sprintf "%s: %A" name msg)
member x.logWithAck level msgFactory =
Debug.WriteLine (sprintf "%s: %A" name (msgFactory level))
async.Return ()

let credsInner =
{ id = "123456"
Expand All @@ -47,7 +46,7 @@ let ``bewit generation`` =
clock = clock
localClockOffset = ts 1356420407232L - clock.Now
ext = Some "xandyandz"
logger = Logging.NoopLogger }
logger = Logging.Targets.create Logging.Warn }
Assert.Equal("bewit should generate correctly",
"MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6",
b)
Expand All @@ -61,7 +60,7 @@ let ``bewit generation`` =
clock = clock
localClockOffset = ts 1356420407232L - clock.Now
ext = Some "xandyandz"
logger = Logging.NoopLogger }
logger = Logging.Targets.create Logging.Warn }
Assert.Equal("bewit should generate correctly",
"MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6",
b)
Expand All @@ -75,7 +74,7 @@ let ``bewit generation`` =
clock = clock
localClockOffset = ts 1356420407232L - clock.Now
ext = None
logger = Logging.NoopLogger }
logger = Logging.Targets.create Logging.Warn }
Assert.Equal("bewit should generate correctly",
"MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c",
b)
Expand Down Expand Up @@ -124,7 +123,7 @@ let ``parsing bewit parts`` =
clock = clock
localClockOffset = ts 1356420407232L - clock.Now
ext = None
logger = Logging.NoopLogger }
logger = Logging.Targets.create Logging.Warn }
match Bewit.parse b with
| Choice1Of2 map ->
Assert.Equal("has id", credsInner.id, map |> Map.find "id")
Expand All @@ -136,7 +135,7 @@ let ``parsing bewit parts`` =

let settings =
{ Settings.clock = clock
logger = Logging.NoopLogger
logger = Targets.create Warn
allowedClockSkew = Duration.FromMilliseconds 300L
localClockOffset = ts 1356420407232L - clock.Now
nonceValidator = Settings.nonceValidatorMem
Expand All @@ -155,7 +154,7 @@ let authentication =
clock = clock
localClockOffset = ts 1356420407232L - clock.Now
ext = Some "some-app-data"
logger = Logging.NoopLogger }
logger = Targets.create Warn }

let bewitRequest fInspect =
uriBuilder.Query <- uriParams
Expand Down
2 changes: 1 addition & 1 deletion src/Logibit.Hawk.Tests/Server.fs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ let server =

let settings =
{ clock = clock
logger = Logging.NoopLogger
logger = Logging.Targets.create Logging.Warn
allowedClockSkew = Duration.FromMilliseconds 8000L
localClockOffset = Duration.Zero
nonceValidator = Settings.nonceValidatorNoop
Expand Down
39 changes: 19 additions & 20 deletions src/Logibit.Hawk/Bewit.fs
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,12 @@ module internal Impl =
(DecodeError (sprintf "Could not decode from base64. Uri '%O'" req.uri))

let logFailure (logger : Logger) timestamp (err : BewitError) =
{ message = "authenticate failure"
{ value = Event "Authenticate Failure"
level = Info
path = "Logibit.Hawk.Bewit.authenticate"
data = [ "error", box err ] |> Map.ofList
timestamp = timestamp }
|> logger.Log
name = "Logibit.Hawk.Bewit.authenticate".Split('.')
fields = [ "error", box err ] |> Map.ofList
timestamp = Instant.toEpochNanos timestamp }
|> logger.logSimple

let mapResult (a, (b, c)) = a, b, c

Expand All @@ -181,19 +181,19 @@ let gen (uri : Uri) (opts : BewitOptions) =
|> Crypto.calcNormMac "bewit"
let exp = exp.Ticks / NodaConstants.TicksPerSecond |> string
let ext = opts.ext |> Option.orDefault ""
(fun _ ->
{ message = "Generate Bewit"
level = Verbose
path = "Logibit.Hawk.Bewit.gen"
data = Map
opts.logger.verbose (fun level ->
{ value = Event "Generate Bewit"
level = level
name = "Logibit.Hawk.Bewit.gen".Split('.')
fields = Map
[ "nowWithOffset", box nowWithOffset
"normalised", box norm
"id", box opts.credentials.id
"exp", box exp
"mac", box mac
"ext", box ext ]
timestamp = now }
) |> Logger.debug opts.logger
timestamp = Instant.toEpochNanos now }
)
// Construct bewit: id\exp\mac\ext
sprintf "%s\\%s\\%s\\%s" opts.credentials.id exp mac ext

Expand All @@ -208,11 +208,11 @@ let authenticate (settings : Settings<'TPrincipal>)
let now = settings.clock.Now
let nowWithOffset = settings.clock.Now + settings.localClockOffset // before computing

(fun _ ->
{ message = "Authenticate Bewit"
level = Verbose
path = "Logibit.Hawk.Bewit.authenticate"
data =
settings.logger.verbose (fun level ->
{ value = Event "Authenticate Bewit"
level = level
name = "Logibit.Hawk.Bewit.authenticate".Split('.')
fields =
[ "nowWithOffset", box nowWithOffset
"req", box (
[ "method", box req.``method``
Expand All @@ -221,16 +221,15 @@ let authenticate (settings : Settings<'TPrincipal>)
"port", box req.port
] |> Map.ofList)
] |> Map.ofList
timestamp = now })
|> Logger.debug settings.logger
timestamp = Instant.toEpochNanos now })

let reqAttr m = Parse.reqAttr MissingAttribute Impl.toBewitError m
let optAttr m = Parse.optAttr m

Impl.decodeFromBase64 req
>>= parse // parse bewit string
>>= (fun parts ->
Writer.lift (BewitAttributes.mk req.``method`` (Impl.removeBewitFromUri req.uri))
Writer.lift (BewitAttributes.create req.``method`` (Impl.removeBewitFromUri req.uri))
>>~ reqAttr parts "id" (Parse.nonEmptyString, BewitAttributes.id_)
>>= reqAttr parts "exp" (Parse.unixSecInstant, BewitAttributes.expiry_)
>>= reqAttr parts "mac" (Parse.id, BewitAttributes.mac_)
Expand Down
2 changes: 1 addition & 1 deletion src/Logibit.Hawk/Client.fs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type ClientOptions =

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module ClientOptions =
let mkSimple creds =
let createSimple creds =
{ credentials = creds
timestamp = SystemClock.Instance.Now
nonce = None
Expand Down
2 changes: 1 addition & 1 deletion src/Logibit.Hawk/Crypto.fs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ open Logibit.Hawk.Types
let headerVersion = "1"

let private initPayloadHash (algo : Algo) contentType =
let h = Hash.mkSimple algo.DotNetString (String.Concat ["hawk."; headerVersion; ".payload\n" ])
let h = Hash.createSimple algo.DotNetString (String.Concat ["hawk."; headerVersion; ".payload\n" ])
Hash.updateStr h (String.Concat [Hoek.parseContentType contentType; "\n"])
h

Expand Down
13 changes: 10 additions & 3 deletions src/Logibit.Hawk/Prelude.fs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ module Writer =
let ``return`` m =
m.state

module Instant =
open NodaTime

/// Convert the instant to nanoseconds since epoch
let toEpochNanos (i : Instant) =
i.Ticks * 100L (* 100 nanos per tick *)

module Hash =
open System.Text
open System.Security.Cryptography
Expand All @@ -47,10 +54,10 @@ module Hash =
h.TransformFinalBlock([||], 0, 0) |> ignore
h.Hash

let mk (algo : string) (bytes : byte[]) =
let create (algo : string) (bytes : byte[]) =
let h = HashAlgorithm.Create algo
update h bytes
h

let mkSimple (algo : string) (s : string) =
mk algo (UTF8.bytes s)
let createSimple (algo : string) (s : string) =
create algo (UTF8.bytes s)
Loading

0 comments on commit 360efb9

Please sign in to comment.