pwn 0.5.708 → 0.5.709

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. checksums.yaml +4 -4
  2. data/documentation/Installation.md +1 -0
  3. data/etc/default_skills/pwn/ai/agent/extrospection/osint/bridges/SKILL.md +30 -8
  4. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/SKILL.md +30 -8
  5. data/etc/default_skills/pwn/ai/agent/extrospection/osint/social/references/urls.md +1 -1
  6. data/etc/default_skills/pwn/ai/agent/extrospection/references/urls.md +0 -1
  7. data/etc/default_skills/pwn/memory_index/SKILL.md +0 -4
  8. data/etc/default_skills/pwn/plugins/aflplusplus/SKILL.md +48 -0
  9. data/etc/default_skills/pwn/plugins/android/SKILL.md +1 -0
  10. data/etc/default_skills/pwn/plugins/artifact_registry/SKILL.md +49 -0
  11. data/etc/default_skills/pwn/plugins/binary_parser/SKILL.md +54 -0
  12. data/etc/default_skills/pwn/plugins/credential_attack/SKILL.md +51 -0
  13. data/etc/default_skills/pwn/plugins/doctor/SKILL.md +57 -0
  14. data/etc/default_skills/pwn/plugins/exploit_dev/SKILL.md +61 -0
  15. data/etc/default_skills/pwn/plugins/frida/SKILL.md +49 -0
  16. data/etc/default_skills/pwn/plugins/gdb/SKILL.md +52 -0
  17. data/etc/default_skills/pwn/plugins/jobs/SKILL.md +51 -0
  18. data/etc/default_skills/pwn/plugins/nuclei/SKILL.md +48 -0
  19. data/etc/default_skills/pwn/plugins/process_tube/SKILL.md +52 -0
  20. data/etc/default_skills/pwn/plugins/radare2/SKILL.md +59 -0
  21. data/etc/default_skills/pwn/plugins/recon/SKILL.md +55 -0
  22. data/etc/default_skills/pwn/plugins/recon/references/urls.md +5 -0
  23. data/etc/default_skills/pwn/plugins/sqlmap/SKILL.md +48 -0
  24. data/etc/default_skills/pwn/plugins/transparent_browser/SKILL.md +0 -4
  25. data/etc/default_skills/pwn/plugins/volatility/SKILL.md +48 -0
  26. data/lib/pwn/ai/agent/assembly.rb +4 -1
  27. data/lib/pwn/ai/agent/btc.rb +4 -1
  28. data/lib/pwn/ai/agent/burp_suite.rb +5 -2
  29. data/lib/pwn/ai/agent/curriculum.rb +89 -30
  30. data/lib/pwn/ai/agent/dispatch.rb +27 -16
  31. data/lib/pwn/ai/agent/extrospection/osint/bridges.rb +9 -18
  32. data/lib/pwn/ai/agent/extrospection/osint/social.rb +9 -18
  33. data/lib/pwn/ai/agent/extrospection.rb +185 -60
  34. data/lib/pwn/ai/agent/gqrx.rb +4 -1
  35. data/lib/pwn/ai/agent/hacker_one.rb +5 -2
  36. data/lib/pwn/ai/agent/learning.rb +142 -25
  37. data/lib/pwn/ai/agent/loop.rb +53 -46
  38. data/lib/pwn/ai/agent/metrics.rb +133 -23
  39. data/lib/pwn/ai/agent/mistakes.rb +126 -17
  40. data/lib/pwn/ai/agent/open_goal.rb +25 -9
  41. data/lib/pwn/ai/agent/policy.rb +158 -18
  42. data/lib/pwn/ai/agent/prompt_builder.rb +21 -11
  43. data/lib/pwn/ai/agent/prompt_cache.rb +44 -13
  44. data/lib/pwn/ai/agent/reflect.rb +9 -5
  45. data/lib/pwn/ai/agent/registry.rb +65 -12
  46. data/lib/pwn/ai/agent/result.rb +19 -10
  47. data/lib/pwn/ai/agent/reward.rb +150 -32
  48. data/lib/pwn/ai/agent/sast.rb +4 -1
  49. data/lib/pwn/ai/agent/swarm.rb +72 -36
  50. data/lib/pwn/ai/agent/task_summarizer.rb +165 -36
  51. data/lib/pwn/ai/agent/tool_guard.rb +105 -6
  52. data/lib/pwn/ai/agent/transparent_browser.rb +4 -1
  53. data/lib/pwn/ai/agent/turn_finalizer.rb +41 -21
  54. data/lib/pwn/ai/agent/vuln_gen.rb +6 -3
  55. data/lib/pwn/ai/agent.rb +4 -0
  56. data/lib/pwn/ai/anthropic.rb +41 -7
  57. data/lib/pwn/ai/gemini.rb +21 -11
  58. data/lib/pwn/ai/grok.rb +44 -6
  59. data/lib/pwn/ai/http_retry.rb +40 -12
  60. data/lib/pwn/ai/ollama.rb +19 -10
  61. data/lib/pwn/ai/open_ai.rb +81 -30
  62. data/lib/pwn/ai/open_web_ui.rb +20 -14
  63. data/lib/pwn/ai/red_team/agent_protocol_abuse.rb +7 -1
  64. data/lib/pwn/ai/red_team/data_and_model_poisoning.rb +7 -1
  65. data/lib/pwn/ai/red_team/excessive_agency.rb +7 -1
  66. data/lib/pwn/ai/red_team/hidden_context_exposure.rb +7 -1
  67. data/lib/pwn/ai/red_team/insecure_output_handling.rb +7 -1
  68. data/lib/pwn/ai/red_team/jailbreak.rb +7 -1
  69. data/lib/pwn/ai/red_team/memory_poisoning.rb +7 -1
  70. data/lib/pwn/ai/red_team/multimodal_injection.rb +7 -1
  71. data/lib/pwn/ai/red_team/overreliance.rb +7 -1
  72. data/lib/pwn/ai/red_team/payload_splitting.rb +7 -1
  73. data/lib/pwn/ai/red_team/prompt_injection.rb +7 -1
  74. data/lib/pwn/ai/red_team/rag_poisoning.rb +7 -1
  75. data/lib/pwn/ai/red_team/sensitive_information_disclosure.rb +7 -1
  76. data/lib/pwn/ai/red_team/supply_chain.rb +7 -1
  77. data/lib/pwn/ai/red_team/system_prompt_extraction.rb +7 -1
  78. data/lib/pwn/ai/red_team/test_case_engine.rb +12 -9
  79. data/lib/pwn/ai/red_team/token_smuggling.rb +7 -1
  80. data/lib/pwn/ai/red_team/unbounded_consumption.rb +7 -1
  81. data/lib/pwn/ai/red_team/vector_and_embedding_weaknesses.rb +7 -1
  82. data/lib/pwn/ai/red_team.rb +4 -0
  83. data/lib/pwn/ai.rb +4 -0
  84. data/lib/pwn/aws/acm.rb +5 -2
  85. data/lib/pwn/aws/api_gateway.rb +10 -7
  86. data/lib/pwn/aws/app_stream.rb +5 -2
  87. data/lib/pwn/aws/application_auto_scaling.rb +5 -2
  88. data/lib/pwn/aws/application_discovery_service.rb +5 -2
  89. data/lib/pwn/aws/auto_scaling.rb +5 -2
  90. data/lib/pwn/aws/batch.rb +5 -2
  91. data/lib/pwn/aws/budgets.rb +5 -2
  92. data/lib/pwn/aws/cloud_formation.rb +5 -2
  93. data/lib/pwn/aws/cloud_front.rb +7 -4
  94. data/lib/pwn/aws/cloud_hsm.rb +5 -2
  95. data/lib/pwn/aws/cloud_search.rb +5 -2
  96. data/lib/pwn/aws/cloud_search_domain.rb +5 -2
  97. data/lib/pwn/aws/cloud_trail.rb +5 -2
  98. data/lib/pwn/aws/cloud_watch.rb +5 -2
  99. data/lib/pwn/aws/cloud_watch_events.rb +5 -2
  100. data/lib/pwn/aws/cloud_watch_logs.rb +5 -2
  101. data/lib/pwn/aws/code_build.rb +5 -2
  102. data/lib/pwn/aws/code_commit.rb +5 -2
  103. data/lib/pwn/aws/code_deploy.rb +5 -2
  104. data/lib/pwn/aws/code_pipeline.rb +5 -2
  105. data/lib/pwn/aws/cognito_identity.rb +5 -2
  106. data/lib/pwn/aws/cognito_identity_provider.rb +5 -2
  107. data/lib/pwn/aws/cognito_sync.rb +5 -2
  108. data/lib/pwn/aws/config_service.rb +5 -2
  109. data/lib/pwn/aws/data_pipleline.rb +5 -2
  110. data/lib/pwn/aws/database_migration_service.rb +5 -2
  111. data/lib/pwn/aws/device_farm.rb +5 -2
  112. data/lib/pwn/aws/direct_connect.rb +5 -2
  113. data/lib/pwn/aws/directory_service.rb +5 -2
  114. data/lib/pwn/aws/dynamo_db.rb +5 -2
  115. data/lib/pwn/aws/dynamo_db_streams.rb +5 -2
  116. data/lib/pwn/aws/ec2.rb +5 -2
  117. data/lib/pwn/aws/ecr.rb +5 -2
  118. data/lib/pwn/aws/ecs.rb +5 -2
  119. data/lib/pwn/aws/efs.rb +5 -2
  120. data/lib/pwn/aws/elasti_cache.rb +5 -2
  121. data/lib/pwn/aws/elastic_beanstalk.rb +8 -5
  122. data/lib/pwn/aws/elastic_load_balancing.rb +5 -2
  123. data/lib/pwn/aws/elastic_load_balancing_v2.rb +6 -3
  124. data/lib/pwn/aws/elastic_transcoder.rb +5 -2
  125. data/lib/pwn/aws/elasticsearch_service.rb +5 -2
  126. data/lib/pwn/aws/emr.rb +5 -2
  127. data/lib/pwn/aws/firehose.rb +5 -2
  128. data/lib/pwn/aws/game_lift.rb +5 -2
  129. data/lib/pwn/aws/glacier.rb +6 -3
  130. data/lib/pwn/aws/health.rb +5 -2
  131. data/lib/pwn/aws/iam.rb +10 -4
  132. data/lib/pwn/aws/import_export.rb +5 -2
  133. data/lib/pwn/aws/inspector.rb +5 -2
  134. data/lib/pwn/aws/iot.rb +5 -2
  135. data/lib/pwn/aws/iot_data_plane.rb +5 -2
  136. data/lib/pwn/aws/kinesis.rb +5 -2
  137. data/lib/pwn/aws/kinesis_analytics.rb +5 -2
  138. data/lib/pwn/aws/kms.rb +5 -2
  139. data/lib/pwn/aws/lambda.rb +5 -2
  140. data/lib/pwn/aws/lambda_preview.rb +5 -2
  141. data/lib/pwn/aws/lex.rb +5 -2
  142. data/lib/pwn/aws/lightsail.rb +5 -2
  143. data/lib/pwn/aws/machine_learning.rb +5 -2
  144. data/lib/pwn/aws/marketplace_commerce_analytics.rb +5 -2
  145. data/lib/pwn/aws/marketplace_metering.rb +5 -2
  146. data/lib/pwn/aws/ops_works.rb +5 -2
  147. data/lib/pwn/aws/ops_works_cm.rb +5 -2
  148. data/lib/pwn/aws/pinpoint.rb +5 -2
  149. data/lib/pwn/aws/polly.rb +5 -2
  150. data/lib/pwn/aws/rds.rb +5 -2
  151. data/lib/pwn/aws/redshift.rb +5 -2
  152. data/lib/pwn/aws/rekognition.rb +5 -2
  153. data/lib/pwn/aws/route53.rb +5 -2
  154. data/lib/pwn/aws/route53_domains.rb +5 -2
  155. data/lib/pwn/aws/s3.rb +5 -2
  156. data/lib/pwn/aws/service_catalog.rb +5 -2
  157. data/lib/pwn/aws/ses.rb +5 -2
  158. data/lib/pwn/aws/shield.rb +5 -2
  159. data/lib/pwn/aws/simple_db.rb +5 -2
  160. data/lib/pwn/aws/sms.rb +5 -2
  161. data/lib/pwn/aws/snowball.rb +5 -2
  162. data/lib/pwn/aws/sns.rb +5 -2
  163. data/lib/pwn/aws/sqs.rb +5 -2
  164. data/lib/pwn/aws/ssm.rb +5 -2
  165. data/lib/pwn/aws/states.rb +5 -2
  166. data/lib/pwn/aws/storage_gateway.rb +5 -2
  167. data/lib/pwn/aws/sts.rb +4 -1
  168. data/lib/pwn/aws/support.rb +5 -2
  169. data/lib/pwn/aws/swf.rb +5 -2
  170. data/lib/pwn/aws/waf.rb +5 -2
  171. data/lib/pwn/aws/waf_regional.rb +5 -2
  172. data/lib/pwn/aws/workspaces.rb +5 -2
  173. data/lib/pwn/aws/x_ray.rb +5 -2
  174. data/lib/pwn/aws.rb +4 -0
  175. data/lib/pwn/banner/anon.rb +3 -0
  176. data/lib/pwn/banner/bubble.rb +3 -0
  177. data/lib/pwn/banner/cheshire.rb +3 -0
  178. data/lib/pwn/banner/code_cave.rb +3 -0
  179. data/lib/pwn/banner/dont_panic.rb +3 -0
  180. data/lib/pwn/banner/f_society.rb +3 -0
  181. data/lib/pwn/banner/fork_bomb.rb +3 -0
  182. data/lib/pwn/banner/jmp_esp.rb +3 -0
  183. data/lib/pwn/banner/matrix.rb +5 -1
  184. data/lib/pwn/banner/ninja.rb +3 -0
  185. data/lib/pwn/banner/off_the_air.rb +3 -0
  186. data/lib/pwn/banner/pirate.rb +3 -0
  187. data/lib/pwn/banner/radare2.rb +3 -0
  188. data/lib/pwn/banner/radare2_ai.rb +3 -0
  189. data/lib/pwn/banner/white_rabbit.rb +3 -0
  190. data/lib/pwn/banner.rb +6 -2
  191. data/lib/pwn/blockchain/btc.rb +8 -3
  192. data/lib/pwn/blockchain/eth.rb +10 -3
  193. data/lib/pwn/blockchain.rb +4 -0
  194. data/lib/pwn/bounty/lifecycle_authz_replay.rb +46 -27
  195. data/lib/pwn/bounty.rb +4 -0
  196. data/lib/pwn/config.rb +79 -13
  197. data/lib/pwn/cron.rb +297 -20
  198. data/lib/pwn/driver.rb +2 -18
  199. data/lib/pwn/ffi/adalm_pluto.rb +65 -11
  200. data/lib/pwn/ffi/fftw.rb +31 -6
  201. data/lib/pwn/ffi/hack_rf.rb +59 -8
  202. data/lib/pwn/ffi/liquid.rb +63 -10
  203. data/lib/pwn/ffi/rtl_sdr.rb +35 -5
  204. data/lib/pwn/ffi/soapy_sdr.rb +60 -10
  205. data/lib/pwn/ffi/stdio.rb +5 -8
  206. data/lib/pwn/ffi/volk.rb +36 -7
  207. data/lib/pwn/ffi.rb +12 -0
  208. data/lib/pwn/memory.rb +136 -16
  209. data/lib/pwn/memory_index.rb +34 -19
  210. data/lib/pwn/migrate.rb +34 -24
  211. data/lib/pwn/module_skills.rb +39 -8
  212. data/lib/pwn/plugins/aflplusplus.rb +52 -0
  213. data/lib/pwn/plugins/android.rb +65 -245
  214. data/lib/pwn/plugins/artifact_registry.rb +71 -0
  215. data/lib/pwn/plugins/assembly.rb +9 -4
  216. data/lib/pwn/plugins/authentication_helper.rb +8 -5
  217. data/lib/pwn/plugins/baresip.rb +59 -12
  218. data/lib/pwn/plugins/basic_auth.rb +9 -3
  219. data/lib/pwn/plugins/beef.rb +28 -18
  220. data/lib/pwn/plugins/binary_parser.rb +133 -0
  221. data/lib/pwn/plugins/black_duck_binary_analysis.rb +63 -39
  222. data/lib/pwn/plugins/burp_suite.rb +98 -68
  223. data/lib/pwn/plugins/bus_pirate.rb +15 -8
  224. data/lib/pwn/plugins/char.rb +33 -3
  225. data/lib/pwn/plugins/credential_attack.rb +99 -0
  226. data/lib/pwn/plugins/credit_card.rb +6 -1
  227. data/lib/pwn/plugins/dao_ldap.rb +19 -13
  228. data/lib/pwn/plugins/dao_mongo.rb +11 -5
  229. data/lib/pwn/plugins/dao_postgres.rb +28 -19
  230. data/lib/pwn/plugins/dao_sqlite3.rb +15 -6
  231. data/lib/pwn/plugins/defect_dojo.rb +38 -22
  232. data/lib/pwn/plugins/detect_os.rb +5 -0
  233. data/lib/pwn/plugins/doctor.rb +149 -0
  234. data/lib/pwn/plugins/ein.rb +3 -0
  235. data/lib/pwn/plugins/exploit_dev.rb +264 -0
  236. data/lib/pwn/plugins/file_fu.rb +11 -8
  237. data/lib/pwn/plugins/frida.rb +61 -0
  238. data/lib/pwn/plugins/fuzz.rb +9 -6
  239. data/lib/pwn/plugins/gdb.rb +95 -0
  240. data/lib/pwn/plugins/git.rb +19 -14
  241. data/lib/pwn/plugins/github.rb +38 -15
  242. data/lib/pwn/plugins/google_workspace.rb +188 -45
  243. data/lib/pwn/plugins/hacker_one.rb +159 -35
  244. data/lib/pwn/plugins/hunter.rb +6 -3
  245. data/lib/pwn/plugins/ip_info.rb +9 -4
  246. data/lib/pwn/plugins/irc.rb +28 -15
  247. data/lib/pwn/plugins/jenkins.rb +65 -57
  248. data/lib/pwn/plugins/jira_data_center.rb +30 -22
  249. data/lib/pwn/plugins/jobs.rb +109 -0
  250. data/lib/pwn/plugins/json_pathify.rb +9 -5
  251. data/lib/pwn/plugins/log.rb +113 -13
  252. data/lib/pwn/plugins/mail_agent.rb +87 -79
  253. data/lib/pwn/plugins/metasploit.rb +11 -6
  254. data/lib/pwn/plugins/monkey_patch.rb +3 -0
  255. data/lib/pwn/plugins/msr206.rb +42 -28
  256. data/lib/pwn/plugins/nessus_cloud.rb +44 -4
  257. data/lib/pwn/plugins/nexpose_vuln_scan.rb +40 -24
  258. data/lib/pwn/plugins/nmap_it.rb +14 -34
  259. data/lib/pwn/plugins/nuclei.rb +57 -0
  260. data/lib/pwn/plugins/oauth2.rb +11 -5
  261. data/lib/pwn/plugins/ocr.rb +3 -0
  262. data/lib/pwn/plugins/open_api.rb +5 -2
  263. data/lib/pwn/plugins/openvas.rb +33 -25
  264. data/lib/pwn/plugins/packet.rb +152 -31
  265. data/lib/pwn/plugins/pdf_parse.rb +5 -2
  266. data/lib/pwn/plugins/pony.rb +86 -1
  267. data/lib/pwn/plugins/process_tube.rb +120 -0
  268. data/lib/pwn/plugins/ps.rb +7 -1
  269. data/lib/pwn/plugins/pwn_logger.rb +6 -2
  270. data/lib/pwn/plugins/rabbit_mq.rb +12 -7
  271. data/lib/pwn/plugins/radare2.rb +253 -0
  272. data/lib/pwn/plugins/recon.rb +161 -0
  273. data/lib/pwn/plugins/repl.rb +122 -1
  274. data/lib/pwn/plugins/scannable_codes.rb +5 -1
  275. data/lib/pwn/plugins/serial.rb +24 -14
  276. data/lib/pwn/plugins/shodan.rb +54 -35
  277. data/lib/pwn/plugins/slack_client.rb +11 -6
  278. data/lib/pwn/plugins/sock.rb +16 -8
  279. data/lib/pwn/plugins/spider.rb +5 -2
  280. data/lib/pwn/plugins/sqlmap.rb +49 -0
  281. data/lib/pwn/plugins/ssn.rb +3 -0
  282. data/lib/pwn/plugins/thread_pool.rb +6 -9
  283. data/lib/pwn/plugins/tor.rb +9 -4
  284. data/lib/pwn/plugins/transparent_browser.rb +62 -107
  285. data/lib/pwn/plugins/tty_spinner.rb +16 -2
  286. data/lib/pwn/plugins/twitter_api.rb +6 -2
  287. data/lib/pwn/plugins/uri_scheme.rb +4 -1
  288. data/lib/pwn/plugins/vault.rb +12 -3
  289. data/lib/pwn/plugins/vin.rb +24 -12
  290. data/lib/pwn/plugins/voice.rb +7 -2
  291. data/lib/pwn/plugins/volatility.rb +48 -0
  292. data/lib/pwn/plugins/vsphere.rb +9 -5
  293. data/lib/pwn/plugins/xxd.rb +12 -43
  294. data/lib/pwn/plugins/zaproxy.rb +30 -16
  295. data/lib/pwn/plugins.rb +19 -0
  296. data/lib/pwn/reports/ai_red_team.rb +6 -2
  297. data/lib/pwn/reports/csv.rb +8 -1
  298. data/lib/pwn/reports/fuzz.rb +5 -2
  299. data/lib/pwn/reports/html.rb +8 -1
  300. data/lib/pwn/reports/html_footer.rb +4 -3
  301. data/lib/pwn/reports/html_header.rb +6 -2
  302. data/lib/pwn/reports/json.rb +8 -1
  303. data/lib/pwn/reports/markdown.rb +8 -1
  304. data/lib/pwn/reports/pdf.rb +8 -1
  305. data/lib/pwn/reports/phone.rb +5 -2
  306. data/lib/pwn/reports/sast.rb +6 -2
  307. data/lib/pwn/reports/uri_buster.rb +5 -2
  308. data/lib/pwn/reports/xml.rb +8 -1
  309. data/lib/pwn/reports.rb +19 -0
  310. data/lib/pwn/sast/amqp_connect_as_guest.rb +9 -3
  311. data/lib/pwn/sast/apache_file_system_util_api.rb +9 -3
  312. data/lib/pwn/sast/aws.rb +9 -3
  313. data/lib/pwn/sast/banned_function_calls_c.rb +9 -3
  314. data/lib/pwn/sast/base64.rb +9 -3
  315. data/lib/pwn/sast/beef_hook.rb +9 -3
  316. data/lib/pwn/sast/cmd_execution_go_lang.rb +9 -3
  317. data/lib/pwn/sast/cmd_execution_java.rb +9 -3
  318. data/lib/pwn/sast/cmd_execution_python.rb +9 -3
  319. data/lib/pwn/sast/cmd_execution_ruby.rb +9 -3
  320. data/lib/pwn/sast/cmd_execution_scala.rb +9 -3
  321. data/lib/pwn/sast/csrf.rb +9 -3
  322. data/lib/pwn/sast/deserial_java.rb +9 -3
  323. data/lib/pwn/sast/emoticon.rb +9 -3
  324. data/lib/pwn/sast/eval.rb +9 -3
  325. data/lib/pwn/sast/factory.rb +9 -3
  326. data/lib/pwn/sast/http_authorization_header.rb +9 -3
  327. data/lib/pwn/sast/inner_html.rb +9 -3
  328. data/lib/pwn/sast/keystore.rb +9 -3
  329. data/lib/pwn/sast/local_storage.rb +9 -3
  330. data/lib/pwn/sast/location_hash.rb +9 -3
  331. data/lib/pwn/sast/log4j.rb +9 -3
  332. data/lib/pwn/sast/logger.rb +9 -3
  333. data/lib/pwn/sast/md5.rb +9 -3
  334. data/lib/pwn/sast/outer_html.rb +9 -3
  335. data/lib/pwn/sast/padding_oracle.rb +9 -3
  336. data/lib/pwn/sast/password.rb +9 -3
  337. data/lib/pwn/sast/php_input_mechanisms.rb +9 -3
  338. data/lib/pwn/sast/php_type_juggling.rb +9 -3
  339. data/lib/pwn/sast/pom_version.rb +9 -3
  340. data/lib/pwn/sast/port.rb +9 -3
  341. data/lib/pwn/sast/post_message.rb +9 -3
  342. data/lib/pwn/sast/private_key.rb +9 -3
  343. data/lib/pwn/sast/redirect.rb +9 -3
  344. data/lib/pwn/sast/redos.rb +9 -3
  345. data/lib/pwn/sast/shell.rb +9 -3
  346. data/lib/pwn/sast/signature.rb +9 -3
  347. data/lib/pwn/sast/sql.rb +9 -3
  348. data/lib/pwn/sast/ssl.rb +9 -3
  349. data/lib/pwn/sast/sudo.rb +9 -3
  350. data/lib/pwn/sast/task_tag.rb +9 -3
  351. data/lib/pwn/sast/test_case_engine.rb +11 -7
  352. data/lib/pwn/sast/throw_errors.rb +9 -3
  353. data/lib/pwn/sast/token.rb +9 -3
  354. data/lib/pwn/sast/type_script_type_juggling.rb +9 -3
  355. data/lib/pwn/sast/use_after_free.rb +9 -3
  356. data/lib/pwn/sast/version.rb +9 -3
  357. data/lib/pwn/sast/window_location_hash.rb +9 -3
  358. data/lib/pwn/sast.rb +4 -0
  359. data/lib/pwn/sdr/decoder/adsb.rb +36 -5
  360. data/lib/pwn/sdr/decoder/apt.rb +9 -6
  361. data/lib/pwn/sdr/decoder/base.rb +74 -22
  362. data/lib/pwn/sdr/decoder/bluetooth.rb +17 -5
  363. data/lib/pwn/sdr/decoder/dect.rb +12 -3
  364. data/lib/pwn/sdr/decoder/dsp.rb +229 -39
  365. data/lib/pwn/sdr/decoder/flex.rb +59 -11
  366. data/lib/pwn/sdr/decoder/gps.rb +12 -3
  367. data/lib/pwn/sdr/decoder/gsm.rb +24 -4
  368. data/lib/pwn/sdr/decoder/iridium.rb +12 -3
  369. data/lib/pwn/sdr/decoder/lora.rb +13 -4
  370. data/lib/pwn/sdr/decoder/lte.rb +27 -3
  371. data/lib/pwn/sdr/decoder/morse.rb +12 -3
  372. data/lib/pwn/sdr/decoder/p25.rb +12 -3
  373. data/lib/pwn/sdr/decoder/pager.rb +8 -5
  374. data/lib/pwn/sdr/decoder/pocsag.rb +29 -9
  375. data/lib/pwn/sdr/decoder/rds.rb +14 -8
  376. data/lib/pwn/sdr/decoder/rfid.rb +12 -3
  377. data/lib/pwn/sdr/decoder/rtl433.rb +12 -3
  378. data/lib/pwn/sdr/decoder/rtty.rb +8 -5
  379. data/lib/pwn/sdr/decoder/wifi.rb +12 -3
  380. data/lib/pwn/sdr/decoder/zigbee.rb +12 -3
  381. data/lib/pwn/sdr/decoder.rb +9 -0
  382. data/lib/pwn/sdr/flipper_zero.rb +17 -10
  383. data/lib/pwn/sdr/frequency_allocation.rb +4 -1
  384. data/lib/pwn/sdr/gqrx.rb +178 -119
  385. data/lib/pwn/sdr/rfidler.rb +4 -1
  386. data/lib/pwn/sdr/son_micro_rfid.rb +37 -24
  387. data/lib/pwn/sdr.rb +14 -0
  388. data/lib/pwn/sessions.rb +86 -16
  389. data/lib/pwn/setup.rb +94 -37
  390. data/lib/pwn/version.rb +1 -1
  391. data/lib/pwn/www/app_cobalt_io.rb +11 -5
  392. data/lib/pwn/www/bing.rb +10 -5
  393. data/lib/pwn/www/bug_crowd.rb +11 -5
  394. data/lib/pwn/www/checkip.rb +8 -4
  395. data/lib/pwn/www/coinbase_pro.rb +11 -5
  396. data/lib/pwn/www/duckduckgo.rb +12 -6
  397. data/lib/pwn/www/facebook.rb +11 -5
  398. data/lib/pwn/www/github.rb +11 -5
  399. data/lib/pwn/www/google.rb +11 -5
  400. data/lib/pwn/www/hacker_one.rb +20 -9
  401. data/lib/pwn/www/linkedin.rb +11 -5
  402. data/lib/pwn/www/pandora.rb +11 -5
  403. data/lib/pwn/www/pastebin.rb +9 -4
  404. data/lib/pwn/www/paypal.rb +19 -11
  405. data/lib/pwn/www/synack.rb +11 -5
  406. data/lib/pwn/www/torch.rb +13 -8
  407. data/lib/pwn/www/trading_view.rb +11 -5
  408. data/lib/pwn/www/twitter.rb +11 -5
  409. data/lib/pwn/www/uber.rb +11 -5
  410. data/lib/pwn/www/upwork.rb +11 -5
  411. data/lib/pwn/www/wayback_machine.rb +12 -6
  412. data/lib/pwn/www/youtube.rb +10 -5
  413. data/lib/pwn/www.rb +4 -0
  414. data/spec/conventions_spec.rb +118 -2
  415. data/spec/lib/pwn/ai/agent/reward_spec.rb +9 -0
  416. data/spec/lib/pwn/plugins/aflplusplus_spec.rb +13 -0
  417. data/spec/lib/pwn/plugins/artifact_registry_spec.rb +13 -0
  418. data/spec/lib/pwn/plugins/binary_parser_spec.rb +21 -0
  419. data/spec/lib/pwn/plugins/credential_attack_spec.rb +13 -0
  420. data/spec/lib/pwn/plugins/doctor_spec.rb +23 -0
  421. data/spec/lib/pwn/plugins/exploit_dev_spec.rb +23 -0
  422. data/spec/lib/pwn/plugins/frida_spec.rb +13 -0
  423. data/spec/lib/pwn/plugins/gdb_spec.rb +13 -0
  424. data/spec/lib/pwn/plugins/jobs_spec.rb +13 -0
  425. data/spec/lib/pwn/plugins/nuclei_spec.rb +13 -0
  426. data/spec/lib/pwn/plugins/process_tube_spec.rb +13 -0
  427. data/spec/lib/pwn/plugins/radare2_spec.rb +13 -0
  428. data/spec/lib/pwn/plugins/recon_spec.rb +26 -0
  429. data/spec/lib/pwn/plugins/sqlmap_spec.rb +13 -0
  430. data/spec/lib/pwn/plugins/volatility_spec.rb +13 -0
  431. data/third_party/pwn_rdoc.jsonl +126 -5
  432. metadata +47 -3
  433. data/etc/default_skills/pwn/memory_index/references/urls.md +0 -4
  434. data/etc/default_skills/pwn/plugins/transparent_browser/references/urls.md +0 -3
