def __init__(self, host, port, username, password, https=False, ssl_verify=True, one_time_pass=None, device_id=None): self._proto = 'https' if https else 'http' self._host = host self._port = port self._sess = 'dsm' self._https = https self._url_prefix = self._proto + '://' + host + ':' + str(port) self._url = self._url_prefix + '/webapi/auth.cgi' self._ssl_verify = ssl_verify self._sid = None self._did = device_id data = {'api': 'SYNO.API.Auth', 'method': 'login', 'version': 6} params = {'account': username, 'passwd': password, 'session': self._sess, 'format': 'sid'} if one_time_pass: if device_id: params.update(device_id=device_id) else: params.update(otp_code=one_time_pass, enable_device_token='yes') if not https: params = self._encrypt_params(params) data.update(params) resp = requests.post(self._url, data=data, verify=self._ssl_verify) result = resp.json() if result and result['success']: self._sid = result['data']['sid'] if one_time_pass and not device_id: self._did = result['data']['did'] else: raise exception.SynoAuthError(_('Login failed.'))
def request(self, api, method, version, **params): cgi_path = self._start(api, version) s = self.__session url = s.url_prefix() + '/webapi/' + cgi_path data = { 'api': api, 'version': version, 'method': method, '_sid': s.sid() } data.update(params) LOG.debug('[%s]', url) LOG.debug('%s', json.dumps(data, indent=4)) # Send HTTP Post Request resp = requests.post(url, data=self._encode_param(data), verify=self._ssl_verify) http_status = resp.status_code result = resp.json() LOG.debug('%s', json.dumps(result, indent=4)) # Check for status code if (200 != http_status): result = {'http_status': http_status} elif 'success' not in result: reason = _("'success' not found") raise exception.MalformedResponse(cmd=json.dumps(data, indent=4), reason=reason) if ('error' in result and 'code' in result["error"] and result['error']['code'] == 105): raise exception.SynoAuthError(reason=_('Session might have ' 'expired.')) return result