Skip to content

Commit 4c86e86

Browse files
committed
SharePoint API enhancement: ensure if security validation expires (#243)
1 parent 98ea16e commit 4c86e86

File tree

3 files changed

+39
-14
lines changed

3 files changed

+39
-14
lines changed
Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
import time
22
from office365.sharepoint.client_context import ClientContext
3+
from office365.sharepoint.server_settings import ServerSettings
34
from tests import test_site_url, test_client_credentials
45

56

6-
def process_site(context):
7-
target_web = context.web
8-
target_web.set_property("Description", "DEV site").update().get().execute_query()
9-
print(target_web.url)
7+
def print_server_settings(context):
8+
"""
9+
:type context: ClientContext
10+
"""
11+
is_online = ServerSettings.is_sharepoint_online(context)
12+
installed_languages = ServerSettings.get_global_installed_languages(context, 15)
13+
context.execute_batch()
14+
print("Is SharePoint Online? : {0}".format(is_online.value))
15+
print("Installed languages amount : {0}".format(len(installed_languages.items)))
1016

1117

1218
ctx = ClientContext(test_site_url).with_credentials(test_client_credentials)
1319

1420
if __name__ == '__main__':
15-
while 1:
16-
print(f"{time.ctime()}: Processing site")
17-
process_site(ctx)
18-
time.sleep(10)
21+
start_time = time.time()
22+
while True:
23+
print(f" %s : Processing site..." % int(time.time() - start_time))
24+
print_server_settings(ctx)
25+
time.sleep(30)

office365/sharepoint/client_context.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def __init__(self, base_url, auth_context=None):
4141
self.__web = None
4242
self.__site = None
4343
self._base_url = base_url
44-
self._ctx_web_info = None
44+
self._ctx_web_info = ContextWebInformation()
4545
self._pendingRequest = ODataRequest(self, JsonLightFormat(ODataMetadataLevel.Verbose))
4646
self._pendingRequest.beforeExecute += self._build_modification_query
4747

@@ -63,6 +63,7 @@ def _init_context_for_web(resp):
6363
"""
6464
resp.raise_for_status()
6565
ctx._base_url = result.value
66+
6667
ctx.after_execute(_init_context_for_web)
6768
return ctx
6869

@@ -118,6 +119,7 @@ def execute_batch(self, items_per_batch=100):
118119

119120
def _prepare_batch_request(request):
120121
self.ensure_form_digest(request)
122+
121123
batch_request.beforeExecute += _prepare_batch_request
122124

123125
all_queries = [qry for qry in self.pending_request().next_query()]
@@ -145,7 +147,7 @@ def ensure_form_digest(self, request_options):
145147
"""
146148
:type request_options: RequestOptions
147149
"""
148-
if self._ctx_web_info is None:
150+
if not self._ctx_web_info.is_valid:
149151
self._ctx_web_info = self.get_context_web_information()
150152
request_options.set_header('X-RequestDigest', self._ctx_web_info.FormDigestValue)
151153

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1+
import math
2+
import time
3+
14
from office365.runtime.client_value import ClientValue
25

36

47
class ContextWebInformation(ClientValue):
5-
"""The context information for a site."""
8+
"""Specifies metadata about a site (2)."""
69

7-
def __init__(self):
10+
def __init__(self, form_digest_value=None, form_digest_timeout_secs=None):
11+
"""
12+
:param str form_digest_value: Specifies a valid form digest for the site
13+
:param int form_digest_timeout_secs: Specifies the amount of time in seconds before security validation expires.
14+
"""
815
super(ContextWebInformation, self).__init__()
9-
self.FormDigestValue = None
10-
self.FormDigestTimeoutSeconds = None
16+
self.FormDigestValue = form_digest_value
17+
self.FormDigestTimeoutSeconds = form_digest_timeout_secs
1118
self.LibraryVersion = None
1219
self.SiteFullUrl = None
1320
self.SupportedSchemaVersions = None
1421
self.WebFullUrl = None
22+
self._valid_from = time.time()
23+
24+
@property
25+
def is_valid(self):
26+
if self.FormDigestTimeoutSeconds is None:
27+
return False
28+
else:
29+
expires_in_sec = math.ceil(time.time() - self._valid_from)
30+
return expires_in_sec < self.FormDigestTimeoutSeconds

0 commit comments

Comments
 (0)