| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/seaside.pacim.de/web/ |
Upload File : |
<?php
/**
* gdrive_auth.php – Einmalige (Neu-)Autorisierung des Google-Drive-Zugriffs für die Monatsabrechnung.
*
* 1. Seite ohne ?code -> Button „Mit Google verbinden" (Consent-URL, access_type=offline, prompt=consent).
* 2. Google leitet mit ?code zurück -> Code gegen Token tauschen, refresh_token sichern.
*
* Das erzeugte Token wird unter includes/certs/token-...-pacim-gdrive.json gespeichert
* (dieselbe Datei, die accounting.drive.php nutzt).
*
* WICHTIG: Die hier angezeigte „Redirect URI" muss in der Google Cloud Console beim
* OAuth-Client als zulässige Weiterleitungs-URI eingetragen sein.
*/
require_once( __DIR__ . '/includes/config.inc.php' );
ini_set( 'display_errors', '0' );
error_reporting( 0 );
if ( ! isset( $_SESSION['user'] ) || $_SESSION['user'] != LOGIN_USER ) {
http_response_code( 403 );
echo 'Nicht angemeldet.';
exit();
}
require_once( PATH_SYSTEM . '/includes/accounting.drive.php' );
$credentialsPath = accounting_drive_token_path();
$secretPath = accounting_drive_secret_path();
// Registrierte Redirect-URI aus der client_secret-Datei verwenden -> kein redirect_uri_mismatch,
// kein Eingriff in der Google Cloud Console nötig. Google leitet danach an gdrive_quick.php (Callback).
$secret = json_decode( file_get_contents( $secretPath ), true );
$secretK = is_array( $secret ) ? array_key_first( $secret ) : null;
$redirect = ( $secretK && ! empty( $secret[ $secretK ]['redirect_uris'][0] ) ) ? $secret[ $secretK ]['redirect_uris'][0] : null;
function gauth_client( $redirect, $secretPath ) {
$client = new Google_Client();
$client->setApplicationName( 'PaCIM Monatsabrechnung' );
$client->setAuthConfig( $secretPath );
$client->addScope( 'https://www.googleapis.com/auth/drive' );
if ( $redirect ) $client->setRedirectUri( $redirect );
$client->setAccessType( 'offline' );
$client->setPrompt( 'consent' ); // erzwingt ein neues refresh_token
return $client;
}
$client = gauth_client( $redirect, $secretPath );
function gauth_page( $body ) {
echo '<!doctype html><html lang="de"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">';
echo '<title>Google Drive verbinden</title>';
echo '<style>body{font-family:system-ui,Segoe UI,Roboto,Arial,sans-serif;max-width:640px;margin:48px auto;padding:0 20px;color:#1f2937;line-height:1.55}';
echo '.btn{display:inline-block;background:#2563eb;color:#fff;padding:10px 18px;border-radius:8px;text-decoration:none;font-weight:600}';
echo 'code{background:#f3f4f6;padding:2px 6px;border-radius:4px;font-size:13px;word-break:break-all}';
echo '.ok{color:#15803d;font-weight:600}.err{color:#b91c1c;font-weight:600}.muted{color:#6b7280;font-size:14px}</style></head><body>';
echo $body;
echo '</body></html>';
exit();
}
if ( ! $redirect ) {
gauth_page( '<h1 class="err">Konfigurationsfehler</h1><p>In der client_secret-Datei ist keine Redirect-URI hinterlegt.</p>' );
}
/* ---- Callback: Google leitet mit ?code hierher zurück (registrierte Redirect-URI = diese Seite) ---- */
if ( isset( $_GET['code'] ) ) {
$token = $client->fetchAccessTokenWithAuthCode( $_GET['code'] );
if ( isset( $token['error'] ) ) {
gauth_page( '<h1 class="err">Autorisierung fehlgeschlagen</h1><p><code>' . htmlspecialchars( $token['error'] . ' – ' . ( isset( $token['error_description'] ) ? $token['error_description'] : '' ) ) . '</code></p><p><a class="btn" href="?">Erneut versuchen</a></p>' );
}
// Falls Google kein neues refresh_token liefert, ein vorhandenes behalten.
if ( empty( $token['refresh_token'] ) && file_exists( $credentialsPath ) ) {
$old = json_decode( file_get_contents( $credentialsPath ), true );
if ( is_array( $old ) && ! empty( $old['refresh_token'] ) ) $token['refresh_token'] = $old['refresh_token'];
}
$hasRefresh = ! empty( $token['refresh_token'] );
@file_put_contents( $credentialsPath, json_encode( $token ) );
gauth_page(
'<h1 class="ok">Google Drive verbunden ✓</h1>' .
'<p>Das Zugriffstoken wurde gespeichert.' . ( $hasRefresh ? ' Ein <strong>refresh_token</strong> ist vorhanden – die Übertragung funktioniert dauerhaft.' : ' <span class="err">Achtung: kein refresh_token erhalten.</span> Bitte den Zugriff im Google-Konto (Sicherheit → Drittanbieter-Apps) entfernen und erneut verbinden.' ) . '</p>' .
'<p class="muted">Du kannst dieses Fenster schließen und in der Buchhaltung „In Google Drive" übertragen.</p>'
);
}
/* ---- Start: Consent-Link anzeigen ---- */
$authUrl = $client->createAuthUrl();
gauth_page(
'<h1>Google Drive verbinden</h1>' .
'<p>Der gespeicherte Zugang für den Drive-Upload der Monatsabrechnungen ist abgelaufen. Verbinde das Google-Konto, das den Abrechnungs-Ordner besitzt, neu:</p>' .
'<p><a class="btn" href="' . htmlspecialchars( $authUrl ) . '">Mit Google verbinden</a></p>' .
'<p class="muted">Verwendete Redirect-URI (in der Google Cloud Console registriert):<br><code>' . htmlspecialchars( $redirect ) . '</code></p>'
);