1
1
import base64
2
2
import os
3
+ from dataclasses import dataclass
3
4
from datetime import datetime , timedelta
4
5
from typing import Dict
5
6
35
36
from prowler .providers .common .models import Connection
36
37
37
38
39
+ @dataclass
40
+ class JiraConnection (Connection ):
41
+ """
42
+ Represents a Jira connection object.
43
+ Attributes:
44
+ projects (dict): Dictionary of projects in Jira.
45
+ """
46
+
47
+ projects : dict = None
48
+
49
+
38
50
class Jira :
39
51
"""
40
52
Jira class to interact with the Jira API
@@ -463,7 +475,7 @@ def test_connection(
463
475
api_token : str = None ,
464
476
domain : str = None ,
465
477
raise_on_exception : bool = True ,
466
- ) -> Connection :
478
+ ) -> JiraConnection :
467
479
"""Test the connection to Jira
468
480
469
481
Args:
@@ -476,14 +488,16 @@ def test_connection(
476
488
- raise_on_exception: Whether to raise an exception or not
477
489
478
490
Returns:
479
- - Connection : The connection object
491
+ - JiraConnection : The connection object
480
492
481
493
Raises:
482
494
- JiraGetCloudIDNoResourcesError: No resources were found in Jira when getting the cloud id
483
495
- JiraGetCloudIDResponseError: Failed to get the cloud ID, response code did not match 200
484
496
- JiraGetCloudIDError: Failed to get the cloud ID from Jira
485
497
- JiraAuthenticationError: Failed to authenticate
486
498
- JiraTestConnectionError: Failed to test the connection
499
+ - JiraNoProjectsError: No projects found in Jira
500
+ - JiraGetProjectsResponseError: Failed to get projects from Jira, response code did not match 200
487
501
"""
488
502
try :
489
503
jira = Jira (
@@ -494,68 +508,59 @@ def test_connection(
494
508
api_token = api_token ,
495
509
domain = domain ,
496
510
)
497
- access_token = jira .get_access_token ()
498
-
499
- if not access_token :
500
- return ValueError ("Failed to get access token" )
501
-
502
- if jira .using_basic_auth :
503
- headers = {"Authorization" : f"Basic { access_token } " }
504
- else :
505
- headers = {"Authorization" : f"Bearer { access_token } " }
506
-
507
- response = requests .get (
508
- f"https://api.atlassian.com/ex/jira/{ jira .cloud_id } /rest/api/3/myself" ,
509
- headers = headers ,
510
- )
511
+ projects = jira .get_projects ()
511
512
512
- if response .status_code == 200 :
513
- return Connection (is_connected = True )
514
- else :
515
- return Connection (is_connected = False , error = response .json ())
516
- except JiraGetCloudIDNoResourcesError as no_resources_error :
513
+ return JiraConnection (is_connected = True , projects = projects )
514
+ except JiraNoProjectsError as no_projects_error :
517
515
logger .error (
518
- f"{ no_resources_error .__class__ .__name__ } [{ no_resources_error .__traceback__ .tb_lineno } ]: { no_resources_error } "
516
+ f"{ no_projects_error .__class__ .__name__ } [{ no_projects_error .__traceback__ .tb_lineno } ]: { no_projects_error } "
519
517
)
520
518
if raise_on_exception :
521
- raise no_resources_error
522
- return Connection (error = no_resources_error )
519
+ raise no_projects_error
520
+ return JiraConnection (error = no_projects_error )
523
521
except JiraGetCloudIDResponseError as response_error :
524
522
logger .error (
525
523
f"{ response_error .__class__ .__name__ } [{ response_error .__traceback__ .tb_lineno } ]: { response_error } "
526
524
)
527
525
if raise_on_exception :
528
526
raise response_error
529
- return Connection (error = response_error )
527
+ return JiraConnection (error = response_error )
530
528
except JiraGetCloudIDError as cloud_id_error :
531
529
logger .error (
532
530
f"{ cloud_id_error .__class__ .__name__ } [{ cloud_id_error .__traceback__ .tb_lineno } ]: { cloud_id_error } "
533
531
)
534
532
if raise_on_exception :
535
533
raise cloud_id_error
536
- return Connection (error = cloud_id_error )
534
+ return JiraConnection (error = cloud_id_error )
537
535
except JiraAuthenticationError as auth_error :
538
536
logger .error (
539
537
f"{ auth_error .__class__ .__name__ } [{ auth_error .__traceback__ .tb_lineno } ]: { auth_error } "
540
538
)
541
539
if raise_on_exception :
542
540
raise auth_error
543
- return Connection (error = auth_error )
541
+ return JiraConnection (error = auth_error )
544
542
except JiraBasicAuthError as basic_auth_error :
545
543
logger .error (
546
544
f"{ basic_auth_error .__class__ .__name__ } [{ basic_auth_error .__traceback__ .tb_lineno } ]: { basic_auth_error } "
547
545
)
548
546
if raise_on_exception :
549
547
raise basic_auth_error
550
- return Connection (error = basic_auth_error )
548
+ return JiraConnection (error = basic_auth_error )
549
+ except JiraGetProjectsResponseError as projects_response_error :
550
+ logger .error (
551
+ f"{ projects_response_error .__class__ .__name__ } [{ projects_response_error .__traceback__ .tb_lineno } ]: { projects_response_error } "
552
+ )
553
+ if raise_on_exception :
554
+ raise projects_response_error
555
+ return JiraConnection (error = projects_response_error )
551
556
except Exception as error :
552
557
logger .error (f"Failed to test connection: { error } " )
553
558
if raise_on_exception :
554
559
raise JiraTestConnectionError (
555
560
message = "Failed to test connection on the Jira integration" ,
556
561
file = os .path .basename (__file__ ),
557
562
)
558
- return Connection (is_connected = False , error = error )
563
+ return JiraConnection (is_connected = False , error = error )
559
564
560
565
def get_projects (self ) -> Dict [str , str ]:
561
566
"""Get the projects from Jira
0 commit comments