@@ -116,27 +116,30 @@ module PWN
116
116
 
117
117
  public_class_method def self.help
118
118
  puts "USAGE:
119
+ # Run recurse in dir and return its result
119
120
  #{self}.recurse_in_dir(
120
- dir_path: 'optional path to dir defaults to .',
121
- include_extensions: 'optional - array of file extensions to search for in scan (e.g. ['.js', '.php'])',
122
- exclude_extensions: 'optional - array of file extensions to exclude from scan (e.g. ['.log', '.txt', '.spec'])'
123
- ) do |entry|
124
- puts entry
125
- end
121
+ dir_path: 'optional - optional path to dir defaults to .',
122
+ include_extensions: 'optional - array of file extensions to search for in scan (e.g. [.js, .php])',
123
+ exclude_extensions: 'optional - array of file extensions to exclude from scan (e.g. [.log, .txt, .spec])'
124
+ )
126
125
 
126
+ # Run untar gz file and return its result
127
127
  #{self}.untar_gz_file(
128
128
  tar_gz_file: 'required - path to .tar.gz file',
129
129
  destination: 'required - destination folder to save extracted contents'
130
130
  )
131
131
 
132
+ # Run shift file up and return its result
132
133
  #{self}.shift_file_up(
133
134
  path: 'required - path to file to shift up',
