Skip to content
This repository was archived by the owner on Jun 11, 2025. It is now read-only.

Commit 7cd8524

Browse files
committed
Docs and exceptions for SOAP provider
1 parent bea12cf commit 7cd8524

File tree

2 files changed

+33
-10
lines changed

2 files changed

+33
-10
lines changed

skpy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from skpy.util import SkypeUtils
77
from skpy.main import Skype, SkypeEventLoop, SkypeSettings, SkypeTranslator
88
from skpy.conn import SkypeConnection, SkypeAuthProvider, SkypeAPIAuthProvider, SkypeLiveAuthProvider, \
9-
SkypeRefreshAuthProvider, SkypeGuestAuthProvider, SkypeEndpoint
9+
SkypeSOAPAuthProvider, SkypeRefreshAuthProvider, SkypeGuestAuthProvider, SkypeEndpoint
1010
from skpy.user import SkypeUser, SkypeContact, SkypeBotUser, SkypeContacts, SkypeContactGroup, SkypeRequest
1111
from skpy.chat import SkypeChat, SkypeSingleChat, SkypeGroupChat, SkypeChats
1212
from skpy.msg import SkypeMsg, SkypeTextMsg, SkypeContactMsg, SkypeLocationMsg, SkypeCardMsg, \

skpy/conn.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,9 @@ def getToken(self, t):
595595

596596

597597
class SkypeSOAPAuthProvider(SkypeAuthProvider):
598+
"""
599+
An authentication provider that connects via Microsoft account SOAP authentication.
600+
"""
598601

599602
template = """
600603
<Envelope xmlns='http://schemas.xmlsoap.org/soap/envelope/'
@@ -631,6 +634,27 @@ class SkypeSOAPAuthProvider(SkypeAuthProvider):
631634
def encode(value):
632635
return value.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
633636

637+
def auth(self, user, pwd):
638+
"""
639+
Perform a SOAP login with the given email address or Skype username, and its password.
640+
641+
.. note::
642+
Microsoft accounts with two-factor authentication enabled must provide an application-specific password.
643+
644+
Args:
645+
user (str): username or email address of the connecting account
646+
pwd (str): password of the connecting account
647+
648+
Returns:
649+
(str, datetime.datetime) tuple: Skype token, and associated expiry if known
650+
651+
Raises:
652+
.SkypeAuthException: if the login request is rejected
653+
.SkypeApiException: if the login form can't be processed
654+
"""
655+
token = self.getSecToken(user, pwd)
656+
return self.exchangeToken(token)
657+
634658
def getSecToken(self, user, pwd):
635659
loginResp = self.conn("POST", "{0}/RST.srf".format(SkypeConnection.API_MSACC),
636660
data=self.template.format(self.encode(user), self.encode(pwd)))
@@ -646,11 +670,14 @@ def getSecToken(self, user, pwd):
646670
code = fnode.text
647671
elif ftag == "faultstring":
648672
msg = fnode.text
649-
raise SkypeAuthException("{} - {}".format(code, msg), loginResp)
673+
if code or msg:
674+
raise SkypeAuthException("{} - {}".format(code, msg), loginResp)
675+
else:
676+
raise SkypeApiException("Unknown fault whilst requesting security token", loginResp)
650677
elif tag == "BinarySecurityToken":
651678
token = node.text
652679
if not token:
653-
raise SkypeAuthException("Couldn't retrieve security token from login response", loginResp)
680+
raise SkypeApiException("Couldn't retrieve security token from login response", loginResp)
654681
return token
655682

656683
def exchangeToken(self, token):
@@ -659,7 +686,7 @@ def exchangeToken(self, token):
659686
try:
660687
edgeData = edgeResp.json()
661688
except ValueError:
662-
raise SkypeAuthException("Couldn't parse edge response body", edgeResp)
689+
raise SkypeApiException("Couldn't parse edge response body", edgeResp)
663690
if "skypetoken" in edgeData:
664691
token = edgeData["skypetoken"]
665692
expiry = None
@@ -668,13 +695,9 @@ def exchangeToken(self, token):
668695
return (token, expiry)
669696
elif "status" in edgeData:
670697
status = edgeData["status"]
671-
raise SkypeAuthException("{} - {}".format(status.get("code"), status.get("text")), edgeResp)
698+
raise SkypeApiException("{} - {}".format(status.get("code"), status.get("text")), edgeResp)
672699
else:
673-
raise SkypeAuthException("Couldn't retrieve token from edge response", edgeResp)
674-
675-
def auth(self, user, pwd):
676-
token = self.getSecToken(user, pwd)
677-
return self.exchangeToken(token)
700+
raise SkypeApiException("Couldn't retrieve token from edge response", edgeResp)
678701

679702

680703
class SkypeGuestAuthProvider(SkypeAuthProvider):

0 commit comments

Comments
 (0)