func TestRegistration(t *testing.T) { wfe := setupWFE(t) wfe.RA = &MockRegistrationAuthority{} wfe.SA = &MockSA{} wfe.Stats, _ = statsd.NewNoopClient() wfe.SubscriberAgreementURL = agreementURL responseWriter := httptest.NewRecorder() // Test invalid method path, _ := url.Parse("/1") wfe.Registration(responseWriter, &http.Request{ Method: "MAKE-COFFEE", Body: makeBody("invalid"), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Method not allowed\"}") responseWriter.Body.Reset() // Test GET proper entry returns 405 path, _ = url.Parse("/1") wfe.Registration(responseWriter, &http.Request{ Method: "GET", URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Method not allowed\"}") responseWriter.Body.Reset() // Test POST invalid JSON path, _ = url.Parse("/2") wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody("invalid"), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Unable to read/verify body\"}") responseWriter.Body.Reset() key, err := jose.LoadPrivateKey([]byte(test2KeyPrivatePEM)) test.AssertNotError(t, err, "Failed to load key") rsaKey, ok := key.(*rsa.PrivateKey) test.Assert(t, ok, "Couldn't load RSA key") signer, err := jose.NewSigner("RS256", rsaKey) test.AssertNotError(t, err, "Failed to make signer") // Test POST valid JSON but key is not registered nonce, err := wfe.nonceService.Nonce() test.AssertNotError(t, err, "Unable to create nonce") result, err := signer.Sign([]byte("{\"agreement\":\""+agreementURL+"\"}"), nonce) path, _ = url.Parse("/2") wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody(result.FullSerialize()), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:unauthorized\",\"detail\":\"No registration exists matching provided key\"}") responseWriter.Body.Reset() key, err = jose.LoadPrivateKey([]byte(test1KeyPrivatePEM)) test.AssertNotError(t, err, "Failed to load key") rsaKey, ok = key.(*rsa.PrivateKey) test.Assert(t, ok, "Couldn't load RSA key") signer, err = jose.NewSigner("RS256", rsaKey) test.AssertNotError(t, err, "Failed to make signer") path, _ = url.Parse("/2") // Test POST valid JSON with registration up in the mock (with incorrect agreement URL) nonce, err = wfe.nonceService.Nonce() test.AssertNotError(t, err, "Unable to create nonce") result, err = signer.Sign([]byte("{\"agreement\":\"https://letsencrypt.org/im-bad\"}"), nonce) // Test POST valid JSON with registration up in the mock path, _ = url.Parse("/1") wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody(result.FullSerialize()), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Provided agreement URL [https://letsencrypt.org/im-bad] does not match current agreement URL ["+agreementURL+"]\"}") responseWriter.Body.Reset() // Test POST valid JSON with registration up in the mock (with correct agreement URL) nonce, err = wfe.nonceService.Nonce() test.AssertNotError(t, err, "Unable to create nonce") result, err = signer.Sign([]byte("{\"agreement\":\""+agreementURL+"\"}"), nonce) wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody(result.FullSerialize()), URL: path, }) test.AssertNotContains(t, responseWriter.Body.String(), "urn:acme:error") responseWriter.Body.Reset() }
func TestRegistration(t *testing.T) { wfe := NewWebFrontEndImpl() wfe.RA = &MockRegistrationAuthority{} wfe.SA = &MockSA{} wfe.Stats, _ = statsd.NewNoopClient() wfe.SubscriberAgreementURL = "https://letsencrypt.org/be-good" responseWriter := httptest.NewRecorder() // Test invalid method path, _ := url.Parse("/1") wfe.Registration(responseWriter, &http.Request{ Method: "MAKE-COFFEE", Body: makeBody("invalid"), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Method not allowed\"}") responseWriter.Body.Reset() // Test GET proper entry returns 405 path, _ = url.Parse("/1") wfe.Registration(responseWriter, &http.Request{ Method: "GET", URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Method not allowed\"}") responseWriter.Body.Reset() // Test POST invalid JSON path, _ = url.Parse("/2") wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody("invalid"), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Unable to read/verify body\"}") responseWriter.Body.Reset() // Test POST valid JSON but key is not registered path, _ = url.Parse("/2") wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody(`{ "payload" : "ewogICJjb250YWN0IjogWwogICAgIm1haWx0bzpjZXJ0LWFkbWluQGV4YW1wbGUuY28ubnoiLAogICAgInRlbDorMjQ5NTU1MTIxMiIKICBdLAogICJhZ3JlZW1lbnQiOiAieWVzIgp9Cg", "protected" : "eyJhbGciOiJQUzI1NiIsImp3ayI6eyJrdHkiOiJSU0EiLCJuIjoibTVDcHgzdlowQ2pBVGlyRHBiSUx2cTc4Zm0zRHY1UkJrTzFWTFdGbUpqNU1iNTR2YzlvWVpXYzFWMWstTEpvRVN1dVBIaGFOTzJFdThUOXRzbFFXY1pTenI1TklteEF3TWs5NzBnVlFhLUhxdi1KcjZ4c3RyQnBxN1RLcFhIVHgyRm5mQTJ3UXJmSVFTbEJYdTB0NGpkVU9yM29KaC1RWHZtYThuTElUZHRqcEMwQVpOdHFkMFFrUkpYXzkwU2FOcmwxOFJyXzBKckJIOVptVVNGY2YzbW9fQnRMMEd4MGpFM24taXdDSThyUXRmeVZQX185LW5fX3I0SWhhbEtMemFlaW82by1xcmRlbWgwRVpnaktHQ1MxX1JwVEllQXJrTzh1aWExS2dPcS16LUdmZW1LRW00czA3V09fYTBfOWRMcWJ2cG55eVp2VWk0MDVtM3ZHRGZRIiwiZSI6IkFBRUFBUSJ9fQ", "signature" : "exg0HJRHk-oSDiaOlgtTkT_COqDRyIAJr4g9fDAJh5GF5evXAfT0Hbkfy4TYzqvF6oOldIaCylYhXjYtve4JLXEMdAj1DaR7kGVALskLg-XbiZ0-IaFBiDDaT6mwyLBTfstX4DD2OL7x0vyuTK16bHEIF0hncwHYVSoX5eFOBQLVu_gjxc7J5OZK4ugSJxZEilTVta0A9EdXdUxth0qqbZg_hJDmGOyNge03C71GbhMs-DF-rujlhe7L4VhcV3U0Wj8kSuAGn_DIHBJ1zM0H46PRgyz_9DgkJ6XnE5W8ZA3kF0VPFSp4ofqBhkFUXLXPPJJUEurAQxBJMaU31ef8bg" }`), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:unauthorized\",\"detail\":\"No registration exists matching provided key\"}") responseWriter.Body.Reset() key, err := jose.LoadPrivateKey([]byte(test1KeyPrivatePEM)) test.AssertNotError(t, err, "Failed to load key") rsaKey, ok := key.(*rsa.PrivateKey) test.Assert(t, ok, "Couldn't load RSA key") signer, err := jose.NewSigner("RS256", rsaKey) test.AssertNotError(t, err, "Failed to make signer") path, _ = url.Parse("/2") // Test POST valid JSON with registration up in the mock (with incorrect agreement URL) result, err := signer.Sign([]byte("{\"agreement\":\"https://letsencrypt.org/im-bad\"}")) // Test POST valid JSON with registration up in the mock path, _ = url.Parse("/1") wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody(result.FullSerialize()), URL: path, }) test.AssertEquals(t, responseWriter.Body.String(), "{\"type\":\"urn:acme:error:malformed\",\"detail\":\"Provided agreement URL [https://letsencrypt.org/im-bad] does not match current agreement URL [https://letsencrypt.org/be-good]\"}") responseWriter.Body.Reset() // Test POST valid JSON with registration up in the mock (with correct agreement URL) result, err = signer.Sign([]byte("{\"agreement\":\"https://letsencrypt.org/be-good\"}")) wfe.Registration(responseWriter, &http.Request{ Method: "POST", Body: makeBody(result.FullSerialize()), URL: path, }) test.AssertNotContains(t, responseWriter.Body.String(), "urn:acme:error") responseWriter.Body.Reset() }