134
- bytes: 'required - number of bytes to shift up',
135
- buffer_size: 'optional - buffer size to use when shifting file up (default: 256 * 1024 / i.e 256KB)'
135
+ bytes: 'required - number of bytes to shift up (remove from beginning)',
136
+ buffer_size: 'optional - buffer size to use when shifting (default: 256KB)'
136
137
  )
137
138
 
139
+ # Print the AUTHOR(S) string for this module.
138
140
  #{self}.authors
139
141
  "
142
+ constants.sort
140
143
  end
141
144
  end
142
145
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module PWN
6
+ module Plugins
7
+ # Frida attach/spawn + script injection.
8
+ module Frida
9
+ public_class_method def self.required_bins
10
+ %w[frida]
11
+ end
12
+
13
+ public_class_method def self.ps(opts = {})
14
+ PWN::Plugins::Doctor.require_bin!(name: 'frida')
15
+ stdout, stderr, status = Open3.capture3('frida-ps', *Array(opts[:extra]))
16
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
17
+ end
18
+
19
+ public_class_method def self.attach(opts = {})
20
+ PWN::Plugins::Doctor.require_bin!(name: 'frida')
21
+ target = opts[:target] || opts[:name]
22
+ script = opts[:script].to_s
23
+ raise 'ERROR: target is required' if target.to_s.empty?
24
+
25
+ cmd = ['frida', '-n', target.to_s]
26
+ cmd += ['-l', opts[:script_path].to_s] if opts[:script_path]
27
+ cmd += ['-e', script] unless script.empty?
28
+ stdout, stderr, status = Open3.capture3(*cmd)
29
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
30
+ end
31
+
32
+ public_class_method def self.authors
33
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
34
+ end
35
+
36
+ public_class_method def self.help
37
+ puts "USAGE:
38
+ # List host binaries this module expects to be installed.
39
+ #{self}.required_bins
40
+
41
+ # Run ps and return its result
42
+ #{self}.ps(
43
+ extra: 'optional - Array extra value consumed by #ps'
44
+ )
45
+
46
+ # Run attach and return its result
47
+ #{self}.attach(
48
+ target: 'required - hostname, IP, or CIDR to scan (defaults to opts[:name])',
49
+ name: 'optional - binary or identifier name',
50
+ script: 'required - script value consumed by #attach',
51
+ script_path: 'optional - script path value consumed by #attach'
52
+ )
53
+
54
+ # Print the AUTHOR(S) string for this module.
55
+ #{self}.authors
56
+ "
57
+ constants.sort
58
+ end
59
+ end
60
+ end
61
+ end
@@ -183,13 +183,14 @@ module PWN
183
183
 
