Commit aee7be31 authored by tuxuser's avatar tuxuser
Browse files

* Use CSRF token for non-GET requests (enables reboot and shutdown)

* Implement authentication
parent 573f7999
Loading
Loading
Loading
Loading
+63 −25
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import requests
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)


class XboxOneDevmodeApi(object):
    PORT = 11443

@@ -16,56 +17,81 @@ class XboxOneDevmodeApi(object):
        # SSL verification is disabled here
        self.session.verify = False

    @property
    def _csrf_header(self):
        return {'X-CSRF-Token': self.session.cookies.get('CSRF-Token')}

    def _get(self, endpoint, *args, **kwargs):
        return self.session.get(self.base_url + endpoint, *args, **kwargs)

    def _post(self, endpoint, *args, **kwargs):
        return self.session.post(self.base_url + endpoint, *args, **kwargs)
        return self.session.post(self.base_url + endpoint, headers=self._csrf_header, *args, **kwargs)

    def _put(self, endpoint, *args, **kwargs):
        return self.session.put(self.base_url + endpoint, headers=self._csrf_header, *args, **kwargs)

    def set_credentials(self, user, pwd):
        self.session.auth = (user, pwd)

    def get_root(self):
        return self._get('/')

    def devicefamily(self):
    def reboot(self):
        return self._post('/api/control/restart')

    def shutdown(self):
        return self._post('/api/control/shutdown')

    def get_devicefamily(self):
        family = self._get('/api/os/devicefamily').json()
        return family.get('DeviceType')

    def machinename(self):
    def get_machinename(self):
        machine = self._get('/api/os/machinename').json()
        return machine.get('ComputerName')

    def sandbox(self):
    def get_settings(self):
        return self._get('/ext/settings').json()

    def get_setting(self, name):
        return self._get('/ext/settings/{0}'.format(name)).json()

    def get_sandbox(self):
        sandbox = self._get('/ext/xboxlive/sandbox').json()
        return sandbox.get('Sandbox')

    def _get_info(self):
        return self._get('/ext/xbox/info').json()

    def osversion(self):
    def get_osversion(self):
        info = self._get_info()
        return info.get('OsVersion')

    def devmode(self):
    def get_devmode(self):
        info = self._get_info()
        return info.get('DevMode')

    def osedition(self):
    def get_osedition(self):
        info = self._get_info()
        return info.get('OsEdition')

    def consoletype(self):
    def get_consoletype(self):
        info = self._get_info()
        return info.get('ConsoleType')

    def consoleid(self):
    def get_consoleid(self):
        info = self._get_info()
        return info.get('ConsoleId')

    def deviceid(self):
    def get_deviceid(self):
        info = self._get_info()
        return info.get('DeviceId')

    def serialnumber(self):
    def get_serialnumber(self):
        info = self._get_info()
        return info.get('SerialNumber')

    def devkitcertificationexpirationtime(self):
    def get_devkitcertificationexpirationtime(self):
        info = self._get_info()
        timestamp = info.get('DevkitCertificateExpirationTime')
        return datetime.datetime.fromtimestamp(timestamp)
@@ -73,21 +99,33 @@ class XboxOneDevmodeApi(object):

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('Please provide IP address')
        print('Usage: {0} <ip>'.format(sys.argv[0]))
        print('ERROR: Please provide IP address')
        print('Usage: {0} <ip> <username> <password>'.format(sys.argv[0]))
        sys.exit(1)
    
    ip_address = sys.argv[1]
    api = XboxOneDevmodeApi(ip_address)

    print('ConsoleId: {0}'.format(api.consoleid()))
    print('ConsoleType: {0}'.format(api.consoletype()))
    print('DeviceFamily: {0}'.format(api.devicefamily()))
    print('DeviceId: {0}'.format(api.deviceid()))
    print('Serial: {0}'.format(api.serialnumber()))
    print('DevkitExpiration: {0}'.format(api.devkitcertificationexpirationtime()))
    print('DevMode: {0}'.format(api.devmode()))
    print('MachineName: {0}'.format(api.machinename()))
    print('OsEdition: {0}'.format(api.osedition()))
    print('OsVersion: {0}'.format(api.osversion()))
    print('Sandbox: {0}'.format(api.sandbox()))
 No newline at end of file
    if len(sys.argv) == 4:
        username = sys.argv[2]
        password = sys.argv[3]
        api.set_credentials(username, password)

    r = api.get_root()
    if r.status_code != 200:
        print('ERROR: Authentication failed, HTTP Status: {0}'.format(r.status_code))
        sys.exit(2)

    print('ConsoleId: {0}'.format(api.get_consoleid()))
    print('ConsoleType: {0}'.format(api.get_consoletype()))
    print('DeviceFamily: {0}'.format(api.get_devicefamily()))
    print('DeviceId: {0}'.format(api.get_deviceid()))
    print('Serial: {0}'.format(api.get_serialnumber()))
    print('DevkitExpiration: {0}'.format(api.get_devkitcertificationexpirationtime()))
    print('DevMode: {0}'.format(api.get_devmode()))
    print('MachineName: {0}'.format(api.get_machinename()))
    print('OsEdition: {0}'.format(api.get_osedition()))
    print('OsVersion: {0}'.format(api.get_osversion()))

    # print('Setting: {0}'.format(api.get_setting('DefaultUWPContentTypeToGame')))
    # api.reboot()