Login with NSEC and HEX private key formats. Proper errors. #66
@ -20,6 +20,7 @@ import { LoginMethods } from '../../store/auth/types'
|
|||||||
import { Dispatch } from '../../store/store'
|
import { Dispatch } from '../../store/store'
|
||||||
import { npubToHex, queryNip05 } from '../../utils'
|
import { npubToHex, queryNip05 } from '../../utils'
|
||||||
import styles from './style.module.scss'
|
import styles from './style.module.scss'
|
||||||
|
import { hexToBytes } from '@noble/hashes/utils'
|
||||||
|
|
||||||
export const Login = () => {
|
export const Login = () => {
|
||||||
const [searchParams] = useSearchParams()
|
const [searchParams] = useSearchParams()
|
||||||
@ -92,9 +93,24 @@ export const Login = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const loginWithNsec = async () => {
|
/**
|
||||||
const nsec = inputValue
|
* Login with NSEC or HEX private key
|
||||||
const privateKey = nip19.decode(nsec).data as Uint8Array
|
* @param privateKey in HEX format
|
||||||
|
*/
|
||||||
|
const loginWithNsec = async (privateKey?: Uint8Array) => {
|
||||||
|
let nsec = ''
|
||||||
|
|
||||||
|
if (privateKey) {
|
||||||
|
nsec = nip19.nsecEncode(privateKey)
|
||||||
|
} else {
|
||||||
|
nsec = inputValue
|
||||||
|
|
||||||
|
try {
|
||||||
|
privateKey = nip19.decode(nsec).data as Uint8Array
|
||||||
|
} catch (err) {
|
||||||
|
toast.error(`Error decoding the nsec. ${err}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!privateKey) {
|
if (!privateKey) {
|
||||||
toast.error(
|
toast.error(
|
||||||
@ -307,7 +323,19 @@ export const Login = () => {
|
|||||||
return loginWithNsecBunker()
|
return loginWithNsecBunker()
|
||||||
}
|
}
|
||||||
|
|
||||||
toast.error('Invalid Input!')
|
// Check if maybe hex nsec
|
||||||
|
try {
|
||||||
|
const privateKey = hexToBytes(inputValue)
|
||||||
m marked this conversation as resolved
|
|||||||
|
const publickey = getPublicKey(privateKey)
|
||||||
|
|
||||||
|
if (publickey) return loginWithNsec(privateKey)
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('err', err)
|
||||||
|
}
|
||||||
|
|
||||||
|
toast.error(
|
||||||
|
'Invalid format, please use: private key (hex), nsec..., bunker:// or nip05 format.'
|
||||||
|
)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,7 +357,7 @@ export const Login = () => {
|
|||||||
<Typography variant="h4">Welcome to Sigit</Typography>
|
<Typography variant="h4">Welcome to Sigit</Typography>
|
||||||
<TextField
|
<TextField
|
||||||
onKeyDown={handleInputKeyDown}
|
onKeyDown={handleInputKeyDown}
|
||||||
label="nip05 login / nip46 bunker string / nsec"
|
label="nip05 login / nip46 bunker string"
|
||||||
value={inputValue}
|
value={inputValue}
|
||||||
y marked this conversation as resolved
Outdated
y
commented
Shouldn't Shouldn't `nsec` be one of the options?
m
commented
@b said that we should not display it so we do not encourage users to use it. But it is visible in the error message if user types in something wrong. @b said that we should not display it so we do not encourage users to use it. But it is visible in the error message if user types in something wrong.
|
|||||||
onChange={(e) => setInputValue(e.target.value)}
|
onChange={(e) => setInputValue(e.target.value)}
|
||||||
sx={{ width: '100%', mt: 2 }}
|
sx={{ width: '100%', mt: 2 }}
|
||||||
|
@ -208,7 +208,7 @@ export const ProfilePage = () => {
|
|||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
<Box className={styles.head}>
|
<Box className={styles.head}>
|
||||||
<Box sx={{lineHeight: 1}} className={styles.npubNip}>
|
<Box sx={{ lineHeight: 1 }} className={styles.npubNip}>
|
||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
display: 'flex'
|
display: 'flex'
|
||||||
@ -216,7 +216,7 @@ export const ProfilePage = () => {
|
|||||||
>
|
>
|
||||||
{profileMetadata && (
|
{profileMetadata && (
|
||||||
<Typography
|
<Typography
|
||||||
sx={{ margin: '5px 0 5px 0'}}
|
sx={{ margin: '5px 0 5px 0' }}
|
||||||
variant="h6"
|
variant="h6"
|
||||||
className={styles.bold}
|
className={styles.bold}
|
||||||
>
|
>
|
||||||
@ -240,11 +240,19 @@ export const ProfilePage = () => {
|
|||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
{profileMetadata?.nip05 &&
|
{profileMetadata?.nip05 &&
|
||||||
textElementWithCopyIcon(profileMetadata.nip05, undefined, 15)}
|
textElementWithCopyIcon(
|
||||||
|
profileMetadata.nip05,
|
||||||
|
undefined,
|
||||||
|
15
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
{profileMetadata?.lud16 &&
|
{profileMetadata?.lud16 &&
|
||||||
textElementWithCopyIcon(profileMetadata.lud16, undefined, 15)}
|
textElementWithCopyIcon(
|
||||||
|
profileMetadata.lud16,
|
||||||
|
undefined,
|
||||||
|
15
|
||||||
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user
Please remove not used code