Skip to content

Commit 1af45f9

Browse files
vvgrem@gmail.comvvgrem@gmail.com
authored andcommitted
Release 2.2.3
1 parent de4d579 commit 1af45f9

File tree

18 files changed

+71
-80
lines changed

18 files changed

+71
-80
lines changed

examples/onedrive/export_files.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def download_files(remote_folder, local_path):
4343
client = GraphClient(get_token)
4444

4545
# load drive properties
46-
target_user_name = settings.get('test_accounts')[1]
46+
target_user_name = settings.get('test_account_name')
4747
drive = client.users[target_user_name].drive
4848
# download files from OneDrive
4949
with tempfile.TemporaryDirectory() as path:

examples/onedrive/import_files.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def upload_files(remote_drive, local_root_path):
3737

3838
# get target drive
3939
client = GraphClient(get_token)
40-
user_name = settings.get('test_accounts')[1]
40+
user_name = settings.get('test_alt_account_name')
4141
target_drive = client.users[user_name].drive
4242
# import local files into OneDrive
4343
upload_files(target_drive, "../data")

examples/onedrive/upload_file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def acquire_token():
2121

2222

2323
client = GraphClient(acquire_token)
24-
user_name = settings.get('test_accounts')[1]
24+
user_name = settings.get('test_account_name')
2525
target_drive = client.users[user_name].drive
2626

2727
local_path = "../../tests/data/SharePoint User Guide.docx"

examples/outlook/send_message.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ def get_token():
2626
"ToRecipients": [
2727
{
2828
"EmailAddress": {
29-
"Address": settings.get('test_accounts')[1]
29+
"Address": settings.get('test_account_name')
3030
}
3131
}
3232
]
3333
},
3434
"SaveToSentItems": "false"
3535
}
3636

37-
user_name = settings.get('test_accounts')[0]
37+
user_name = settings.get('test_account_name')
3838
client.users[user_name].send_mail(message_json)
3939
client.execute_query()

examples/sharepoint/files/download_file_large.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,9 @@
44
from settings import settings
55

66
from office365.runtime.auth.client_credential import ClientCredential
7-
from office365.runtime.http.request_options import RequestOptions
87
from office365.sharepoint.client_context import ClientContext
98

109

11-
def download_file(context, download_url, file_object, chunk_downloaded=None, chunk_size=1024 * 1024):
12-
"""
13-
14-
:type context: office365.sharepoint.client_context.ClientContext
15-
:type download_url: str
16-
:type file_object: typing.IO
17-
:type chunk_downloaded: (int)->None or None
18-
:type chunk_size: int
19-
"""
20-
21-
request = RequestOptions(
22-
r"{0}web/getFileByServerRelativeUrl('{1}')/\$value".format(ctx.service_root_url(), download_url))
23-
request.stream = True
24-
response = context.execute_request_direct(request)
25-
response.raise_for_status()
26-
bytes_read = 0
27-
for chunk in response.iter_content(chunk_size=chunk_size):
28-
bytes_read += len(chunk)
29-
if callable(chunk_downloaded):
30-
chunk_downloaded(bytes_read)
31-
file_object.write(chunk)
32-
33-
3410
def print_download_progress(offset):
3511
print("Downloaded '{0}' bytes...".format(offset))
3612

@@ -41,7 +17,8 @@ def print_download_progress(offset):
4117
ctx = ClientContext(site_url).with_credentials(credentials)
4218

4319
file_url = '/sites/team/Shared Documents/big_buck_bunny.mp4'
20+
source_file = ctx.web.get_file_by_server_relative_url(file_url)
4421
local_file_name = os.path.join(tempfile.mkdtemp(), os.path.basename(file_url))
4522
with open(local_file_name, "wb") as local_file:
46-
download_file(ctx, file_url, local_file, print_download_progress)
23+
source_file.download_session(local_file, print_download_progress).execute_query()
4724
print("[Ok] file has been downloaded: {0}".format(local_file_name))

examples/sharepoint/tenant/get_set_site_admin.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
from office365.sharepoint.client_context import ClientContext
33
from office365.sharepoint.tenant.administration.secondary_administrators_info import SecondaryAdministratorsInfo
44
from office365.sharepoint.tenant.administration.tenant import Tenant
5-
from settings import settings
5+
from settings import settings, tenant_prefix
66

77
credentials = UserCredential(settings['user_credentials']['username'],
88
settings['user_credentials']['password'])
99

1010

11-
client = ClientContext(settings.get("team_site_url")).with_credentials(credentials)
11+
client = ClientContext(settings.get('url')).with_credentials(credentials)
1212
target_site = client.site.get().execute_query()
1313

