code: def get_attribute(self, app=None, key=None):
          
          path = 'getattribute'
          if app is not None:
              path += '/' + parse.quote(app, '')
              if key is not None:
                  path += '/' + parse.quote(self._encode_string(key), '')
          res = self._make_ocs_request(
              'GET',
              self.OCS_SERVICE_PRIVATEDATA,
              path
          )
          if res.status_code == 200:
              tree = ET.fromstring(res.content)
              self._check_ocs_status(tree)
              values = []
              for element in tree.find('data').iter('element'):
                  app_text = element.find('app').text
                  key_text = element.find('key').text
                  value_text = element.find('value').text or ''
                  if key is None:
                      if app is None:
                          values.append((app_text, key_text, value_text))
                      else:
                          values.append((key_text, value_text))
                  else:
                      return value_text
  
              if len(values) == 0 and key is not None:
                  return None
              return values
          raise HTTPResponseError(res)
docs: Returns an application attribute
  
          :param app: application id
          :param key: attribute key or None to retrieve all values for the
              given application
          :returns: attribute value if key was specified, or an array of tuples
              (key, value) for each attribute
          :raises: HTTPResponseError in case an HTTP error status was returned