class CheckSvg: def __init__(self, svg_file, user_agent, is_file=False): self.RNG_SCHEMA_FILE = Config.RNG_SCHEMA_FILE self.STORAGE_SVG_DIR = Config.STORAGE_SVG_DIR self.svg_file = svg_file self.Utils = Utils() self.svg_image_path = None self.svg_response = { "status": False, "errors": [], "svg_link": svg_file } self.is_file = is_file self.user_agent = user_agent # Donwnload SVG def download_svg_path(self, url): print('Beginning SVG file download with requests') try: self.Utils.check_dir_folder(self.STORAGE_SVG_DIR) file_name_hash = str(uuid.uuid4()) session = requests.Session() session.max_redirects = 3 response = session.get(url, headers={'User-Agent': self.user_agent}) if response: self.svg_image_path = self.STORAGE_SVG_DIR + file_name_hash + ".svg" with open(self.STORAGE_SVG_DIR + file_name_hash + ".svg", 'wb+') as out_file: out_file.write(response.content) print("Generated file: " + self.STORAGE_SVG_DIR + file_name_hash + ".svg") return self.STORAGE_SVG_DIR + file_name_hash + ".svg" else: response.raise_for_status() return False except HTTPError as http_err: self.svg_response['errors'].append({ "short_error": "Http Error", "error_details": "An error occurred while fetching the BIMI SVG Image. " + str(http_err) + "." }) print(f'HTTP error : {http_err}, occurred while fetching image') return False except requests.exceptions.TooManyRedirects as red_err: self.svg_response['errors'].append({ "short_error": "Too many redirects", "error_details": "The svg URL redirected too many times, please remove the redirections, or atleast reduce them to 3 or less." }) print( f'HTTP error : More than 3 redirects while fetching the svg image' ) return False except Exception as e: print(e) self.svg_response["errors"].append({ "short_error": "Something went wrong while downloading the SVG Image", "error_details": "The SVG file referenced by the URL in the BIMI record is unreachable by this validator." }) return False # CHECK SVG Extension def is_svg_extension(self): print('Checking Svg extension') if self.is_file: if self.svg_file != None: return True else: print(self.svg_file, "Upload SVG Image has an Invalid Extension") return False else: if self.svg_file.endswith('.svg') or self.svg_file.endswith( '.SVG'): return True else: return False # Check if xml file has an SVG tag def is_svg_xml(self): print('Checking If this is an XML file') tag = None with open(self.svg_file, "r") as f: try: for event, el in et.iterparse(f, ('start', )): tag = el.tag break except et.ParseError: pass return tag == '{http://www.w3.org/2000/svg}svg' # SVG check function def check_svg(self): if self.svg_file != "": if self.is_svg_extension(): if not self.is_file: self.svg_file = self.download_svg_path(self.svg_file) if not self.svg_file: self.svg_response['status'] = False return self.svg_response if self.svg_file: if self.is_svg_xml(): self.check_svg_schema() self.svg_image_path = self.svg_file if len(self.svg_response['errors']) > 0: self.svg_response['status'] = False else: self.svg_response['status'] = True else: self.svg_response['errors'].append({ "short_error": "Invalid SVG", "error_details": "The SVG image in your BIMI record has no SVG tag" }) else: self.svg_response['errors'].append({ "short_error": "File extraction error", "error_details": "There was an issue with downloading the SVG. Either the SVG image file doesn't exist or the link is unreachable / blocked." }) else: self.svg_response['errors'].append({ "short_error": "Extension Error", "error_details": "Invalid File extension" }) else: self.svg_response['errors'].append({ "short_error": "No SVG Image Found", "error_details": "We have found a blank/empty SVG file Or no SVG link in you BIMI record. Please check your BIMI record for this." }) return self.svg_response # SVG check according to Relax Ng, rng file schema def check_svg_schema(self): try: result = subprocess.run( ['pyjing', "-c", self.RNG_SCHEMA_FILE, self.svg_file], stdout=subprocess.PIPE) # print(result.stdout) error_string = result.stdout.decode() if error_string: if error_string.find("error:") != -1: err = error_string.split("\n") for i in range(len(err)): # print(err[i]) if err[i]: clear_error_string = self.Utils.clear_response_single_string( err[i].split('.svg:')[1]) error_str = self.Utils.strip_svg_plugin_errors( self.STORAGE_SVG_DIR, clear_error_string, ", Check Line ") self.svg_response['errors'].append({ "short_error": error_str, "error_details": clear_error_string }) self.svg_response['status'] = False else: self.svg_response['status'] = True except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] print(exc_type, fname, exc_tb.tb_lineno) print(str(e))
class CheckSvg: def __init__(self, svg_file, user_agent, is_file=False): self.RNG_SCHEMA_FILE = Config.RNG_SCHEMA_FILE self.STORAGE_SVG_DIR = Config.STORAGE_SVG_DIR self.svg_file = svg_file self.Utils = Utils() self.svg_response = { "status": False, "errors": [], "svg_link": svg_file } self.is_file = is_file self.user_agent = user_agent # Donwnload SVG def download_svg_path(self, url): print('Beginning file download with urllib2') try: self.Utils.check_dir_folder(self.STORAGE_SVG_DIR) file_name_hash = str(uuid.uuid4()) req = Request(url, headers={'User-Agent': self.user_agent}) with urlopen(req) as response, open( self.STORAGE_SVG_DIR + file_name_hash + ".svg", 'wb') as out_file: data = response.read() out_file.write(data) return self.STORAGE_SVG_DIR + file_name_hash + ".svg" except Exception as e: print(e) self.svg_response['errors'].append({ "short_error": str(e), "error_details": clear_error_string }) return # CHECK SVG Extension def is_svg_extension(self): if self.is_file: if self.svg_file != None: return True else: print(self.svg_file, "Upload SVG Image has an Invalid Extension") return False else: if self.svg_file.endswith('.svg') or self.svg_file.endswith( '.SVG'): return True else: return False # Check if xml file has an SVG tag def is_svg_xml(self): tag = None with open(self.svg_file, "r") as f: try: for event, el in et.iterparse(f, ('start', )): tag = el.tag break except et.ParseError: pass return tag == '{http://www.w3.org/2000/svg}svg' # SVG check function def check_svg(self): if self.svg_file != "": if self.is_svg_extension(): if not self.is_file: self.svg_file = self.download_svg_path(self.svg_file) if self.is_svg_xml(): self.check_svg_schema() if len(self.svg_response['errors']) > 0: self.svg_response['status'] = False else: self.svg_response['status'] = True else: self.svg_response['errors'].append({ "short_error": "Invalid SVG", "error_details": "The SVG image in your BIMI record has no SVG tag" }) else: self.svg_response['errors'].append({ "short_error": "Extension Error", "error_details": "Invalid File extension" }) else: self.svg_response['errors'].append({ "short_error": "No SVG Image Found", "error_details": "We have found a blank/empty SVG file Or no SVG link in you BIMI record. Please check your BIMI record for this." }) return self.svg_response # SVG check according to Relax Ng, rng file schema def check_svg_schema(self): try: result = subprocess.run( ['pyjing', "-c", self.RNG_SCHEMA_FILE, self.svg_file], stdout=subprocess.PIPE) # print(result.stdout) error_string = result.stdout.decode() if error_string: if error_string.find("error:") != -1: err = error_string.split("error:") for i in range(1, len(err) - 1): clear_error_string = self.Utils.clear_response_single_string( err[i]) error_str = self.Utils.strip_svg_plugin_errors( self.STORAGE_SVG_DIR, clear_error_string, ", Check Line ") self.svg_response['errors'].append({ "short_error": error_str, "error_details": clear_error_string }) self.svg_response['status'] = False else: self.svg_response['status'] = True except Exception as e: exc_type, exc_obj, exc_tb = sys.exc_info() fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] print(exc_type, fname, exc_tb.tb_lineno) print(str(e))