Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
I am still learning, and mistakes may happen. However, based on the download history, I am now more sensible and accurate than ever. Please feel free to contact me at the email address provided in my profile, and I will quickly reach out to you. Additionally, I am planning to make the GitHub repository public for all of us to improve this module and avoid the chaos that occurred on November 11, 2024. Thank you for understanding.
The best way to interact with Atlassian Jira/Confluence API.
Note: This module is useful for the Atlassian Cloud
Your URL should look like this https://domain.atlassian.net
from atlassian_modules import JiraHelper # for Jira
from atlassian_modules import WikiHelper # for Wiki
To initialize a connection to Jira, instantiate the JiraHelper
class with your Jira URL, email, and API token:
jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
create_ticket
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_url = jira_helper.create_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug")
if ticket_url:
print(f"Ticket created: {ticket_url}")
else:
print("Failed to create ticket.")
Parameters:
project_key
(str): Key of the project where the new ticket will be created. This is usually a short, capitalized identifier for a project in JIRA.summary
(str): Summary of the new ticket. This is a concise overview of the issue or task.description
(str): Detailed description of the new ticket. This field is used to provide all necessary details about the issue or task.issue_type
(str): Type of the issue (e.g., Bug
, Task
, Story
). This specifies what kind of ticket is being created.Output:
Return:
URL of the created ticket (str)
: If the ticket creation is successful, the function returns the URL to access the newly created ticket directly.False
: If the ticket creation fails (for example, due to incorrect input parameters or server errors), the function returns False
.create_custom_ticket
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
# Define additional fields if necessary
additional_fields = {
"customfield_12345": "Custom value",
"labels": ["label1", "label2"]
}
ticket_url = jira_helper.create_custom_ticket("PRJ", "Issue Summary", "Detailed issue description.", "Bug", additional_fields)
if ticket_url:
print(f"Ticket created: {ticket_url}")
else:
print("Failed to create ticket.")
Parameters:
project_key
(str): The key of the project where the new ticket will be created. This is typically a short, capitalized identifier specific to a project in Jira.summary
(str): A concise overview of the issue or task that the new ticket will represent.description
(str): A detailed description of the issue or task, providing all necessary details for understanding and addressing it.issue_type
(str): Specifies the type of issue being created (e.g., Bug
, Task
, Story
), determining how the issue is categorized within Jira.additional_fields
(dict, optional): A dictionary of additional fields that are required for ticket creation. This parameter allows for the inclusion of project-specific or issue-specific information that is not covered by the standard fields.Output:
URL of the created ticket
(str): If the ticket creation is successful, the function returns the URL to access the newly created ticket directly. This allows for immediate navigation to the ticket for review or further action.False
: If the ticket creation process fails, whether due to incorrect input parameters, server errors, or issues with the additional fields, the function returns False
. This indicates that the ticket was not created and provides an opportunity to address any issues before retrying.update_ticket_with_fields
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
# Define the additional fields you want to update
additional_fields = {
"customfield_12345": "New custom value",
"labels": ["newlabel1", "newlabel2"]
}
ticket_id = "PRJ-123" # Example ticket ID to be updated
update_success = jira_helper.update_ticket_with_fields(ticket_id, additional_fields)
if update_success:
print(f"Ticket {ticket_id} updated successfully.")
else:
print(f"Failed to update ticket {ticket_id}.")
Parameters:
ticket_id
(str): ID (also known as the key) of the ticket to be updated. This identifier is typically a combination of the project key and a sequence number, like PRJ-123
.additional_fields
(dict): A dictionary of fields to update the ticket with. This parameter allows specifying values for any standard or custom field in the ticket that supports updates.
Output:True
if the update was successful. This indicates that the server accepted the update request and applied the changes to the ticket.False
otherwise. If the ticket update fails (for example, due to incorrect ticket ID, fields that cannot be updated, or server errors), the function returns False
, and additional error information is printed to help diagnose the issue.delete_ticket
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_key = "PRJ-123" # Example ticket key
if jira_helper.delete_ticket(ticket_key):
print("Ticket deleted successfully.")
else:
print("Failed to delete ticket or ticket does not exist.")
Parameters:
ticket_key
(str): The unique identifier for the ticket you wish to delete. This key is usually a combination of the project key and a number (e.g., "PRJ-123
").Output:
DELETE
request to the JIRA REST API to delete the specified ticket.Return:
True
: If the ticket is successfully deleted. This is indicated by a 204
HTTP status code from the JIRA API, meaning "No Content
" but signifying successful deletion.False
: If the deletion fails, which can occur if the ticket does not exist or if there's an issue with the API request (e.g., permissions, invalid ticket key). This is communicated by returning False
.jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_key = "PRJ-123" # Example ticket key
transition_name = "Close"
transition_id = jira_helper.get_transitions(ticket_key, transition_name)
if transition_id:
print(f"Transition ID for '{transition_name}' is {transition_id}.")
else:
print(f"Transition '{transition_name}' not found for ticket {ticket_key} or failed to fetch transitions.")
Parameters:
ticket_key
(str): The key of the ticket for which transitions are being fetched. This is typically a unique identifier like "PRJ-123
".transition_to
(str): The name of the desired transition to look for. This is the human-readable name of the transition (e.g., "Close
", "Resolve
").Output:
Return:
Transition ID
(str): If the specified transition is found for the given ticket, the function returns the transition's ID, which can be used for further actions like transitioning the ticket to another status.False
: If the specified transition is not found for the ticket, or if there is any failure in fetching transitions (e.g., due to an invalid ticket key, network issues, or server errors), the function returns False
.transition_ticket
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_key = "PRJ-123" # Example ticket key
transition_input = "Done" # Can be a transition name like 'Done' or an ID like '31'
if jira_helper.transition_ticket(ticket_key, transition_input):
print("Ticket transitioned successfully.")
else:
print("Failed to transition ticket.")
Parameters:
ticket_key
(str): The key of the ticket you want to transition. This is a unique identifier for the ticket within JIRA.transition_input
(str or int): The desired transition for the ticket. This can be specified as either the name of the transition (e.g., "Done
") or the transition ID (e.g., 31
).Output:
Return:
True
: If the ticket transition is successful. This is indicated by a 204
HTTP status code, which means "No Content
" but signifies that the operation completed successfully.False
: If the ticket transition fails. This could be due to various reasons, such as an invalid ticket key, an unrecognized transition name or ID, or a failure in the HTTP request itself.if_ticket_exist
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_key = "PRJ-123" # Example ticket key
if jira_helper.if_ticket_exist(ticket_key):
print("The ticket exists.")
else:
print("The ticket does not exist.")
Parameters:
ticket_key
(str): The key of the ticket you want to check. This is a unique identifier for the ticket within JIRA.Output:
Return:
True
: If the ticket exists. This is confirmed by a 200
HTTP status code, indicating that the ticket was found.False
: If the ticket does not exist or if there was an error in checking. A 404
HTTP status code indicates the ticket does not exist. Other status codes indicate a failure in the request to check the ticket.comment_ticket
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_key = "PRJ-123" # Example ticket key
comment_text = "This is an example comment."
comment_url = jira_helper.comment_ticket(ticket_key, comment_text)
if comment_url:
print(f"Comment added successfully: {comment_url}")
else:
print("Failed to add comment to the ticket.")
Parameters:
ticket_key
(str): The key of the ticket to which you want to add a comment. This is a unique identifier for the ticket within JIRA.comment_text
(str): The text of the comment you wish to add to the ticket.Output:
Return:
URL of the created comment
(str): If adding the comment is successful, the function returns the URL to access the newly created comment directly. This is indicated by a 201
HTTP status code, meaning "Created
".False
: If adding the comment fails. This could be because the ticket does not exist, the comment text is invalid, or there was an error in the request itself. In such cases, the function returns False
.jql_ticket
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
jql_query = "project = PRJ AND status = 'Open'"
max_results = 100 # Optional
ticket_keys = jira_helper.jql_ticket(jql_query, max_results)
if ticket_keys:
print(f"Found tickets: {', '.join(ticket_keys)}")
else:
print("Failed to retrieve tickets based on the JQL query.")
Parameters:
jql_query
(str): The Jira Query Language query string used to retrieve tickets. This string specifies the criteria that the returned tickets must meet.max_results
(int, optional): The maximum number of tickets to retrieve. If not specified, the method attempts to fetch all tickets that match the query.Output:
Return:
List of ticket keys
(list): If successful, the function returns a list containing the keys of the tickets that match the JQL query criteria. Each key is a unique identifier for a ticket within JIRA.False
: If the retrieval fails. This could be due to an issue with the JQL query, a problem with the request to JIRA, or if the JIRA server returns an unexpected status code. In such cases, the function returns False
.get_ticket_subject
method:jira_helper = JiraHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
ticket_key = "PRJ-123" # Example ticket key
subject = jira_helper.get_ticket_subject(ticket_key)
if subject:
print(f"Subject of the ticket: {subject}")
else:
print("Failed to retrieve the subject of the ticket.")
Parameters:
ticket_key
(str): The key of the ticket for which you want to retrieve the subject. This is a unique identifier for the ticket within JIRA.Output:
Return:
False
: If the retrieval fails, the function returns False.This function allows you to attach a file to a JIRA ticket.
ticket_id
(str): The ID of the ticket to which the file will be attached.file_path
(str): The path to the file that will be attached.file_name
(str): The name of the file to be attached.bool
: Returns True
if the file was successfully attached, False
otherwise.jira_helper = JiraHelper(server_url, email, api_token)
ticket_id = "PROJECT-123"
file_path = "/path/to/your/file.txt"
success = jira_helper.attach_file_to_ticket(ticket_id, file_path)
if success:
print("File attached successfully!")
else:
print("Failed to attach file.")
create_wiki_page
method:wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
space_key = "DEV"
title = "API Documentation"
content = "<p>This is the API documentation for our project.</p>"
parent_page_id = 123456 # Optional
page_url = wiki_helper.create_wiki_page(space_key, title, content, parent_page_id)
if page_url:
print(f"Wiki page created successfully: {page_url}")
else:
print("Failed to create wiki page.")
Parameters:
space_key
(str): The key of the Confluence space where the new page will be created. Confluence spaces are containers for related content.title
(str): The title of the new page. Titles are used to identify pages within Confluence.content
(str): The content of the new page. This is usually HTML or Confluence storage format markup that defines the page's body.parent_page_id
(int, optional): The ID of a parent page if the new page is to be a child page. This parameter is optional; if not provided, the page will be created at the root of the specified space.Output:
Return:
URL of the created Confluence page
(str): If the page creation is successful, the function returns the URL to access the newly created page. This is indicated by a 200
HTTP status code.False
: If the page creation fails. This could be due to various issues, such as invalid input parameters, permissions problems, or server errors. In such cases, the function returns False
.duplicate_wiki_page
method:wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
source_page_id = "12345" # Example source page ID
target_space_key = "TGT" # Example target space key
target_title = "Duplicated Page Title" # New title for the duplicated page
target_parent_page_id = "67890" # Optional parent page ID for the new page
duplicated_page_url = wiki_helper.duplicate_wiki_page(source_page_id, target_space_key, target_title, target_parent_page_id)
if duplicated_page_url:
print(f"Duplicated page successfully. View at: {duplicated_page_url}")
else:
print("Failed to duplicate the page.")
Parameters:
source_page_id
(str): ID of the Confluence page you wish to duplicate.target_space_key
(str): Key of the Confluence space where the duplicated page will reside.target_title
(str): Title of the duplicated page.target_parent_page_id
(str, optional): ID of the parent page if the duplicated page is to be a child within the hierarchy. If not specified, the page will be created at the top level of the specified space.
Output:Return:
URL of the duplicated Confluence page
(str): If the duplication is successful, the method returns the URL to access the newly created duplicated page. This URL is constructed from the response of the page creation process.None
: If the duplication fails at any point (e.g., retrieving content from the source page, creating the new page), the method returns None
. This indicates that the operation was not successful, and no new page was created.create_page_from_template
method:wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
template_id = "12345" # Example template ID
space_key = "TGT" # Example space key
title = "New Page from Template" # Title for the new page
parent_page_id = "67890" # Optional parent page ID
created_page_url = wiki_helper.create_page_from_template(template_id, space_key, title, parent_page_id)
if created_page_url:
print(f"New page created successfully. View at: {created_page_url}")
else:
print("Failed to create the new page from template.")
Parameters:
template_id
(str): ID of the Confluence template you wish to use for creating the new page.space_key
(str): Key of the Confluence space where the new page will be created.title
(str): Title of the new page.parent_page_id
(str, optional): ID of the parent page if the new page is to be a child within the space hierarchy. If not specified, the page will be created at the top level of the specified space.
Output:URL of the created Confluence page
(str): If the page creation is successful, the function returns the URL to access the newly created page. This indicates that the page was created successfully and is accessible at the returned URL.None
or False
: If the page creation fails, due to reasons such as template retrieval failure, duplicate title, or any error in the creation process, the function returns None
or False
. This indicates that no new page was created.move_wiki_page
method:wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "12345" # Example page ID to be moved
target_space_key = "NEWSPACE" # Target space key
target_position = "append" # Position of the page relative to the parent page ('append', 'above', 'below')
target_parent_page_id = "67890" # Optional new parent page ID
moved_page_url = wiki_helper.move_wiki_page(page_id, target_space_key, target_position, target_parent_page_id)
if moved_page_url:
print(f"Page moved successfully. View at: {moved_page_url}")
else:
print("Failed to move the page.")
Parameters:
page_id
(str): ID of the Confluence page you wish to move.target_space_key
(str): Key of the Confluence space where the page will be moved to.target_position
(str): Position to place the moved page relative to the parent page. Default is 'append
', but 'above
' and 'below
' are also valid options.target_parent_page_id
(str, optional): ID of the parent page if the moved page is to be nested under another page. If not specified, the page will be moved to the top level of the target space or as specified by target_position
.
Output:URL of the moved Confluence page
(str): If the move operation is successful, the function returns the URL to access the moved page. This indicates that the page was successfully moved to the new space and position.None
or False
: If the move operation fails, due to reasons such as an error retrieving the current page details, an error in the move operation, or inability to retrieve the moved page URL, the function returns None
or False
. This indicates that the page was not successfully moved.move_wiki_page
method:wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
title = "Example Page Title" # Title of the Confluence wiki page to check
space_key = "EX" # Key of the Confluence space
if wiki_helper.wiki_page_exists(title, space_key):
print(f"The page '{title}' exists in space '{space_key}'.")
else:
print(f"The page '{title}' does not exist in space '{space_key}'.")
Parameters:
title
(str): Title of the Confluence wiki page to check for existence.space_key
(str): Key of the Confluence space where the page might reside.
Output:True
: If the page exists. This is determined by the presence of results matching the specified title in the specified space.False
: If the page does not exist or if there was an error during the request. This could be due to the specified page not being found in the given space or an issue with the Confluence API response.wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
parent_id = "12345" # Example parent page ID
child_pages = wiki_helper.get_child_pages_recursive(parent_id)
if child_pages:
print("Child pages found:")
for page in child_pages:
print(f"Title: {page['title']}, ID: {page['id']}, Parent ID: {page['parentid']}")
else:
print("No child pages found or failed to fetch.")
Parameters:
parent_id
(str): ID of the parent Confluence wiki page from which to start retrieving descendant pages.
Output:Return:
List of child pages
: Returns a list of dictionaries, each containing the title, ID, and parent ID of each descendant page found. This allows for a comprehensive view of the hierarchy and content under the specified parent page.wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
title = "Example Page" # Title of the Confluence wiki page to search for
space_key = "EX" # Key of the Confluence space
page_id = wiki_helper.get_page_id(title, space_key)
if page_id:
print(f"Found page '{title}' with ID: {page_id} in space '{space_key}'.")
else:
print(f"No page found with the title '{title}' in space '{space_key}'.")
Parameters:
title
(str): Title of the Confluence wiki page you're looking for.space_key
(str): Key of the Confluence space where you're searching for the page.
Output:Return:
ID of the page
(str): If a page with the specified title is found in the given space, the function returns the ID of the page.False
: If no page is found with the given title in the specified space, or if there was an error during the request, the function returns False
.wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "123456" # Example page ID
from_string = "old text" # Text to be replaced
to_string = "new text" # Replacement text
if wiki_helper.replace_in_page(page_id, from_string, to_string):
print(f"Replaced all occurrences of '{from_string}' with '{to_string}' in page ID: {page_id}.")
else:
print("Failed to replace text in the page.")
Parameters:
page_id
(str): ID of the Confluence wiki page where the replacement will be made.from_string
(str): The string to be replaced in the page's content.to_string
(str): The string to use as a replacement.
Output:from_string
with the to_string
within the page's content.Return:
True
: If the replacement operation was successful, whether replacements were made or not (including the case where the from_string
was not found).False
: If there was a failure at any point during the process, such as an error fetching the page content, or updating the page with the new content.wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "123456" # Example page ID
tables_json = wiki_helper.get_tables_from_page(page_id)
if tables_json:
print("Found tables on the page:")
print(tables_json)
else:
print("Failed to fetch tables or no tables found on the page.")
Parameter
page_id
(str): ID of the Confluence wiki page from which to fetch tables.Output:
table1
, table2
, etc., in the JSON structure.{}
).wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "12345" # Example page ID
new_content = "<p>This is the new content for the page.</p>" # HTML content
if wiki_helper.update_wiki_page(page_id, new_content):
print(f"Page ID: {page_id} was updated successfully.")
else:
print(f"Failed to update the page ID: {page_id}.")
Parameter
page_id
(str): The ID of the Confluence wiki page that you want to update.new_content
(str): The new content to replace the existing content of the page. This content is typically in HTML
format.Output:
True
: If the page content update is successful. This is indicated by a status code of 200
from the Confluence REST API, showing that the update request was processed correctly.False
: If the update fails. This could be due to various reasons such as an invalid page ID, issues with the Confluence server, or improper formatting of the new content. Failure is indicated by any status code other than 200
, and the method prints the error details received from the server.wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "123456" # Example page ID
parent_id = wiki_helper.get_parent_page_id(page_id)
if parent_id:
print(f"Parent page ID for page ID {page_id}: {parent_id}")
else:
print(f"No parent page found for page ID {page_id}, or failed to fetch.")
Parameter
page_id
(str): The ID of the Confluence wiki page for which you want to find the parent page.Output:
Return:
ID of the parent page
(str): If the specified page has a parent page, the method returns the ID of the parent page. This is useful for understanding the hierarchy of pages within Confluence spaces.False
: If no parent page exists for the specified page or if there was an error in the fetch operation (such as an invalid page ID or a problem with the Confluence server), the method returns False. This helps to identify pages that are at the top level of their space or when an issue occurs with the retrieval process.wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "123456" # Example page ID
result_message = wiki_helper.add_toc_to_page(page_id)
print(result_message)
Parameter
page_id
(str): The ID of the Confluence wiki page where you want to add a Table of Contents.Output and Return
wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "123456" # Example page ID
headers = ["Header1", "Header2", "Header3"] # The headers of the table you're targeting
row_data = ["Data1", "Data2", "Data3"] # The data for the new row
result_message = wiki_helper.add_row_to_table(page_id, headers, row_data)
print(result_message)
Parameters
page_id
(str): The ID of the Confluence page you're modifying.headers
(list of str): A list of headers representing the columns of the table. This ensures that the data is added to the correct column.row_data
(list of str): A list of values corresponding to each header, forming the new row.Output and Return
wiki_helper = WikiHelper(ATLASSIAN_URL, EMAIL, API_TOKEN)
page_id = "123456" # Example page ID
headers = ["Cluster Name", "Component Name", "Next Version"] # The headers of your table
new_row_data = ["Cluster1", "ComponentA", "v2.0"] # Data for the new or updated row
result_message = wiki_helper.update_or_add_table_row(page_id, headers, new_row_data)
print(result_message)
Parameter
page_id
(str): The ID of the Confluence page containing the table.headers
(list of str): A list of headers representing the columns of the table. It's crucial for identifying the correct columns when updating or adding rows.new_row_data
(list of str): The values for the new or updated row, aligned with the headers order.
Output and Returnš We respect your privacy: This module does not store any of your data anywhere. It simply interacts with the Atlassian Jira API to perform the requested operations. Ensure you manage your connection details securely.
attach_file_to_ticket
function to JiraHelper
class to attach files to Jira tickets.wiki_helper.add_row_to_table
& wiki_helper.update_or_add_table_row
for improved table management.get_ticket_subject
function to JiraHelper
class for retrieving the subject of a Jira ticket by its ID.wiki_helper.add_row_to_table
& wiki_helper.update_or_add_table_row
for improved table management.JIRA_URL
, CONFLUENCE_URL
is replaced with ATLASSIAN_URL
https://domain.atlassian.net
only to address Jira and Wiki bothwiki_helper.add_row_to_table
& wiki_helper.update_or_add_table_row
for improved table management.create_custom_ticket
function has been introduced, allowing for more flexible ticket creation in JIRA projects. This function supports additional fields, enabling users to specify custom data during ticket creation.update_ticket_with_fields
method has been added, offering the ability to update existing tickets with new or modified fields. This feature is crucial for maintaining accurate and up-to-date ticket information.wiki_helper.add_row_to_table
& wiki_helper.update_or_add_table_row
for improved table management.readme.md
documentation.wiki_helper.add_row_to_table
& wiki_helper.update_or_add_table_row
for improved table management.add_toc_to_page
: Automatically adds a table of contents to wiki pages lacking one.README.md
with guidance on using add_toc_to_page
.get_parent_page_id
: Retrieves the parent ID for a given wiki page ID.README.md
with instructions for get_parent_page_id
.update_wiki_page
: Replaces entire wiki page content with new content.README.md
with usage information for update_wiki_page
.get_tables_from_page
: Fetches all tables from a wiki page in JSON format, simplifying table extraction.README.md
with get_tables_from_page
usage details.README.md
with usage information for get_page_id
and replace_in_page
.get_page_id
to retrieve wiki page IDs.replace_in_page
for in-page text replacement.README.md
for better clarity.get_child_pages_recursive
to fetch child pages recursively.README.md
update for improved understanding.README.md
for enhanced understanding.README.md
.README.md
.if_exist_ticket
for Jira ticket existence checks.README.md
format.transition_ticket
for Jira ticket transitions, with ID flexibility.README.md
.create
, delete
, and transition tickets
.FAQs
Modules for interacting with Atlassian cloud products.
We found that atlassian-modules demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago.Ā It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.