184
184
  public_class_method def self.help
185
185
  puts "USAGE:
186
- socket_fuzz_results_arr = #{self}.socket(
187
- target: 'required = target host or ip',
188
- port: 'required => target port',
189
- protocol: 'optional => :tcp || :udp (defaults to tcp)',
186
+ # Run socket and return its result
187
+ #{self}.socket(
188
+ target: 'required - target host or ip',
189
+ port: 'required - target port',
190
+ protocol: 'optional - :tcp || :udp (defaults to tcp)',
190
191
  tls: 'optional - boolean connect to target socket using TLS (defaults to false)',
191
- fuzz_delimeter: \"optional - fuzz delimeter used in request to specify where payloads should reside (defaults to \u2665)\",
192
- request: \"required - String object of socket request w/ \u2665 as fuzz delimeter (e.g. '\"GET /\u2665\u2665 HTTP/1.1\\r\\nHost: \u2665127.0.0.1\u2665\\r\\n\\r\\n\"')\",
192
+ fuzz_delimeter: 'optional - fuzz delimeter used in request to specify where payloads should reside (defaults to \\u2665)',
193
+ request: 'required - String object of socket request w/ \\u001A as fuzz delimeter (e.g. GET /\\u001A\\u001A HTTP/1.1\\r\\nHost: \\u001A127..0.0.1\\u001A\\r\\n\\r\\n)',
193
194
  payload: 'required - payload string',
