Hello Glyph,

it was an error at a different place as you expected. Now it is working very 
nicely.

Thanks for your help,
Thomas


From: Twisted-Python [mailto:twisted-python-boun...@twistedmatrix.com] On 
Behalf Of Glyph
Sent: Thursday, June 06, 2019 7:36 AM
To: Twisted general discussion
Subject: Re: [Twisted-Python] Returning Failure when requestAvatarID to 
indicate a failed login is not working for me




On Jun 5, 2019, at 4:52 AM, Thomas Westfeld <thomas.westf...@currenta.de> wrote:

Dear all,

Hi Thomas!


I am experiencing a problem with a custom credential checker for twisted cred 
based on an external server.
My problem is, that the Failure in the last line does not trigger the Errback 
of the deferred of the calling method to signal that the login failed.

This is surprising, because unless something else is broken, the example you 
gave definitely behaves like that.  Which suggests to me that something else is 
broken.


I also tried to raise the error but this does not work for me.

This should also work.


I also tried to return a defer.fail(error.UnauthorizedLogin()).

This, however, is a mistake; you can't returnValue(someDeferred()) in 
inlineCallbacks; you have to wait for deferreds with 'yield'.  So this failing 
is expected.


I am now a bit puzzled that it could be problematic, because the 
@inlineCallbacks decorator makes the function itself return a deferred already. 
It would be great to have an inlineCallbacked method as getAvatarID method, 
because I am doing some networking calls in it which are all returning 
deferreds.

Do I have to rewrite the getAvatarID implementation to not use inlineCallbacks?

No, this should indeed work as you describe.

It would be helpful if you could construct the most minimal possible example of 
your issue.

For example, here's a super minimal illustration of the fact that the two 
techniques that should work, do in fact work:

from twisted.internet.defer import inlineCallbacks, returnValue, fail
from twisted.python.failure import Failure
from twisted.cred.error import UnauthorizedLogin

@inlineCallbacks
def returnFailure():
    if 0:
        yield
    returnValue(Failure(UnauthorizedLogin()))

@inlineCallbacks
def returnFailResult():
    if 0:
        yield
    returnValue(fail(UnauthorizedLogin()))

@inlineCallbacks
def raiseException():
    if 0:
        yield
    raise UnauthorizedLogin()

returnFailure().addErrback(lambda eb: print(eb))
# returnFailResult().addErrback(lambda eb: print(eb))
raiseException().addErrback(lambda eb: print(eb))

Could you reduce your checker to something suitably minimal that can be run 
directly without actually talking to your auth backend?  My guess is that 
you'll discover a bug as you're doing this, but the possibility definitely 
remains that there's an issue with Twisted; I just can't guess what it might be 
without more information.

Thanks for using Twisted,

-g
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to