@@ -18,7 +18,8 @@ type $LoginData = z.infer<typeof $LoginData>;
1818const $LoginData = z . object ( {
1919 apiBaseUrl : z . url ( ) ,
2020 username : z . string ( ) . min ( 1 ) ,
21- password : z . string ( ) . min ( 1 )
21+ password : z . string ( ) . min ( 1 ) ,
22+ legacyLogin : z . boolean ( )
2223} ) ;
2324
2425export type LoginDialogProps = {
@@ -39,10 +40,13 @@ export const LoginDialog = ({ isOpen, setIsOpen }: LoginDialogProps) => {
3940 revalidateToken ( ) ;
4041 } , [ isOpen ] ) ;
4142
42- const getAdminToken = ( credentials : $LoginCredentials ) : ResultAsync < { accessToken : string } , string > => {
43+ const getAdminToken = (
44+ credentials : $LoginCredentials ,
45+ baseUrl : string
46+ ) : ResultAsync < { accessToken : string } , string > => {
4347 return asyncResultify ( async ( ) => {
4448 try {
45- const response = await axios . post ( `${ apiBaseUrl } /v1/auth/login` , credentials , {
49+ const response = await axios . post ( `${ baseUrl } /v1/auth/login` , credentials , {
4650 headers : {
4751 Accept : 'application/json'
4852 } ,
@@ -59,10 +63,10 @@ export const LoginDialog = ({ isOpen, setIsOpen }: LoginDialogProps) => {
5963 } ) ;
6064 } ;
6165
62- const getLimitedToken = ( adminToken : string ) : ResultAsync < { accessToken : string } , string > => {
66+ const getLimitedToken = ( adminToken : string , baseUrl : string ) : ResultAsync < { accessToken : string } , string > => {
6367 return asyncResultify ( async ( ) => {
6468 try {
65- const response = await axios . get ( `${ apiBaseUrl } /v1/auth/create-instrument-token` , {
69+ const response = await axios . get ( `${ baseUrl } /v1/auth/create-instrument-token` , {
6670 headers : {
6771 Accept : 'application/json' ,
6872 Authorization : `Bearer ${ adminToken } `
@@ -80,20 +84,24 @@ export const LoginDialog = ({ isOpen, setIsOpen }: LoginDialogProps) => {
8084 } ) ;
8185 } ;
8286
83- const handleSubmit = async ( { apiBaseUrl, ...credentials } : $LoginData ) => {
87+ const handleSubmit = async ( { apiBaseUrl, legacyLogin , ...credentials } : $LoginData ) => {
8488 updateSettings ( { apiBaseUrl } ) ;
85- const adminTokenResult = await getAdminToken ( credentials ) ;
89+ const adminTokenResult = await getAdminToken ( credentials , apiBaseUrl ) ;
8690 if ( adminTokenResult . isErr ( ) ) {
8791 addNotification ( { type : 'error' , title : 'Login Failed' , message : adminTokenResult . error } ) ;
8892 return ;
8993 }
90- const limitedTokenResult = await getLimitedToken ( adminTokenResult . value . accessToken ) ;
91- if ( limitedTokenResult . isErr ( ) ) {
92- addNotification ( { type : 'error' , title : 'Failed to Get Limited Token' , message : limitedTokenResult . error } ) ;
93- return ;
94- }
9594
96- login ( limitedTokenResult . value . accessToken ) ;
95+ if ( legacyLogin ) {
96+ login ( adminTokenResult . value . accessToken ) ;
97+ } else {
98+ const limitedTokenResult = await getLimitedToken ( adminTokenResult . value . accessToken , apiBaseUrl ) ;
99+ if ( limitedTokenResult . isErr ( ) ) {
100+ addNotification ( { type : 'error' , title : 'Failed to Get Limited Token' , message : limitedTokenResult . error } ) ;
101+ return ;
102+ }
103+ login ( limitedTokenResult . value . accessToken ) ;
104+ }
97105
98106 addNotification ( { type : 'success' } ) ;
99107 } ;
@@ -137,6 +145,20 @@ export const LoginDialog = ({ isOpen, setIsOpen }: LoginDialogProps) => {
137145 placeholder : 'e.g., https://demo.opendatacapture.org/api' ,
138146 label : 'API Base URL' ,
139147 variant : 'input'
148+ } ,
149+ legacyLogin : {
150+ description : [
151+ "Use the user's full access token instead of a granular access token." ,
152+ 'Note that this can introduce security risks and should not be used on shared machines.' ,
153+ 'It is required only for ODC versions prior to v1.12.0.'
154+ ] . join ( '' ) ,
155+ kind : 'boolean' ,
156+ label : 'Legacy Login Mode' ,
157+ variant : 'radio' ,
158+ options : {
159+ false : 'No (Recommended)' ,
160+ true : 'Yes'
161+ }
140162 }
141163 }
142164 } ,
@@ -156,7 +178,7 @@ export const LoginDialog = ({ isOpen, setIsOpen }: LoginDialogProps) => {
156178 }
157179 }
158180 ] }
159- initialValues = { { apiBaseUrl } }
181+ initialValues = { { apiBaseUrl, legacyLogin : false } }
160182 validationSchema = { $LoginData }
161183 onSubmit = { async ( data ) => {
162184 await handleSubmit ( data ) ;
0 commit comments