From 7739693d63d3446dfc3be9b23eddaaabe489e5d6 Mon Sep 17 00:00:00 2001 From: wea_ondara Date: Fri, 1 Sep 2023 20:04:03 +0200 Subject: [PATCH] added Spar PoC, added objection and frida guide --- .editorconfig | 1221 +++++++++++++++++ .gitignore | 1 + Spar/frida/README.md | 54 + Spar/frida/hook_apicalls.js | 18 + Spar/frida/hook_login.js | 52 + Spar/pocJava/.gitattributes | 9 + Spar/pocJava/.gitignore | 7 + Spar/pocJava/app/build.gradle.kts | 46 + Spar/pocJava/app/src/main/java/poc/App.java | 173 +++ .../app/src/test/java/poc/AppTest.java | 14 + Spar/pocJava/gradle.properties | 6 + .../pocJava/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + Spar/pocJava/gradlew | 249 ++++ Spar/pocJava/gradlew.bat | 92 ++ Spar/pocJava/settings.gradle.kts | 15 + Spar/pocTs/.gitignore | 2 + 17 files changed, 1966 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 Spar/frida/README.md create mode 100644 Spar/frida/hook_apicalls.js create mode 100644 Spar/frida/hook_login.js create mode 100644 Spar/pocJava/.gitattributes create mode 100644 Spar/pocJava/.gitignore create mode 100644 Spar/pocJava/app/build.gradle.kts create mode 100644 Spar/pocJava/app/src/main/java/poc/App.java create mode 100644 Spar/pocJava/app/src/test/java/poc/AppTest.java create mode 100644 Spar/pocJava/gradle.properties create mode 100644 Spar/pocJava/gradle/wrapper/gradle-wrapper.jar create mode 100644 Spar/pocJava/gradle/wrapper/gradle-wrapper.properties create mode 100755 Spar/pocJava/gradlew create mode 100644 Spar/pocJava/gradlew.bat create mode 100644 Spar/pocJava/settings.gradle.kts create mode 100644 Spar/pocTs/.gitignore diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..80ad21f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,1221 @@ +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = false +max_line_length = 120 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = true +ij_smart_tabs = false +ij_visual_guides = none +ij_wrap_on_typing = false + +[*.css] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_css_align_closing_brace_with_properties = false +ij_css_blank_lines_around_nested_selector = 1 +ij_css_blank_lines_between_blocks = 1 +ij_css_block_comment_add_space = false +ij_css_brace_placement = end_of_line +ij_css_enforce_quotes_on_format = false +ij_css_hex_color_long_format = false +ij_css_hex_color_lower_case = false +ij_css_hex_color_short_format = false +ij_css_hex_color_upper_case = false +ij_css_keep_blank_lines_in_code = 2 +ij_css_keep_indents_on_empty_lines = false +ij_css_keep_single_line_blocks = false +ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_css_space_after_colon = true +ij_css_space_before_opening_brace = true +ij_css_use_double_quotes = true +ij_css_value_alignment = do_not_align + +[*.feature] +indent_size = 2 +ij_gherkin_keep_indents_on_empty_lines = false + +[*.java] +indent_size = 4 +tab_width = 4 +ij_continuation_indent_size = 8 +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_deconstruction_list_components = true +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_align_types_in_multi_catch = true +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = off +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = off +ij_java_assignment_wrap = off +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = off +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_add_space = false +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = off +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 5 +ij_java_class_names_in_javadoc = 1 +ij_java_deconstruction_list_wrap = normal +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_not_wrap_after_single_annotation_in_parameter = false +ij_java_do_while_brace_force = never +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_entity_dd_prefix = +ij_java_entity_dd_suffix = EJB +ij_java_entity_eb_prefix = +ij_java_entity_eb_suffix = Bean +ij_java_entity_hi_prefix = +ij_java_entity_hi_suffix = Home +ij_java_entity_lhi_prefix = Local +ij_java_entity_lhi_suffix = Home +ij_java_entity_li_prefix = Local +ij_java_entity_li_suffix = +ij_java_entity_pk_class = java.lang.String +ij_java_entity_ri_prefix = +ij_java_entity_ri_suffix = +ij_java_entity_vo_prefix = +ij_java_entity_vo_suffix = VO +ij_java_enum_constants_wrap = off +ij_java_extends_keyword_wrap = off +ij_java_extends_list_wrap = off +ij_java_field_annotation_wrap = split_into_lines +ij_java_field_name_prefix = +ij_java_field_name_suffix = +ij_java_filter_class_prefix = +ij_java_filter_class_suffix = +ij_java_filter_dd_prefix = +ij_java_filter_dd_suffix = +ij_java_finally_on_new_line = false +ij_java_for_brace_force = never +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = off +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = never +ij_java_imports_layout = *,|,javax.**,java.**,|,$* +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = true +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_add_space_on_reformat = false +ij_java_line_comment_at_first_column = true +ij_java_listener_class_prefix = +ij_java_listener_class_suffix = +ij_java_local_variable_name_prefix = +ij_java_local_variable_name_suffix = +ij_java_message_dd_prefix = +ij_java_message_dd_suffix = EJB +ij_java_message_eb_prefix = +ij_java_message_eb_suffix = Bean +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = off +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = off +ij_java_modifier_list_wrap = false +ij_java_multi_catch_types_wrap = normal +ij_java_names_count_to_use_import_on_demand = 3 +ij_java_new_line_after_lparen_in_annotation = false +ij_java_new_line_after_lparen_in_deconstruction_pattern = true +ij_java_new_line_after_lparen_in_record_header = false +ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.* +ij_java_parameter_annotation_wrap = off +ij_java_parameter_name_prefix = +ij_java_parameter_name_suffix = +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_annotations = +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = off +ij_java_rparen_on_new_line_in_annotation = false +ij_java_rparen_on_new_line_in_deconstruction_pattern = true +ij_java_rparen_on_new_line_in_record_header = false +ij_java_servlet_class_prefix = +ij_java_servlet_class_suffix = +ij_java_servlet_dd_prefix = +ij_java_servlet_dd_suffix = +ij_java_session_dd_prefix = +ij_java_session_dd_suffix = EJB +ij_java_session_eb_prefix = +ij_java_session_eb_suffix = Bean +ij_java_session_hi_prefix = +ij_java_session_hi_suffix = Home +ij_java_session_lhi_prefix = Local +ij_java_session_lhi_suffix = Home +ij_java_session_li_prefix = Local +ij_java_session_li_suffix = +ij_java_session_ri_prefix = +ij_java_session_ri_suffix = +ij_java_session_si_prefix = +ij_java_session_si_suffix = Service +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = false +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_deconstruction_list = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_annotation_eq = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_deconstruction_list = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_static_field_name_prefix = +ij_java_static_field_name_suffix = +ij_java_subclass_name_prefix = +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = off +ij_java_test_name_prefix = +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = off +ij_java_throws_list_wrap = off +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = off +ij_java_visibility = public +ij_java_while_brace_force = never +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = false + +[*.less] +indent_size = 2 +ij_less_align_closing_brace_with_properties = false +ij_less_blank_lines_around_nested_selector = 1 +ij_less_blank_lines_between_blocks = 1 +ij_less_block_comment_add_space = false +ij_less_brace_placement = 0 +ij_less_enforce_quotes_on_format = false +ij_less_hex_color_long_format = false +ij_less_hex_color_lower_case = false +ij_less_hex_color_short_format = false +ij_less_hex_color_upper_case = false +ij_less_keep_blank_lines_in_code = 2 +ij_less_keep_indents_on_empty_lines = false +ij_less_keep_single_line_blocks = false +ij_less_line_comment_add_space = false +ij_less_line_comment_at_first_column = false +ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_less_space_after_colon = true +ij_less_space_before_opening_brace = true +ij_less_use_double_quotes = true +ij_less_value_alignment = 0 + +[*.proto] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_protobuf_keep_blank_lines_in_code = 2 +ij_protobuf_keep_indents_on_empty_lines = false +ij_protobuf_keep_line_breaks = true +ij_protobuf_space_after_comma = true +ij_protobuf_space_before_comma = false +ij_protobuf_spaces_around_assignment_operators = true +ij_protobuf_spaces_within_braces = false +ij_protobuf_spaces_within_brackets = false + +[*.sass] +indent_size = 2 +ij_sass_align_closing_brace_with_properties = false +ij_sass_blank_lines_around_nested_selector = 1 +ij_sass_blank_lines_between_blocks = 1 +ij_sass_brace_placement = 0 +ij_sass_enforce_quotes_on_format = false +ij_sass_hex_color_long_format = false +ij_sass_hex_color_lower_case = false +ij_sass_hex_color_short_format = false +ij_sass_hex_color_upper_case = false +ij_sass_keep_blank_lines_in_code = 2 +ij_sass_keep_indents_on_empty_lines = false +ij_sass_keep_single_line_blocks = false +ij_sass_line_comment_add_space = false +ij_sass_line_comment_at_first_column = false +ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_sass_space_after_colon = true +ij_sass_space_before_opening_brace = true +ij_sass_use_double_quotes = true +ij_sass_value_alignment = 0 + +[*.scss] +indent_size = 2 +ij_scss_align_closing_brace_with_properties = false +ij_scss_blank_lines_around_nested_selector = 1 +ij_scss_blank_lines_between_blocks = 1 +ij_scss_block_comment_add_space = false +ij_scss_brace_placement = 0 +ij_scss_enforce_quotes_on_format = false +ij_scss_hex_color_long_format = false +ij_scss_hex_color_lower_case = false +ij_scss_hex_color_short_format = false +ij_scss_hex_color_upper_case = false +ij_scss_keep_blank_lines_in_code = 2 +ij_scss_keep_indents_on_empty_lines = false +ij_scss_keep_single_line_blocks = false +ij_scss_line_comment_add_space = false +ij_scss_line_comment_at_first_column = false +ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_scss_space_after_colon = true +ij_scss_space_before_opening_brace = true +ij_scss_use_double_quotes = true +ij_scss_value_alignment = 0 + +[*.vue] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_vue_indent_children_of_top_level = template +ij_vue_interpolation_new_line_after_start_delimiter = true +ij_vue_interpolation_new_line_before_end_delimiter = true +ij_vue_interpolation_wrap = off +ij_vue_keep_indents_on_empty_lines = false +ij_vue_spaces_within_interpolation_expressions = true + +[.editorconfig] +ij_editorconfig_align_group_field_declarations = false +ij_editorconfig_space_after_colon = false +ij_editorconfig_space_after_comma = true +ij_editorconfig_space_before_colon = false +ij_editorconfig_space_before_comma = false +ij_editorconfig_spaces_around_assignment_operators = true + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_add_space = false +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = false + +[{*.ats,*.cts,*.mts,*.ts}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_typescript_align_imports = false +ij_typescript_align_multiline_array_initializer_expression = false +ij_typescript_align_multiline_binary_operation = false +ij_typescript_align_multiline_chained_methods = false +ij_typescript_align_multiline_extends_list = false +ij_typescript_align_multiline_for = true +ij_typescript_align_multiline_parameters = true +ij_typescript_align_multiline_parameters_in_calls = false +ij_typescript_align_multiline_ternary_operation = false +ij_typescript_align_object_properties = 0 +ij_typescript_align_union_types = false +ij_typescript_align_var_statements = 0 +ij_typescript_array_initializer_new_line_after_left_brace = false +ij_typescript_array_initializer_right_brace_on_new_line = false +ij_typescript_array_initializer_wrap = off +ij_typescript_assignment_wrap = off +ij_typescript_binary_operation_sign_on_next_line = false +ij_typescript_binary_operation_wrap = off +ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** +ij_typescript_blank_lines_after_imports = 1 +ij_typescript_blank_lines_around_class = 1 +ij_typescript_blank_lines_around_field = 0 +ij_typescript_blank_lines_around_field_in_interface = 0 +ij_typescript_blank_lines_around_function = 1 +ij_typescript_blank_lines_around_method = 1 +ij_typescript_blank_lines_around_method_in_interface = 1 +ij_typescript_block_brace_style = end_of_line +ij_typescript_block_comment_add_space = false +ij_typescript_block_comment_at_first_column = true +ij_typescript_call_parameters_new_line_after_left_paren = false +ij_typescript_call_parameters_right_paren_on_new_line = false +ij_typescript_call_parameters_wrap = off +ij_typescript_catch_on_new_line = false +ij_typescript_chained_call_dot_on_new_line = true +ij_typescript_class_brace_style = end_of_line +ij_typescript_comma_on_new_line = false +ij_typescript_do_while_brace_force = never +ij_typescript_else_on_new_line = false +ij_typescript_enforce_trailing_comma = whenmultiline +ij_typescript_enum_constants_wrap = on_every_item +ij_typescript_extends_keyword_wrap = off +ij_typescript_extends_list_wrap = off +ij_typescript_field_prefix = _ +ij_typescript_file_name_style = relaxed +ij_typescript_finally_on_new_line = false +ij_typescript_for_brace_force = never +ij_typescript_for_statement_new_line_after_left_paren = false +ij_typescript_for_statement_right_paren_on_new_line = false +ij_typescript_for_statement_wrap = off +ij_typescript_force_quote_style = true +ij_typescript_force_semicolon_style = true +ij_typescript_function_expression_brace_style = end_of_line +ij_typescript_if_brace_force = never +ij_typescript_import_merge_members = global +ij_typescript_import_prefer_absolute_path = global +ij_typescript_import_sort_members = true +ij_typescript_import_sort_module_name = false +ij_typescript_import_use_node_resolution = true +ij_typescript_imports_wrap = on_every_item +ij_typescript_indent_case_from_switch = true +ij_typescript_indent_chained_calls = true +ij_typescript_indent_package_children = 0 +ij_typescript_jsdoc_include_types = false +ij_typescript_jsx_attribute_value = braces +ij_typescript_keep_blank_lines_in_code = 2 +ij_typescript_keep_first_column_comment = true +ij_typescript_keep_indents_on_empty_lines = false +ij_typescript_keep_line_breaks = true +ij_typescript_keep_simple_blocks_in_one_line = false +ij_typescript_keep_simple_methods_in_one_line = false +ij_typescript_line_comment_add_space = true +ij_typescript_line_comment_at_first_column = false +ij_typescript_method_brace_style = end_of_line +ij_typescript_method_call_chain_wrap = off +ij_typescript_method_parameters_new_line_after_left_paren = false +ij_typescript_method_parameters_right_paren_on_new_line = false +ij_typescript_method_parameters_wrap = off +ij_typescript_object_literal_wrap = on_every_item +ij_typescript_object_types_wrap = on_every_item +ij_typescript_parentheses_expression_new_line_after_left_paren = false +ij_typescript_parentheses_expression_right_paren_on_new_line = false +ij_typescript_place_assignment_sign_on_next_line = false +ij_typescript_prefer_as_type_cast = false +ij_typescript_prefer_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = false +ij_typescript_prefer_parameters_wrap = false +ij_typescript_property_prefix = +ij_typescript_reformat_c_style_comments = false +ij_typescript_space_after_colon = true +ij_typescript_space_after_comma = true +ij_typescript_space_after_dots_in_rest_parameter = false +ij_typescript_space_after_generator_mult = true +ij_typescript_space_after_property_colon = true +ij_typescript_space_after_quest = true +ij_typescript_space_after_type_colon = true +ij_typescript_space_after_unary_not = false +ij_typescript_space_before_async_arrow_lparen = true +ij_typescript_space_before_catch_keyword = true +ij_typescript_space_before_catch_left_brace = true +ij_typescript_space_before_catch_parentheses = true +ij_typescript_space_before_class_lbrace = true +ij_typescript_space_before_class_left_brace = true +ij_typescript_space_before_colon = true +ij_typescript_space_before_comma = false +ij_typescript_space_before_do_left_brace = true +ij_typescript_space_before_else_keyword = true +ij_typescript_space_before_else_left_brace = true +ij_typescript_space_before_finally_keyword = true +ij_typescript_space_before_finally_left_brace = true +ij_typescript_space_before_for_left_brace = true +ij_typescript_space_before_for_parentheses = true +ij_typescript_space_before_for_semicolon = false +ij_typescript_space_before_function_left_parenth = true +ij_typescript_space_before_generator_mult = false +ij_typescript_space_before_if_left_brace = true +ij_typescript_space_before_if_parentheses = true +ij_typescript_space_before_method_call_parentheses = false +ij_typescript_space_before_method_left_brace = true +ij_typescript_space_before_method_parentheses = false +ij_typescript_space_before_property_colon = false +ij_typescript_space_before_quest = true +ij_typescript_space_before_switch_left_brace = true +ij_typescript_space_before_switch_parentheses = true +ij_typescript_space_before_try_left_brace = true +ij_typescript_space_before_type_colon = false +ij_typescript_space_before_unary_not = false +ij_typescript_space_before_while_keyword = true +ij_typescript_space_before_while_left_brace = true +ij_typescript_space_before_while_parentheses = true +ij_typescript_spaces_around_additive_operators = true +ij_typescript_spaces_around_arrow_function_operator = true +ij_typescript_spaces_around_assignment_operators = true +ij_typescript_spaces_around_bitwise_operators = true +ij_typescript_spaces_around_equality_operators = true +ij_typescript_spaces_around_logical_operators = true +ij_typescript_spaces_around_multiplicative_operators = true +ij_typescript_spaces_around_relational_operators = true +ij_typescript_spaces_around_shift_operators = true +ij_typescript_spaces_around_unary_operator = false +ij_typescript_spaces_within_array_initializer_brackets = false +ij_typescript_spaces_within_brackets = false +ij_typescript_spaces_within_catch_parentheses = false +ij_typescript_spaces_within_for_parentheses = false +ij_typescript_spaces_within_if_parentheses = false +ij_typescript_spaces_within_imports = false +ij_typescript_spaces_within_interpolation_expressions = false +ij_typescript_spaces_within_method_call_parentheses = false +ij_typescript_spaces_within_method_parentheses = false +ij_typescript_spaces_within_object_literal_braces = false +ij_typescript_spaces_within_object_type_braces = true +ij_typescript_spaces_within_parentheses = false +ij_typescript_spaces_within_switch_parentheses = false +ij_typescript_spaces_within_type_assertion = false +ij_typescript_spaces_within_union_types = true +ij_typescript_spaces_within_while_parentheses = false +ij_typescript_special_else_if_treatment = true +ij_typescript_ternary_operation_signs_on_next_line = false +ij_typescript_ternary_operation_wrap = off +ij_typescript_union_types_wrap = on_every_item +ij_typescript_use_chained_calls_group_indents = false +ij_typescript_use_double_quotes = false +ij_typescript_use_explicit_js_extension = auto +ij_typescript_use_path_mapping = always +ij_typescript_use_public_modifier = false +ij_typescript_use_semicolon_after_statement = true +ij_typescript_var_declaration_wrap = normal +ij_typescript_while_brace_force = never +ij_typescript_while_on_new_line = false +ij_typescript_wrap_comments = false + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +ij_shell_binary_ops_start_line = false +ij_shell_keep_column_alignment_padding = false +ij_shell_minify_program = false +ij_shell_redirect_followed_by_space = false +ij_shell_switch_cases_indented = false +ij_shell_use_unix_line_separator = true + +[{*.cjs,*.js}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_javascript_align_imports = false +ij_javascript_align_multiline_array_initializer_expression = false +ij_javascript_align_multiline_binary_operation = false +ij_javascript_align_multiline_chained_methods = false +ij_javascript_align_multiline_extends_list = false +ij_javascript_align_multiline_for = true +ij_javascript_align_multiline_parameters = true +ij_javascript_align_multiline_parameters_in_calls = false +ij_javascript_align_multiline_ternary_operation = false +ij_javascript_align_object_properties = 0 +ij_javascript_align_union_types = false +ij_javascript_align_var_statements = 0 +ij_javascript_array_initializer_new_line_after_left_brace = false +ij_javascript_array_initializer_right_brace_on_new_line = false +ij_javascript_array_initializer_wrap = off +ij_javascript_assignment_wrap = off +ij_javascript_binary_operation_sign_on_next_line = false +ij_javascript_binary_operation_wrap = off +ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +ij_javascript_blank_lines_around_class = 1 +ij_javascript_blank_lines_around_field = 0 +ij_javascript_blank_lines_around_function = 1 +ij_javascript_blank_lines_around_method = 1 +ij_javascript_block_brace_style = end_of_line +ij_javascript_block_comment_add_space = false +ij_javascript_block_comment_at_first_column = true +ij_javascript_call_parameters_new_line_after_left_paren = false +ij_javascript_call_parameters_right_paren_on_new_line = false +ij_javascript_call_parameters_wrap = off +ij_javascript_catch_on_new_line = false +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = end_of_line +ij_javascript_comma_on_new_line = false +ij_javascript_do_while_brace_force = never +ij_javascript_else_on_new_line = false +ij_javascript_enforce_trailing_comma = whenmultiline +ij_javascript_extends_keyword_wrap = off +ij_javascript_extends_list_wrap = off +ij_javascript_field_prefix = _ +ij_javascript_file_name_style = relaxed +ij_javascript_finally_on_new_line = false +ij_javascript_for_brace_force = never +ij_javascript_for_statement_new_line_after_left_paren = false +ij_javascript_for_statement_right_paren_on_new_line = false +ij_javascript_for_statement_wrap = off +ij_javascript_force_quote_style = true +ij_javascript_force_semicolon_style = true +ij_javascript_function_expression_brace_style = end_of_line +ij_javascript_if_brace_force = never +ij_javascript_import_merge_members = global +ij_javascript_import_prefer_absolute_path = global +ij_javascript_import_sort_members = true +ij_javascript_import_sort_module_name = false +ij_javascript_import_use_node_resolution = true +ij_javascript_imports_wrap = on_every_item +ij_javascript_indent_case_from_switch = true +ij_javascript_indent_chained_calls = true +ij_javascript_indent_package_children = 0 +ij_javascript_jsx_attribute_value = braces +ij_javascript_keep_blank_lines_in_code = 2 +ij_javascript_keep_first_column_comment = true +ij_javascript_keep_indents_on_empty_lines = false +ij_javascript_keep_line_breaks = true +ij_javascript_keep_simple_blocks_in_one_line = false +ij_javascript_keep_simple_methods_in_one_line = false +ij_javascript_line_comment_add_space = true +ij_javascript_line_comment_at_first_column = false +ij_javascript_method_brace_style = end_of_line +ij_javascript_method_call_chain_wrap = off +ij_javascript_method_parameters_new_line_after_left_paren = false +ij_javascript_method_parameters_right_paren_on_new_line = false +ij_javascript_method_parameters_wrap = off +ij_javascript_object_literal_wrap = on_every_item +ij_javascript_object_types_wrap = on_every_item +ij_javascript_parentheses_expression_new_line_after_left_paren = false +ij_javascript_parentheses_expression_right_paren_on_new_line = false +ij_javascript_place_assignment_sign_on_next_line = false +ij_javascript_prefer_as_type_cast = false +ij_javascript_prefer_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = false +ij_javascript_prefer_parameters_wrap = false +ij_javascript_property_prefix = +ij_javascript_reformat_c_style_comments = false +ij_javascript_space_after_colon = true +ij_javascript_space_after_comma = true +ij_javascript_space_after_dots_in_rest_parameter = false +ij_javascript_space_after_generator_mult = true +ij_javascript_space_after_property_colon = true +ij_javascript_space_after_quest = true +ij_javascript_space_after_type_colon = true +ij_javascript_space_after_unary_not = false +ij_javascript_space_before_async_arrow_lparen = true +ij_javascript_space_before_catch_keyword = true +ij_javascript_space_before_catch_left_brace = true +ij_javascript_space_before_catch_parentheses = true +ij_javascript_space_before_class_lbrace = true +ij_javascript_space_before_class_left_brace = true +ij_javascript_space_before_colon = true +ij_javascript_space_before_comma = false +ij_javascript_space_before_do_left_brace = true +ij_javascript_space_before_else_keyword = true +ij_javascript_space_before_else_left_brace = true +ij_javascript_space_before_finally_keyword = true +ij_javascript_space_before_finally_left_brace = true +ij_javascript_space_before_for_left_brace = true +ij_javascript_space_before_for_parentheses = true +ij_javascript_space_before_for_semicolon = false +ij_javascript_space_before_function_left_parenth = true +ij_javascript_space_before_generator_mult = false +ij_javascript_space_before_if_left_brace = true +ij_javascript_space_before_if_parentheses = true +ij_javascript_space_before_method_call_parentheses = false +ij_javascript_space_before_method_left_brace = true +ij_javascript_space_before_method_parentheses = false +ij_javascript_space_before_property_colon = false +ij_javascript_space_before_quest = true +ij_javascript_space_before_switch_left_brace = true +ij_javascript_space_before_switch_parentheses = true +ij_javascript_space_before_try_left_brace = true +ij_javascript_space_before_type_colon = false +ij_javascript_space_before_unary_not = false +ij_javascript_space_before_while_keyword = true +ij_javascript_space_before_while_left_brace = true +ij_javascript_space_before_while_parentheses = true +ij_javascript_spaces_around_additive_operators = true +ij_javascript_spaces_around_arrow_function_operator = true +ij_javascript_spaces_around_assignment_operators = true +ij_javascript_spaces_around_bitwise_operators = true +ij_javascript_spaces_around_equality_operators = true +ij_javascript_spaces_around_logical_operators = true +ij_javascript_spaces_around_multiplicative_operators = true +ij_javascript_spaces_around_relational_operators = true +ij_javascript_spaces_around_shift_operators = true +ij_javascript_spaces_around_unary_operator = false +ij_javascript_spaces_within_array_initializer_brackets = false +ij_javascript_spaces_within_brackets = false +ij_javascript_spaces_within_catch_parentheses = false +ij_javascript_spaces_within_for_parentheses = false +ij_javascript_spaces_within_if_parentheses = false +ij_javascript_spaces_within_imports = false +ij_javascript_spaces_within_interpolation_expressions = false +ij_javascript_spaces_within_method_call_parentheses = false +ij_javascript_spaces_within_method_parentheses = false +ij_javascript_spaces_within_object_literal_braces = false +ij_javascript_spaces_within_object_type_braces = true +ij_javascript_spaces_within_parentheses = false +ij_javascript_spaces_within_switch_parentheses = false +ij_javascript_spaces_within_type_assertion = false +ij_javascript_spaces_within_union_types = true +ij_javascript_spaces_within_while_parentheses = false +ij_javascript_special_else_if_treatment = true +ij_javascript_ternary_operation_signs_on_next_line = false +ij_javascript_ternary_operation_wrap = off +ij_javascript_union_types_wrap = on_every_item +ij_javascript_use_chained_calls_group_indents = false +ij_javascript_use_double_quotes = false +ij_javascript_use_explicit_js_extension = auto +ij_javascript_use_path_mapping = always +ij_javascript_use_public_modifier = false +ij_javascript_use_semicolon_after_statement = true +ij_javascript_var_declaration_wrap = normal +ij_javascript_while_brace_force = never +ij_javascript_while_on_new_line = false +ij_javascript_wrap_comments = false + +[{*.ft,*.vm,*.vsl}] +ij_vtl_keep_indents_on_empty_lines = false + +[{*.gant,*.groovy,*.gy}] +ij_groovy_align_group_field_declarations = false +ij_groovy_align_multiline_array_initializer_expression = false +ij_groovy_align_multiline_assignment = false +ij_groovy_align_multiline_binary_operation = false +ij_groovy_align_multiline_chained_methods = false +ij_groovy_align_multiline_extends_list = false +ij_groovy_align_multiline_for = true +ij_groovy_align_multiline_list_or_map = true +ij_groovy_align_multiline_method_parentheses = false +ij_groovy_align_multiline_parameters = true +ij_groovy_align_multiline_parameters_in_calls = false +ij_groovy_align_multiline_resources = true +ij_groovy_align_multiline_ternary_operation = false +ij_groovy_align_multiline_throws_list = false +ij_groovy_align_named_args_in_map = true +ij_groovy_align_throws_keyword = false +ij_groovy_array_initializer_new_line_after_left_brace = false +ij_groovy_array_initializer_right_brace_on_new_line = false +ij_groovy_array_initializer_wrap = off +ij_groovy_assert_statement_wrap = off +ij_groovy_assignment_wrap = off +ij_groovy_binary_operation_wrap = off +ij_groovy_blank_lines_after_class_header = 0 +ij_groovy_blank_lines_after_imports = 1 +ij_groovy_blank_lines_after_package = 1 +ij_groovy_blank_lines_around_class = 1 +ij_groovy_blank_lines_around_field = 0 +ij_groovy_blank_lines_around_field_in_interface = 0 +ij_groovy_blank_lines_around_method = 1 +ij_groovy_blank_lines_around_method_in_interface = 1 +ij_groovy_blank_lines_before_imports = 1 +ij_groovy_blank_lines_before_method_body = 0 +ij_groovy_blank_lines_before_package = 0 +ij_groovy_block_brace_style = end_of_line +ij_groovy_block_comment_add_space = false +ij_groovy_block_comment_at_first_column = true +ij_groovy_call_parameters_new_line_after_left_paren = false +ij_groovy_call_parameters_right_paren_on_new_line = false +ij_groovy_call_parameters_wrap = off +ij_groovy_catch_on_new_line = false +ij_groovy_class_annotation_wrap = split_into_lines +ij_groovy_class_brace_style = end_of_line +ij_groovy_class_count_to_use_import_on_demand = 5 +ij_groovy_do_while_brace_force = never +ij_groovy_else_on_new_line = false +ij_groovy_enable_groovydoc_formatting = true +ij_groovy_enum_constants_wrap = off +ij_groovy_extends_keyword_wrap = off +ij_groovy_extends_list_wrap = off +ij_groovy_field_annotation_wrap = split_into_lines +ij_groovy_finally_on_new_line = false +ij_groovy_for_brace_force = never +ij_groovy_for_statement_new_line_after_left_paren = false +ij_groovy_for_statement_right_paren_on_new_line = false +ij_groovy_for_statement_wrap = off +ij_groovy_ginq_general_clause_wrap_policy = 2 +ij_groovy_ginq_having_wrap_policy = 1 +ij_groovy_ginq_indent_having_clause = true +ij_groovy_ginq_indent_on_clause = true +ij_groovy_ginq_on_wrap_policy = 1 +ij_groovy_ginq_space_after_keyword = true +ij_groovy_if_brace_force = never +ij_groovy_import_annotation_wrap = 2 +ij_groovy_imports_layout = *,|,javax.**,java.**,|,$* +ij_groovy_indent_case_from_switch = true +ij_groovy_indent_label_blocks = true +ij_groovy_insert_inner_class_imports = false +ij_groovy_keep_blank_lines_before_right_brace = 2 +ij_groovy_keep_blank_lines_in_code = 2 +ij_groovy_keep_blank_lines_in_declarations = 2 +ij_groovy_keep_control_statement_in_one_line = true +ij_groovy_keep_first_column_comment = true +ij_groovy_keep_indents_on_empty_lines = false +ij_groovy_keep_line_breaks = true +ij_groovy_keep_multiple_expressions_in_one_line = false +ij_groovy_keep_simple_blocks_in_one_line = false +ij_groovy_keep_simple_classes_in_one_line = true +ij_groovy_keep_simple_lambdas_in_one_line = true +ij_groovy_keep_simple_methods_in_one_line = true +ij_groovy_label_indent_absolute = false +ij_groovy_label_indent_size = 0 +ij_groovy_lambda_brace_style = end_of_line +ij_groovy_layout_static_imports_separately = true +ij_groovy_line_comment_add_space = false +ij_groovy_line_comment_add_space_on_reformat = false +ij_groovy_line_comment_at_first_column = true +ij_groovy_method_annotation_wrap = split_into_lines +ij_groovy_method_brace_style = end_of_line +ij_groovy_method_call_chain_wrap = off +ij_groovy_method_parameters_new_line_after_left_paren = false +ij_groovy_method_parameters_right_paren_on_new_line = false +ij_groovy_method_parameters_wrap = off +ij_groovy_modifier_list_wrap = false +ij_groovy_names_count_to_use_import_on_demand = 3 +ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.* +ij_groovy_parameter_annotation_wrap = off +ij_groovy_parentheses_expression_new_line_after_left_paren = false +ij_groovy_parentheses_expression_right_paren_on_new_line = false +ij_groovy_prefer_parameters_wrap = false +ij_groovy_resource_list_new_line_after_left_paren = false +ij_groovy_resource_list_right_paren_on_new_line = false +ij_groovy_resource_list_wrap = off +ij_groovy_space_after_assert_separator = true +ij_groovy_space_after_colon = true +ij_groovy_space_after_comma = true +ij_groovy_space_after_comma_in_type_arguments = true +ij_groovy_space_after_for_semicolon = true +ij_groovy_space_after_quest = true +ij_groovy_space_after_type_cast = true +ij_groovy_space_before_annotation_parameter_list = false +ij_groovy_space_before_array_initializer_left_brace = false +ij_groovy_space_before_assert_separator = false +ij_groovy_space_before_catch_keyword = true +ij_groovy_space_before_catch_left_brace = true +ij_groovy_space_before_catch_parentheses = true +ij_groovy_space_before_class_left_brace = true +ij_groovy_space_before_closure_left_brace = true +ij_groovy_space_before_colon = true +ij_groovy_space_before_comma = false +ij_groovy_space_before_do_left_brace = true +ij_groovy_space_before_else_keyword = true +ij_groovy_space_before_else_left_brace = true +ij_groovy_space_before_finally_keyword = true +ij_groovy_space_before_finally_left_brace = true +ij_groovy_space_before_for_left_brace = true +ij_groovy_space_before_for_parentheses = true +ij_groovy_space_before_for_semicolon = false +ij_groovy_space_before_if_left_brace = true +ij_groovy_space_before_if_parentheses = true +ij_groovy_space_before_method_call_parentheses = false +ij_groovy_space_before_method_left_brace = true +ij_groovy_space_before_method_parentheses = false +ij_groovy_space_before_quest = true +ij_groovy_space_before_record_parentheses = false +ij_groovy_space_before_switch_left_brace = true +ij_groovy_space_before_switch_parentheses = true +ij_groovy_space_before_synchronized_left_brace = true +ij_groovy_space_before_synchronized_parentheses = true +ij_groovy_space_before_try_left_brace = true +ij_groovy_space_before_try_parentheses = true +ij_groovy_space_before_while_keyword = true +ij_groovy_space_before_while_left_brace = true +ij_groovy_space_before_while_parentheses = true +ij_groovy_space_in_named_argument = true +ij_groovy_space_in_named_argument_before_colon = false +ij_groovy_space_within_empty_array_initializer_braces = false +ij_groovy_space_within_empty_method_call_parentheses = false +ij_groovy_spaces_around_additive_operators = true +ij_groovy_spaces_around_assignment_operators = true +ij_groovy_spaces_around_bitwise_operators = true +ij_groovy_spaces_around_equality_operators = true +ij_groovy_spaces_around_lambda_arrow = true +ij_groovy_spaces_around_logical_operators = true +ij_groovy_spaces_around_multiplicative_operators = true +ij_groovy_spaces_around_regex_operators = true +ij_groovy_spaces_around_relational_operators = true +ij_groovy_spaces_around_shift_operators = true +ij_groovy_spaces_within_annotation_parentheses = false +ij_groovy_spaces_within_array_initializer_braces = false +ij_groovy_spaces_within_braces = true +ij_groovy_spaces_within_brackets = false +ij_groovy_spaces_within_cast_parentheses = false +ij_groovy_spaces_within_catch_parentheses = false +ij_groovy_spaces_within_for_parentheses = false +ij_groovy_spaces_within_gstring_injection_braces = false +ij_groovy_spaces_within_if_parentheses = false +ij_groovy_spaces_within_list_or_map = false +ij_groovy_spaces_within_method_call_parentheses = false +ij_groovy_spaces_within_method_parentheses = false +ij_groovy_spaces_within_parentheses = false +ij_groovy_spaces_within_switch_parentheses = false +ij_groovy_spaces_within_synchronized_parentheses = false +ij_groovy_spaces_within_try_parentheses = false +ij_groovy_spaces_within_tuple_expression = false +ij_groovy_spaces_within_while_parentheses = false +ij_groovy_special_else_if_treatment = true +ij_groovy_ternary_operation_wrap = off +ij_groovy_throws_keyword_wrap = off +ij_groovy_throws_list_wrap = off +ij_groovy_use_flying_geese_braces = false +ij_groovy_use_fq_class_names = false +ij_groovy_use_fq_class_names_in_javadoc = true +ij_groovy_use_relative_indents = false +ij_groovy_use_single_class_imports = true +ij_groovy_variable_annotation_wrap = off +ij_groovy_while_brace_force = never +ij_groovy_while_on_new_line = false +ij_groovy_wrap_chain_calls_after_dot = false +ij_groovy_wrap_long_lines = false + +[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}] +indent_size = 2 +ij_json_array_wrapping = split_into_lines +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_keep_trailing_comma = false +ij_json_object_wrapping = split_into_lines +ij_json_property_alignment = do_not_align +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = false +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 +ij_html_align_attributes = true +ij_html_align_text = true +ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p +ij_html_do_not_indent_children_of_tags = none +ij_html_enforce_quotes = false +ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span,pre,textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal + +[{*.http,*.rest}] +indent_size = 0 +ij_continuation_indent_size = 4 +ij_http-request_call_parameters_wrap = normal +ij_http-request_method_parameters_wrap = split_into_lines +ij_http-request_space_before_comma = true +ij_http-request_spaces_around_assignment_operators = true + +[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}] +ij_jsp_jsp_prefer_comma_separated_import_list = false +ij_jsp_keep_indents_on_empty_lines = false + +[{*.jspx,*.tagx}] +ij_jspx_keep_indents_on_empty_lines = false + +[{*.kt,*.kts}] +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false +ij_kotlin_assignment_wrap = off +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_add_space = false +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = false +ij_kotlin_call_parameters_right_paren_on_new_line = false +ij_kotlin_call_parameters_wrap = off +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_continuation_indent_for_chained_calls = true +ij_kotlin_continuation_indent_for_expression_bodies = true +ij_kotlin_continuation_indent_in_argument_lists = true +ij_kotlin_continuation_indent_in_elvis = true +ij_kotlin_continuation_indent_in_if_conditions = true +ij_kotlin_continuation_indent_in_parameter_lists = true +ij_kotlin_continuation_indent_in_supertype_lists = true +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = off +ij_kotlin_field_annotation_wrap = split_into_lines +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = false +ij_kotlin_import_nested_classes = false +ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^ +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_break_after_multiline_when_entry = true +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_add_space_on_reformat = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = off +ij_kotlin_method_parameters_new_line_after_left_paren = false +ij_kotlin_method_parameters_right_paren_on_new_line = false +ij_kotlin_method_parameters_wrap = off +ij_kotlin_name_count_to_use_star_import = 5 +ij_kotlin_name_count_to_use_star_import_for_members = 3 +ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.** +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 0 +ij_kotlin_wrap_first_method_in_call_chain = false + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true + +[{*.pb,*.textproto}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_prototext_keep_blank_lines_in_code = 2 +ij_prototext_keep_indents_on_empty_lines = false +ij_prototext_keep_line_breaks = true +ij_prototext_space_after_colon = true +ij_prototext_space_after_comma = true +ij_prototext_space_before_colon = false +ij_prototext_space_before_comma = false +ij_prototext_spaces_within_braces = true +ij_prototext_spaces_within_brackets = false + +[{*.properties,spring.handlers,spring.schemas}] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}] +ij_qute_keep_indents_on_empty_lines = false + +[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] +ij_toml_keep_indents_on_empty_lines = false + +[{*.yaml,*.yml}] +indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/Spar/frida/README.md b/Spar/frida/README.md new file mode 100644 index 0000000..450121a --- /dev/null +++ b/Spar/frida/README.md @@ -0,0 +1,54 @@ +# Start emulator and install burp cert +Original guide see [here](https://medium.com/mii-cybersec/how-to-connect-burp-suite-to-an-android-emulator-9da19b0ad2c3) +```sh +emulator -netdelay none -netspeed full -avd Pixel_2_XL_API_27_2 -qt-hide-window -grpc-use-token -idle-grpc-timeout 300 -http-proxy http://192.168.0.171:8081 -debug-proxy -writable-system +adb root +sleep 2 +adb remount +adb push Downloads/sparapp/9a5ba575.0 /storage/emulated/0/ +adb shell "mv /storage/emulated/0/9a5ba575.0 /system/etc/security/cacerts" +adb shell "chmod 644 /system/etc/security/cacerts/9a5ba575.0" +adb shell "chown root:root /system/etc/security/cacerts/9a5ba575.0" +adb shell "ls -lah /system/etc/security/cacerts/9a5ba575.0" +``` + +# Hacking jar +Good starting point [OWASP](https://github.com/OWASP/owasp-mastg/blob/master/Document/0x08a-Testing-Tools.md#objection) + +## install frida server +```sh +curl -L -o /tmp/frida-server.xz https://github.com/frida/frida/releases/download/16.1.3/frida-server-16.1.3-android-x86.xz +unxz /tmp/frida-server.xz +adb root && sleep 2 +adb push /tmp/frida-server /data/local/tmp/ +adb shell "chmod 755 /data/local/tmp/frida-server" +adb shell "/data/local/tmp/frida-server &" +``` + +## Patch and install an apk +```sh +python -m venv1 venv # creates virtual environment +. ./venv1/bin/activate # changes into the virtual environment +pip install objection +objection patchapk --source SPAR_1.0.1_Apkpure.apk # patches apk so that is injectable +adb root && sleep 2 +adb install +adb install SPAR_1.0.1_Apkpure.objection.apk +``` + +## Connected to patched apk +```sh +# while in virtual environment +frida-ps -Ua # lists available to attach objection to +objection -d -g `at.spar.app` explore # starts app with objection attached +``` + +## Useful commands when in objection shell +```sh +android sslpinning disable # try disable certificate pinning +android hooking ... # various commands for class/method listing, call hooking, etc +import # executes a frida injection javascript +import Fin/Spar/frida/hook_login.js +import Fin/Spar/frida/hook_apicalls.js +... +``` diff --git a/Spar/frida/hook_apicalls.js b/Spar/frida/hook_apicalls.js new file mode 100644 index 0000000..7ca638d --- /dev/null +++ b/Spar/frida/hook_apicalls.js @@ -0,0 +1,18 @@ +Java.perform(() => { + Java.use('okhttp3.Request').$init.overload('okhttp3.Request$Builder').implementation = function(builder) { + this.$init(builder); + let out = "-----------------------------------\n"; + out += this.toString() + "\n\n"; + out += this.method() + " " + this.url().toString() + "\n" + this.headers().toString(); + if (this.body()) { + const buffer = Java.use('okio.Buffer').$new(); + this.body().writeTo(buffer); + out += buffer.toString(); + } + out += "\n-----------------------------------"; + console.log(out); + + //var jAndroidLog = Java.use("android.util.Log"), jException = Java.use("java.lang.Exception"); + //console.log( jAndroidLog.getStackTraceString( jException.$new() ) ); + }; +}); diff --git a/Spar/frida/hook_login.js b/Spar/frida/hook_login.js new file mode 100644 index 0000000..ff1829d --- /dev/null +++ b/Spar/frida/hook_login.js @@ -0,0 +1,52 @@ +Java.perform(() => { + const readField = function(className, field, instance) { + const f = Java.use(className).class.getDeclaredField(field); + f.setAccessible(true); + return f.get(instance); + } + + Java.use('com.gigya.android.sdk.network.adapter.HttpNetworkProvider$GigyaNetworkAsyncTask').doInBackground + .overload('[Lcom.gigya.android.sdk.api.GigyaApiHttpRequest;') + .implementation = function(requests) { + const res = this.doInBackground(requests); + + let out = ""; + [...requests].forEach((request, i) => { + Java.perform(() => { + out += "-----------------------------------\n"; + out += request.getHttpMethod() + " " + request.getUrl().toString() + "\n" + + request.getHeaders()?.toString() + "\n" + + request.getEncodedParams() + "\n" ; + out += ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"; + const resp = Array.isArray(res) ? [...res][i] : res; + out += "code: " + resp.getCode() + "; " + + "result: " + readField("com.gigya.android.sdk.network.adapter.HttpNetworkProvider$AsyncResult", "result", resp) + "\n"; + out += "-----------------------------------"; + }); + }) + console.log(out); + + return res; + }; + + Java.use('com.gigya.android.sdk.session.SessionInfo').$init + .overload('java.lang.String', 'java.lang.String', 'long') + .implementation = function(sessionSecret, sessionToken, expirationTime) { + console.log("new SessionInfo(sessionSecret: " + sessionSecret + + ", sessionToken: " + sessionToken + + ", expirationTime: " + expirationTime); + + return this.$init(sessionSecret, sessionToken, expirationTime); + }; + + Java.use('com.gigya.android.sdk.utils.SigUtils').getSignature + .implementation = function(str, str2, str3, map) { + console.log("SigUtils.getSignature(" + + "\nstr: " + str + + "\n, str2: " + str2 + + "\n, str3: " + str3 + + "\n, map: " + map); + + return this.getSignature(str, str2, str3, map); + }; +}); diff --git a/Spar/pocJava/.gitattributes b/Spar/pocJava/.gitattributes new file mode 100644 index 0000000..097f9f9 --- /dev/null +++ b/Spar/pocJava/.gitattributes @@ -0,0 +1,9 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# Linux start script should use lf +/gradlew text eol=lf + +# These are Windows script files and should use crlf +*.bat text eol=crlf + diff --git a/Spar/pocJava/.gitignore b/Spar/pocJava/.gitignore new file mode 100644 index 0000000..19576b5 --- /dev/null +++ b/Spar/pocJava/.gitignore @@ -0,0 +1,7 @@ +# Ignore Gradle project-specific cache directory +.gradle + +# Ignore Gradle build output directory +build + +app/dump/ diff --git a/Spar/pocJava/app/build.gradle.kts b/Spar/pocJava/app/build.gradle.kts new file mode 100644 index 0000000..cfd5b8b --- /dev/null +++ b/Spar/pocJava/app/build.gradle.kts @@ -0,0 +1,46 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java application project to get you started. + * For more details on building Java & JVM projects, please refer to https://docs.gradle.org/8.3/userguide/building_java_projects.html in the Gradle documentation. + * This project uses @Incubating APIs which are subject to change. + */ + +plugins { + // Apply the application plugin to add support for building a CLI application in Java. + application +} + +repositories { + maven("https://jitpack.io") + mavenCentral() +} + +dependencies { + implementation("com.github.SAP.gigya-java-sdk:sdk:3.3.2") + implementation("com.github.SAP.gigya-java-sdk:auth:3.3.2") // only if needed + implementation("org.json:json:20230227") //missing dep declaration in sdk +} + +testing { + suites { + // Configure the built-in test suite + val test by getting(JvmTestSuite::class) { + // Use JUnit Jupiter test framework + useJUnitJupiter("5.9.3") + } + } +} + +// Apply a specific Java toolchain to ease working on different environments. +java { + toolchain { +// encoding + languageVersion.set(JavaLanguageVersion.of(17)) + } +} + +application { + // Define the main class for the application. + mainClass.set("poc.App") +} diff --git a/Spar/pocJava/app/src/main/java/poc/App.java b/Spar/pocJava/app/src/main/java/poc/App.java new file mode 100644 index 0000000..fbf0e86 --- /dev/null +++ b/Spar/pocJava/app/src/main/java/poc/App.java @@ -0,0 +1,173 @@ +package poc; + +import com.gigya.auth.GSAnonymousRequest; +import com.gigya.socialize.GSKeyNotFoundException; +import com.gigya.socialize.GSObject; +import com.gigya.socialize.GSRequest; +import com.gigya.socialize.GSResponse; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class App { + private static final String authHost = "eu2.gigya.com"; + private static final String authApiKey = "4_NfHE-cJJ9djefjHQU5x97Q"; + + private static final String apiProto = "https"; + private static final String apiHost = "api-scp.spar-ics.com"; + private static final String apiMount = "/mobile/b2c/apps/spar/at/be/v1/"; + + public static void main(String[] args) { + var loginProcess = new LoginProcess("", ""); + loginProcess.perform().join(); + } + + public static class LoginProcess { + private final String username; + private final String password; + private String sessionToken; + private String sessionSecret; + private String uid; + private String jwt; + private Map receiptsByBonId = new HashMap<>(); + private final Map receiptsPdfByBonId = new HashMap<>(); + + public LoginProcess(String username, String password) { + this.username = username; + this.password = password; + } + + public CompletableFuture perform() { + return CompletableFuture.supplyAsync(() -> { + login(); + getJWT(); + return null; + }) + .thenComposeAsync(v -> receipts()) + .thenComposeAsync(v -> { + var future = CompletableFuture.completedFuture(null); + for (String receiptBonId : receiptsByBonId.keySet()) { + future = future.thenCompose(v2 -> receiptById(receiptBonId)); + } + return future; + }) + .thenAccept(v -> dump()) + .thenApply(v -> this); + } + + private void login() { + var loginRequest = new GSAnonymousRequest(authApiKey, authHost, "accounts.login"); + loginRequest.setParam("loginID", username); + loginRequest.setParam("password", password); + loginRequest.setParam("loginMode", "standard"); + loginRequest.setParam("targetEnv", "mobile"); + + final GSResponse response = loginRequest.send(); + if (response.getErrorCode() != 0) { + throw new RuntimeException(); + } + + try { + sessionToken = response.getData().getObject("sessionInfo").getString("sessionToken"); + sessionSecret = response.getData().getObject("sessionInfo").getString("sessionSecret"); + uid = response.getData().getString("UID"); + } catch (GSKeyNotFoundException e) { + throw new RuntimeException(e); + } + } + + private void getJWT() { + var jwtRequest = new GSRequest(authApiKey, sessionSecret, null, "accounts.getJWT", new GSObject(), true); +// var jwtRequest = new GSAuthRequest(authApiKey, sessionSecret, sessionToken, "accounts.getJWT", new GSObject(), true); + jwtRequest.setAPIDomain(authHost); + jwtRequest.setParam("UID", uid); + jwtRequest.setParam("oauth_token", sessionToken); + jwtRequest.setParam("targetEnv", "mobile"); + jwtRequest.setParam("fields", "UID,isVerified"); + final GSResponse response = jwtRequest.send(); + if (response.getErrorCode() != 0) { + throw new RuntimeException(); + } + try { + this.jwt = response.getData().getString("id_token"); + } catch (GSKeyNotFoundException e) { + throw new RuntimeException(e); + } + } + + private CompletableFuture receipts() { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(apiProto + "://" + apiHost + apiMount + "v1/receipts")) + .header("Authorization", "Bearer " + this.jwt) + .build(); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofString()) + .thenApply(res -> { + if (res.statusCode() != 200) { + throw new RuntimeException("Status code: " + res.statusCode() + "\n" + res.body()); + } + return res; + }) + .thenApply(HttpResponse::body) + .thenAccept(body -> { + var receipts = new JSONObject(body).getJSONArray("receipt"); + this.receiptsByBonId = IntStream.range(0, receipts.length()) + .mapToObj(receipts::getJSONObject) + .collect(Collectors.toMap(e -> e.getString("bonId"), e -> e)); + }); + } + + private CompletableFuture receiptById(String bonId) { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(apiProto + "://" + apiHost + apiMount + "v1/receipt/" + bonId)) + .header("Authorization", "Bearer " + this.jwt) + .build(); + return client.sendAsync(request, HttpResponse.BodyHandlers.ofByteArray()) + .thenApply(res -> { + if (res.statusCode() != 200) { + throw new RuntimeException("Status code: " + res.statusCode() + "\n" + new String(res.body())); + } + return res; + }) + .thenApply(HttpResponse::body) + .thenAccept(body -> this.receiptsPdfByBonId.put(bonId, body)); + } + + private void dump() { + try { + new File("dump").mkdirs(); + + //dump meta + var j = new JSONArray(); + this.receiptsByBonId.values().forEach(j::put); + Files.writeString(Path.of("dump", "receipts.json"), j.toString(2), + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING); + + //dump pdfs + for (var e : this.receiptsPdfByBonId.entrySet()) { + Files.write(Path.of("dump", e.getKey() + ".pdf"), e.getValue(), + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/Spar/pocJava/app/src/test/java/poc/AppTest.java b/Spar/pocJava/app/src/test/java/poc/AppTest.java new file mode 100644 index 0000000..09cfb57 --- /dev/null +++ b/Spar/pocJava/app/src/test/java/poc/AppTest.java @@ -0,0 +1,14 @@ +/* + * This Java source file was generated by the Gradle 'init' task. + */ +package poc; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class AppTest { + @Test void appHasAGreeting() { +// App classUnderTest = new App(); +// assertNotNull(classUnderTest.getGreeting(), "app should have a greeting"); + } +} diff --git a/Spar/pocJava/gradle.properties b/Spar/pocJava/gradle.properties new file mode 100644 index 0000000..18f452c --- /dev/null +++ b/Spar/pocJava/gradle.properties @@ -0,0 +1,6 @@ +# This file was generated by the Gradle 'init' task. +# https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties + +org.gradle.parallel=true +org.gradle.caching=true + diff --git a/Spar/pocJava/gradle/wrapper/gradle-wrapper.jar b/Spar/pocJava/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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"gpYvgVMVsULOY3=lDL#2r|Jj~bidD9% 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 z '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/Spar/pocJava/gradlew.bat b/Spar/pocJava/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/Spar/pocJava/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/Spar/pocJava/settings.gradle.kts b/Spar/pocJava/settings.gradle.kts new file mode 100644 index 0000000..687f701 --- /dev/null +++ b/Spar/pocJava/settings.gradle.kts @@ -0,0 +1,15 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/8.3/userguide/building_swift_projects.html in the Gradle documentation. + * This project uses @Incubating APIs which are subject to change. + */ + +plugins { + // Apply the foojay-resolver plugin to allow automatic download of JDKs + id("org.gradle.toolchains.foojay-resolver-convention") version "0.4.0" +} + +rootProject.name = "pocJava" +include("app") diff --git a/Spar/pocTs/.gitignore b/Spar/pocTs/.gitignore new file mode 100644 index 0000000..b947077 --- /dev/null +++ b/Spar/pocTs/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/