Skip to content

Commit

Permalink
Add support for reset password
Browse files Browse the repository at this point in the history
  • Loading branch information
matthieusieben committed Feb 26, 2025
1 parent 27b0a7b commit e22b78d
Show file tree
Hide file tree
Showing 128 changed files with 5,188 additions and 2,116 deletions.
5 changes: 5 additions & 0 deletions .changeset/brave-countries-return.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@atproto/oauth-provider": patch
---

Add support for password reset
5 changes: 5 additions & 0 deletions .changeset/eleven-ducks-boil.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@atproto-labs/fetch": patch
---

Improved error response parsing
5 changes: 5 additions & 0 deletions .changeset/hungry-buttons-clean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@atproto/oauth-client-browser-example": patch
---

Update react to version 19
5 changes: 5 additions & 0 deletions .changeset/tall-rules-hammer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@atproto/oauth-client": patch
---

Minor code optimizations
5 changes: 5 additions & 0 deletions .changeset/tiny-goats-sing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@atproto-labs/fetch": patch
---

Remove optional dependeny on "zod"
1 change: 1 addition & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"consolas",
"dpop",
"googleusercontent",
"hcaptcha",
"hexeditor",
"ingester",
"insertable",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"packageManager": "pnpm@8.15.9",
"scripts": {
"lint:fix": "pnpm lint --fix",
"lint": "eslint . --ext .ts,.js",
"lint": "eslint . --ext .ts,.js,.tsx,.jsx",
"style:fix": "prettier --write .",
"style": "prettier --check .",
"verify": "pnpm --stream '/^verify:.+$/'",
Expand Down
10 changes: 6 additions & 4 deletions packages/dev-env/src/pds.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export class TestPds {
recoveryDidKey: recoveryKey,
adminPassword: ADMIN_PASSWORD,
jwtSecret: JWT_SECRET,
serviceHandleDomains: ['.test'],
serviceHandleDomains: ['.test', '.example'],
bskyAppViewUrl: 'https://appview.invalid',
bskyAppViewDid: 'did:example:invalid',
bskyAppViewCdnUrlPattern: 'http://cdn.appview.com/%s/%s/%s',
Expand All @@ -47,10 +47,12 @@ export class TestPds {
inviteRequired: false,
disableSsrfProtection: true,
serviceName: 'Development PDS',
brandColor: '#ffcb1e',
errorColor: undefined,
brandColor: '#8338ec',
errorColor: '#ff006e',
warningColor: '#fb5607',
successColor: '#02c39a',
logoUrl:
'https://uxwing.com/wp-content/themes/uxwing/download/animals-and-birds/bee-icon.png',
'data:image/png;base64,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',
homeUrl: 'https://bsky.social/',
termsOfServiceUrl: 'https://bsky.social/about/support/tos',
privacyPolicyUrl: 'https://bsky.social/about/support/privacy-policy',
Expand Down
3 changes: 0 additions & 3 deletions packages/internal/fetch/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@
"devDependencies": {
"typescript": "^5.6.3"
},
"optionalDependencies": {
"zod": "^3.23.8"
},
"scripts": {
"build": "tsc --build tsconfig.json"
}
Expand Down
36 changes: 22 additions & 14 deletions packages/internal/fetch/src/fetch-response.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import type { ParseParams, TypeOf, ZodTypeAny } from 'zod'
import { Transformer, pipe } from '@atproto-labs/pipe'
import { FetchError } from './fetch-error.js'
import { TransformedResponse } from './transformed-response.js'
import {
Json,
MaxBytesTransformStream,
cancelBody,
ifObject,
ifString,
logCancellationError,
} from './util.js'
Expand Down Expand Up @@ -69,15 +67,16 @@ const extractResponseMessage: ResponseMessageGetter = async (response) => {
const json: unknown = await response.json()

if (typeof json === 'string') return json
if (typeof json === 'object' && json != null) {
const errorDescription = ifString(json['error_description'])
if (errorDescription) return errorDescription

const errorDescription = ifString(ifObject(json)?.['error_description'])
if (errorDescription) return errorDescription
const error = ifString(json['error'])
if (error) return error

const error = ifString(ifObject(json)?.['error'])
if (error) return error

const message = ifString(ifObject(json)?.['message'])
if (message) return message
const message = ifString(json['message'])
if (message) return message
}
}
} catch {
// noop
Expand Down Expand Up @@ -283,10 +282,19 @@ export function fetchJsonProcessor<T = Json>(
)
}

export function fetchJsonZodProcessor<S extends ZodTypeAny>(
schema: S,
params?: Partial<ParseParams>,
): Transformer<ParsedJsonResponse, TypeOf<S>> {
return async (jsonResponse: ParsedJsonResponse): Promise<TypeOf<S>> =>
// We are not using actual types imported from "zod" here to avoid
// compatibility issues with different versions of the library.

type ParseParams = {
path?: (string | number)[]
}

export function fetchJsonZodProcessor<S>(
schema: {
parseAsync(value: unknown, params?: ParseParams): PromiseLike<S>
},
params?: ParseParams,
): Transformer<ParsedJsonResponse, S> {
return async (jsonResponse: ParsedJsonResponse): Promise<S> =>
schema.parseAsync(jsonResponse.json, params)
}
18 changes: 0 additions & 18 deletions packages/internal/fetch/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,6 @@ export function isIp(hostname: string) {
return false
}

const plainObjectProto = Object.prototype
export const ifObject = <V>(v: V) => {
if (typeof v === 'object' && v != null && !Array.isArray(v)) {
const proto = Object.getPrototypeOf(v)
if (proto === null || proto === plainObjectProto) {
// eslint-disable-next-line @typescript-eslint/ban-types
return v as V extends JsonScalar | JsonArray | Function | symbol
? never
: V extends Json
? V
: // Plain object are (mostly) safe to access using a string index
Record<string, unknown>
}
}

return undefined
}

export const ifString = <V>(v: V) => (typeof v === 'string' ? v : undefined)

export class MaxBytesTransformStream extends TransformStream<
Expand Down
8 changes: 4 additions & 4 deletions packages/oauth/oauth-client-browser-example/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@
"@rollup/plugin-replace": "^5.0.5",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^11.1.6",
"@types/react": "^18.2.50",
"@types/react-dom": "^18.2.18",
"@types/react": "^19.0.10",
"@types/react-dom": "^19.0.4",
"autoprefixer": "^10.4.17",
"postcss": "^8.4.33",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"rollup": "^4.13.0",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-serve": "^1.1.1",
Expand Down
6 changes: 3 additions & 3 deletions packages/oauth/oauth-client-browser-example/src/app.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useCallback, useState } from 'react'
import { useAuthContext } from './auth/auth-provider'
import { OAuthSession } from '@atproto/oauth-client'
import { useAuthContext } from './auth/auth-provider'

function App() {
const { pdsAgent, signOut, refresh } = useAuthContext()
Expand All @@ -18,7 +18,7 @@ function App() {
const [serviceAuth, setServiceAuth] = useState<unknown>(undefined)
const loadServiceAuth = useCallback(async () => {
const serviceAuth = await pdsAgent.com.atproto.server.getServiceAuth({
aud: pdsAgent.accountDid,
aud: pdsAgent.assertDid,
})
console.log('serviceAuth', serviceAuth)
setServiceAuth(serviceAuth.data)
Expand All @@ -28,7 +28,7 @@ function App() {
const [profile, setProfile] = useState<unknown>(undefined)
const loadProfile = useCallback(async () => {
const profile = await pdsAgent.com.atproto.repo.getRecord({
repo: pdsAgent.accountDid,
repo: pdsAgent.assertDid,
collection: 'app.bsky.actor.profile',
rkey: 'self',
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import { useEffect, useState } from 'react'

import {
AtpSignIn,
CredentialSignInForm,
} from './credential/credential-sign-in-form'
import { OAuthSignIn, OAuthSignInForm } from './oauth/oauth-sign-in-form'

export function AuthForm({
atpSignIn,
oauthSignIn,
}: {
export type AuthFormProps = {
atpSignIn?: AtpSignIn
oauthSignIn?: OAuthSignIn
}) {
signUpUrl?: string
}

export function AuthForm({ atpSignIn, oauthSignIn, signUpUrl }: AuthFormProps) {
const defaultMethod = oauthSignIn
? 'oauth'
: atpSignIn
Expand Down Expand Up @@ -58,7 +57,9 @@ export function AuthForm({
</button>
</div>

{method === 'oauth' && <OAuthSignInForm signIn={oauthSignIn!} />}
{method === 'oauth' && (
<OAuthSignInForm signIn={oauthSignIn!} signUpUrl={signUpUrl} />
)}
{method === 'credential' && <CredentialSignInForm signIn={atpSignIn!} />}
{method == null && <div>No auth method available</div>}
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,31 @@
'use client'

import { ReactNode, createContext, useContext, useMemo } from 'react'
import { Agent } from '@atproto/api'
import { createContext, ReactNode, useContext, useMemo } from 'react'

import { useCredentialAuth } from './credential/use-credential-auth'
import { AuthForm } from './auth-form'
import { useOAuth, UseOAuthOptions } from './oauth/use-oauth'
import { useCredentialAuth } from './credential/use-credential-auth'
import { UseOAuthOptions, useOAuth } from './oauth/use-oauth'

export type AuthContext = {
export type AuthContextValue = {
pdsAgent: Agent
signOut: () => void
refresh: () => void
}

const AuthContext = createContext<AuthContext | null>(null)
const AuthContext = createContext<AuthContextValue | null>(null)

export type AuthProviderProps = UseOAuthOptions & {
children: ReactNode
signUpUrl?: string
}

export const AuthProvider = ({
children,
signUpUrl,

// UseOAuthOptions
...options
}: {
children: ReactNode
} & UseOAuthOptions) => {
}: AuthProviderProps) => {
const {
isLoginPopup,
isInitializing,
Expand All @@ -38,7 +43,7 @@ export const AuthProvider = ({
refresh: credentialRefresh,
} = useCredentialAuth()

const value = useMemo<AuthContext | null>(() => {
const value = useMemo<AuthContextValue | null>(() => {
if (oauthAgent) {
return {
pdsAgent: oauthAgent,
Expand Down Expand Up @@ -77,6 +82,7 @@ export const AuthProvider = ({
return (
<AuthForm
atpSignIn={credentialSignIn}
signUpUrl={signUpUrl}
oauthSignIn={oauthClient ? oauthSignIn : undefined}
/>
)
Expand All @@ -85,7 +91,7 @@ export const AuthProvider = ({
return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>
}

export function useAuthContext(): AuthContext {
export function useAuthContext(): AuthContextValue {
const context = useContext(AuthContext)
if (context) return context

Expand Down
Loading

0 comments on commit e22b78d

Please sign in to comment.