нужна небольшая помощь в "переводе" скрипта base64decoder с PHP на Python - PullRequest
0 голосов
/ 21 января 2011

Я пытался подключить нечто, называемое simplesamlphp, к приложению django.

Я почти на месте ... хотя мне нужно продублировать в Python функциональность этого сценария php:

Я скопировал содержимое переменной $ raw в php в файл64.rtf.Однако, когда я запускаю эквивалент Python, я получаю сообщение об ошибке:

TypeError: Неверное заполнение

PHP-код:

function getValue($raw) {

    $val = $raw;

    $url = parse_url($raw, PHP_URL_QUERY);
    if (!empty($url)) $val = $url;

    $arr = array();
    $query = parse_str($val, &$arr);

    #echo('<pre>');print_r($arr);

    if (array_key_exists('SAMLResponse', $arr)) return $arr['SAMLResponse'];
    if (array_key_exists('SAMLRequest', $arr)) return $arr['SAMLRequest'];
    if (array_key_exists('LogoutRequest', $arr)) return $arr['LogoutRequest'];
    if (array_key_exists('LogoutResponse', $arr)) return $arr['LogoutResponse'];

    return rawurldecode(stripslashes($val));
}

function decode($raw) {
    $message = getValue($raw);
    #echo 'using value: ' . $message; exit;

    $base64decoded = base64_decode($message);
    $gzinflated = gzinflate($base64decoded);
    if ($gzinflated != FALSE) {
        $base64decoded = $gzinflated;
    }
    $decoded = htmlspecialchars($base64decoded);
    return $decoded;
}    

Я только придумал это в Pythonдо сих пор:

string64 = open("64.rtf", "rU").read()
decodedstring = base64.b64decode(string64,)

Что я не получаю?rawurldecode (stripslashes bit ?? или url_parser ??

и что именно они делают, что так важно для декодирования?

Надеюсь, вы можете помочь. спасибо…

1 Ответ

0 голосов
/ 21 января 2011

Вот оно, во всей красе.

#!/usr/bin/env python

import base64
import zlib
import cgi
import urlparse

def getValue(raw):
    args = urlparse.parse_qs(urlparse.urlparse(raw).query)
    keys = ['SAMLResponse', 'SAMLRequest', 'LogoutRequest', 'LogoutResponse']
    for key in keys:
        if key in args: return args[key][0]

def decode(raw):
    message = getValue(raw)
    message = message + "=" * (4 - len(message) % 4)
    base64decoded = base64.b64decode(message)
    try:
        base64decoded = zlib.decompressobj().decompress('x\x9c' + base64decoded)
    except zlib.error:
        pass # may want to handle this error
    return cgi.escape(base64decoded, True)

data = 'PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIElEPSJwZnhkYTAxMjkzOC03MDkxLWNjZjQtZTc2Ny0wZWQ4OGVhN2Q1YmYiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDExLTAxLTIxVDEyOjI4OjI5WiIgRGVzdGluYXRpb249Imh0dHBzOi8vd2F5Zi5teWRvbWFpbi5kay9zaW1wbGVzYW1sL3NhbWwyLW15bG9naW4ucGhwIiBJblJlc3BvbnNlVG89Il82ZDhmNDAxZDUzYTg1NDkzMzY2N2FiNWU5NzE1NWNmMzJjYWExMjBkZDciPjxzYW1sOklzc3Vlcj5odHRwczovL3Rlc3RicmlkZ2Uud2F5Zi5kazwvc2FtbDpJc3N1ZXI'

url = "http://www.google.com?SAMLResponse=" + data
print decode(url)

Причина, по которой вы получили ошибку при попытке b64-кодирования вашей строки, в том, что строка не является ИСТИННОЙ base64-кодировкой. Данные в кодировке base64 всегда имеют длину, которая делится на 4. Ваша строка - нет. Для того, чтобы длина строки была равномерно разделена на 4, символы '=' добавляются в конец строки. В вашем случае длина% 4 == 3. Итак, нам нужно добавить один '=' в конец строки, чтобы она правильно декодировалась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...