def secrets(self): if self._secrets is None: data = Secrets('sync-server-ngrok').value_from_json_string() username = data.get('username') password = data.get('password') self._secrets = (username, password) return self._secrets
def setup(self): if self.secrets_id is None: raise Exception('in Web_Slack no slack team provided') self.page = Browser_Page(headless = self.headless, new_page=self.new_page).setup() self.server_details = Secrets(self.secrets_id).value_from_json_string() self.server_url = self.server_details.get('server') return self
def setup(self): self.page = Browser_Page(headless=self.headless, new_page=self.new_page).setup() self.server_details = Secrets(self.secrets_id).value_from_json_string() self.server_url = self.server_details.get('server') self.page.on_dialog__always_accept() #self.page.on_request__block_these(['glasswall.atlassian.net','jeditor','tinymce']) return self
def test_create_secret(self): import json from osbot_aws.apis.Secrets import Secrets data = { "email": "..", "password": "******", "server": "https://os-summit.slack.com" } Secrets('gs_bot_slack_web_oss').create(json.dumps(data)) self.result = Secrets('gs_bot_slack_web_oss').value_from_json_string()
async def test_open_jira_page(self): from osbot_aws.apis.Secrets import Secrets self.api = API_Browser(headless=False) login_needed = False self.secrets_id = 'GS_BOT_GS_JIRA' (server, username, password) = Secrets( self.secrets_id).value_from_json_string().values() if login_needed: Dev.pprint(server, username, password) await self.api.open(server + '/login.jsp') page = await self.api.page() await page.type('#login-form-username', username) await page.type('#login-form-password', password) await page.click('#login-form-submit') #await self.api.open(server + '/browse/GSP-95') #page = await self.api.page() #await self.api.js_execute("$('#show-more-links-link').click()") #from time import sleep #sleep(1) await self.api.page_size(2000, 3000) await self.api.screenshot( file_screenshot='/tmp/tmp-jira-screenshot.png', full_page=True)
def test_exists(self): assert Secrets('aaaaa').exists() is False self.secrets.undelete() assert self.secrets.exists() is True self.secrets.delete() assert self.secrets.exists() is False
def run(event, context): channel = event.get('channel') png_data = event.get('png_data') s3_bucket = event.get('s3_bucket') s3_key = event.get('s3_key') title = event.get('title') team_id = event.get('team_id') #aws_secrets_id = event.get('aws_secrets_id') #if team_id == 'T7F3AUXGV': aws_secrets_id = 'slack-gs-bot' # hard coded values #if team_id == 'T0SDK1RA8': aws_secrets_id = 'slack-gsbot-for-pbx' # need to move to special function aws_secrets_id = 'slack-bot-oauth' bot_token = Secrets(aws_secrets_id).value() if png_data: #(fd, tmp_file) = tempfile.mkstemp('png') tmp_file = Files.temp_file('.png') with open(tmp_file, "wb") as fh: fh.write(base64.decodebytes(png_data.encode())) else: if s3_bucket and s3_key: tmp_file = S3().file_download_and_delete(s3_bucket, s3_key) else: return None return send_file_to_slack(tmp_file, title, bot_token, channel)
def start_build_for_repo(self, repo_name, user='******', server_size='small'): aws_secret = "git__{0}".format(repo_name) data = Secrets(aws_secret).value_from_json_string() if not data: return None repo_url = data['repo_url'] kvargs = { 'projectName': self.project_name, 'timeoutInMinutesOverride': self.build_timeout, 'sourceLocationOverride': repo_url, 'computeTypeOverride': self.server_sizes[server_size], 'environmentVariablesOverride': [{ 'name': 'repo_name', 'value': repo_name, 'type': 'PLAINTEXT' }, { 'name': 'user', 'value': user, 'type': 'PLAINTEXT' }] } build_id = self.code_build.codebuild.start_build( **kvargs).get('build').get('arn') return {'status': 'ok', 'data': build_id}
def setup(self): login_details = json.loads(Secrets(self.aws_secrets_id).value()) self.username = login_details.get('username') self.password = login_details.get('password') self.server_url = login_details.get('server_url') if self._browser is None: self._browser = API_Browser(headless=self.headless).sync__setup_browser() return self._browser
def _setup_Elastic_on_cloud_via_AWS_Secret(self, index, secret_id): credentials = json.loads(Secrets(secret_id).value()) host = credentials['host'] username = credentials['username'] password = credentials['password'] port = credentials['port'] self.index = index self._setup_Elastic_on_cloud(host, port, username, password) return self
def setup(self): if self.elastic is None: credentials = json.loads(Secrets(self.secrets_id).value()) host = credentials['host'] username = credentials['username'] password = credentials['password'] port = credentials['port'] self.elastic = Elastic_Search(self.index_id)._setup_Elastic_on_cloud(host, port, username, password) return self
def upload_png_file(channel_id, file): bot_token = Secrets('slack-gs-bot').value() my_file = {'file': ('/tmp/myfile.pdf', open(file, 'rb'), 'png')} payload = { "filename": 'image.png', "token": bot_token, "channels": [channel_id], } requests.post("https://slack.com/api/files.upload", params=payload, files=my_file) return 'image sent .... '
def login(self): (account_id, username, password) = Secrets( self.secrets_id).value_from_json_string().values() login_url = f'https://{account_id}.signin.aws.amazon.com/console' self.page.open(login_url) self.page.wait_for_element__id('username') js_code = f""" $('#username').val(''); $('#password').val(''); """ self.js_invoke(js_code) # this clears the values self.page.type('#username', username) # this triggers the js events required self.page.type('#password', password) self.page.click('#signin_button') # this submits the form self.wait(2)
def test_access_to_aws_secrets(self): secret_name = f'ssh_key_{self.key_name}.pem' assert len(Secrets('').list()) > 0 assert Secrets(secret_name).exists() is True
def jira_server_details(self): data = Secrets(self.secrets_id).value_from_json_string() server = data.get('server') username = data.get('username') password = data.get('password') return server, username, password
class Web_Slack: def __init__(self, team_id, headless=True, new_page=True): self._browser = None self._browser_helper = None self.scroll_split = 1500 self.server_details = None self.server_url = None self.team_id = team_id self.secrets_id = self.resolve_secret_id() self.headless = headless self.new_page = new_page self.page : Browser_Page = None def resolve_secret_id(self): if self.team_id == 'T7F3AUXGV' : return 'gs_bot_slack_web' if self.team_id == 'TAULHPATC' : return 'gs_bot_slack_web_oss' def setup(self): if self.secrets_id is None: raise Exception('in Web_Slack no slack team provided') self.page = Browser_Page(headless = self.headless, new_page=self.new_page).setup() self.server_details = Secrets(self.secrets_id).value_from_json_string() self.server_url = self.server_details.get('server') return self def js_invoke(self,js_code): return self.page.javascript_eval(js_code) def login(self,wait_for_load=False): path = '/' self.open(path) page_text = self.page.text() if "Sign in to" in page_text: email = self.server_details.get('email') password = self.server_details.get('password') js_code = """ $('#email').val('{0}'); $('#password').val('{1}'); $('#signin_btn').click(); """.format(email,password) self.page.javascript_eval(js_code) if wait_for_load: self.page.wait_for_element__id('msg_input') self.page.wait_for_element__id('loading_welcome_msg', exists=False) # misc tests to find optimal elements to wait #for i in range(0,3): #self.page.wait_for_element__id ('msg_input' ) #self.page.wait_for_element__id ('msg_input' , max_attempts=4,exists=False ) #self.page.wait_for_element__id ('loading_welcome_msg', max_attempts=4, exists=True) #self.page.wait_for_element__id ('loading_welcome_msg', max_attempts=4, exists=False) #self.page.wait_for_element__class_name('c-message__body' , max_attempts=4, exists=True) #self.page.wait_for_element__class_name('c-message__body' , max_attempts=4, exists=False) #self.page.wait_for_element__tag_name ('button' , max_attempts=4, exists=True) #self.page.wait_for_element__tag_name ('button' , max_attempts=4, exists=False) #print('****') def logout(self): logout_link_path_1 = "$('.ts_icon_sign_out').parent().parent().find('a').attr('href')" logout_link_path_2 = "$('#team_menu_user').click(); $('#logout a').attr('href')" logout_link = self.page.javascript_eval(logout_link_path_1) if logout_link is None: logout_link = self.page.javascript_eval(logout_link_path_2) if logout_link and logout_link.startswith('https://slack.com/signout'): self.page.open(logout_link) else: print("didn't find logout link") return self def open(self, path=None): if path is None: path = '' url = "{0}{1}".format(self.server_url, path) page = self.page.open(url) self.page.wait_for_element__id('loading_welcome_msg', exists=False) return page def wait(self,seconds): self.page.wait(seconds) return self def screenshot(self,width=None): if width: self.page.width(width) return self.page.screenshot() def set_browser_size(self,width, height): self.page.width(width, height) return self def fix_set_list_view(self): self.open('/issues/?filter=-1') self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()") return self def fix_ui_for_screenshot(self): js_code = """ $('.client_channels_list_container').hide(); """ self.page.javascript_eval(js_code) return self def scroll_messages_by(self,value): value = Misc.to_int(value) if value: # split the scroll in chunks since it was not working as expected when the # scroll amount was bigger than the current browser page window height while value > 0: if value < self.scroll_split: scroll_by = value else: scroll_by = self.scroll_split value -= scroll_by js_code = """value = $('.c-scrollbar__hider').eq(1).scrollTop() - {0} ; $('.c-scrollbar__hider').eq(1).scrollTop(value);""".format(scroll_by) self.js_invoke(js_code) self.wait(0.25) # wait a little bit before sending the next scroll event (this needs a better solution) return self
def resolve_bot_token(team_id): # to refactor if team_id == '...': return Secrets('slack-gs-bot' ).value() if team_id == '...': return Secrets('slack-gsbot-for-pbx').value() return Secrets('slack-gs-bot').value()
def config(self): if self._config is None: data = Secrets(self.secrets_id).value_from_json_string() self._config = (data.get('server'), data.get('username'), data.get('password')) return self._config
def repo_url(self): data = Secrets(self.aws_secret).value_from_json_string() return 'https://{0}:{1}@github.com/{2}/{3}.git'.format( data.get('username'), data.get('password'), data.get('git_org'), self.repo_name)
def get_lambda_shell_auth(self): data = Secrets(self.secret_id).value_from_json_string() if data: return data.get('key')
def test_delete(self): self.secrets.delete() assert self.secrets.deleted() is True assert Secrets('aaaa').deleted() is False
def reset_lambda_shell_auth(self): value = {'key' : random_uuid() } return Secrets(self.secret_id).update_to_json_string(value)
def setUp(self): self.id = 'an_secret' self.value = 'goes here' self.secrets = Secrets(self.id) if self.secrets.deleted(): self.secrets.undelete()
class test_Secrets(TestCase): def setUp(self): self.id = 'an_secret' self.value = 'goes here' self.secrets = Secrets(self.id) if self.secrets.deleted(): self.secrets.undelete() def tearDown(self): if self.secrets.deleted() is False and self.secrets.exists(): assert self.secrets.delete() is True def test_create(self): #if self.secrets.exists() or self.secrets.deleted(): assert self.secrets.delete_no_recovery() is True #assert self.secrets.create(self.value) is True def test_delete(self): self.secrets.delete() assert self.secrets.deleted() is True assert Secrets('aaaa').deleted() is False def test_details(self): details = self.secrets.details() assert details.get('Name') == self.id assert self.secrets.set_id('aaaaaa').details() is None def test_exists(self): assert Secrets('aaaaa').exists() is False self.secrets.undelete() assert self.secrets.exists() is True self.secrets.delete() assert self.secrets.exists() is False def test_print(self, ): def my_print(value): # hook method assert "{'ARN': 'arn:aws:secretsmanager:" in value # confirm data sent to print assert "'Name': 'an_secret'" in value assert "'ResponseMetadata': {'HTTPHeader" in value import builtins # get print module original_print = builtins.print # save original print method builtins.print = my_print # apply hook self.secrets.print() # call function that will call print builtins.print = original_print # restore original print def test_update_to_json_string(self): data = { 'the answer is': 42, 'random_string': Misc.random_string_and_numbers() } self.secrets.update_to_json_string(data) assert self.secrets.value_from_json_string() == data def test_value(self): temp_value = Misc.random_string_and_numbers() self.secrets.update(temp_value) assert self.secrets.value() == temp_value assert self.secrets.set_id('abcd').value() is None # bugs def test_bug__delete_no_recovery__is_not_deleting_it_strait_away(self): assert self.secrets.exists() is True # confirm secret exists assert self.secrets.delete_no_recovery( ) is True # this should delete immediately assert self.secrets.exists() is False # confirm secret doesn't exist assert self.secrets.deleted( ) is True # (bug) confirm is marked for deletion (vs already deleted) assert self.secrets.create( 'abc' ) is False # (bug) confirm we can't create a new one with same name
class Web_Slack: def __init__(self, team_id, headless=True, new_page=True): self._browser = None self._browser_helper = None self.server_details = None self.server_url = None self.team_id = team_id self.secrets_id = self.resolve_secret_id() self.headless = headless self.new_page = new_page self.page: Browser_Page = None def resolve_secret_id(self): if self.team_id == 'T7F3AUXGV': return 'gs_bot_slack_web' if self.team_id == 'TAULHPATC': return 'gs_bot_slack_web_oss' def setup(self): if self.secrets_id is None: raise Exception('in Web_Slack no slack team provided') self.page = Browser_Page(headless=self.headless, new_page=self.new_page).setup() self.server_details = Secrets(self.secrets_id).value_from_json_string() self.server_url = self.server_details.get('server') return self def channel(self, issue_id): raise Exception('to do') #return self def login(self, wait_for_load=False): path = '/' self.open(path) page_text = self.page.text() if "Sign in to" in page_text: email = self.server_details.get('email') password = self.server_details.get('password') js_code = """ $('#email').val('{0}'); $('#password').val('{1}'); $('#signin_btn').click(); """.format(email, password) self.page.javascript_eval(js_code) if wait_for_load: self.page.wait_for_element__id('msg_input') self.page.wait_for_element__id('loading_welcome_msg', exists=False) # misc tests to find optimal elements to wait #for i in range(0,3): #self.page.wait_for_element__id ('msg_input' ) #self.page.wait_for_element__id ('msg_input' , max_attempts=4,exists=False ) #self.page.wait_for_element__id ('loading_welcome_msg', max_attempts=4, exists=True) #self.page.wait_for_element__id ('loading_welcome_msg', max_attempts=4, exists=False) #self.page.wait_for_element__class_name('c-message__body' , max_attempts=4, exists=True) #self.page.wait_for_element__class_name('c-message__body' , max_attempts=4, exists=False) #self.page.wait_for_element__tag_name ('button' , max_attempts=4, exists=True) #self.page.wait_for_element__tag_name ('button' , max_attempts=4, exists=False) #print('****') def logout(self): logout_link_path_1 = "$('.ts_icon_sign_out').parent().parent().find('a').attr('href')" logout_link_path_2 = "$('#team_menu_user').click(); $('#logout a').attr('href')" logout_link = self.page.javascript_eval(logout_link_path_1) if logout_link is None: logout_link = self.page.javascript_eval(logout_link_path_2) if logout_link and logout_link.startswith('https://slack.com/signout'): self.page.open(logout_link) else: print("didn't find logout link") return self def open(self, path=None): if path is None: path = '' url = "{0}{1}".format(self.server_url, path) page = self.page.open(url) self.page.wait_for_element__id('loading_welcome_msg', exists=False) return page def wait(self, seconds): self.page.wait(seconds) return self def screenshot(self, width=None): if width: self.page.width(width) return self.page.screenshot() def fix_set_list_view(self): self.open('/issues/?filter=-1') self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()") return self def fix_ui_for_screenshot(self): js_code = """ $('.client_channels_list_container').hide(); """ self.page.javascript_eval(js_code) return self
class Web_Jira: def __init__(self, headless=True, new_page=True): self._browser = None self._browser_helper = None self.server_details = None self.server_url = None self.secrets_id = 'GS_BOT_GS_JIRA' self.headless = headless self.new_page = new_page self.page: Browser_Page = None def setup(self): self.page = Browser_Page(headless=self.headless, new_page=self.new_page).setup() self.server_details = Secrets(self.secrets_id).value_from_json_string() self.server_url = self.server_details.get('server') self.page.on_dialog__always_accept() self.page.on_request__block_these( ['jira.photobox.com', 'jeditor', 'tinymce']) return self # def browser(self): # if self._browser is None: # self._browser_helper = Browser_Lamdba_Helper(headless=self.headless).setup() # self._browser = self._browser_helper.api_browser # return self._browser # async def login_async(self): # (server, username, password) = self.server_details().values() # await self.open(server + '/login.jsp') # page = await self.browser().page() # #await page.type('#login-form-username', username) # #await page.type('#login-form-password', password) # #await page.click('#login-form-submit') def issue(self, issue_id): #(server, username, password) = self.server_details().values() path = '/browse/{0}?filter=-1'.format(issue_id) self.open(path) #self.browser().sync__await_for_element('.jira-help-tip') #self.browser().sync__js_execute("$('.jira-help-tip').hide()") #self.page.click('#show-more-links-link') self.page.javascript_eval("$('#show-more-links-link').click()") return self def login(self): path = '/login.jsp?os_destination=/rest/helptips/1.0/tips' self.open(path) page_text = self.page.text() if "Username" in page_text: self.page.type('#login-form-username', self.server_details.get('username')) self.page.type('#login-form-password', self.server_details.get('password')) self.page.javascript_eval('document.forms[1].submit()') self.page.wait_for_navigation() def logout(self): self.open('/logout') if self.page.exists('#confirm-logout-submit'): self.page.click('#confirm-logout-submit') return self def open(self, path): url = "{0}{1}".format(self.server_url, path) return self.page.open(url) def screenshot(self, width=None, height=None): if width: self.page.width(width, height) return self.page.screenshot() def fix_set_list_view(self): self.open('/issues/?filter=-1') self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()") return self def fix_issue_remove_ui_elements(self): js_code = """ $('.command-bar' ).hide(); $('#header' ).hide(); $('.aui-sidebar' ).hide() $('#viewissuesidebar' ).hide(); $('#attachmentmodule' ).hide(); $('#addcomment' ).hide(); $('#footer' ).hide(); $('.aui-page-header-actions').hide(); $('#resolution-val' ) .parent().hide(); $('#priority-val' ) .parent().hide(); $('.remote-link' ).eq(0).parent().hide(); """ self.page.javascript_eval(js_code) return self
def resolve_bot_token(self, team_id): if team_id == 'T7F3AUXGV': return Secrets('slack-gs-bot').value() if team_id == 'T0SDK1RA8': return Secrets('slack-gsbot-for-pbx').value()
class Web_Jira: def __init__(self, headless=True, new_page=False): self._browser = None self._browser_helper = None self.server_details = None self.server_url = None self.secrets_id = 'gw-bot-jira-web' self.headless = headless self.new_page = new_page self.page: Browser_Page = None def setup(self): self.page = Browser_Page(headless=self.headless, new_page=self.new_page).setup() self.server_details = Secrets(self.secrets_id).value_from_json_string() self.server_url = self.server_details.get('server') self.page.on_dialog__always_accept() #self.page.on_request__block_these(['glasswall.atlassian.net','jeditor','tinymce']) return self # def browser(self): # if self._browser is None: # self._browser_helper = Browser_Lamdba_Helper(headless=self.headless).setup() # self._browser = self._browser_helper.api_browser # return self._browser # async def login_async(self): # (server, username, password) = self.server_details().values() # await self.open(server + '/login.jsp') # page = await self.browser().page() # #await page.type('#login-form-username', username) # #await page.type('#login-form-password', password) # #await page.click('#login-form-submit') def issue(self, issue_id): #(server, username, password) = self.server_details().values() path = '/browse/{0}'.format(issue_id) self.open(path) #self.browser().sync__await_for_element('.jira-help-tip') #self.browser().sync__js_execute("$('.jira-help-tip').hide()") #self.page.click('#show-more-links-link') #self.page.javascript_eval("$('#show-more-links-link').click()") return self def login(self): path = '/login.jsp?os_destination=/rest/helptips/1.0/tips' self.open(path) page_text = self.page.text() if "Log in to your account" in page_text: username = self.server_details.get('username') password = self.server_details.get('password') self.page.javascript_eval( f"document.forms[0].username.value='{username}'") self.page.click('#login-submit') self.page.wait_for_element__id__is_equal_to( 'login-submit', "Log in") self.page.javascript_eval( f"document.forms[0].password.value='{password}'") self.page.click('#login-submit') self.page.wait_for_navigation( ) # first redirection to page that says 'Please wait...' self.page.wait_for_navigation( ) # final redirection to page that shows [] #return self.page.wait_for_element__id() #from time import sleep #sleep(2) #self.page.click('#login-submit') #self.page.wait_for_navigation() #sleep(4) #self.page.wait_for_element__id('password') #self.page.type('#password', self.server_details.get('password')) #self.page.javascript_eval('document.forms[0].submit()') def logout(self): #self.page.browser.sync__open('https://www.google.com') self.open('/logout') if self.page.exists('#logout-submit'): self.page.click('#logout-submit') self.page.wait_for_navigation() return self def open(self, path): url = "{0}{1}".format(self.server_url, path) return self.page.open(url) def screenshot(self, width=None, height=None): if width: self.page.width(width, height) return self.page.screenshot() def fix_set_list_view(self): self.open('/issues/?filter=-1') self.page.javascript_eval("$('.aui-list-item-link').eq(1).click()") return self def fix_issue_remove_ui_elements(self): # js_code = """ # $('.command-bar' ).hide(); # $('#header' ).hide(); # $('.aui-sidebar' ).hide() # $('#viewissuesidebar' ).hide(); # $('#attachmentmodule' ).hide(); # $('#addcomment' ).hide(); # $('#footer' ).hide(); # $('.aui-page-header-actions').hide(); # # $('#resolution-val' ) .parent().hide(); # $('#priority-val' ) .parent().hide(); # $('.remote-link' ).eq(0).parent().hide(); # """ js_code = """ contains = function (selector, text) { var elements = document.querySelectorAll(selector); return [].filter.call(elements, function(element){ return RegExp(text).test(element.textContent); });} remove = function(selector,text,index) { target = contains(selector,text)[index] if (target) {target.remove()} } remove('div' , 'updating the issue view', 11) remove('span','Activity' ,0) document.querySelector('[data-testid="Navigation"]').remove() document.querySelector('#jira-issue-header').children[0].children[0].children[0].children[0].children[0].children[1].remove() //external share contains('div', 'External Share').pop().parentElement.parentElement.parentElement.remove() """ self.page.javascript_eval(js_code) return self
def resolve_bot_token(self): return Secrets(self.secret_name).value()