@ -1,6 +1,8 @@
import requests
import requests
import xml.etree.ElementTree as ET
import xml.etree.ElementTree as ET
import sys
import sys
import time
import datetime
# Prepare and send the propfind request return xml string
# Prepare and send the propfind request return xml string
def propfind ( path , auth ) :
def propfind ( path , auth ) :
@ -23,9 +25,6 @@ def search_folder(requestreturn):
# First folder provided in the xml file is always the folder we are currently in.
# First folder provided in the xml file is always the folder we are currently in.
# To prevent searching this folder twice, or ending in a loop, we can not store this folder in the folderlist again.
# To prevent searching this folder twice, or ending in a loop, we can not store this folder in the folderlist again.
firstfolder = True
firstfolder = True
# Name of files are stored as an string. But we can check the timestamp of the file after we can check the name,
# so it needs to be stored temporary in case the timestamp is wrong
temp = " this is sa temporary storage "
# Get a xml tree
# Get a xml tree
tree = ET . ElementTree ( ET . fromstring ( requestreturn ) )
tree = ET . ElementTree ( ET . fromstring ( requestreturn ) )
# Find all responses in the tree, those contain the fielpath, lasttimemodified, typeoffile etc.
# Find all responses in the tree, those contain the fielpath, lasttimemodified, typeoffile etc.
@ -41,17 +40,50 @@ def search_folder(requestreturn):
else :
else :
firstfolder = False
firstfolder = False
break
break
else :
temp = p . text
# In case p.text is none, it contains the further information
# In case p.text is none, it contains the further information
else :
else :
# Find time last modfied and check if the year is before 1990
for time in p . findall ( ' .//{DAV:}getlastmodified ' ) :
year = time . text . split ( ' ' )
if int ( year [ 3 ] ) < 1990 :
linkswrongtime . append ( temp )
for t in p . findall ( ' .//{DAV:}getlastmodified ' ) :
#this function converts the given date to unix timestamp
lastmodified = time . mktime ( datetime . datetime . strptime ( t . text , " % a, %d % b % Y % H: % M: % S GMT " ) . timetuple ( ) )
#631148400 is the unix timestamp of 01.01.1990 00:00:00, because we know there is no file older than this in our nextcloud system
if lastmodified < 631148400 :
for fileid in p . findall ( ' .//{http://owncloud.org/ns}fileid ' ) :
linkswrongtime . append ( fileid . text )
return [ innerfolders , linkswrongtime ]
return [ innerfolders , linkswrongtime ]
# This function returns the fileid of the version of a given fileid with the most current timestamp or None if there are no versions with a timestamp younger than 01.01.1990
def version_check ( xmlfile ) :
tree = ET . ElementTree ( ET . fromstring ( xmlfile ) )
# Name of files are stored as a string. But we can check the timestamp of the file only after we can check the name,
# so it needs to be stored temporary in case the timestamp is the most current
temp = " this is a temporary string "
# These two variables are used to store the highest/most current timestamp and the associated fileid
most_current_timestamp = 631148400
most_current_timestamp_fileid = 0
for resp in tree . findall ( ' .//{DAV:}response ' ) :
for p in resp :
# In case p.text is not none, it contains the filepath
if not ( p . text is None ) :
temp = p . text
else :
for t in p . findall ( ' .//{DAV:}getlastmodified ' ) :
if not ( t . text is None ) :
#this function converts the given date to unix timestamp
lastmodified = time . mktime ( datetime . datetime . strptime ( t . text , " % a, %d % b % Y % H: % M: % S GMT " ) . timetuple ( ) )
#
if lastmodified > most_current_timestamp :
most_current_timestamp = lastmodified
fileid_old_version = temp . split ( ' / ' )
most_current_timestamp_fileid = fileid_old_version [ - 1 ]
else :
break
# Check if there is another version and a file with a current timestamp
if most_current_timestamp_fileid != 0 :
return most_current_timestamp_fileid
else :
return None
def main ( ) :
# Enter username and password to enter nextcloud via webdav
# Enter username and password to enter nextcloud via webdav
user = sys . argv [ 1 ]
user = sys . argv [ 1 ]
passw = sys . argv [ 2 ]
passw = sys . argv [ 2 ]
@ -61,7 +93,7 @@ prefix_path = "https://kingsx.cs.uni-saarland.de"
mainpath = " /remote.php/dav/files/ " + user + " /Testrequests/ "
mainpath = " /remote.php/dav/files/ " + user + " /Testrequests/ "
# List of all folderpaths we need to enter
# List of all folderpaths we need to enter
folders = [ mainpath ]
folders = [ mainpath ]
# List of all filepath s with wrong time
# List of all fileid s with wrong time
wrongtime = [ ]
wrongtime = [ ]
# Iterate through all folders and check for wrong timestamps
# Iterate through all folders and check for wrong timestamps
@ -73,9 +105,12 @@ while folders:
# Append all found folders and files with wrong timestamps to global list
# Append all found folders and files with wrong timestamps to global list
folders = folders + res [ 0 ]
folders = folders + res [ 0 ]
wrongtime = wrongtime + res [ 1 ]
wrongtime = wrongtime + res [ 1 ]
# Iterate through all fileids with wrong timestamps and check for versions with intact timestamp
while wrongtime :
fileid = wrongtime . pop ( 0 )
version_suffix = " /remote.php/dav/versions/ " + user + " /versions/ " + fileid
version_path = prefix_path + version_suffix
versions = propfind ( version_path , auth )
print ( version_check ( versions ) )
# Print out the list of all the filenames with the wrong time
print ( wrongtime )
# By now just storage of suffix used to enter version files via FILEID
version_suffix = " /remote.php/dav/versions/USER/versions/FILEID "
main ( )