2022-09-11 18:41:29 +02:00
/ *
GoToSocial
Copyright ( C ) 2021 - 2022 GoToSocial Authors admin @ gotosocial . org
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Affero General Public License for more details .
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
"use strict" ;
const Promise = require ( "bluebird" ) ;
2022-09-15 20:02:55 +02:00
const { OAUTHError , AuthenticationError } = require ( "../errors" ) ;
2022-09-11 18:41:29 +02:00
const oauth = require ( "../../redux/reducers/oauth" ) . actions ;
const temporary = require ( "../../redux/reducers/temporary" ) . actions ;
2022-09-11 19:05:06 +02:00
const user = require ( "../../redux/reducers/user" ) . actions ;
2022-09-11 18:41:29 +02:00
2022-09-15 20:02:55 +02:00
module . exports = function oauthAPI ( { apiCall , getCurrentUrl } ) {
2022-09-11 18:41:29 +02:00
return {
register : function register ( scopes = [ ] ) {
2022-09-11 19:05:06 +02:00
return function ( dispatch , _getState ) {
2022-09-11 18:41:29 +02:00
return Promise . try ( ( ) => {
2022-09-11 19:05:06 +02:00
return dispatch ( apiCall ( "POST" , "/api/v1/apps" , {
2022-09-11 18:41:29 +02:00
client _name : "GoToSocial Settings" ,
scopes : scopes . join ( " " ) ,
redirect _uris : getCurrentUrl ( ) ,
website : getCurrentUrl ( )
2022-09-11 19:05:06 +02:00
} ) ) ;
2022-09-11 18:41:29 +02:00
} ) . then ( ( json ) => {
json . scopes = scopes ;
dispatch ( oauth . setRegistration ( json ) ) ;
} ) ;
} ;
} ,
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
authorize : function authorize ( ) {
return function ( dispatch , getState ) {
let state = getState ( ) ;
let reg = state . oauth . registration ;
let base = new URL ( state . oauth . instance ) ;
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
base . pathname = "/oauth/authorize" ;
base . searchParams . set ( "client_id" , reg . client _id ) ;
base . searchParams . set ( "redirect_uri" , getCurrentUrl ( ) ) ;
base . searchParams . set ( "response_type" , "code" ) ;
base . searchParams . set ( "scope" , reg . scopes . join ( " " ) ) ;
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
dispatch ( oauth . setLoginState ( "callback" ) ) ;
dispatch ( temporary . setStatus ( "Redirecting to instance login..." ) ) ;
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
// send user to instance's login flow
window . location . assign ( base . href ) ;
} ;
} ,
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
tokenize : function tokenize ( code ) {
return function ( dispatch , getState ) {
let reg = getState ( ) . oauth . registration ;
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
return Promise . try ( ( ) => {
if ( reg == undefined || reg . client _id == undefined ) {
throw new OAUTHError ( "Callback code present, but no client registration is available from localStorage. \nNote: localStorage is unavailable in Private Browsing." ) ;
}
2022-09-15 20:02:55 +02:00
2022-09-11 19:05:06 +02:00
return dispatch ( apiCall ( "POST" , "/oauth/token" , {
2022-09-11 18:41:29 +02:00
client _id : reg . client _id ,
client _secret : reg . client _secret ,
redirect _uri : getCurrentUrl ( ) ,
grant _type : "authorization_code" ,
code : code
2022-09-11 19:05:06 +02:00
} ) ) ;
2022-09-11 18:41:29 +02:00
} ) . then ( ( json ) => {
console . log ( json ) ;
window . history . replaceState ( { } , document . title , window . location . pathname ) ;
return dispatch ( oauth . login ( json ) ) ;
} ) ;
} ;
} ,
2022-09-15 20:02:55 +02:00
checkIfAdmin : function checkIfAdmin ( ) {
return function ( dispatch , getState ) {
const state = getState ( ) ;
let stored = state . oauth . isAdmin ;
if ( stored != undefined ) {
return stored ;
}
// newer GoToSocial version will include a `role` in the Account data, check that first
// TODO: check account data for admin status
// no role info, try fetching an admin-only route and see if we get an error
return Promise . try ( ( ) => {
return dispatch ( apiCall ( "GET" , "/api/v1/admin/domain_blocks" ) ) ;
} ) . then ( ( ) => {
return dispatch ( oauth . setAdmin ( true ) ) ;
} ) . catch ( AuthenticationError , ( ) => {
return dispatch ( oauth . setAdmin ( false ) ) ;
} ) . catch ( ( e ) => {
console . log ( "caught" , e , e instanceof AuthenticationError ) ;
} ) ;
} ;
} ,
2022-09-11 18:41:29 +02:00
logout : function logout ( ) {
return function ( dispatch , _getState ) {
// TODO: GoToSocial does not have a logout API route yet
2022-09-15 20:02:55 +02:00
2022-09-11 18:41:29 +02:00
return dispatch ( oauth . remove ( ) ) ;
} ;
}
} ;
} ;