TD 4 - Exercice 2

In [1]:
from xmlrpc.client import ServerProxy
In [2]:
server = ServerProxy('http://monge.univ-mlv.fr:8888')
In [3]:
server.system.listMethods() # c'est dans la doc
Out[3]:
['__',
 'help',
 'jure',
 'system.listMethods',
 'system.methodHelp',
 'system.methodSignature',
 'tous_les_jurons']
In [4]:
server.help() # Essayer ça au minimum!
Out[4]:
'ENCODAGE=BASE64'
In [5]:
from base64 import b64decode # Il y a pas mal de possibilités pour décoder, c'est un exemple
In [7]:
server.jure().data # Il faut l'attribut "data" car le serveur est en python 3 (il n'existerait pas en python 2)
Out[7]:
b'U2FsZSBwYXlzIGRlIHRvbm5lcnJlIGRlIEJyZXN0Cg=='
In [8]:
b64decode(_).decode('latin1')
Out[8]:
'Sale pays de tonnerre de Brest\n'
In [9]:
# Maintenant qu'on a compris, on écrit une fonction
def jure():
    return b64decode(server.jure().data).decode('latin1')
In [10]:
print(jure())
Brigand

In [11]:
# ... et on essaie les autres méthodes
jurons = server.tous_les_jurons().data
In [12]:
jurons[:100]
Out[12]:
b'QWJvbWluYWJsZQpBY2NhcGFyZXVycwpBbXBoaXRyeW9uCkFuYWNvbHV0aGUKQW5hY29sdXRoZXMKQW5hbHBoYWLodGUKQW5hbHBo'
In [13]:
jurons = b64decode(server.tous_les_jurons().data).decode('latin1')
In [14]:
open('jurons','w').write(jurons)
Out[14]:
8475
In [15]:
# On peut aussi s'interroger sur la présence d'une étrange méthode '__'
# Pourquoi ne pas essayer ?
print(b64decode(server.__().data).decode('ascii'))
#!/usr/bin/env python3


from xmlrpc.server import SimpleXMLRPCServer
from base64 import *
from random import randint


jurons = open('jurons.txt', 'rb').readlines()

def jure():
        return b64encode(jurons[randint(0,len(jurons))])

def help(): return  "ENCODAGE=BASE64"

def __():
	s=open('haddock_server_py3.py','rb').read()
	return b64encode(s)

def tous_les_jurons():
	s=open('jurons.txt','rb').read()
	return b64encode(s)

server = SimpleXMLRPCServer(('193.55.63.80', 8888))

server.register_function(tous_les_jurons)
server.register_function(jure)
server.register_function(help)
server.register_function(__)
server.register_introspection_functions()

try:
    server.serve_forever()
finally:
    server.server_close()

Avec un minimum de curiosité, on récupère donc la solution de la question suivante (écrire un serveur identique).

In [ ]: