function getToken(params: PChar):PChar;stdcall; // cdecl
var
Client: TFPHttpClient;
Response : TStringList;
wwwParams, Token: string;
sClientId, sClientSecret, sRedirectURI, sAuthCode, sAccessToken, sRefreshToken, sTokenType: string;
iAuthPeriod, iGoogleapi_params_id: integer;
jData, jData2 : TJSONData;
jObject, jObject2 : TJSONObject;
conn: TSQLConnector;
query: TSQLQuery;
hiba,jsonstring:string;
begin
try
begin
InitializeLogger();
logger.Info('getToken calling...');
// input params
hiba:= '';
token:= '';
jsonstring := StrPas(params);
jData2 := GetJSON(jsonstring);
jObject2 := TJSONObject(jData2);
iGoogleapi_params_id := jObject2.Get('paramsID', 0);
hostname := jObject2.Get('hostname', '');
database := jObject2.Get('databasename', '');
user := jObject2.Get('user', '');
password := jObject2.Get('password', '');
logger.Debug('Input params (database variable''s value): ' + database);
database := ReplaceString(database,'\\','\');
// database initialize
conn:=TSQLConnector.Create(nil);
conn.ConnectorType:='Firebird';
conn.HostName:=hostname;
conn.DatabaseName:=database;
conn.UserName:=user;
conn.Password:=password;
conn.LoginPrompt:=false;
conn.Transaction:=TSQLTransaction.Create(Conn);
//Conn.Transaction.Params.Add('isc_tpb_read_commited'); // WITH THESE THERE IS NO DIFFERENCE
//Conn.Transaction.Params.Add('isc_tpb_concurrency');
//Conn.Transaction.Params.Add('isc_tpb_nowait');
// https://wiki.freepascal.org/SqlDBHowto
conn.OnLog:= @loggerDB.LogDBEvents;
logger.Info('conn.OnLog @loggerDB.LogDBEvents');
conn.LogEvents:= LogAllEventsExtra; //= [detCustom, detPrepare, detExecute, detFetch, detCommit, detRollBack]
logger.Info('LogEvents enums set');
logger.Info('conn initialized...');
query := TSQLQuery.Create(conn);
query.DataBase := conn;
logger.Info('TSQLQuery initialized...');
// query the database
logger.Info('query database');
logger.Debug('Database exists: ' + BoolToStr(FileExists(conn.DatabaseName),'Y','N'));
logger.Debug('Database connected: ' + BoolToStr(conn.Connected = true,'Y,'N'));
logger.Debug('Database is not nil: ' + BoolToStr(conn <> nil,'Y','N'));
query.SQL.Text:= 'select CLIENT_ID, CLIENT_SECRET, REDIRECT_URI, AUTHCODE from GOOGLEAPI_PARAMS WHERE ID = :PARAMS_ID';
query.ParamByName('PARAMS_ID').AsInteger:= iGoogleapi_params_id;
//SQLTransaction1.active:= true; // setting Active to True will call StartTransaction, setting it to False will call TDBTransaction.EndTransaction
logger.Debug('before query.Open; , ' + query.SQL.Text);
logger.Debug('Database exists: ' + BoolToStr(FileExists(conn.DatabaseName),'I','N'));
logger.Debug('Database connected: ' + BoolToStr(conn.Connected = true,'I','N'));
logger.Debug('Database is not nil: ' + BoolToStr(conn <> nil,'I','N'));
if (FileExists(conn.DatabaseName)) then
begin
query.Open;
logger.Debug('after query.Open;');
sClientId := query.FieldByName('CLIENT_ID').AsString;
sClientSecret := query.FieldByName('CLIENT_SECRET').AsString;
sRedirectURI := query.FieldByName('REDIRECT_URI').AsString;
sAuthCode := query.FieldByName('AUTHCODE').AsString;
logger.Debug('query successfully executed: ' + sRedirectURI);
query.Close;
logger.Info('query GOOGLEAPI_PARAMS closed...');
//conn.Transaction.Commit; // = SQLTransaction1.active:= false; // WITH THIS LINE THERE IS NO DIFFERENCE
end;
conn.close(); // = conn.Connected:=false;
logger.Debug('conn.close()');
// POST request preparing
wwwParams := 'client_id='+trim(sClientId)
+'&client_secret='+trim(sClientSecret)
+'&grant_type='+'authorization_code'
+'&redirect_uri='+ EncodeURLElement(trim(sRedirectURI))
+'&code='+trim(sAuthCode);
Client := TFPHttpClient.Create(nil);
Client.AddHeader('User-Agent','Mozilla/5.0 (compatible; fpweb)');
Client.AddHeader('Content-Type','application/x-www-form-urlencoded');
Client.AddHeader('Accept', 'application/json');
//Client.AllowRedirect := true;
//Client.UserName:=USER;
//Client.Password:=PW;
//client.RequestBody := TRawByteStringStream.Create(Params);
// a request response objektum initialize
Response := TStringList.Create;
logger.Debug('before client.FormPost token');
client.FormPost('https://accounts.google.com/o/oauth2/token', wwwParams, Response);
Token := Response.Text;
// this is only a minimal sampling of what can be done with this API
// create from string
jData := GetJSON(Token);
logger.Debug('jData := GetJSON(Token)');
logger.Debug('before Token.Contains(''access_token'')');
// if it does not contains ('access_token'), then something went wrong
if (Token.Contains('access_token')) then
begin
// output as a flat string
//s := jData.AsJSON;
// output as nicely formatted JSON
//s := jData.FormatJSON;
// cast as TJSONObject to make access easier
jObject := TJSONObject(jData);
// retrieve value of access_token
sAccessToken := jObject.Get('access_token', '');
sRefreshToken := jObject.Get('refresh_token', '');
sTokenType := jObject.Get('token_type', '');
iAuthPeriod := jObject.Get('expires_in', 0);
//sScope := jObject.Get('scope');
query.close();
logger.Info('GOOGLEAPI_PARAMS table update token');
//conn.open();
//conn.StartTransaction;
query.SQL.Text:= 'update GOOGLEAPI_PARAMS set REFRESH_TOKEN=:REFRESH_TOKEN,ACCESS_TOKEN=:ACCESS_TOKEN,TOKEN_TYPE=:TOKEN_TYPE, ' +
'AUTH_EXPIRES=:AUTH_EXPIRES,AUTH_PERIOD=:AUTH_PERIOD ' +
'WHERE ID = :params_id';
query.ParamByName('params_id').AsInteger:= igoogleapi_params_id;
query.ParamByName('REFRESH_TOKEN').AsString:= sRefreshToken;
query.ParamByName('ACCESS_TOKEN').AsString:= sAccessToken;
query.ParamByName('TOKEN_TYPE').AsString:= sTokenType;
// AUTH_EXPIRES = Now+(AUTH_PERIOD-AuthExpiryMargin(=10, fpoauth2-ben látható))
query.ParamByName('AUTH_EXPIRES').AsDateTime:= Now()+(iAuthPeriod-10);
query.ParamByName('AUTH_PERIOD').AsInteger:= iAuthPeriod;
query.ExecSQL();
query.Close;
//SQLTransaction1.active:= false;
//conn.Transaction.Commit;
//conn.close();
//logger.Debug('conn.close()');
end;
end
except
on E:EUpdateError do
begin
hiba := 'EUpdateError : ' + E.Context + ' - ' + E.Message;
logger.Error(hiba);
end;
on E:ESQLDatabaseError do
begin
hiba := 'ESQLDatabaseError : ' + E.SQLState + ' - ' + E.Message;
logger.Error(hiba);
end;
on E:EDatabaseError do
begin
hiba := 'EDatabaseError : ' + ' - ' + E.Message;
logger.Error(hiba);
end;
on E:Exception do
begin
hiba := 'Exception : ' + E.Message;
logger.Error(hiba);
end
end;
try
begin
if ((hiba <> '') and (Token = '')) then
Result := PChar(hiba)//PAnsiChar(AnsiString(hiba))
else
Result := PChar(Token);//PAnsiChar(AnsiString(Token));
logger.Debug('Result: ' + StrPas(Result));
if (Client <> nil) then
begin
FreeAndNil(Client);
logger.Info('FreeAndNil(Client);');
end;
if (Response <> nil) then
begin
FreeAndNil(Response);
logger.Info('FreeAndNil(Response);');
end;
if (jData <> nil) then
begin
FreeAndNil(jData);
logger.Info('FreeAndNil(jData);');
end;
if (jData2 <> nil) then
begin
FreeAndNil(jData2);
logger.Info('FreeAndNil(jData2);');
end;
if (conn <> nil) then
begin
FreeAndNil(conn);
logger.Info('FreeAndNil(conn);');
end;
logger.Info('FreeAndNil ending');
FreeAndNil(loggerDB);
FreeAndNil(logger);
end
except
on E:EDatabaseError do
begin
hiba := 'EDatabaseError : ' + E.Message;
logger.Error(hiba);
end;
on E:EAccessViolation do
begin
hiba := 'EAccessViolation : ' + E.Message;
logger.Error(hiba);
end;
on E:exception do
begin
hiba := 'Something bad happened : ' + E.Message;
logger.Error(hiba);
end
end;
end;