1414
admin_client = ClientContext(settings.get("admin_site_url")).with_credentials(credentials)
@@ -17,8 +17,11 @@
1717
admins = tenant.get_site_secondary_administrators(site_id=target_site.id)
1818
admin_client.execute_query()
1919

20-
emails = settings.get("test_accounts")
21-
tenant.set_site_secondary_administrators(site_id=target_site.id, emails=emails).execute_query()
20+
existing_admin_names = [admin.get_property('loginName') for admin in admins]
21+
22+
target_user = target_site.rootWeb.ensure_user(f"mdoe@{tenant_prefix}.onmicrosoft.com").execute_query()
23+
names = existing_admin_names + [target_user.login_name]
24+
tenant.set_site_secondary_administrators(site_id=target_site.id, names=names).execute_query()
2225

2326
for admin in admins: # type: SecondaryAdministratorsInfo
2427
print(admin.get_property('loginName'))

office365/runtime/auth/providers/saml_token_provider.py

Lines changed: 10 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
import uuid
33
from xml.etree import ElementTree
44
import xml.dom.minidom as minidom
5-
from urllib.parse import urlparse
6-
7-
from datetime import datetime, timezone, timedelta
85

96

107
import requests
@@ -112,18 +109,14 @@ def get_last_error(self):
112109
def acquire_service_token_from_adfs(self, adfs_url, username, password):
113110
logger = self.logger(self.acquire_service_token_from_adfs.__name__)
114111

115-
now = datetime.now(tz=timezone.utc)
116-
created = now.astimezone(timezone.utc).isoformat('T')[:-9]+'Z'
117-
expires = (now + timedelta(minutes=10)).astimezone(timezone.utc).isoformat('T')[:-9]+'Z'
118-
119112
payload = self._prepare_request_from_template('FederatedSAML.xml', {
120113
'auth_url': adfs_url,
121114
'message_id': str(uuid.uuid4()),
122115
'username': username,
123116
'password': password,
124-
'created': created,
125-
'expires': expires,
126-
'issuer': self.__sts_profile.federationTokenIssuer
117+
'created': self.__sts_profile.created,
118+
'expires': self.__sts_profile.expires,
119+
'issuer': self.__sts_profile.tokenIssuer
127120
})
128121

