def testCaseDoesNotMatter(self): """Ensure that case (upper/lower) of extension does not matter.""" for ext, ctype in self._TEST_EXTENSIONS_TO_CTYPES.items(): ext = ext.upper() self.assertEqual( filecontent.GuessContentTypeFromFilename('file.%s' % ext), ctype) for ext in self._CODE_EXTENSIONS: ext = ext.upper() self.assertEqual( filecontent.GuessContentTypeFromFilename('code.%s' % ext), 'text/plain')
def _ParseIssueRequestAttachments(post_data): """Extract and clean-up any attached files from the post data. Args: post_data: dict w/ values from the user's HTTP POST form data. Returns: [(filename, filecontents, mimetype), ...] with items for each attachment. """ # TODO(jrobbins): change from numbered fields to a multi-valued field. attachments = [] for i in range(1, 16): if 'file%s' % i in post_data: item = post_data['file%s' % i] if isinstance(item, string_types): continue if '\\' in item.filename: # IE insists on giving us the whole path. item.filename = item.filename[item.filename.rindex('\\') + 1:] if not item.filename: continue # Skip any FILE fields that were not filled in. attachments.append( (item.filename, item.value, filecontent.GuessContentTypeFromFilename(item.filename))) return attachments
def StoreLogoInGCS(file_name, content, project_id): mime_type = filecontent.GuessContentTypeFromFilename(file_name) CheckMimeTypeResizable(mime_type) if '\\' in file_name: # IE insists on giving us the whole path. file_name = file_name[file_name.rindex('\\') + 1:] return StoreObjectInGCS( content, mime_type, project_id, thumb_width=LOGO_THUMB_WIDTH, thumb_height=LOGO_THUMB_HEIGHT)
def IngestAttachmentUploads(attachment_uploads): """Ingest protoc AttachmentUpload objects as tuples.""" result = [] for up in attachment_uploads: if not up.filename: raise exceptions.InputException('Missing attachment name') if not up.content: raise exceptions.InputException('Missing attachment content') mimetype = filecontent.GuessContentTypeFromFilename(up.filename) attachment_tuple = (up.filename, up.content, mimetype) result.append(attachment_tuple) return result
def __init__(self, project_pb): if (not project_pb or not project_pb.logo_gcs_id or not project_pb.logo_file_name): self.thumbnail_url = '' self.viewurl = '' return object_path = ('/' + app_identity.get_default_gcs_bucket_name() + project_pb.logo_gcs_id) self.filename = project_pb.logo_file_name self.mimetype = filecontent.GuessContentTypeFromFilename(self.filename) self.thumbnail_url = gcs_helpers.SignUrl(object_path + '-thumbnail') self.viewurl = ( gcs_helpers.SignUrl(object_path) + '&' + urllib.urlencode( {'response-content-displacement': ('attachment; filename=%s' % self.filename)}))
def ProcessFormData(self, mr, post_data): """Process the posted form.""" # 1. Parse and validate user input. # Project name is taken from post_data because we are creating it. project_name = post_data.get('projectname') if not project_name: mr.errors.projectname = _MSG_MISSING_PROJECT_NAME elif not framework_bizobj.IsValidProjectName(project_name): mr.errors.projectname = _MSG_INVALID_PROJECT_NAME summary = post_data.get('summary') if not summary: mr.errors.summary = _MSG_MISSING_PROJECT_SUMMARY description = post_data.get('description', '') access = project_helpers.ParseProjectAccess(None, post_data.get('access')) home_page = post_data.get('project_home') if home_page and not (home_page.startswith('http://') or home_page.startswith('https://')): mr.errors.project_home = 'Home page link must start with http(s)://' docs_url = post_data.get('docs_url') if docs_url and not (docs_url.startswith('http:') or docs_url.startswith('https:')): mr.errors.docs_url = 'Documentation link must start with http: or https:' self.CheckCaptcha(mr, post_data) # These are not specified on via the ProjectCreate form, # the user must edit the project after creation to set them. committer_ids = [] contributor_ids = [] # Validate that provided logo is supported. logo_provided = 'logo' in post_data and not isinstance( post_data['logo'], basestring) if logo_provided: item = post_data['logo'] try: gcs_helpers.CheckMimeTypeResizable( filecontent.GuessContentTypeFromFilename(item.filename)) except gcs_helpers.UnsupportedMimeType, e: mr.errors.logo = e.message
def __init__(self, project_pb): super(LogoView, self).__init__(None) if (not project_pb or not project_pb.logo_gcs_id or not project_pb.logo_file_name): self.thumbnail_url = '' self.viewurl = '' return bucket_name = app_identity.get_default_gcs_bucket_name() gcs_object = project_pb.logo_gcs_id self.filename = project_pb.logo_file_name self.mimetype = filecontent.GuessContentTypeFromFilename(self.filename) self.thumbnail_url = gcs_helpers.SignUrl(bucket_name, gcs_object + '-thumbnail') self.viewurl = (gcs_helpers.SignUrl(bucket_name, gcs_object) + '&' + urllib.urlencode({ 'response-content-displacement': ('attachment; filename=%s' % self.filename) }))
def testStoreLogoInGCS(self): file_name = 'test_file.png' mime_type = 'image/png' content = 'test content' project_id = 100 object_id = 123 self.mox.StubOutWithMock(filecontent, 'GuessContentTypeFromFilename') filecontent.GuessContentTypeFromFilename(file_name).AndReturn( mime_type) self.mox.StubOutWithMock(gcs_helpers, 'StoreObjectInGCS') gcs_helpers.StoreObjectInGCS( content, mime_type, project_id, thumb_width=gcs_helpers.LOGO_THUMB_WIDTH, thumb_height=gcs_helpers.LOGO_THUMB_HEIGHT).AndReturn(object_id) self.mox.ReplayAll() ret_id = gcs_helpers.StoreLogoInGCS(file_name, content, project_id) self.mox.VerifyAll() self.assertEquals(object_id, ret_id)
def testNoShockwaveFlash(self): """Ensure that Shockwave files will NOT be served w/ that content type.""" self.assertEqual( filecontent.GuessContentTypeFromFilename('bad.swf'), 'application/octet-stream')
def testUnknownExtension(self): """Ensure that an obviously unknown extension returns is binary.""" self.assertEqual( filecontent.GuessContentTypeFromFilename('f.madeupextension'), 'application/octet-stream')
def testNoExtensionIsText(self): """Ensure that no extension indicates text/plain.""" self.assertEqual( filecontent.GuessContentTypeFromFilename('noextension'), 'text/plain')
def testCodeIsText(self): """Ensure that code extensions are text/plain.""" for ext in self._CODE_EXTENSIONS: self.assertEqual( filecontent.GuessContentTypeFromFilename('code.%s' % ext), 'text/plain')
def testCommonExtensions(self): """Tests some common extensions for their expected content types.""" for ext, ctype in self._TEST_EXTENSIONS_TO_CTYPES.items(): self.assertEqual( filecontent.GuessContentTypeFromFilename('file.%s' % ext), ctype)