194
195
  response_timeout: 'optional - float (defaults to 0.9)',
195
196
  request_rate_limit: 'optional - float (defaults to 0.3)',
@@ -198,8 +199,10 @@ module PWN
198
199
  char_encoding: 'optional - character encoding returned by PWN::Plugins::Char.list_encoders (defaults to UTF-8)'
199
200
  )
200
201
 
202
+ # Print the AUTHOR(S) string for this module.
201
203
  #{self}.authors
202
204
  "
205
+ constants.sort
203
206
  end
204
207
  end
205
208
  end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module PWN
6
+ module Plugins
7
+ # gdb/MI batch driver: run-to-crash, registers, mitigations, core dumps.
8
+ module GDB
9
+ public_class_method def self.required_bins
10
+ %w[gdb]
11
+ end
12
+
13
+ public_class_method def self.batch(opts = {})
14
+ PWN::Plugins::Doctor.require_bin!(name: 'gdb')
15
+ binary = opts[:binary].to_s
16
+ cmds = Array(opts[:commands] || opts[:cmds])
17
+ args = Array(opts[:args])
18
+ mi = ['gdb', '--batch', '--quiet']
19
+ mi += ['-ex', 'set pagination off']
20
+ cmds.each { |c| mi += ['-ex', c.to_s] }
21
+ mi << '--args' if !binary.empty? || args.any?
22
+ mi << binary unless binary.empty?
23
+ mi.concat(args.map(&:to_s))
24
+ stdout, stderr, status = Open3.capture3(*mi)
25
+ { stdout: stdout, stderr: stderr, exit: status.exitstatus }
26
+ end
27
+
28
+ public_class_method def self.run_to_crash(opts = {})
29
+ cmds = ['run', 'bt', 'info registers']
30
+ batch(opts.merge(commands: cmds))
31
+ end
32
+
33
+ public_class_method def self.registers(opts = {})
34
+ batch(opts.merge(commands: ['info registers']))
35
+ end
36
+
37
+ public_class_method def self.mitigations(opts = {})
38
+ batch(opts.merge(commands: ['checksec']))
39
+ rescue StandardError
40
+ path = opts[:binary].to_s
41
+ return { error: 'gdb missing' } unless PWN::Plugins::Doctor.bin?(name: 'gdb')
42
+
43
+ { hint: 'pwndbg/gef checksec not loaded', binary: path }
44
+ end
45
+
46
+ public_class_method def self.core(opts = {})
47
+ core = opts[:core].to_s
48
+ binary = opts[:binary].to_s
49
+ raise 'ERROR: core is required' if core.empty?
50
+
51
+ batch(opts.merge(commands: ['bt', 'info registers'], binary: binary, args: []))
52
+ end
53
+
54
+ public_class_method def self.authors
55
+ "AUTHOR(S):\n 0day Inc. <support@0dayinc.com>\n"
56
+ end
57
+
58
+ public_class_method def self.help
59
+ puts "USAGE:
60
+ # List host binaries this module expects to be installed.
61
+ #{self}.required_bins
62
+
63
+ # Run batch and return its result
64
+ #{self}.batch(
65
+ binary: 'required - binary value consumed by #batch',
66
+ commands: 'optional - commands value consumed by #batch',
67
+ cmds: 'optional - cmds value consumed by #batch',
68
+ args: 'required - Array args value consumed by #batch'
69
+ )
70
+
71
+ # Run run to crash and return its result
72
+ #{self}.run_to_crash
73
+
74
+ # Run registers and return its result
75
+ #{self}.registers
76
+
77
+ # Run mitigations and return its result
78
+ #{self}.mitigations(
79
+ binary: 'optional - binary value consumed by #mitigations'
80
+ )
81
+
82
+ # Run core and return its result
83
+ #{self}.core(
84
+ core: 'required - core value consumed by #core',
85
+ binary: 'optional - binary value consumed by #core'
86
+ )
87
+
88
+ # Print the AUTHOR(S) string for this module.
89
+ #{self}.authors
90
+ "
91
+ constants.sort
92
+ end
93
+ end
94
+ end
95
+ end
@@ -132,27 +132,32 @@ module PWN
132
132
  # Display Usage for this Module