129122
response = requests.post(adfs_url, data=payload,
@@ -132,15 +125,13 @@ def acquire_service_token_from_adfs(self, adfs_url, username, password):
132125
assertion_node = dom.getElementsByTagNameNS("urn:oasis:names:tc:SAML:1.0:assertion", 'Assertion')[0].toxml()
133126

134127
try:
135-
self.tenant = urlparse(self.__sts_profile.authorityUrl).netloc
136-
137128
payload = self._prepare_request_from_template('RST2.xml', {
138-
'auth_url': self.tenant,
129+
'auth_url': self.__sts_profile.tenant,
139130
'serviceTokenUrl': self.__sts_profile.security_token_service_url,
140131
'assertion_node': assertion_node
141132
})
142133

143-
# 3. get token
134+
# 3. get security token
144135
response = requests.post(self.__sts_profile.security_token_service_url, data=payload,
145136
headers={'Content-Type': 'application/soap+xml'})
146137
token = self._process_service_token_response(response)
@@ -154,14 +145,15 @@ def acquire_service_token_from_adfs(self, adfs_url, username, password):
154145
def _acquire_service_token(self, username, password, service_target=None, service_policy=None):
155146
"""Retrieve service token"""
156147
logger = self.logger(self._acquire_service_token.__name__)
148+
157149
payload = self._prepare_request_from_template('SAML.xml', {
158150
'auth_url': self.__sts_profile.authorityUrl,
159151
'username': username,
160152
'password': password,
161153
'message_id': str(uuid.uuid4()),
162154
'created': self.__sts_profile.created,
163155
'expires': self.__sts_profile.expires,
164-
'issuer': self.__sts_profile.federationTokenIssuer
156+
'issuer': self.__sts_profile.tokenIssuer
165157
})
166158
logger.debug_secrets('options: %s', payload)
167159
response = requests.post(self.__sts_profile.security_token_service_url, data=payload,
@@ -217,14 +209,11 @@ def _acquire_authentication_cookie(self, security_token, federated=False):
217209
logger.debug_secrets("session: %s\nsession.post(%s, data=%s)", session, self.__sts_profile.signin_page_url,
218210
security_token)
219211
if not federated:
220-
self._auth_cookies['FedAuth'] = None
221-
self._auth_cookies['rtFa'] = None
222212
session.post(self.__sts_profile.signin_page_url, data=security_token,
223213
headers={'Content-Type': 'application/x-www-form-urlencoded'})
224214
else:
225-
self._auth_cookies['SPOIDCRL'] = None
226-
idcrlEndpoint = "https://{}/_vti_bin/idcrl.svc/".format(self.tenant)
227-
session.get(idcrlEndpoint,
215+
idcrl_endpoint = "https://{}/_vti_bin/idcrl.svc/".format(self.__sts_profile.tenant)
216+
session.get(idcrl_endpoint,
228217
headers={
229218
'User-Agent': 'Office365 Python Client',
230219
'X-IDCRL_ACCEPTED': 't',
@@ -238,8 +227,7 @@ def _acquire_authentication_cookie(self, security_token, federated=False):
238227
self.__sts_profile.signin_page_url)
239228
logger.error(self.error)
240229
return False
241-
for name in self._auth_cookies.keys():
242-
self._auth_cookies[name] = cookies[name]
230+
self._auth_cookies = cookies
243231
return True
244232

245233
@staticmethod

office365/runtime/auth/sts_profile.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import datetime
2+
from datetime import datetime, timezone, timedelta
3+
from urllib.parse import urlparse
24

35

46
class STSProfile(object):
@@ -12,11 +14,16 @@ def __init__(self, authority_url):
1214
self.serviceUrl = 'https://login.microsoftonline.com'
1315
self.securityTokenServicePath = 'extSTS.srf'
1416
self.userRealmServicePath = 'GetUserRealm.srf'
15-
self.federationTokenIssuer = 'urn:federation:MicrosoftOnline'
16-
self.created = datetime.datetime.now()
17-
self.expires = self.created + datetime.timedelta(minutes=10)
17+
self.tokenIssuer = 'urn:federation:MicrosoftOnline'
18+
now = datetime.now(tz=timezone.utc)
19+
self.created = now.astimezone(timezone.utc).isoformat('T')[:-9] + 'Z'
20+
self.expires = (now + timedelta(minutes=10)).astimezone(timezone.utc).isoformat('T')[:-9] + 'Z'
1821
self.signInPage = '_forms/default.aspx?wa=wsignin1.0'
1922

23+
@property
24+
def tenant(self):
25+
return urlparse(self.authorityUrl).netloc
26+
2027
@property
2128
def security_token_service_url(self):
2229
return "/".join([self.serviceUrl, self.securityTokenServicePath])

office365/sharepoint/files/file.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,31 @@ def download(self, file_object):
286286
def _download_inner():
287287
qry = DownloadFileQuery(self.context.web, self.serverRelativeUrl, file_object)
288288
self.context.add_query(qry)
289+
290+
self.ensure_property("ServerRelativeUrl", _download_inner)
291+
return self
292+
293+
def download_session(self, file_object, chunk_downloaded=None, chunk_size=1024 * 1024):
294+
"""
295+
:type file_object: typing.IO
296+
:type chunk_downloaded: (int)->None or None
297+
:type chunk_size: int
298+
"""
299+
300+
def _download_inner():
301+
request = RequestOptions(
302+
r"{0}web/getFileByServerRelativeUrl('{1}')/\$value".format(self.context.service_root_url(),
303+
self.serverRelativeUrl))
304+
request.stream = True
305+
response = self.context.execute_request_direct(request)
306+
response.raise_for_status()
307+
bytes_read = 0
308+
for chunk in response.iter_content(chunk_size=chunk_size):
309+
bytes_read += len(chunk)
310+
if callable(chunk_downloaded):
311+
chunk_downloaded(bytes_read)
312+
file_object.write(chunk)
313+
289314
self.ensure_property("ServerRelativeUrl", _download_inner)
290315
return self
291316

office365/sharepoint/tenant/administration/secondary_administrators_fields_data.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,5 @@ def __init__(self, site_id, emails=None, names=None):
1313
"""
1414
super().__init__()
1515
self.secondaryAdministratorEmails = ClientValueCollection(str, emails)
16-
self.secondaryAdministratorLoginNames = names
16+
self.secondaryAdministratorLoginNames = ClientValueCollection(str, names)
1717
self.siteId = site_id
18-
19-
#@property
20-
#def entity_type_name(self):
21-
# return "Microsoft.Online.SharePoint.TenantAdministration.SecondaryAdministratorsFieldsData"
22-
23-
24-
25-

0 commit comments

Comments
 (0)