Пример #1
0
  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')
Пример #2
0
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
Пример #3
0
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)
Пример #4
0
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
Пример #5
0
  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)}))
Пример #6
0
    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
Пример #7
0
    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)
                        }))
Пример #8
0
    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)
Пример #9
0
 def testNoShockwaveFlash(self):
   """Ensure that Shockwave files will NOT be served w/ that content type."""
   self.assertEqual(
       filecontent.GuessContentTypeFromFilename('bad.swf'),
       'application/octet-stream')
Пример #10
0
 def testUnknownExtension(self):
   """Ensure that an obviously unknown extension returns is binary."""
   self.assertEqual(
       filecontent.GuessContentTypeFromFilename('f.madeupextension'),
       'application/octet-stream')
Пример #11
0
 def testNoExtensionIsText(self):
   """Ensure that no extension indicates text/plain."""
   self.assertEqual(
       filecontent.GuessContentTypeFromFilename('noextension'),
       'text/plain')
Пример #12
0
 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')
Пример #13
0
 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)