'Determine the best auth method (digest/0k/plain) and use it for auth.
Returns used method name on success. Used internally.'

def plugin(self, owner):

    if (not self.resource):
        return self.authComponent(owner)
    self.DEBUG('Querying    server    about    possible    auth    methods', 'start')
    resp = owner.Dispatcher.SendAndWaitForResponse(Iq('get', NS_AUTH, payload=[Node('username', payload=[self.user])]))
    if (not isResultNode(resp)):
        self.DEBUG('No    result    node    arrived!    Aborting...', 'error')
        return
    iq = Iq(typ='set', node=resp)
    query = iq.getTag('query')
    query.setTagData('username', self.user)
    query.setTagData('resource', self.resource)
    if query.getTag('digest'):
        self.DEBUG('Performing    digest    authentication', 'ok')
        query.setTagData('digest', sha.new((owner.Dispatcher.Stream._document_attrs['id'] + self.password)).hexdigest())
        if query.getTag('password'):
            query.delChild('password')
        method = 'digest'
    elif query.getTag('token'):
        token = query.getTagData('token')
        seq = query.getTagData('sequence')
        self.DEBUG('Performing    zero-k    authentication', 'ok')
        hash = sha.new((sha.new(self.password).hexdigest() + token)).hexdigest()
        for foo in xrange(int(seq)):
            hash = sha.new(hash).hexdigest()
        query.setTagData('hash', hash)
        method = '0k'
    else:
        self.DEBUG('Sequre    methods    unsupported,    performing    plain    text    authentication', 'warn')
        query.setTagData('password', self.password)
        method = 'plain'
    resp = owner.Dispatcher.SendAndWaitForResponse(iq)
    if isResultNode(resp):
        self.DEBUG('Sucessfully    authenticated    with    remove    host.', 'ok')
        owner.User = self.user
        owner.Resource = self.resource
        owner._registered_name = ((((owner.User + '@') + owner.Server) + '/') + owner.Resource)
        return method
    self.DEBUG('Authentication    failed!', 'error')
