1+ import logging
2+ from typing import Optional , Union
3+ from dataclasses import dataclass , asdict
4+
5+ log = logging .getLogger ("socketdev" )
6+
7+
8+ @dataclass
9+ class SocketBasicsConfig :
10+ """Data class representing Socket Basics configuration settings."""
11+ pythonSastEnabled : bool = False
12+ golangSastEnabled : bool = False
13+ javascriptSastEnabled : bool = False
14+ secretScanningEnabled : bool = False
15+ trivyImageEnabled : bool = False
16+ trivyDockerfileEnabled : bool = False
17+ socketScanningEnabled : bool = False
18+ socketScaEnabled : bool = False
19+ additionalParameters : str = ""
20+
21+ def __getitem__ (self , key ):
22+ return getattr (self , key )
23+
24+ def to_dict (self ):
25+ return asdict (self )
26+
27+ @classmethod
28+ def from_dict (cls , data : dict ) -> "SocketBasicsConfig" :
29+ return cls (
30+ pythonSastEnabled = data .get ("pythonSastEnabled" , False ),
31+ golangSastEnabled = data .get ("golangSastEnabled" , False ),
32+ javascriptSastEnabled = data .get ("javascriptSastEnabled" , False ),
33+ secretScanningEnabled = data .get ("secretScanningEnabled" , False ),
34+ trivyImageEnabled = data .get ("trivyImageEnabled" , False ),
35+ trivyDockerfileEnabled = data .get ("trivyDockerfileEnabled" , False ),
36+ socketScanningEnabled = data .get ("socketScanningEnabled" , False ),
37+ socketScaEnabled = data .get ("socketScaEnabled" , False ),
38+ additionalParameters = data .get ("additionalParameters" , "" ),
39+ )
40+
41+
42+ @dataclass
43+ class SocketBasicsResponse :
44+ """Data class representing the response from Socket Basics API calls."""
45+ success : bool
46+ status : int
47+ config : Optional [SocketBasicsConfig ] = None
48+ message : Optional [str ] = None
49+
50+ def __getitem__ (self , key ):
51+ return getattr (self , key )
52+
53+ def to_dict (self ):
54+ return asdict (self )
55+
56+ @classmethod
57+ def from_dict (cls , data : dict ) -> "SocketBasicsResponse" :
58+ return cls (
59+ config = SocketBasicsConfig .from_dict (data ) if data else None ,
60+ success = True ,
61+ status = 200 ,
62+ )
63+
64+
65+ class Basics :
66+ """
67+ Socket Basics API client for managing CI/CD security scanning configurations.
68+
69+ Socket Basics is a security scanning suite that includes:
70+ - SAST (Static Application Security Testing) for Python, Go, and JavaScript
71+ - Secret scanning for hardcoded credentials
72+ - Container security for Docker images and Dockerfiles
73+ - Socket SCA dependency scanning
74+ """
75+
76+ def __init__ (self , api ):
77+ self .api = api
78+
79+ def get_config (
80+ self , org_slug : str , use_types : bool = False
81+ ) -> Union [dict , SocketBasicsResponse ]:
82+ """
83+ Get Socket Basics configuration for an organization.
84+
85+ Args:
86+ org_slug: Organization slug
87+ use_types: Whether to return typed response objects (default: False)
88+
89+ Returns:
90+ dict or SocketBasicsResponse: Configuration settings for Socket Basics
91+
92+ Example:
93+ >>> basics = socketdev_client.basics
94+ >>> config = basics.get_config("my-org")
95+ >>> print(config["pythonSastEnabled"])
96+
97+ >>> # Using typed response
98+ >>> response = basics.get_config("my-org", use_types=True)
99+ >>> print(response.config.pythonSastEnabled)
100+ """
101+ path = f"orgs/{ org_slug } /settings/socket-basics"
102+ response = self .api .do_request (path = path , method = "GET" )
103+
104+ if response .status_code == 200 :
105+ config_data = response .json ()
106+ if use_types :
107+ return SocketBasicsResponse .from_dict (config_data )
108+ return config_data
109+
110+ error_message = response .json ().get ("error" , {}).get ("message" , "Unknown error" )
111+ log .error (f"Failed to get Socket Basics configuration: { response .status_code } , message: { error_message } " )
112+
113+ if use_types :
114+ return SocketBasicsResponse (
115+ success = False ,
116+ status = response .status_code ,
117+ config = None ,
118+ message = error_message
119+ )
120+ return {}
0 commit comments