133
133
 
134
134
  public_class_method def self.help
135
- puts %{USAGE:
136
- git_html_resp = #{self}.gen_html_diff(
137
- repo: 'required git repo name',
138
- branch: 'required git repo branch (e.g. master, develop, etc)',
139
- since: 'optional date, otherwise default to last pull'
135
+ puts "USAGE:
136
+ # Run gen html diff and return its result
137
+ #{self}.gen_html_diff(
138
+ repo: 'required - required git repo name',
139
+ branch: 'required - required git repo branch (e.g. master, develop, etc)',
140
+ since: 'optional - optional date, otherwise default to last pull'
140
141
  )
141
142
 
142
- author = #{self}.get_author(
143
- repo_root: 'optional path to git repo root (defaults to ".")'
144
- from_line: 'required line number to start in range',
145
- to_line: 'required line number to stop in range',
146
- target_file: 'required file in which line range is queried'
147
- entry_beautified: 'required boolean'
143
+ # Run dump all repo branches and return its result
144
+ #{self}.dump_all_repo_branches(
145
+ git_url: 'required - required git repo url'
148
146
  )
149
147
 
150
- all_repo_branches = #{self}.dump_all_repo_branches(
151
- git_url: 'required git repo url'
148
+ # Run get author and return its result
149
+ #{self}.get_author(
150
+ repo_root: 'optional - repo root value consumed by #get_author',
151
+ from_line: 'optional - from line value consumed by #get_author',
152
+ to_line: 'optional - to line value consumed by #get_author',
153
+ target_file: 'optional - target file value consumed by #get_author',
154
+ entry_beautified: 'optional - entry beautified value consumed by #get_author'
152
155
  )
153
156
 
157
+ # Print the AUTHOR(S) string for this module.
154
158
  #{self}.authors
155
- }
159
+ "
160
+ constants.sort
156
161
  end
157
162
  end
158
163
  end
@@ -235,6 +235,7 @@ module PWN
235
235
  gh_bin = ENV['PATH'].to_s.split(File::PATH_SEPARATOR)
236
236
  .map { |d| File.join(d, 'gh') }
237
237
  .find { |f| File.executable?(f) }
238
+ # Run api and return its result
238
239
  raise "ERROR: gh CLI not found on PATH - use #{self}.api(path:) instead, or install gh (https://cli.github.com)" unless gh_bin
239
240
 
240
241
  token = resolve_token(opts)
@@ -259,36 +260,58 @@ module PWN
259
260
 
260
261
  public_class_method def self.help
261
262
  puts "USAGE:
