profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/desimone/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.

desimone/evie-hugo 6

A hugo port of the evie theme.

desimone/kaggle-dog-breed-keras-pytorch 1

Example of network fine-tuning in Keras and Pytorch.

desimone/autocache 0

Distributed cache with gossip peer membership enrollment.

desimone/awesome-go 0

A curated list of awesome Go frameworks, libraries and software

desimone/awesome-kubernetes 0

A curated list for awesome kubernetes sources :ship::tada:

desimone/awesome-sysadmin 0

A curated list of amazingly awesome open source sysadmin resources.

desimone/awesome-vuepress 0

🎉 A curated list of awesome things related to VuePress

desimone/certmagic 0

Automatic HTTPS for any Go program: fully-managed TLS certificate issuance and renewal

desimone/chart-releaser-action 0

A GitHub Action to turn a GitHub project into a self-hosted Helm chart repo, using helm/chart-releaser CLI tool

desimone/charts 0

Curated applications for Kubernetes

Pull request review commentpomerium/webauthn

add types from webauthn spec

+package webauthn++import "time"++type (

super nit: The wrapping type() block makes me think these are related / grouped types. Total preference thing but I'd probably prefer to have the type blocks separated.

calebdoxsey

comment created time in 17 hours

Pull request review commentpomerium/webauthn

add types from webauthn spec

+package webauthn++import "time"++type (+	// The AuthenticatorAttestationResponse interface represents the authenticator's response to a client's request for+	// the creation of a new public key credential. It contains information about the new credential that can be used to+	// identify it for later use, and metadata that can be used by the WebAuthn Relying Party to assess the+	// characteristics of the credential during registration.+	AuthenticatorAttestationResponse struct {+		// ClientDataJSON contains the JSON-compatible serialization of client data passed to the authenticator by the+		// client in order to generate this credential. The exact JSON serialization MUST be preserved, as the hash of+		// the serialized client data has been computed over it.+		ClientDataJSON []byte `json:"clientDataJSON"`+		// AttestationObject contains an attestation object, which is opaque to, and cryptographically protected+		// against tampering by, the client. The attestation object contains both authenticator data and an attestation+		// statement. The former contains the AAGUID, a unique credential ID, and the credential public key. The+		// contents of the attestation statement are determined by the attestation statement format used by the+		// authenticator. It also contains any additional information that the Relying Party's server requires to+		// validate the attestation statement, as well as to decode and validate the authenticator data along with the+		// JSON-compatible serialization of client data.+		AttestationObject []byte `json:"attestationObject"`+	}++	// The AuthenticatorAssertionResponse represents an authenticator's response to a client’s request for generation+	// of a new authentication assertion given the WebAuthn Relying Party's challenge and OPTIONAL list of credentials+	// it is aware of. This response contains a cryptographic signature proving possession of the credential private+	// key, and optionally evidence of user consent to a specific transaction.+	AuthenticatorAssertionResponse struct {+		// ClientDataJSON contains the JSON-compatible serialization of client data passed to the authenticator by the+		// client in order to generate this assertion. The exact JSON serialization MUST be preserved, as the hash of+		// the serialized client data has been computed over it.+		ClientDataJSON []byte `json:"clientDataJSON"`+		// AuthenticatorData contains the authenticator data returned by the authenticator.+		AuthenticatorData []byte `json:"authenticatorData"`+		// Signature contains the raw signature returned from the authenticator.+		Signature []byte `json:"signature"`+		// UserHandle contains the user handle returned from the authenticator, or nil if the authenticator did not+		// return a user handle.+		UserHandle []byte `json:"userHandle"`+	}++	// AuthenticatorSelectionCriteria specifies requirements regarding authenticator attributes.+	AuthenticatorSelectionCriteria struct {+		// AuthenticatorAttachment, if present, filters eligible authenticators. The value SHOULD be a member of+		// AuthenticatorAttachment but client platforms MUST ignore unknown values, treating an unknown value as if the+		// member does not exist.+		AuthenticatorAttachment string `json:"authenticatorAttachment"`+		// ResidentKey specifies the extent to which the Relying Party desires to create a client-side discoverable+		// credential. For historical reasons the naming retains the deprecated “resident” terminology. The value+		// SHOULD be a member of ResidentKeyRequirement but client platforms MUST ignore unknown values, treating an+		// unknown value as if the member does not exist. If no value is given then the effective value is required if+		// requireResidentKey is true or discouraged if it is false or absent.+		ResidentKey string `json:"residentKey"`+		// RequireResidentKey is retained for backwards compatibility with WebAuthn Level 1 and, for historical reasons,+		// its naming retains the deprecated “resident” terminology for discoverable credentials. Relying Parties SHOULD+		// set it to true if, and only if, residentKey is set to required.+		RequireResidentKey bool `json:"requireResidentKey"`+		// UserVerification describes the Relying Party's requirements regarding user verification for the create()+		// operation. Eligible authenticators are filtered to only those capable of satisfying this requirement. The+		// value SHOULD be a member of UserVerificationRequirement but client platforms MUST ignore unknown values,+		// treating an unknown value as if the member does not exist.+		UserVerification string `json:"userVerification"`+	}++	// CollectedClientData represents the contextual bindings of both the WebAuthn Relying Party and the client.+	CollectedClientData struct {+		// Type contains the string "webauthn.create" when creating new credentials, and "webauthn.get" when+		// getting an assertion from an existing credential. The purpose of this member is to prevent certain types of+		// signature confusion attacks (where an attacker substitutes one legitimate signature for another).+		Type string `json:"type"`+		// Challenge contains the base64url encoding of the challenge provided by the Relying Party.+		Challenge string `json:"challenge"`+		// Origin contains the fully qualified origin of the requester, as provided to the authenticator by the+		// client.+		Origin string `json:"origin"`+		// CrossOrigin contains the inverse of the sameOriginWithAncestors argument value that was passed into the+		// internal method.+		CrossOrigin bool `json:"crossOrigin"`+		// TokenBinding contains information about the state of the Token Binding protocol used when communicating with+		// the Relying Party. Its absence indicates that the client doesn’t support token binding.+		TokenBinding *TokenBinding `json:"tokenBinding"`+	}++	// PublicKeyAssertionCredential contains the attributes when a new assertion is requested.+	PublicKeyAssertionCredential struct {+		// ID is the base64url encoding of the RawID.+		ID string `json:"id"`+		// Type is "public-key".+		Type string `json:"type"`+		// RawID is the credential ID, chosen by the authenticator. The credential ID is used to look up credentials for+		// use, and is therefore expected to be globally unique with high probability across all credentials of the same+		// type, across all authenticators.+		RawID []byte `json:"rawId"`+		// Response contains the authenticator's response to the client's request to generate an authentication+		// assertion.+		Response AuthenticatorAssertionResponse `json:"response"`+		// ClientExtensionResults is a map containing extension identifier → client extension output entries produced by+		// the extension’s client extension processing.+		ClientExtensionResults map[string]interface{} `json:"clientExtensionResults"`+	}++	// PublicKeyCreationCredential contains the attributes when a new credential is created.+	PublicKeyCreationCredential struct {+		// ID is the base64url encoding of the RawID.+		ID string `json:"id"`+		// Type is "public-key".+		Type string `json:"type"`+		// RawID is the credential ID, chosen by the authenticator. The credential ID is used to look up credentials for+		// use, and is therefore expected to be globally unique with high probability across all credentials of the same+		// type, across all authenticators.+		RawID []byte `json:"rawId"`+		// Response contains the authenticator's response to the client's request to create a public key credential.+		Response AuthenticatorAttestationResponse `json:"response"`+		// ClientExtensionResults is a map containing extension identifier → client extension output entries produced by+		// the extension’s client extension processing.+		ClientExtensionResults map[string]interface{} `json:"clientExtensionResults"`+	}++	// The PublicKeyCredentialCreationOptions supplies create() with the data it needs to generate a new credential.+	PublicKeyCredentialCreationOptions struct {+		// This member contains data about the Relying Party responsible for the request.+		//+		// Its value’s name member is REQUIRED.+		//+		// Its value’s id member specifies the RP ID the credential should be scoped to. If omitted, its value will be+		// the CredentialsContainer object’s relevant settings object's origin's effective domain.+		RP PublicKeyCredentialRpEntity `json:"rp"`+		// This member contains data about the user account for which the Relying Party is requesting attestation.+		//+		// Its value’s name, displayName and id members are REQUIRED.+		User PublicKeyCredentialUserEntity `json:"user"`+		// This member contains a challenge intended to be used for generating the newly created credential’s+		// attestation object.+		Challenge []byte `json:"challenge"`+		// This member contains information about the desired properties of the credential to be created. The sequence+		// is ordered from most preferred to least preferred. The client makes a best-effort to create the most+		// preferred credential that it can.+		PubKeyCredParams []PublicKeyCredentialParameters `json:"pubKeyCredParams"`+		// This member specifies a time, in milliseconds, that the caller is willing to wait for the call to complete.+		// This is treated as a hint, and MAY be overridden by the client.+		Timeout time.Duration `json:"timeout"`+		// This member is intended for use by Relying Parties that wish to limit the creation of multiple credentials+		// for the same account on a single authenticator. The client is requested to return an error if the new+		// credential would be created on an authenticator that also contains one of the credentials enumerated in this+		// parameter.+		ExcludeCredentials []PublicKeyCredentialDescriptor `json:"excludeCredentials"`+		// This member is intended for use by Relying Parties that wish to select the appropriate authenticators to+		// participate in the create() operation.+		AuthenticatorSelection AuthenticatorSelectionCriteria `json:"authenticatorSelection"`+		// This member is intended for use by Relying Parties that wish to express their preference for attestation+		// conveyance. Its values SHOULD be members of AttestationConveyancePreference. Client platforms MUST ignore+		// unknown values, treating an unknown value as if the member does not exist. Its default value is "none".+		Attestation string `json:"attestation"`+		// This member contains additional parameters requesting additional processing by the client and authenticator.+		// For example, the caller may request that only authenticators with certain capabilities be used to create the+		// credential, or that particular information be returned in the attestation object.+		Extensions map[string]interface{} `json:"extensions"`+	}++	// The PublicKeyCredentialDescriptor contains the attributes that are specified by a caller when referring to a+	// public key credential as an input parameter to the create() or get() methods.+	PublicKeyCredentialDescriptor struct {+		// This member contains the type of the public key credential the caller is referring to. The value SHOULD be a+		// member of PublicKeyCredentialType but client platforms MUST ignore any PublicKeyCredentialDescriptor with an+		// unknown type.+		Type string `json:"type"`+		// This member contains the credential ID of the public key credential the caller is referring to.+		ID []byte `json:"id"`+		// This OPTIONAL member contains a hint as to how the client might communicate with the managing authenticator+		// of the public key credential the caller is referring to. The values SHOULD be members of+		// AuthenticatorTransport but client platforms MUST ignore unknown values.+		Transports []string `json:"transports"`+	}++	// PublicKeyCredentialParameters is used to supply additional parameters when creating a new credential.+	PublicKeyCredentialParameters struct {+		// This member specifies the type of credential to be created.+		Type string `json:"type"`+		// This member specifies the cryptographic signature algorithm with which the newly generated credential will+		// be used, and thus also the type of asymmetric key pair to be generated, e.g., RSA or Elliptic Curve.+		COSEAlgorithmIdentifier int64 `json:"alg"`+	}++	// The PublicKeyCredentialRequestOptions supplies get() with the data it needs to generate an assertion.+	// Its challenge member MUST be present, while its other members are OPTIONAL.+	PublicKeyCredentialRequestOptions struct {+		// This member represents a challenge that the selected authenticator signs, along with other data, when+		// producing an authentication assertion.+		Challenge []byte `json:"challenge"`+		// This OPTIONAL member specifies a time, in milliseconds, that the caller is willing to wait for the call to+		// complete. The value is treated as a hint, and MAY be overridden by the client.+		Timeout time.Duration `json:"timeout"`+		// This OPTIONAL member specifies the relying party identifier claimed by the caller. If omitted, its+		// value will be the CredentialsContainer object’s relevant settings object's origin's effective domain.+		RPID string `json:"rpId"`+		// This OPTIONAL member contains a list of PublicKeyCredentialDescriptor objects representing public key+		// credentials acceptable to the caller, in descending order of the caller’s preference (the first item in the+		// list is the most preferred credential, and so on down the list).+		AllowCredentials []PublicKeyCredentialDescriptor `json:"allowCredentials"`+		// This OPTIONAL member describes the Relying Party's requirements regarding user verification for the get()+		// operation. The value SHOULD be a member of UserVerificationRequirement but client platforms MUST ignore+		// unknown values, treating an unknown value as if the member does not exist. Eligible authenticators are+		// filtered to only those capable of satisfying this requirement.+		UserVerification string `json:"userVerification"`+		// This OPTIONAL member contains additional parameters requesting additional processing by the client and+		// authenticator. For example, if transaction confirmation is sought from the user, then the prompt string+		// might be included as an extension.+		Extensions map[string]interface{} `json:"extensions"`+	}++	// The PublicKeyCredentialRpEntity is used to supply additional Relying Party attributes when creating a new+	// credential.+	PublicKeyCredentialRpEntity struct {+		// A unique identifier for the Relying Party entity, which sets the RP ID.+		ID string `json:"id"`+		// A human-palatable identifier for the Relying Party, intended only for display.+		Name string `json:"name"`+	}++	// The PublicKeyCredentialUserEntity is used to supply additional user account attributes when creating a new+	// credential.+	PublicKeyCredentialUserEntity struct {+		// The user handle of the user account entity. A user handle is an opaque byte sequence with a maximum size of+		// 64 bytes, and is not meant to be displayed to the user.+		//+		// To ensure secure operation, authentication and authorization decisions MUST be made on the basis of this id+		// member, not the displayName nor name members.+		//+		// The user handle MUST NOT contain personally identifying information about the user, such as a username or+		// e-mail address.+		ID []byte `json:"id"`+		// A human-palatable name for the user account, intended only for display. For example, "Alex Müller" or+		// "田中倫". The Relying Party SHOULD let the user choose this, and SHOULD NOT restrict the choice more than+		// necessary.+		//+		// Authenticators MUST accept and store a 64-byte minimum length for a displayName member’s value.+		// Authenticators MAY truncate a displayName member’s value so that it fits within 64 bytes.+		DisplayName string `json:"displayName"`+		// A human-palatable identifier for a user account.+		Name string `json:"name"`+	}++	// A TokenBinding is established by a User Agent generating a private-public key pair (possibly within a secure+	// hardware module, such as a Trusted Platform Module) per target server, providing the public key to the server,+	// and proving possession of the corresponding private key.+	TokenBinding struct {+		// This member SHOULD be a member of TokenBindingStatus but client platforms MUST ignore unknown values,+		// treating an unknown value as if the tokenBinding member does not exist.+		Status string `json:"status"`+		// This member MUST be present if status is present, and MUST be a base64url encoding of the Token Binding ID+		// that was used when communicating with the Relying Party.+		ID string `json:"id"`+	}+)++const (

nit: could we split these into separate const() blocks by type?

eg...

// Link to the docs for all the enumy-types
const(
// AttestationA does ....
AttestationA = ...
AttestationB = ...
AttestationC = ...
)

const(
COSEAlgorithmIdentifierX=foo
COSEAlgorithmIdentifierY=foo
COSEAlgorithmIdentifierZ=foo
)

etc

calebdoxsey

comment created time in 17 hours

Pull request review commentpomerium/webauthn

add types from webauthn spec

+name: Test+on:+  push:+    tags:+      - v*+    branches:+      - main+  pull_request:+jobs:+  test:+    name: Go+    runs-on: ubuntu-latest+    steps:+      - name: Install go+        uses: actions/setup-go@v2+        with:+          go-version: "1.17.1"

Should we pin on minor?

          go-version: "1.17.x"
calebdoxsey

comment created time in 17 hours

PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentpomerium/pomerium

DOCS: Update Enterprise Reference Docs

 a list of user ids, names or emails to make administrators, useful for bootstrap  **Default value:** `none` +## audience++audience for verifying signing key++**Default value:** `[]`

we should probably stress this can be a list.

alexfornuto

comment created time in 2 days

PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 import ( 	"github.com/pomerium/pomerium/internal/log" 	"github.com/pomerium/pomerium/internal/telemetry/requestid" 	"github.com/pomerium/pomerium/internal/urlutil"+	"github.com/pomerium/pomerium/pkg/policy/criteria" ) -func (a *Authorize) okResponse(reply *evaluator.Result) *envoy_service_auth_v3.CheckResponse {+func (a *Authorize) handleResultAllowed(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	return a.okResponse(result.Headers), nil+}++func (a *Authorize) handleResultDenied(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	denyStatusCode := int32(http.StatusForbidden)+	denyStatusText := http.StatusText(http.StatusForbidden)++	switch {+	case result.Deny.Reasons.Has(criteria.ReasonRouteNotFound):+		denyStatusCode = http.StatusNotFound+		denyStatusText = "route not found"+	case result.Deny.Reasons.Has(criteria.ReasonInvalidClientCertificate):+		denyStatusCode = 495

We should probably make any custom / new status codes public and exported (modeled after https://golang.org/src/net/http/status.go).

calebdoxsey

comment created time in 4 days

PullRequestReviewEvent

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 import ( 	"github.com/pomerium/pomerium/internal/log" 	"github.com/pomerium/pomerium/internal/telemetry/requestid" 	"github.com/pomerium/pomerium/internal/urlutil"+	"github.com/pomerium/pomerium/pkg/policy/criteria" ) -func (a *Authorize) okResponse(reply *evaluator.Result) *envoy_service_auth_v3.CheckResponse {+func (a *Authorize) handleResultAllowed(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	return a.okResponse(result.Headers), nil+}++func (a *Authorize) handleResultDenied(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	denyStatusCode := int32(http.StatusForbidden)+	denyStatusText := http.StatusText(http.StatusForbidden)++	switch {+	case result.Deny.Reasons.Has(criteria.ReasonRouteNotFound):+		denyStatusCode = http.StatusNotFound+		denyStatusText = "route not found"
		denyStatusText = http.StatusText(http.StatusNotFound)

Curios why not use http.StatusText like above?

calebdoxsey

comment created time in 4 days

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 func (a *Authorize) logAuthorizeCheck(  	// result 	if res != nil {-		evt = evt.Bool("allow", res.Allow)-		evt = evt.Interface("deny", res.Deny)+		evt = evt.Bool("allow", res.Allow.Value)+		if res.Allow.Value {+			evt = evt.Strs("allowed-reasons", res.Allow.Reasons.Strings())+		} else {+			evt = evt.Strs("not-allowed-reasons", res.Allow.Reasons.Strings())
			evt = evt.Strs("allow-why-false", res.Allow.Reasons.Strings())
calebdoxsey

comment created time in 5 days

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 import ( 	"github.com/pomerium/pomerium/internal/log" 	"github.com/pomerium/pomerium/internal/telemetry/requestid" 	"github.com/pomerium/pomerium/internal/urlutil"+	"github.com/pomerium/pomerium/pkg/policy/criteria" ) -func (a *Authorize) okResponse(reply *evaluator.Result) *envoy_service_auth_v3.CheckResponse {+func (a *Authorize) handleResultAllowed(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	return a.okResponse(result.Headers), nil+}++func (a *Authorize) handleResultDenied(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	denyStatusCode := int32(http.StatusForbidden)+	denyStatusText := http.StatusText(http.StatusForbidden)++	switch {+	case result.Deny.Reasons.Has(criteria.ReasonRouteNotFound):+		denyStatusCode = http.StatusNotFound+		denyStatusText = "route not found"+	case result.Deny.Reasons.Has(criteria.ReasonInvalidClientCertificate):+		denyStatusCode = 495+		denyStatusText = "invalid client certificate"+	}++	return a.deniedResponse(ctx, in, denyStatusCode, denyStatusText, nil)+}++func (a *Authorize) handleResultNotAllowed(+	ctx context.Context,+	in *envoy_service_auth_v3.CheckRequest,+	result *evaluator.Result,+) (*envoy_service_auth_v3.CheckResponse, error) {+	switch {+	case result.Allow.Reasons.Has(criteria.ReasonUserUnauthenticated):+		// when the user is unauthenticated it means they haven't+		// logged in yet, so redirect to authenticate+		return a.requireLoginResponse(ctx, in)+	}++	return a.deniedResponse(ctx, in, http.StatusForbidden, "Forbidden", nil)
	return a.deniedResponse(ctx, in, http.StatusForbidden, http.StatusText(http.StatusForbidden), nil)
calebdoxsey

comment created time in 4 days

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 func (a *Authorize) logAuthorizeCheck(  	// result 	if res != nil {-		evt = evt.Bool("allow", res.Allow)-		evt = evt.Interface("deny", res.Deny)+		evt = evt.Bool("allow", res.Allow.Value)+		if res.Allow.Value {+			evt = evt.Strs("allowed-reasons", res.Allow.Reasons.Strings())+		} else {+			evt = evt.Strs("not-allowed-reasons", res.Allow.Reasons.Strings())+		}+		evt = evt.Bool("deny", res.Deny.Value)+		if res.Deny.Value {+			evt = evt.Strs("denied-reasons", res.Deny.Reasons.Strings())
			evt = evt.Strs("deny-why-true", res.Deny.Reasons.Strings())
calebdoxsey

comment created time in 5 days

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 func (a *Authorize) logAuthorizeCheck(  	// result 	if res != nil {-		evt = evt.Bool("allow", res.Allow)-		evt = evt.Interface("deny", res.Deny)+		evt = evt.Bool("allow", res.Allow.Value)+		if res.Allow.Value {+			evt = evt.Strs("allowed-reasons", res.Allow.Reasons.Strings())

what about something like...

			evt = evt.Strs("allow-why-true", res.Allow.Reasons.Strings())

To keep the json / log keys close / related... I'm not sure this is any clearer though

calebdoxsey

comment created time in 7 days

Pull request review commentpomerium/pomerium

ppl: pass contextual information through policy

 func (a *Authorize) logAuthorizeCheck(  	// result 	if res != nil {-		evt = evt.Bool("allow", res.Allow)-		evt = evt.Interface("deny", res.Deny)+		evt = evt.Bool("allow", res.Allow.Value)+		if res.Allow.Value {+			evt = evt.Strs("allowed-reasons", res.Allow.Reasons.Strings())+		} else {+			evt = evt.Strs("not-allowed-reasons", res.Allow.Reasons.Strings())+		}+		evt = evt.Bool("deny", res.Deny.Value)+		if res.Deny.Value {+			evt = evt.Strs("denied-reasons", res.Deny.Reasons.Strings())+		} else {+			evt = evt.Strs("not-denied-reasons", res.Deny.Reasons.Strings())
			evt = evt.Strs("deny-why-false", res.Deny.Reasons.Strings())
calebdoxsey

comment created time in 5 days

PullRequestReviewEvent
PullRequestReviewEvent

delete branch pomerium/pomerium

delete branch : backport-2605-to-0-15-0

delete time in 7 days

push eventpomerium/pomerium

backport-actions-token[bot]

commit sha 886fb98177559ad0c7bd8d9891265bcecfb2e62f

Add docs team as a code owner of packages.json (#2605) (#2607) * Add docs team as a code owner of packages.json `packages.json` Is used by the docs site to manage vuepress and its plugins/dependencies. * empty commit to bypass CLA hangup Co-authored-by: Alex Fornuto <afornuto@pomerium.com>

view details

push time in 7 days

PR merged pomerium/pomerium

Reviewers
Add docs team as a code owner of packages.json

Backport 8e8178e03c95373d8ae99e8345eb1f33431c0d32 from #2605

+1 -0

0 comment

1 changed file

backport-actions-token[bot]

pr closed time in 7 days

PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent
PullRequestReviewEvent