Пытаюсь работать с Thrift (IDL ниже)
struct AuthSalt {
1: required i64 client, /* случайные данные генерируемы клиентом. */
2: required i64 server, /* salt-данные из предыдущего ответа сервера. */
}
struct AuthRequest {
1: required AuthSalt bootstrap,
2: required string who, /* логин пользователя. */
3: required string signature, /* SHA-1 дайджест от слияния bootstrap + password + who + bootstrap. */
}
exception NotAuthorisedException {
1: required string description
}
service Bookworm {
AuthResponse Authenticate( 1: required AuthRequest a, 2: required string locale )
throws ( 1: NotAuthorisedException e )
}
Для генерации SHA использую: dig = hashlib.sha1(), судя по описанию, то получить дайджест я могу последовательным вызовом dig.update(string).
bw_authsalt = AuthSalt(0,0) #создаем объект, который будем использовать при создании AuthRequest
dig.update(bw_authsalt)
dig.update(password + login)
dig.update(bw_authsalt)
SHA_CTX c;
::SHA1_Init(&c);
::SHA1_Update(&c, &bootstrap, sizeof(bootstrap));
::SHA1_Update(&c, password.c_str(), password.size());
::SHA1_Update(&c, who.c_str(), who.size());
::SHA1_Update(&c, &bootstrap, sizeof(bootstrap));
::SHA1_Final(digest, &c);
Вторая часть проблемы в том, что я решил создать объект без корректного дайджеста и вызвать метод Authenticate - ожидал получить exception NotAuthorisedException, но вывалилось с:
Traceback (most recent call last):
File "./bw_client.py", line 44, in <module>
client.Authenticate(bw_authreq, 'rus')
File "./gen-py/bookworm/Bookworm.py", line 50, in Authenticate
self.send_Authenticate(a, locale)
File "./gen-py/bookworm/Bookworm.py", line 58, in send_Authenticate
args.write(self._oprot)
File "./gen-py/bookworm/Bookworm.py", line 213, in write
self.a.write(oprot)
File "./gen-py/bookworm/ttypes.py", line 161, in write
oprot.writeString(self.digest)
File "/usr/local/lib/python2.6/dist-packages/thrift/protocol/TBinaryProtocol.py", line 122, in writeString
self.writeI32(len(str))
TypeError: object of type '_hashlib.HASH' has no len()