def test_viewstate_cannot_be_set(self): """ViewState is read only and can not be set once the NC is instantiated.""" v = ViewState(MagicMock()) n = NotificationCentre(v) new_v = ViewState(MagicMock()) with self.assertRaises(AttributeError): n.view_state = new_v
def test_missing_component_no_exception(self): """If a component no longer exists at the path to receive the notification, no error should occur.""" v = ViewState(MagicMock()) n = NotificationCentre(v) v.component_from_path = MagicMock(return_value=None) n.subscribe_to_notification('test_notification', 'page.test_component') n.post_notification('test_notification')
def setUp(self): self.root_controller = BaseViewController() self.child_one = BaseViewController() self.child_two = BaseViewController() self.child_three = BaseViewController() self.vs = ViewState(self.root_controller) self.root_controller.set_named_child('one', self.child_one) self.child_one.set_named_child('two', self.child_two) self.child_two.set_named_child('three', self.child_three)
def test_force_same_notification_multiple_queue(self): """The same notification will be queued twice if the force arg is True.""" v = ViewState(MagicMock()) n = NotificationCentre(v) n.queue_client_notification('test_name', 'page.test_component') n.queue_client_notification('test_name', 'page.test_component', force=True) queued_notifications = [notification for notification in n] self.assertEqual(len(queued_notifications), 2) self.assertEqual(queued_notifications[0], queued_notifications[1])
def test_notification_unsubscribe_all(self): """nc.unsubscribe_from_all_notifications should prevent any more calls going to the component.""" v = ViewState(MagicMock()) n = NotificationCentre(v) component = MagicMock() v.component_from_path = MagicMock(return_value=component) n.subscribe_to_notification('test_notification', 'page.test_component') n.subscribe_to_notification('test_notification2', 'page.test_component') n.unsubscribe_from_all_notifications('page.test_component') n.post_notification('test_notification') n.post_notification('test_notification2') self.assertEqual(component.process_notification.call_count, 0)
def test_notification_unsubscribe(self): """After a component unsubscribes, it should not receive that notification any more (but should still receive others that it is subscribed to).""" v = ViewState(MagicMock()) n = NotificationCentre(v) component = MagicMock() v.component_from_path = MagicMock(return_value=component) n.subscribe_to_notification('test_notification', 'page.test_component') n.subscribe_to_notification('test_notification2', 'page.test_component') n.unsubscribe_from_notification('test_notification', 'page.test_component') n.post_notification('test_notification') self.assertEqual(component.process_notification.call_count, 0) n.post_notification('test_notification2') component.process_notification.assert_called_with('test_notification2', None)
def test_specific_notification_subscription_and_receive(self): """A component can listen to events from only single sources, so shouldn't receive that notification if posted from elsewhere.""" v = ViewState(MagicMock()) n = NotificationCentre(v) component = MagicMock() v.component_from_path = MagicMock(return_value=component) n.subscribe_to_notification('test_notification', 'page.test_component', 'page.source_component') n.post_notification('test_notification') n.post_notification('test_notification', 'page.another_source') self.assertEqual(component.process_notification.call_count, 0) n.post_notification('test_notification', 'page.source_component') component.process_notification.assert_called_with('test_notification', None)
def test_global_notification_subscription_and_receive(self): """A component that subscribes to a notification with a blank source, should receive that notification no matter what source posts it.""" v = ViewState(MagicMock()) n = NotificationCentre(v) component = MagicMock() v.component_from_path = MagicMock(return_value=component) n.subscribe_to_notification('test_notification', 'page.test_component') n.post_notification('test_notification') component.process_notification.assert_called_with('test_notification', None) n.subscribe_to_notification('test_notification2', 'page.test_component') n.post_notification('test_notification2', 'page.another_component') component.process_notification.assert_called_with('test_notification2', None)
def test_client_notification_queue_and_retrieve(self): """Client notifications are queued and retrieved in FIFO order.""" v = ViewState(MagicMock()) n = NotificationCentre(v) n.queue_client_notification('test_name', 'page.test_component') n.queue_client_notification('test_name2', 'page.test_component2', 'somedata') # notifications are retrieved FIFO queued_notifications = [notification for notification in n] self.assertEqual(len(queued_notifications), 2) self.assertEqual({'name': 'test_name', 'path': 'page.test_component'}, queued_notifications[0]) self.assertEqual({'name': 'test_name2', 'path': 'page.test_component2', 'data': 'somedata'}, queued_notifications[1]) # queue should now be empty self.assertEqual(len([notification for notification in n]), 0)
def test_same_notification_multiple_queue(self): """The same notification will not be queued twice, however if any of name, path or data differs, it will.""" v = ViewState(MagicMock()) n = NotificationCentre(v) n.queue_client_notification('test_name', 'page.test_component') n.queue_client_notification('test_name', 'page.test_component') self.assertEqual(len([notification for notification in n]), 1) n.queue_client_notification('test_name', 'page.test_component') n.queue_client_notification('test_name', 'page.test_component', 'somedata') self.assertEqual(len([notification for notification in n]), 2) n.queue_client_notification('test_name', 'page.test_component2') n.queue_client_notification('test_name', 'page.test_component') self.assertEqual(len([notification for notification in n]), 2) n.queue_client_notification('test_name', 'page.test_component') n.queue_client_notification('test_name2', 'page.test_component') self.assertEqual(len([notification for notification in n]), 2)
'ERROR: Input needed - Usage: viewstate-decoder.py [-h] [-vs ENCODED_VS] [-f VS_FILENAME] [-o OUTPUT_FILENAME]' ) else: # Check if the input is given in the command line if (args.encoded_vs): encoded_vs = args.encoded_vs else: # If not, we have the input inside a file with name: args.vs_filename input_file = open(args.vs_filename, 'r') encoded_vs = input_file.read() input_file.close() # Convert the URL encoded input into Base64 only (URL decode) encoded_vs = urllib.parse.unquote(encoded_vs) #Create ViewState object vs = ViewState(encoded_vs) decoded_vs = vs.decode() hmac = vs.mac sign = vs.signature #Write to output file output_file = open(args.output_filename, 'w') output_file.write( 'Decoded Viewstate: ' + str(decoded_vs) ) # We must set it as 'string' to write it because it's a tuple, not a string output_file.write('\n ViewState HMAC Signature Type: ' + hmac) output_file.write('\n ViewState HMAC Signature: ' + str(sign)) output_file.close() print('Output file saved to: ' + args.output_filename)
def test_no_listeners_no_exception(self): """If there is no listener for a notification, no error should occur.""" v = ViewState(MagicMock()) n = NotificationCentre(v) n.post_notification('test_notification')
def test_view_state_init(self): """A ViewState can only be inited with a root controller arg.""" with self.assertRaises(TypeError): ViewState()
def test_symbiotic_relationship(self): """v.notification_centre -> nc, and nc.view_state -> vs.""" v = ViewState(MagicMock()) n = NotificationCentre(v) self.assertEqual(n.view_state, v) self.assertEqual(v.notification_centre, n)
def test_viewstate_read(self): """ViewState can be read from the NC.""" v = ViewState(MagicMock()) n = NotificationCentre(v) self.assertEqual(v, n.view_state)
def test_root_view_set(self): """Initing the ViewState sets the root controller to the root_controller attribute.""" root_controller = MagicMock() vs = ViewState(root_controller) self.assertEqual(vs.root_controller, root_controller)
from viewstate import ViewState import urllib.request vs1 = "/wEPDwUKLTY4MjI1MDA4NA9kFgICAw9kFgICAQ9kFgJmDxYCHgtfIUl0ZW1Db3VudAICFgRmD2QWAgIBDw8WBB4ISW1hZ2VVcmwFIH4vaW1hZ2VzL0xhbmd1YWdlSWNvbnMvc3Ytc2UuZ2lmHg9Db21tYW5kQXJndW1lbnQFBXN2LVNFZGQCAQ9kFgICAQ8PFgQfAQUgfi9pbWFnZXMvTGFuZ3VhZ2VJY29ucy9lbi1nYi5naWYfAgUFZW4tR0JkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAwUwY3RsMDIkbGFuZ3VhZ2VSZXBlYXRlciRjdGwwMCRpbWFnZUJ1dHRvbkxhbmd1YWdlBTBjdGwwMiRsYW5ndWFnZVJlcGVhdGVyJGN0bDAxJGltYWdlQnV0dG9uTGFuZ3VhZ2UFHExvZ2luUG9ydGFsJExvZ2luSW1hZ2VCdXR0b27mxoduUjO73E1fxorgw8lFyTq/QQ==" vs2 = "/wEPDwUKLTY4MjI1MDA4NA9kFgICAw9kFgICAQ9kFgJmDxYCHgtfIUl0ZW1Db3VudAICFgRmD2QWAgIBDw8WBB4ISW1hZ2VVcmwFIH4vaW1hZ2VzL0xhbmd1YWdlSWNvbnMvc3Ytc2UuZ2lmHg9Db21tYW5kQXJndW1lbnQFBXN2LVNFZGQCAQ9kFgICAQ8PFgQfAQUgfi9pbWFnZXMvTGFuZ3VhZ2VJY29ucy9lbi1nYi5naWYfAgUFZW4tR0JkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAwUwY3RsMDIkbGFuZ3VhZ2VSZXBlYXRlciRjdGwwMCRpbWFnZUJ1dHRvbkxhbmd1YWdlBTBjdGwwMiRsYW5ndWFnZVJlcGVhdGVyJGN0bDAxJGltYWdlQnV0dG9uTGFuZ3VhZ2UFHExvZ2luUG9ydGFsJExvZ2luSW1hZ2VCdXR0b27mxoduUjO73E1fxorgw8lFyTq/QQ==" vs3 = "/wEPDwUKLTY4MjI1MDA4NA9kFgICAw9kFgICAQ9kFgJmDxYCHgtfIUl0ZW1Db3VudAICFgRmD2QWAgIBDw8WBB4ISW1hZ2VVcmwFIH4vaW1hZ2VzL0xhbmd1YWdlSWNvbnMvc3Ytc2UuZ2lmHg9Db21tYW5kQXJndW1lbnQFBXN2LVNFZGQCAQ9kFgICAQ8PFgQfAQUgfi9pbWFnZXMvTGFuZ3VhZ2VJY29ucy9lbi1nYi5naWYfAgUFZW4tR0JkZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAwUwY3RsMDIkbGFuZ3VhZ2VSZXBlYXRlciRjdGwwMCRpbWFnZUJ1dHRvbkxhbmd1YWdlBTBjdGwwMiRsYW5ndWFnZVJlcGVhdGVyJGN0bDAxJGltYWdlQnV0dG9uTGFuZ3VhZ2UFHExvZ2luUG9ydGFsJExvZ2luSW1hZ2VCdXR0b27mxoduUjO73E1fxorgw8lFyTq/QQ==" ev3 = "/wEWBgLUkfX7CgKBx8WVDwKk3rbwDAKm6uySCAKlnPOvBAKmw8iKAse1npqQxeNtE0tIgHnnO30AYpUx" ev4 = "/wEWBgLUkfX7CgKBx8WVDwKk3rbwDAKm6uySCAKlnPOvBAKmw8iKAse1npqQxeNtE0tIgHnnO30AYpUx" print(ViewState(vs1).decode()) print(ViewState(vs2).decode()) print(vs1 == vs3) cookieProcessor = urllib.request.HTTPCookieProcessor() opener = urllib.request.build_opener(cookieProcessor) request = urllib.request.Request('http://aptusportal.sssb.se/') response = opener.open(request,timeout=100) data = { "__LASTFOCUS": "", "__EVENTTARGET": "", "__EVENTARGUMENT": "", "__VIEWSTATE": vs3, "__EVENTVALIDATION": ev3, "LoginPortal$UserName": "******", "LoginPortal$Password": "******", "LoginPortal$LoginButton": "Logga in" } request = urllib.request.Request(r'http://aptusportal.sssb.se/login.aspx?ReturnUrl=%2findex.aspx', headers = data)