262
- response_json = #{self}.download_all_gists(
263
- username: 'optional - username of gists to download (default PWN::Env[:plugins][:github][:username])',
263
+ # Run download all gists and return its result
264
+ #{self}.download_all_gists(
265
+ username: 'optional - username of gists to backup (default PWN::Env[:plugins][:github][:username])',
264
266
  target_dir: 'required - target directory to save respective gists'
265
267
  )
266
268
 
267
- runs = #{self}.workflow_runs(
268
- owner: 'optional - default PWN::Env[:plugins][:github][:username]',
269
+ # Run workflow runs and return its result
270
+ #{self}.workflow_runs(
271
+ owner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',
269
272
  repo: 'required - repo name',
270
- workflow: 'optional - e.g. install-matrix.yml',
271
- params: 'optional - {branch:, status:, per_page:}'
273
+ workflow: 'optional - workflow file name or id (e.g. install-matrix.yml). Omit for all runs.',
274
+ params: 'optional - {branch:, status:, per_page:, page:}',
275
+ token: 'optional - token value consumed by #workflow_runs'
272
276
  )
273
277
 
274
- jobs = #{self}.workflow_run_jobs(
275
- owner: 'optional', repo: 'required', run_id: 'required'
278
+ # Run workflow run jobs and return its result
279
+ #{self}.workflow_run_jobs(
280
+ owner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',
281
+ repo: 'required - repo name',
282
+ run_id: 'required - workflow run id',
283
+ params: 'optional - params value consumed by #workflow_run_jobs',
284
+ token: 'optional - token value consumed by #workflow_run_jobs'
276
285
  )
277
286
 
278
- log = #{self}.job_log(
279
- owner: 'optional', repo: 'required', job_id: 'required'
287
+ # Run job log and return its result
288
+ #{self}.job_log(
289
+ owner: 'required - repo owner (default PWN::Env[:plugins][:github][:username])',
290
+ repo: 'required - repo name',
291
+ job_id: 'required - job id from workflow_run_jobs',
292
+ token: 'optional - token value consumed by #job_log'
280
293
  )
281
294
 
282
- json = #{self}.api(
283
- path: 'required - e.g. repos/0dayinc/pwn/releases/latest',
284
- method: 'optional - :get|:post|:put|:patch|:delete',
285
- params: 'optional', body: 'optional', raw: 'optional'
295
+ # Run api and return its result
296
+ #{self}.api(
297
+ path: 'required - REST path relative to https://api.github.com (e.g. repos/0dayinc/pwn/releases/latest)',
298
+ method: 'optional - :get|:post|:put|:patch|:delete (default :get)',
299
+ params: 'optional - query params Hash',
300
+ body: 'optional - request body Hash/Array/String for POST/PUT/PATCH',
301
+ token: 'optional - PAT (default PWN::Env[:plugins][:github][:personal_access_token])',
302
+ raw: 'optional - return raw RestClient::Response instead of parsed JSON (default false)'
286
303
  )
287
304
 
288
- #{self}.gh(cmd: 'run view <run_id> -R <owner>/<repo> --log-failed')
305
+ # Thin wrapper around the `gh` CLI with GH_TOKEN injected from PWN::Env so
306
+ #{self}.gh(
307
+ cmd: 'required - gh subcommand string, e.g. run list -R 0dayinc/pwn -L 5 --json databaseId,status',
308
+ token: 'optional - PAT (default PWN::Env[:plugins][:github][:personal_access_token])'
309
+ )
289
310
 
311
+ # Print the AUTHOR(S) string for this module.
290
312
  #{self}.authors
291
313
  "
314
+ constants.sort
292
315
  end
293
316
  end
294
317
  end
@@ -876,51 +876,194 @@ module PWN
876
876
  end
877
877
 
878
878
  public_class_method def self.help
