2011-01-21 78 views
0

我一直在試圖讓一個名爲simplesamlphp的東西連接到一個Django應用程序。需要一點幫助將base64解碼器腳本從PHP翻譯爲Python

我幾乎沒有...雖然我需要複製,在Python,PHP這個腳本的功能:

我抄在PHP $生變量的內容,該文件64.rtf。然而,當我運行了Python相當於我得到一個錯誤,指出:

類型錯誤:不正確的填充

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位??或url_parser ??

和究竟是什麼這些幹什麼,多數民衆贊成在解碼如此重要?

我希望你能有所幫助。感謝...

+0

嘗試`base64.b64decode(string64)`(不含逗號)。 – 2011-01-21 15:49:54

+0

@ Jakub:在我的Python上它可以使用和不使用逗號。 – rubik 2011-01-21 16:10:50

回答

0

這在所有它的榮耀。

#!/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) 

的原因您試圖b64decode您的字符串時,得到一個錯誤,是因爲該字符串是不是一個真正的64位編碼。base64編碼的數據始終是一個長度爲能被4整除。你的字符串不是。爲了使t他的字符串長度可以被4整除,'='字符被附加到字符串的末尾。在你的情況下,長度爲%4 == 3.所以,我們需要在字符串的末尾添加一個'='以使其正確解碼。