879
- puts <<~USAGE
880
- USAGE:
881
- # OAuth (Desktop client from Google Cloud Console)
882
- # authorize the printed URL; refresh/bearer persist to Env + pwn.yaml
883
- #{self}.obtain_oauth_auth_url(services: 'email,calendar')
884
- #{self}.obtain_oauth_auth_url(wait: false) # URL only; no listener
885
- #{self}.exchange_oauth_code(code: 'optional paste fallback')
886
- #{self}.authenticated?
887
- #{self}.revoke
888
-
889
- # Gmail
890
- #{self}.gmail_search(query: 'is:unread', max: 10)
891
- #{self}.gmail_get(id: 'MESSAGE_ID')
892
- #{self}.gmail_send(to: 'a@b.com', subject: 'Hi', body: '...')
893
- #{self}.gmail_reply(id: 'MESSAGE_ID', body: 'Thanks')
894
- #{self}.gmail_labels
895
- #{self}.gmail_modify(id: 'MESSAGE_ID', add_labels: ['STARRED'], remove_labels: ['UNREAD'])
896
-
897
- # Calendar
898
- #{self}.calendar_list(start: '2026-03-01T00:00:00Z')
899
- #{self}.calendar_create(summary: 'Standup', start: '2026-03-01T10:00:00-06:00', end: '2026-03-01T10:30:00-06:00')
900
- #{self}.calendar_update(id: 'EVENT_ID', summary: 'Standup (moved)')
901
- #{self}.calendar_delete(id: 'EVENT_ID')
902
-
903
- # Drive
904
- #{self}.drive_search(query: 'quarterly report')
905
- #{self}.drive_get(id: 'FILE_ID')
906
- #{self}.drive_upload(path: '/tmp/report.pdf')
907
- #{self}.drive_download(id: 'FILE_ID', output: '/tmp/out.pdf')
908
- #{self}.drive_create_folder(name: 'Reports')
909
- #{self}.drive_share(id: 'FILE_ID', email: 'a@b.com', role: 'reader')
910
- #{self}.drive_delete(id: 'FILE_ID')
911
-
912
- # Docs / Sheets
913
- #{self}.docs_create(title: 'Notes', body: 'Hello')
914
- #{self}.docs_get(id: 'DOC_ID')
915
- #{self}.docs_append(id: 'DOC_ID', text: ' more')
916
- #{self}.sheets_create(title: 'Budget')
917
- #{self}.sheets_get(id: 'SHEET_ID', range: 'Sheet1!A1:D10')
918
- #{self}.sheets_update(id: 'SHEET_ID', range: 'Sheet1!A1', values: [['Name']])
919
- #{self}.sheets_append(id: 'SHEET_ID', range: 'Sheet1!A:C', values: [['a', 'b', 'c']])
920
-
921
- Config: PWN::Env[:plugins][:google_workspace][:oauth]
922
- #{self}.authors
923
- USAGE
879
+ puts "USAGE:
880
+ # Run scopes and return its result
881
+ #{self}.scopes(
882
+ scope: 'optional - scope value consumed by #scopes',
883
+ services: 'optional - services value consumed by #scopes'
884
+ )
885
+
886
+ # Run parse oauth code and return its result
887
+ #{self}.parse_oauth_code(
888
+ code: 'optional - code value consumed by #parse_oauth_code'
889
+ )
890
+
891
+ # Run obtain oauth auth url and return its result
892
+ #{self}.obtain_oauth_auth_url(
893
+ wait: 'optional - wait value consumed by #obtain_oauth_auth_url',
894
+ timeout: 'optional - seconds to wait before giving up',
895
+ probe: 'optional - probe value consumed by #obtain_oauth_auth_url'
896
+ )
897
+
898
+ # Run exchange oauth code and return its result
899
+ #{self}.exchange_oauth_code(
900
+ code: 'required - code value consumed by #exchange_oauth_code',
901
+ code_verifier: 'optional - code verifier value consumed by #exchange_oauth_code (defaults to pending[:verifier])'
902
+ )
903
+
904
+ # Run refresh oauth bearer token and return its result
905
+ #{self}.refresh_oauth_bearer_token(
906
+ refresh_token: 'required - refresh token value consumed by #refresh_oauth_bearer_token (defaults to c[:refresh_token])',
907
+ client_id: 'required - client id value consumed by #refresh_oauth_bearer_token (defaults to c[:client_id])',
908
+ client_secret: 'required - client secret value consumed by #refresh_oauth_bearer_token (defaults to c[:client_secret])'
909
+ )
910
+
911
+ # Run bearer token and return its result
912
+ #{self}.bearer_token
913
+
914
+ # Run authenticated and return its result
915
+ #{self}.authenticated?
916
+
917
+ # Run revoke and return its result
918
+ #{self}.revoke
919
+
920
+ # ── Gmail ──────────────────────────────────────────────────────────
921
+ #{self}.gmail_search(
922
+ query: 'optional - search query string',
923
+ max: 'optional - max value consumed by #gmail_search'
924
+ )
925
+
926
+ # Run gmail get and return its result
927
+ #{self}.gmail_get(
928
+ id: 'required - id value consumed by #gmail_get',
929
+ format: 'optional - format value consumed by #gmail_get (defaults to full)'
930
+ )
931
+
932
+ # Run gmail send and return its result
933
+ #{self}.gmail_send(
934
+ to: 'required - to value consumed by #gmail_send'
935
+ )
936
+
937
+ # Run gmail reply and return its result
938
+ #{self}.gmail_reply(
939
+ id: 'required - id value consumed by #gmail_reply'
940
+ )
941
+
942
+ # Run gmail labels and return its result
943
+ #{self}.gmail_labels
944
+
945
+ # Run gmail modify and return its result
946
+ #{self}.gmail_modify(
947
+ id: 'required - id value consumed by #gmail_modify',
948
+ add_labels: 'optional - add labels value consumed by #gmail_modify',
949
+ add: 'required - add value consumed by #gmail_modify',
950
+ remove_labels: 'optional - remove labels value consumed by #gmail_modify',
951
+ remove: 'required - remove value consumed by #gmail_modify'
952
+ )
953
+
954
+ # ── Calendar ───────────────────────────────────────────────────────
955
+ #{self}.calendar_list(
956
+ calendar_id: 'optional - calendar id value consumed by #calendar_list',
957
+ start: 'optional - start value consumed by #calendar_list',
958
+ end: 'optional - end value consumed by #calendar_list',
959
+ max: 'optional - max value consumed by #calendar_list'
960
+ )
961
+
962
+ # Run calendar create and return its result
963
+ #{self}.calendar_create(
964
+ calendar_id: 'optional - calendar id value consumed by #calendar_create'
965
+ )
966
+
967
+ # Run calendar update and return its result
968
+ #{self}.calendar_update(
969
+ id: 'required - id value consumed by #calendar_update',
970
+ calendar_id: 'optional - calendar id value consumed by #calendar_update'
971
+ )
972
+
973
+ # Run calendar delete and return its result
974
+ #{self}.calendar_delete(
975
+ id: 'required - id value consumed by #calendar_delete',
976
+ calendar_id: 'optional - calendar id value consumed by #calendar_delete'
977
+ )
978
+
979
+ # ── Drive ──────────────────────────────────────────────────────────
980
+ #{self}.drive_search(
981
+ query: 'optional - search query string',
982
+ raw_query: 'optional - raw query value consumed by #drive_search',
983
+ max: 'optional - max value consumed by #drive_search'
984
+ )
985
+
986
+ # Run drive get and return its result
987
+ #{self}.drive_get(
988
+ id: 'required - id value consumed by #drive_get'
989
+ )
990
+
991
+ # Run drive upload and return its result
992
+ #{self}.drive_upload(
993
+ path: 'required - filesystem path to read or write',
994
+ name: 'required - binary or identifier name',
995
+ parent: 'optional - parent value consumed by #drive_upload',
996
+ mime: 'optional - mime value consumed by #drive_upload'
997
+ )
998
+
999
+ # Run drive download and return its result
1000
+ #{self}.drive_download(
1001
+ id: 'required - id value consumed by #drive_download',
1002
+ export_mime: 'optional - export mime value consumed by #drive_download (defaults to EXPORT_MIME[meta[:mimeType])',
1003
+ output: 'optional - output value consumed by #drive_download'
1004
+ )
1005
+
1006
+ # Run drive create folder and return its result
1007
+ #{self}.drive_create_folder(
1008
+ name: 'required - binary or identifier name',
1009
+ parent: 'optional - parent value consumed by #drive_create_folder'
1010
+ )
1011
+
1012
+ # Run drive share and return its result
1013
+ #{self}.drive_share(
1014
+ id: 'required - id value consumed by #drive_share',
1015
+ role: 'optional - role value consumed by #drive_share',
1016
+ type: 'optional - type value consumed by #drive_share',
1017
+ email: 'optional - email value consumed by #drive_share',
1018
+ domain: 'optional - FQDN to query (e.g. example.com)',
1019
+ notify: 'optional - notify value consumed by #drive_share'
1020
+ )
1021
+
1022
+ # Run drive delete and return its result
1023
+ #{self}.drive_delete(
1024
+ id: 'required - id value consumed by #drive_delete',
1025
+ permanent: 'optional - permanent value consumed by #drive_delete'
1026
+ )
1027
+
1028
+ # ── Docs ───────────────────────────────────────────────────────────
1029
+ #{self}.docs_get(
1030
+ id: 'required - id value consumed by #docs_get'
1031
+ )
1032
+
1033
+ # Run docs create and return its result
1034
+ #{self}.docs_create(
1035
+ title: 'required - title value consumed by #docs_create',
1036
+ body: 'optional - body value consumed by #docs_create'
1037
+ )
1038
+
1039
+ # Run docs append and return its result
1040
+ #{self}.docs_append(
1041
+ id: 'required - id value consumed by #docs_append',
1042
+ text: 'optional - text value consumed by #docs_append'
1043
+ )
1044
+
1045
+ # ── Sheets ─────────────────────────────────────────────────────────
1046
+ #{self}.sheets_create(
1047
+ title: 'required - title value consumed by #sheets_create',
1048
+ sheet_name: 'optional - sheet name value consumed by #sheets_create'
1049
+ )
1050
+
1051
+ # Run sheets get and return its result
1052
+ #{self}.sheets_get(
1053
+ id: 'required - id value consumed by #sheets_get',
1054
+ range: 'required - range value consumed by #sheets_get'
1055
+ )
1056
+
1057
+ # Run sheets update and return its result
1058
+ #{self}.sheets_update
1059
+
1060
+ # Run sheets append and return its result
1061
+ #{self}.sheets_append
1062
+
1063
+ # Print the AUTHOR(S) string for this module.
1064
+ #{self}.authors
1065
+ "
1066
+ constants.sort
924
1067
  end
925
1068
  end
926
1069
  end