Files
metasploit-gs/api/Msf/DataStore.html
T
jenkins-metasploit c3f5bd3de2 Reboot gh-pages
2026-05-08 17:08:43 +00:00

3588 lines
127 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
Class: Msf::DataStore
&mdash; Documentation by YARD 0.9.37
</title>
<link rel="stylesheet" href="../css/style.css" type="text/css" />
<link rel="stylesheet" href="../css/common.css" type="text/css" />
<script type="text/javascript">
pathId = "Msf::DataStore";
relpath = '../';
</script>
<script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="../js/app.js"></script>
</head>
<body>
<div class="nav_wrap">
<iframe id="nav" src="../class_list.html?1"></iframe>
<div id="resizer"></div>
</div>
<div id="main" tabindex="-1">
<div id="header">
<div id="menu">
<a href="../_index.html">Index (D)</a> &raquo;
<span class='title'><span class='object_link'><a href="../Msf.html" title="Msf (module)">Msf</a></span></span>
&raquo;
<span class="title">DataStore</span>
</div>
<div id="search">
<a class="full_list_link" id="class_list_link"
href="../class_list.html">
<svg width="24" height="24">
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
</svg>
</a>
</div>
<div class="clear"></div>
</div>
<div id="content"><h1>Class: Msf::DataStore
</h1>
<div class="box_info">
<dl>
<dt>Inherits:</dt>
<dd>
<span class="inheritName">Object</span>
<ul class="fullTree">
<li>Object</li>
<li class="next">Msf::DataStore</li>
</ul>
<a href="#" class="inheritanceTree">show all</a>
</dd>
</dl>
<dl>
<dt>Defined in:</dt>
<dd>lib/msf/core/data_store.rb</dd>
</dl>
</div>
<h2>Overview</h2><div class="docstring">
<div class="discussion">
<p>The data store is just a bitbucket that holds keyed values. It is used by various classes to hold option values and other state information.</p>
</div>
</div>
<div class="tags">
</div><div id="subclasses">
<h2>Direct Known Subclasses</h2>
<p class="children"><span class='object_link'><a href="ModuleDataStore.html" title="Msf::ModuleDataStore (class)">ModuleDataStore</a></span></p>
</div>
<h2>Defined Under Namespace</h2>
<p class="children">
<strong class="classes">Classes:</strong> <span class='object_link'><a href="DataStore/DataStoreSearchResult.html" title="Msf::DataStore::DataStoreSearchResult (class)">DataStoreSearchResult</a></span>
</p>
<h2>
Constant Summary
<small><a href="#" class="constants_summary_toggle">collapse</a></small>
</h2>
<dl class="constants">
<dt id="GLOBAL_OPTION_DEFINITIONS-constant" class="">GLOBAL_OPTION_DEFINITIONS =
<div class="docstring">
<div class="discussion">
<p>Typed option definitions for globally-scoped datastore keys. These are registered on the framework datastore at startup so that normalization (e.g. OptBool converting “true” to true) applies even when no module is active.</p>
</div>
</div>
<div class="tags">
</div>
</dt>
<dd><pre class="code"><span class='const'><span class='object_link'><a href="OptionContainer.html" title="Msf::OptionContainer (class)">OptionContainer</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptionContainer.html#initialize-instance_method" title="Msf::OptionContainer#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='lbracket'>[</span>
<span class='const'><span class='object_link'><a href="OptBool.html" title="Msf::OptBool (class)">OptBool</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptBool.html#initialize-instance_method" title="Msf::OptBool#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>ConsoleLogging</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Log all console input and output</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>false</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptInt.html" title="Msf::OptInt (class)">OptInt</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptBase.html#initialize-instance_method" title="Msf::OptBase#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>LogLevel</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Verbosity of logs (default 0, max 3)</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='int'>0</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptEnum.html" title="Msf::OptEnum (class)">OptEnum</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptEnum.html#initialize-instance_method" title="Msf::OptEnum#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>MinimumRank</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>The minimum rank of exploits that will run without explicit confirmation</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>manual</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='const'><span class='object_link'><a href="../Msf.html#RankingName-constant" title="Msf::RankingName (constant)">RankingName</a></span></span><span class='period'>.</span><span class='id identifier rubyid_values'>values</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptBool.html" title="Msf::OptBool (class)">OptBool</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptBool.html#initialize-instance_method" title="Msf::OptBool#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>SessionLogging</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Log all input and output for sessions</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>false</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptBool.html" title="Msf::OptBool (class)">OptBool</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptBool.html#initialize-instance_method" title="Msf::OptBool#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>TimestampOutput</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Prefix all console output with a timestamp</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>false</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptBool.html" title="Msf::OptBool (class)">OptBool</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptBool.html#initialize-instance_method" title="Msf::OptBool#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>VERBOSE</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Enable detailed status messages - the specific behavior can differ per module</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>false</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptString.html" title="Msf::OptString (class)">OptString</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptString.html#initialize-instance_method" title="Msf::OptString#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Prompt</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>The prompt string</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptString.html" title="Msf::OptString (class)">OptString</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptString.html#initialize-instance_method" title="Msf::OptString#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>PromptChar</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>The prompt character</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptString.html" title="Msf::OptString (class)">OptString</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptString.html#initialize-instance_method" title="Msf::OptString#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>PromptTimeFormat</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Format for timestamp escapes in prompts</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptString.html" title="Msf::OptString (class)">OptString</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptString.html#initialize-instance_method" title="Msf::OptString#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>MeterpreterPrompt</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>The meterpreter prompt string</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='const'><span class='object_link'><a href="OptSessionTlvLogging.html" title="Msf::OptSessionTlvLogging (class)">OptSessionTlvLogging</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptSessionTlvLogging.html#initialize-instance_method" title="Msf::OptSessionTlvLogging#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>SessionTlvLogging</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Log all incoming and outgoing TLV packets</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rbracket'>]</span><span class='rparen'>)</span><span class='comma'>,</span>
<span class='rbracket'>]</span><span class='rparen'>)</span></pre></dd>
<dt id="GLOBAL_KEYS-constant" class="">GLOBAL_KEYS =
<div class="docstring">
<div class="discussion">
<p>Backward-compatible list of known global key names, derived from the typed option definitions above.</p>
</div>
</div>
<div class="tags">
</div>
</dt>
<dd><pre class="code"><span class='const'><span class='object_link'><a href="#GLOBAL_OPTION_DEFINITIONS-constant" title="Msf::DataStore::GLOBAL_OPTION_DEFINITIONS (constant)">GLOBAL_OPTION_DEFINITIONS</a></span></span><span class='period'>.</span><span class='id identifier rubyid_keys'><span class='object_link'><a href="#keys-instance_method" title="Msf::DataStore#keys (method)">keys</a></span></span><span class='period'>.</span><span class='id identifier rubyid_freeze'>freeze</span></pre></dd>
</dl>
<h2>Instance Attribute Summary <small><a href="#" class="summary_toggle">collapse</a></small></h2>
<ul class="summary">
<li class="protected ">
<span class="summary_signature">
<a href="#aliases-instance_method" title="#aliases (instance method)">#<strong>aliases</strong> &#x21d2; Hash{String =&gt; String} </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>The key is the old option name, the value is the new option name.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#defaults-instance_method" title="#defaults (instance method)">#<strong>defaults</strong> &#x21d2; Hash{String =&gt; Msf::OptBase} </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>These defaults will be used if the user has not explicitly defined a specific datastore value.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#options-instance_method" title="#options (instance method)">#<strong>options</strong> &#x21d2; Hash{String =&gt; Msf::OptBase} </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>The options associated with this datastore.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#user_defined-instance_method" title="#user_defined (instance method)">#<strong>user_defined</strong> &#x21d2; Hash&lt;String, Object&gt; </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Returns a hash of user-defined datastore values.</p>
</div></span>
</li>
</ul>
<h2>
Instance Method Summary
<small><a href="#" class="summary_toggle">collapse</a></small>
</h2>
<ul class="summary">
<li class="public ">
<span class="summary_signature">
<a href="#[]-instance_method" title="#[] (instance method)">#<strong>[]</strong>(k) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Case-insensitive wrapper around hash lookup.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#[]=-instance_method" title="#[]= (instance method)">#<strong>[]=</strong>(k, v) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Clears the imported flag for the supplied key since its being set directly.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#clear-instance_method" title="#clear (instance method)">#<strong>clear</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Completely clear all values in the data store.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#copy-instance_method" title="#copy (instance method)">#<strong>copy</strong> &#x21d2; Msf::DataStore </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Return a copy of this datastore.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#copy_state-instance_method" title="#copy_state (instance method)">#<strong>copy_state</strong>(other) &#x21d2; Msf::DataStore </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Copy the state from the other Msf::DataStore.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#default%3F-instance_method" title="#default? (instance method)">#<strong>default?</strong>(key) &#x21d2; TrueClass, FalseClass </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Was this entry actually set or just using its default.</p>
</div></span>
</li>
<li class="public deprecated">
<span class="summary_signature">
<a href="#delete-instance_method" title="#delete (instance method)">#<strong>delete</strong>(key) &#x21d2; Object </a>
</span>
<span class="deprecated note title">deprecated</span>
<span class="summary_desc"><strong>Deprecated.</strong> <div class='inline'>
<p>use #<span class='object_link'><a href="#unset-instance_method" title="Msf::DataStore#unset (method)">#unset</a></span> instead, or set the value explicitly to nil</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#each-instance_method" title="#each (instance method)">#<strong>each</strong>(&amp;block) &#x21d2; Object </a>
(also: #each_pair)
</span>
<span class="summary_desc"><div class='inline'>
<p>Overrides the builtin each operator to avoid the following exception on Ruby 1.9.2+ “cant add a new key into hash during iteration”.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#each_key-instance_method" title="#each_key (instance method)">#<strong>each_key</strong>(&amp;block) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'></div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#find_key_case-instance_method" title="#find_key_case (instance method)">#<strong>find_key_case</strong>(k) &#x21d2; String </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Case-insensitive key lookup.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#from_file-instance_method" title="#from_file (instance method)">#<strong>from_file</strong>(path, name = &#39;global&#39;) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Imports datastore values from the specified file path using the supplied name.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#import_defaults_from_hash-instance_method" title="#import_defaults_from_hash (instance method)">#<strong>import_defaults_from_hash</strong>(hash, imported_by:) &#x21d2; nil </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Update defaults from a hash.</p>
</div></span>
</li>
<li class="public deprecated">
<span class="summary_signature">
<a href="#import_option-instance_method" title="#import_option (instance method)">#<strong>import_option</strong>(key, val, imported = true, imported_by = nil, option = nil) &#x21d2; Object </a>
</span>
<span class="deprecated note title">deprecated</span>
<span class="summary_desc"><strong>Deprecated.</strong> <div class='inline'>
<p>Use <span class='object_link'><a href="#import_options-instance_method" title="Msf::DataStore#import_options (method)">#import_options</a></span></p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#import_options-instance_method" title="#import_options (instance method)">#<strong>import_options</strong>(options, imported_by = nil, overwrite = true) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>This method is a helper method that imports the default value for all of the supplied options.</p>
</div></span>
</li>
<li class="public deprecated">
<span class="summary_signature">
<a href="#import_options_from_hash-instance_method" title="#import_options_from_hash (instance method)">#<strong>import_options_from_hash</strong>(option_hash, imported = true, imported_by = nil) &#x21d2; nil </a>
</span>
<span class="deprecated note title">deprecated</span>
<span class="summary_desc"><strong>Deprecated.</strong> <div class='inline'>
<p>use <span class='object_link'><a href="#merge!-instance_method" title="Msf::DataStore#merge! (method)">#merge!</a></span> instead</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#import_options_from_s-instance_method" title="#import_options_from_s (instance method)">#<strong>import_options_from_s</strong>(option_str, delim = nil) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Imports option values from a whitespace separated string in VAR=VAL format.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#initialize-instance_method" title="#initialize (instance method)">#<strong>initialize</strong> &#x21d2; DataStore </a>
</span>
<span class="note title constructor">constructor</span>
<span class="summary_desc"><div class='inline'>
<p>Initializes the data stores internal state.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#key%3F-instance_method" title="#key? (instance method)">#<strong>key?</strong>(key) &#x21d2; TrueClass, FalseClass </a>
(also: #has_key?, #include?, #member?)
</span>
<span class="summary_desc"><div class='inline'>
<p>True if the key is present in the user defined values, or within registered options.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#key_error_for-instance_method" title="#key_error_for (instance method)">#<strong>key_error_for</strong>(key) &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'>
<p>Raised when the specified key is not found.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#keys-instance_method" title="#keys (instance method)">#<strong>keys</strong> &#x21d2; Array&lt;String&gt; </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>The array of user defined datastore values, and registered option names.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#length-instance_method" title="#length (instance method)">#<strong>length</strong> &#x21d2; Integer </a>
(also: #count, #size)
</span>
<span class="summary_desc"><div class='inline'>
<p>The length of the registered keys.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#merge-instance_method" title="#merge (instance method)">#<strong>merge</strong>(other) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Override merge to ensure we merge the aliases and imported hashes.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#merge!-instance_method" title="#merge! (instance method)">#<strong>merge!</strong>(other) &#x21d2; Object </a>
(also: #update)
</span>
<span class="summary_desc"><div class='inline'>
<p>Merge the other object into the current datastores aliases and imported hashes.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#remove_option-instance_method" title="#remove_option (instance method)">#<strong>remove_option</strong>(name) &#x21d2; nil </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Removes an option and any associated value.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#reverse_merge!-instance_method" title="#reverse_merge! (instance method)">#<strong>reverse_merge!</strong>(other) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Reverse Merge the other object into the current datastores aliases and imported hashes Equivalent to ActiveSupports reverse_merge! functionality.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#search_for-instance_method" title="#search_for (instance method)">#<strong>search_for</strong>(key) &#x21d2; DataStoreSearchResult </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Search for a value within the current datastore, taking into consideration any registered aliases, fallbacks, etc.</p>
</div></span>
</li>
<li class="protected ">
<span class="summary_signature">
<a href="#search_result-instance_method" title="#search_result (instance method)">#<strong>search_result</strong>(result, value, fallback_key: nil) &#x21d2; Object </a>
</span>
<span class="note title protected">protected</span>
<span class="summary_desc"><div class='inline'></div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#store-instance_method" title="#store (instance method)">#<strong>store</strong>(k, v) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Case-insensitive wrapper around store; Skips option validation entirely.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#to_external_message_h-instance_method" title="#to_external_message_h (instance method)">#<strong>to_external_message_h</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Hack on a hack for the external modules.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#to_file-instance_method" title="#to_file (instance method)">#<strong>to_file</strong>(path, name = &#39;global&#39;) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Persists the contents of the data store to a file.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#to_h-instance_method" title="#to_h (instance method)">#<strong>to_h</strong> &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Override Hashs to_h method so we can include the original case of each key (failing to do this breaks a number of places in framework and pro that use serialized datastores).</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#to_s-instance_method" title="#to_s (instance method)">#<strong>to_s</strong>(delim = &#39; &#39;) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Serializes the options in the datastore to a string.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#unset-instance_method" title="#unset (instance method)">#<strong>unset</strong>(key) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>unset the current key from the datastore.</p>
</div></span>
</li>
<li class="public ">
<span class="summary_signature">
<a href="#update_value-instance_method" title="#update_value (instance method)">#<strong>update_value</strong>(k, v) &#x21d2; Object </a>
</span>
<span class="summary_desc"><div class='inline'>
<p>Updates a value in the datastore with the specified name, k, to the specified value, v.</p>
</div></span>
</li>
</ul>
<div id="constructor_details" class="method_details_list">
<h2>Constructor Details</h2>
<div class="method_details first">
<h3 class="signature first" id="initialize-instance_method">
#<strong>initialize</strong> &#x21d2; <tt><span class='object_link'><a href="" title="Msf::DataStore (class)">DataStore</a></span></tt>
</h3><div class="docstring">
<div class="discussion">
<p>Initializes the data stores internal state.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
37
38
39
40
41
42
43
44
45
46</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 37</span>
<span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span>
<span class='ivar'>@options</span> <span class='op'>=</span> <span class='const'>Hash</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
<span class='ivar'>@aliases</span> <span class='op'>=</span> <span class='const'>Hash</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
<span class='comment'># default values which will be referenced when not defined by the user
</span> <span class='ivar'>@defaults</span> <span class='op'>=</span> <span class='const'>Hash</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
<span class='comment'># values explicitly defined, which take precedence over default values
</span> <span class='ivar'>@user_defined</span> <span class='op'>=</span> <span class='const'>Hash</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
<div id="instance_attr_details" class="attr_details">
<h2>Instance Attribute Details</h2>
<span id="aliases=-instance_method"></span>
<div class="method_details first">
<h3 class="signature first" id="aliases-instance_method">
#<strong>aliases</strong> &#x21d2; <tt>Hash{String =&gt; String}</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Returns The key is the old option name, the value is the new option name.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Hash{String =&gt; String}</tt>)</span>
&mdash;
<div class='inline'>
<p>The key is the old option name, the value is the new option name</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
481
482
483</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 481</span>
<span class='kw'>def</span> <span class='id identifier rubyid_aliases'>aliases</span>
<span class='ivar'>@aliases</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="defaults=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="defaults-instance_method">
#<strong>defaults</strong> &#x21d2; <tt>Hash{String =&gt; <span class='object_link'><a href="OptBase.html" title="Msf::OptBase (class)">Msf::OptBase</a></span>}</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>These defaults will be used if the user has not explicitly defined a specific datastore value. These will be checked as a priority to any options that also provide defaults.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Hash{String =&gt; <span class='object_link'><a href="OptBase.html" title="Msf::OptBase (class)">Msf::OptBase</a></span>}</tt>)</span>
&mdash;
<div class='inline'>
<p>The hash of default values</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
478
479
480</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 478</span>
<span class='kw'>def</span> <span class='id identifier rubyid_defaults'>defaults</span>
<span class='ivar'>@defaults</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="options=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="options-instance_method">
#<strong>options</strong> &#x21d2; <tt>Hash{String =&gt; <span class='object_link'><a href="OptBase.html" title="Msf::OptBase (class)">Msf::OptBase</a></span>}</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns The options associated with this datastore. Used for validating values/defaults/etc.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Hash{String =&gt; <span class='object_link'><a href="OptBase.html" title="Msf::OptBase (class)">Msf::OptBase</a></span>}</tt>)</span>
&mdash;
<div class='inline'>
<p>The options associated with this datastore. Used for validating values/defaults/etc</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
49
50
51</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 49</span>
<span class='kw'>def</span> <span class='id identifier rubyid_options'>options</span>
<span class='ivar'>@options</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<span id="user_defined=-instance_method"></span>
<div class="method_details ">
<h3 class="signature " id="user_defined-instance_method">
#<strong>user_defined</strong> &#x21d2; <tt>Hash&lt;String, Object&gt;</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns a hash of user-defined datastore values. The returned hash does not include default option values.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Hash&lt;String, Object&gt;</tt>)</span>
&mdash;
<div class='inline'>
<p>values explicitly defined on the data store which will override any default datastore values</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
56
57
58</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 56</span>
<span class='kw'>def</span> <span class='id identifier rubyid_user_defined'>user_defined</span>
<span class='ivar'>@user_defined</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
<div id="instance_method_details" class="method_details_list">
<h2>Instance Method Details</h2>
<div class="method_details first">
<h3 class="signature first" id="[]-instance_method">
#<strong>[]</strong>(k) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Case-insensitive wrapper around hash lookup</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
89
90
91
92
93</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 89</span>
<span class='kw'>def</span> <span class='op'>[]</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='id identifier rubyid_search_result'>search_result</span> <span class='op'>=</span> <span class='id identifier rubyid_search_for'>search_for</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='id identifier rubyid_search_result'>search_result</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="[]=-instance_method">
#<strong>[]=</strong>(k, v) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Clears the imported flag for the supplied key since its being set directly.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 70</span>
<span class='kw'>def</span> <span class='op'>[]=</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span>
<span class='id identifier rubyid_k'>k</span> <span class='op'>=</span> <span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='ivar'>@options</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span>
<span class='kw'>unless</span> <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span>
<span class='kw'>if</span> <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_validate_on_assignment?'>validate_on_assignment?</span>
<span class='kw'>unless</span> <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_valid?'>valid?</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='comma'>,</span> <span class='label'>check_empty:</span> <span class='kw'>false</span><span class='rparen'>)</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'><span class='object_link'><a href="../Msf.html" title="Msf (module)">Msf</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="OptionValidateError.html" title="Msf::OptionValidateError (class)">OptionValidateError</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="OptionValidateError.html#initialize-instance_method" title="Msf::OptionValidateError#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Value &#39;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_v'>v</span><span class='embexpr_end'>}</span><span class='tstring_content'>&#39; is not valid for option &#39;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_k'>k</span><span class='embexpr_end'>}</span><span class='tstring_content'>&#39;</span><span class='tstring_end'>&quot;</span></span><span class='rbracket'>]</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='id identifier rubyid_v'>v</span> <span class='op'>=</span> <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_normalize'>normalize</span><span class='lparen'>(</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='ivar'>@user_defined</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_v'>v</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="clear-instance_method">
#<strong>clear</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Completely clear all values in the data store</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
389
390
391
392
393
394
395
396</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 389</span>
<span class='kw'>def</span> <span class='id identifier rubyid_clear'>clear</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_clear'>clear</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='period'>.</span><span class='id identifier rubyid_clear'>clear</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_defaults'>defaults</span><span class='period'>.</span><span class='id identifier rubyid_clear'>clear</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_user_defined'>user_defined</span><span class='period'>.</span><span class='id identifier rubyid_clear'>clear</span>
<span class='kw'>self</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="copy-instance_method">
#<strong>copy</strong> &#x21d2; <tt><span class='object_link'><a href="" title="Msf::DataStore (class)">Msf::DataStore</a></span></tt>
</h3><div class="docstring">
<div class="discussion">
<p>Return a copy of this datastore. Only string values will be duplicated, other values will share the same reference</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt><span class='object_link'><a href="" title="Msf::DataStore (class)">Msf::DataStore</a></span></tt>)</span>
&mdash;
<div class='inline'>
<p>a new datastore instance</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
337
338
339
340
341</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 337</span>
<span class='kw'>def</span> <span class='id identifier rubyid_copy'>copy</span>
<span class='id identifier rubyid_new_instance'>new_instance</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span>
<span class='id identifier rubyid_new_instance'>new_instance</span><span class='period'>.</span><span class='id identifier rubyid_copy_state'>copy_state</span><span class='lparen'>(</span><span class='kw'>self</span><span class='rparen'>)</span>
<span class='id identifier rubyid_new_instance'>new_instance</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="copy_state-instance_method">
#<strong>copy_state</strong>(other) &#x21d2; <tt><span class='object_link'><a href="" title="Msf::DataStore (class)">Msf::DataStore</a></span></tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Copy the state from the other Msf::DataStore. The state will be coped in a shallow fashion, other than imported and user_defined strings.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>other</span>
<span class='type'>(<tt><span class='object_link'><a href="" title="Msf::DataStore (class)">Msf::DataStore</a></span></tt>)</span>
&mdash;
<div class='inline'>
<p>The other datastore to copy state from</p>
</div>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt><span class='object_link'><a href="" title="Msf::DataStore (class)">Msf::DataStore</a></span></tt>)</span>
&mdash;
<div class='inline'>
<p>the current datastore instance</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
489
490
491
492
493
494
495
496</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 489</span>
<span class='kw'>def</span> <span class='id identifier rubyid_copy_state'>copy_state</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_options'>options</span> <span class='op'>=</span> <span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span> <span class='op'>=</span> <span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_defaults'>defaults</span> <span class='op'>=</span> <span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_defaults'>defaults</span><span class='period'>.</span><span class='id identifier rubyid_transform_values'>transform_values</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_kind_of?'>kind_of?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span> <span class='op'>:</span> <span class='id identifier rubyid_value'>value</span> <span class='rbrace'>}</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_user_defined'>user_defined</span> <span class='op'>=</span> <span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_user_defined'>user_defined</span><span class='period'>.</span><span class='id identifier rubyid_transform_values'>transform_values</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_value'>value</span><span class='op'>|</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_kind_of?'>kind_of?</span><span class='lparen'>(</span><span class='const'>String</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span> <span class='op'>:</span> <span class='id identifier rubyid_value'>value</span> <span class='rbrace'>}</span>
<span class='kw'>self</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="default?-instance_method">
#<strong>default?</strong>(key) &#x21d2; <tt>TrueClass</tt>, <tt>FalseClass</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Was this entry actually set or just using its default</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>TrueClass</tt>, <tt>FalseClass</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
62
63
64</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 62</span>
<span class='kw'>def</span> <span class='id identifier rubyid_default?'>default?</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_search_for'>search_for</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_default?'>default?</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="delete-instance_method">
#<strong>delete</strong>(key) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<div class="note deprecated"><strong>Deprecated.</strong> <div class='inline'>
<p>use #<span class='object_link'><a href="#unset-instance_method" title="Msf::DataStore#unset (method)">#unset</a></span> instead, or set the value explicitly to nil</p>
</div></div>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>key</span>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>The key to search for</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
123
124
125</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 123</span>
<span class='kw'>def</span> <span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_unset'>unset</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="each-instance_method">
#<strong>each</strong>(&amp;block) &#x21d2; <tt>Object</tt>
<span class="aliases">Also known as:
<span class="names"><span id='each_pair-instance_method'>each_pair</span></span>
</span>
</h3><div class="docstring">
<div class="discussion">
<p>Overrides the builtin each operator to avoid the following exception on Ruby 1.9.2+</p>
<pre class="code ruby"><code class="ruby"><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>can&#39;t add a new key into hash during iteration</span><span class='tstring_end'>&quot;</span></span>
</code></pre>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
402
403
404
405
406
407
408</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 402</span>
<span class='kw'>def</span> <span class='id identifier rubyid_each'>each</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
<span class='id identifier rubyid_list'>list</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_sort'>sort</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_sidx'>sidx</span><span class='op'>|</span>
<span class='id identifier rubyid_list'>list</span> <span class='op'>&lt;&lt;</span> <span class='lbracket'>[</span><span class='id identifier rubyid_sidx'>sidx</span><span class='comma'>,</span> <span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_sidx'>sidx</span><span class='rbracket'>]</span><span class='rbracket'>]</span>
<span class='kw'>end</span>
<span class='id identifier rubyid_list'>list</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="each_key-instance_method">
#<strong>each_key</strong>(&amp;block) &#x21d2; <tt>Object</tt>
</h3><table class="source_code">
<tr>
<td>
<pre class="lines">
412
413
414</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 412</span>
<span class='kw'>def</span> <span class='id identifier rubyid_each_key'>each_key</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='id identifier rubyid_block'>block</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="find_key_case-instance_method">
#<strong>find_key_case</strong>(k) &#x21d2; <tt>String</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Case-insensitive key lookup</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>String</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 420</span>
<span class='kw'>def</span> <span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='comment'># Scan each alias looking for a key
</span> <span class='id identifier rubyid_search_k'>search_k</span> <span class='op'>=</span> <span class='id identifier rubyid_k'>k</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span>
<span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='period'>.</span><span class='id identifier rubyid_has_key?'>has_key?</span><span class='lparen'>(</span><span class='id identifier rubyid_search_k'>search_k</span><span class='rparen'>)</span>
<span class='id identifier rubyid_search_k'>search_k</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='lbracket'>[</span><span class='id identifier rubyid_search_k'>search_k</span><span class='rbracket'>]</span>
<span class='kw'>end</span>
<span class='comment'># Check to see if we have an exact key match - otherwise we&#39;ll have to search manually to check case sensitivity
</span> <span class='kw'>if</span> <span class='ivar'>@user_defined</span><span class='period'>.</span><span class='id identifier rubyid_key?'>key?</span><span class='lparen'>(</span><span class='id identifier rubyid_search_k'>search_k</span><span class='rparen'>)</span> <span class='op'>||</span> <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_key?'>key?</span><span class='lparen'>(</span><span class='id identifier rubyid_search_k'>search_k</span><span class='rparen'>)</span>
<span class='kw'>return</span> <span class='id identifier rubyid_search_k'>search_k</span>
<span class='kw'>end</span>
<span class='comment'># Scan each key looking for a match
</span> <span class='id identifier rubyid_each_key'>each_key</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_rk'>rk</span><span class='op'>|</span>
<span class='kw'>if</span> <span class='id identifier rubyid_rk'>rk</span><span class='period'>.</span><span class='id identifier rubyid_casecmp'>casecmp</span><span class='lparen'>(</span><span class='id identifier rubyid_search_k'>search_k</span><span class='rparen'>)</span> <span class='op'>==</span> <span class='int'>0</span>
<span class='kw'>return</span> <span class='id identifier rubyid_rk'>rk</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='comment'># Fall through to the non-existent value
</span> <span class='id identifier rubyid_k'>k</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="from_file-instance_method">
#<strong>from_file</strong>(path, name = &#39;global&#39;) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Imports datastore values from the specified file path using the supplied name</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
321
322
323
324
325
326
327
328
329
330
331</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 321</span>
<span class='kw'>def</span> <span class='id identifier rubyid_from_file'>from_file</span><span class='lparen'>(</span><span class='id identifier rubyid_path'>path</span><span class='comma'>,</span> <span class='id identifier rubyid_name'>name</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>global</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>begin</span>
<span class='id identifier rubyid_ini'>ini</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../Rex/Parser.html" title="Rex::Parser (module)">Parser</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../Rex/Parser/Ini.html" title="Rex::Parser::Ini (class)">Ini</a></span></span><span class='period'>.</span><span class='id identifier rubyid_from_file'><span class='object_link'><a href="../Rex/Parser/Ini.html#from_file-class_method" title="Rex::Parser::Ini.from_file (method)">from_file</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_path'>path</span><span class='rparen'>)</span>
<span class='kw'>rescue</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
<span class='kw'>if</span> <span class='id identifier rubyid_ini'>ini</span><span class='period'>.</span><span class='id identifier rubyid_group?'>group?</span><span class='lparen'>(</span><span class='id identifier rubyid_name'>name</span><span class='rparen'>)</span>
<span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_ini'>ini</span><span class='lbracket'>[</span><span class='id identifier rubyid_name'>name</span><span class='rbracket'>]</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="import_defaults_from_hash-instance_method">
#<strong>import_defaults_from_hash</strong>(hash, imported_by:) &#x21d2; <tt>nil</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Update defaults from a hash. These merged values are not validated by default.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>hash</span>
<span class='type'>(<tt>Hash&lt;String, Object&gt;</tt>)</span>
&mdash;
<div class='inline'>
<p>The default values that should be used by the datastore</p>
</div>
</li>
<li>
<span class='name'>imported_by</span>
<span class='type'>(<tt>Object</tt>)</span>
&mdash;
<div class='inline'>
<p>Who imported the defaults, not currently used</p>
</div>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>nil</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
212
213
214</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 212</span>
<span class='kw'>def</span> <span class='id identifier rubyid_import_defaults_from_hash'>import_defaults_from_hash</span><span class='lparen'>(</span><span class='id identifier rubyid_hash'>hash</span><span class='comma'>,</span> <span class='label'>imported_by:</span><span class='rparen'>)</span>
<span class='ivar'>@defaults</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_hash'>hash</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="import_option-instance_method">
#<strong>import_option</strong>(key, val, imported = true, imported_by = nil, option = nil) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<div class="note deprecated"><strong>Deprecated.</strong> <div class='inline'>
<p>Use <span class='object_link'><a href="#import_options-instance_method" title="Msf::DataStore#import_options (method)">#import_options</a></span></p>
</div></div>
<p>TODO: Doesnt normalize data in the same vein as: <a href="https://github.com/rapid7/metasploit-framework/pull/6644">github.com/rapid7/metasploit-framework/pull/6644</a></p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
219
220
221
222
223
224
225
226
227
228</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 219</span>
<span class='kw'>def</span> <span class='id identifier rubyid_import_option'>import_option</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_val'>val</span><span class='comma'>,</span> <span class='id identifier rubyid_imported'>imported</span> <span class='op'>=</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='id identifier rubyid_imported_by'>imported_by</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='id identifier rubyid_store'>store</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='comma'>,</span> <span class='id identifier rubyid_val'>val</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='id identifier rubyid_option'>option</span>
<span class='id identifier rubyid_option'>option</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_a'>a</span><span class='op'>|</span>
<span class='ivar'>@aliases</span><span class='lbracket'>[</span><span class='id identifier rubyid_a'>a</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='ivar'>@options</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_option'>option</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="import_options-instance_method">
#<strong>import_options</strong>(options, imported_by = nil, overwrite = true) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>This method is a helper method that imports the default value for all of the supplied options.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
145
146
147
148
149
150
151
152
153
154
155</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 145</span>
<span class='kw'>def</span> <span class='id identifier rubyid_import_options'>import_options</span><span class='lparen'>(</span><span class='id identifier rubyid_options'>options</span><span class='comma'>,</span> <span class='id identifier rubyid_imported_by'>imported_by</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='id identifier rubyid_overwrite'>overwrite</span> <span class='op'>=</span> <span class='kw'>true</span><span class='rparen'>)</span>
<span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_each_option'>each_option</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_option'>option</span><span class='op'>|</span>
<span class='kw'>if</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_options'>options</span><span class='lbracket'>[</span><span class='id identifier rubyid_name'>name</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span> <span class='op'>||</span> <span class='id identifier rubyid_overwrite'>overwrite</span>
<span class='id identifier rubyid_key'>key</span> <span class='op'>=</span> <span class='id identifier rubyid_name'>name</span>
<span class='id identifier rubyid_option'>option</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_a'>a</span><span class='op'>|</span>
<span class='ivar'>@aliases</span><span class='lbracket'>[</span><span class='id identifier rubyid_a'>a</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_downcase'>downcase</span>
<span class='kw'>end</span>
<span class='ivar'>@options</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_option'>option</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="import_options_from_hash-instance_method">
#<strong>import_options_from_hash</strong>(option_hash, imported = true, imported_by = nil) &#x21d2; <tt>nil</tt>
</h3><div class="docstring">
<div class="discussion">
<div class="note deprecated"><strong>Deprecated.</strong> <div class='inline'>
<p>use <span class='object_link'><a href="#merge!-instance_method" title="Msf::DataStore#merge! (method)">#merge!</a></span> instead</p>
</div></div>
<p>Imports values from a hash and stores them in the datastore.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>nil</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
203
204
205</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 203</span>
<span class='kw'>def</span> <span class='id identifier rubyid_import_options_from_hash'>import_options_from_hash</span><span class='lparen'>(</span><span class='id identifier rubyid_option_hash'>option_hash</span><span class='comma'>,</span> <span class='id identifier rubyid_imported'>imported</span> <span class='op'>=</span> <span class='kw'>true</span><span class='comma'>,</span> <span class='id identifier rubyid_imported_by'>imported_by</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_option_hash'>option_hash</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="import_options_from_s-instance_method">
#<strong>import_options_from_s</strong>(option_str, delim = nil) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Imports option values from a whitespace separated string in VAR=VAL format.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 161</span>
<span class='kw'>def</span> <span class='id identifier rubyid_import_options_from_s'>import_options_from_s</span><span class='lparen'>(</span><span class='id identifier rubyid_option_str'>option_str</span><span class='comma'>,</span> <span class='id identifier rubyid_delim'>delim</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='id identifier rubyid_hash'>hash</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='comment'># Figure out the delimiter, default to space.
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_delim'>delim</span><span class='period'>.</span><span class='id identifier rubyid_nil?'>nil?</span><span class='rparen'>)</span>
<span class='id identifier rubyid_delim'>delim</span> <span class='op'>=</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\s</span><span class='regexp_end'>/</span></span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_option_str'>option_str</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>=</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>&lt;=</span> <span class='int'>2</span> <span class='kw'>or</span> <span class='id identifier rubyid_option_str'>option_str</span><span class='period'>.</span><span class='id identifier rubyid_index'>index</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='op'>!=</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='id identifier rubyid_delim'>delim</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>,</span><span class='tstring_end'>&#39;</span></span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='comment'># Split on the delimiter
</span> <span class='id identifier rubyid_option_str'>option_str</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='id identifier rubyid_delim'>delim</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_opt'>opt</span><span class='op'>|</span>
<span class='id identifier rubyid_var'>var</span><span class='comma'>,</span> <span class='id identifier rubyid_val'>val</span> <span class='op'>=</span> <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>=</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='int'>2</span><span class='rparen'>)</span>
<span class='kw'>next</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_var'>var</span> <span class='op'>=~</span> <span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>^\s+$</span><span class='regexp_end'>/</span></span><span class='rparen'>)</span>
<span class='comment'># Invalid parse? Raise an exception and let those bastards know.
</span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='id identifier rubyid_var'>var</span> <span class='op'>==</span> <span class='kw'>nil</span> <span class='kw'>or</span> <span class='id identifier rubyid_val'>val</span> <span class='op'>==</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='id identifier rubyid_var'>var</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>unknown</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>if</span> <span class='lparen'>(</span><span class='op'>!</span><span class='id identifier rubyid_var'>var</span><span class='rparen'>)</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'><span class='object_link'><a href="../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'>ArgumentParseError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Invalid option specified: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_var'>var</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
<span class='id identifier rubyid_caller'>caller</span>
<span class='kw'>end</span>
<span class='comment'># Remove trailing whitespaces from the value
</span> <span class='id identifier rubyid_val'>val</span><span class='period'>.</span><span class='id identifier rubyid_gsub!'>gsub!</span><span class='lparen'>(</span><span class='tstring'><span class='regexp_beg'>/</span><span class='tstring_content'>\s+$</span><span class='regexp_end'>/</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='comment'># Store the value
</span> <span class='id identifier rubyid_hash'>hash</span><span class='lbracket'>[</span><span class='id identifier rubyid_var'>var</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_val'>val</span>
<span class='rbrace'>}</span>
<span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_hash'>hash</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="key?-instance_method">
#<strong>key?</strong>(key) &#x21d2; <tt>TrueClass</tt>, <tt>FalseClass</tt>
<span class="aliases">Also known as:
<span class="names"><span id='has_key?-instance_method'>has_key?</span>, <span id='include?-instance_method'>include?</span>, <span id='member?-instance_method'>member?</span></span>
</span>
</h3><div class="docstring">
<div class="discussion">
<p>Returns True if the key is present in the user defined values, or within registered options. False otherwise.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>key</span>
<span class='type'>(<tt>String</tt>)</span>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>TrueClass</tt>, <tt>FalseClass</tt>)</span>
&mdash;
<div class='inline'>
<p>True if the key is present in the user defined values, or within registered options. False otherwise.</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
245
246
247
248</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 245</span>
<span class='kw'>def</span> <span class='id identifier rubyid_key?'>key?</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_matching_key'>matching_key</span> <span class='op'>=</span> <span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_include?'>include?</span><span class='lparen'>(</span><span class='id identifier rubyid_matching_key'>matching_key</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="key_error_for-instance_method">
#<strong>key_error_for</strong>(key) &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><div class="docstring">
<div class="discussion">
<p>Raised when the specified key is not found</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>key</span>
<span class='type'>(<tt>string</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
500
501
502</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 500</span>
<span class='kw'>def</span> <span class='id identifier rubyid_key_error_for'>key_error_for</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='op'>::</span><span class='const'>KeyError</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>key not found: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='period'>.</span><span class='id identifier rubyid_inspect'>inspect</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="keys-instance_method">
#<strong>keys</strong> &#x21d2; <tt>Array&lt;String&gt;</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Returns The array of user defined datastore values, and registered option names.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Array&lt;String&gt;</tt>)</span>
&mdash;
<div class='inline'>
<p>The array of user defined datastore values, and registered option names</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
231
232
233</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 231</span>
<span class='kw'>def</span> <span class='id identifier rubyid_keys'>keys</span>
<span class='lparen'>(</span><span class='ivar'>@user_defined</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span> <span class='op'>+</span> <span class='ivar'>@options</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_uniq'>uniq</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:downcase</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="length-instance_method">
#<strong>length</strong> &#x21d2; <tt>Integer</tt>
<span class="aliases">Also known as:
<span class="names"><span id='count-instance_method'>count</span>, <span id='size-instance_method'>size</span></span>
</span>
</h3><div class="docstring">
<div class="discussion">
<p>Returns The length of the registered keys.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>Integer</tt>)</span>
&mdash;
<div class='inline'>
<p>The length of the registered keys</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
236
237
238</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 236</span>
<span class='kw'>def</span> <span class='id identifier rubyid_length'>length</span>
<span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="merge-instance_method">
#<strong>merge</strong>(other) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Override merge to ensure we merge the aliases and imported hashes</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>other</span>
<span class='type'>(<tt>Msf::Datastore</tt>, <tt>Hash</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
381
382
383
384</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 381</span>
<span class='kw'>def</span> <span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='rparen'>)</span>
<span class='id identifier rubyid_ds'>ds</span> <span class='op'>=</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_copy'>copy</span>
<span class='id identifier rubyid_ds'>ds</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="merge!-instance_method">
#<strong>merge!</strong>(other) &#x21d2; <tt>Object</tt>
<span class="aliases">Also known as:
<span class="names"><span id='update-instance_method'>update</span></span>
</span>
</h3><div class="docstring">
<div class="discussion">
<p>Merge the other object into the current datastores aliases and imported hashes</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>other</span>
<span class='type'>(<tt>Msf::Datastore</tt>, <tt>Hash</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 347</span>
<span class='kw'>def</span> <span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="" title="Msf::DataStore (class)">DataStore</a></span></span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_aliases'>aliases</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_options'>options</span><span class='rparen'>)</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_defaults'>defaults</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_defaults'>defaults</span><span class='rparen'>)</span>
<span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_user_defined'>user_defined</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='op'>|</span>
<span class='ivar'>@user_defined</span><span class='lbracket'>[</span><span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_v'>v</span>
<span class='kw'>end</span>
<span class='kw'>else</span>
<span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='op'>|</span>
<span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_v'>v</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>self</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="remove_option-instance_method">
#<strong>remove_option</strong>(name) &#x21d2; <tt>nil</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Removes an option and any associated value</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>name</span>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>the option name</p>
</div>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt>nil</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
132
133
134
135
136
137
138
139</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 132</span>
<span class='kw'>def</span> <span class='id identifier rubyid_remove_option'>remove_option</span><span class='lparen'>(</span><span class='id identifier rubyid_name'>name</span><span class='rparen'>)</span>
<span class='id identifier rubyid_k'>k</span> <span class='op'>=</span> <span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_name'>name</span><span class='rparen'>)</span>
<span class='ivar'>@user_defined</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='ivar'>@aliases</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid__'>_</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='op'>|</span> <span class='id identifier rubyid_v'>v</span><span class='period'>.</span><span class='id identifier rubyid_casecmp?'>casecmp?</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
<span class='ivar'>@options</span><span class='period'>.</span><span class='id identifier rubyid_delete_if'>delete_if</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_option_name'>option_name</span><span class='comma'>,</span> <span class='id identifier rubyid__v'>_v</span><span class='op'>|</span> <span class='id identifier rubyid_option_name'>option_name</span><span class='period'>.</span><span class='id identifier rubyid_casecmp?'>casecmp?</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span> <span class='op'>||</span> <span class='id identifier rubyid_option_name'>option_name</span><span class='period'>.</span><span class='id identifier rubyid_casecmp?'>casecmp?</span><span class='lparen'>(</span><span class='id identifier rubyid_name'>name</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
<span class='kw'>nil</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="reverse_merge!-instance_method">
#<strong>reverse_merge!</strong>(other) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Reverse Merge the other object into the current datastores aliases and imported hashes Equivalent to ActiveSupports reverse_merge! functionality.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>other</span>
<span class='type'>(<tt>Msf::Datastore</tt>)</span>
</li>
</ul>
<p class="tag_title">Raises:</p>
<ul class="raise">
<li>
<span class='type'>(<tt>ArgumentError</tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
371
372
373
374
375</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 371</span>
<span class='kw'>def</span> <span class='id identifier rubyid_reverse_merge!'>reverse_merge!</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='rparen'>)</span>
<span class='id identifier rubyid_raise'>raise</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>invalid error type </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span><span class='embexpr_end'>}</span><span class='tstring_content'>, expected ::Msf::DataStore</span><span class='tstring_end'>&quot;</span></span> <span class='kw'>unless</span> <span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span><span class='lparen'>(</span><span class='const'><span class='object_link'><a href="../Msf.html" title="Msf (module)">Msf</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="" title="Msf::DataStore (class)">DataStore</a></span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_copy_state'>copy_state</span><span class='lparen'>(</span><span class='id identifier rubyid_other'>other</span><span class='period'>.</span><span class='id identifier rubyid_merge'>merge</span><span class='lparen'>(</span><span class='kw'>self</span><span class='rparen'>)</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="search_for-instance_method">
#<strong>search_for</strong>(key) &#x21d2; <tt><span class='object_link'><a href="DataStore/DataStoreSearchResult.html" title="Msf::DataStore::DataStoreSearchResult (class)">DataStoreSearchResult</a></span></tt>
</h3><div class="docstring">
<div class="discussion">
<p>Search for a value within the current datastore, taking into consideration any registered aliases, fallbacks, etc.</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>key</span>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>The key to search for</p>
</div>
</li>
</ul>
<p class="tag_title">Returns:</p>
<ul class="return">
<li>
<span class='type'>(<tt><span class='object_link'><a href="DataStore/DataStoreSearchResult.html" title="Msf::DataStore::DataStoreSearchResult (class)">DataStoreSearchResult</a></span></tt>)</span>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 447</span>
<span class='kw'>def</span> <span class='id identifier rubyid_search_for'>search_for</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_k'>k</span> <span class='op'>=</span> <span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='kw'>return</span> <span class='id identifier rubyid_search_result'>search_result</span><span class='lparen'>(</span><span class='symbol'>:user_defined</span><span class='comma'>,</span> <span class='ivar'>@user_defined</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='ivar'>@user_defined</span><span class='period'>.</span><span class='id identifier rubyid_key?'>key?</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='ivar'>@options</span><span class='period'>.</span><span class='id identifier rubyid_fetch'>fetch</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span> <span class='lbrace'>{</span> <span class='ivar'>@options</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_option_name'>option_name</span><span class='comma'>,</span> <span class='id identifier rubyid__option'>_option</span><span class='op'>|</span> <span class='id identifier rubyid_option_name'>option_name</span><span class='period'>.</span><span class='id identifier rubyid_casecmp?'>casecmp?</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span> <span class='rbrace'>}</span><span class='op'>&amp;.</span><span class='id identifier rubyid_last'>last</span> <span class='rbrace'>}</span>
<span class='kw'>if</span> <span class='id identifier rubyid_option'>option</span>
<span class='comment'># If the key isn&#39;t present - check any additional fallbacks that have been registered with the option.
</span> <span class='comment'># i.e. handling the scenario of SMBUser not being explicitly set, but the option has registered a more
</span> <span class='comment'># generic &#39;Username&#39; fallback
</span> <span class='id identifier rubyid_option'>option</span><span class='period'>.</span><span class='id identifier rubyid_fallbacks'>fallbacks</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_fallback'>fallback</span><span class='op'>|</span>
<span class='id identifier rubyid_fallback_search'>fallback_search</span> <span class='op'>=</span> <span class='id identifier rubyid_search_for'>search_for</span><span class='lparen'>(</span><span class='id identifier rubyid_fallback'>fallback</span><span class='rparen'>)</span>
<span class='kw'>if</span> <span class='id identifier rubyid_fallback_search'>fallback_search</span><span class='period'>.</span><span class='id identifier rubyid_found?'>found?</span>
<span class='kw'>return</span> <span class='id identifier rubyid_search_result'>search_result</span><span class='lparen'>(</span><span class='symbol'>:option_fallback</span><span class='comma'>,</span> <span class='id identifier rubyid_fallback_search'>fallback_search</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span><span class='comma'>,</span> <span class='label'>fallback_key:</span> <span class='id identifier rubyid_fallback'>fallback</span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='comment'># Checking for imported default values, ignoring case again
</span> <span class='id identifier rubyid_imported_default_match'>imported_default_match</span> <span class='op'>=</span> <span class='ivar'>@defaults</span><span class='period'>.</span><span class='id identifier rubyid_find'>find</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_default_key'>default_key</span><span class='comma'>,</span> <span class='id identifier rubyid__default_value'>_default_value</span><span class='op'>|</span> <span class='id identifier rubyid_default_key'>default_key</span><span class='period'>.</span><span class='id identifier rubyid_casecmp?'>casecmp?</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span> <span class='rbrace'>}</span>
<span class='kw'>return</span> <span class='id identifier rubyid_search_result'>search_result</span><span class='lparen'>(</span><span class='symbol'>:imported_default</span><span class='comma'>,</span> <span class='id identifier rubyid_imported_default_match'>imported_default_match</span><span class='period'>.</span><span class='id identifier rubyid_last'>last</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_imported_default_match'>imported_default_match</span>
<span class='kw'>return</span> <span class='id identifier rubyid_search_result'>search_result</span><span class='lparen'>(</span><span class='symbol'>:option_default</span><span class='comma'>,</span> <span class='id identifier rubyid_option'>option</span><span class='period'>.</span><span class='id identifier rubyid_default'>default</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_option'>option</span>
<span class='id identifier rubyid_search_result'>search_result</span><span class='lparen'>(</span><span class='symbol'>:not_found</span><span class='comma'>,</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="search_result-instance_method">
#<strong>search_result</strong>(result, value, fallback_key: nil) &#x21d2; <tt>Object</tt> <span class="extras">(protected)</span>
</h3><table class="source_code">
<tr>
<td>
<pre class="lines">
546
547
548</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 546</span>
<span class='kw'>def</span> <span class='id identifier rubyid_search_result'>search_result</span><span class='lparen'>(</span><span class='id identifier rubyid_result'>result</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='comma'>,</span> <span class='label'>fallback_key:</span> <span class='kw'>nil</span><span class='rparen'>)</span>
<span class='const'><span class='object_link'><a href="DataStore/DataStoreSearchResult.html" title="Msf::DataStore::DataStoreSearchResult (class)">DataStoreSearchResult</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="DataStore/DataStoreSearchResult.html#initialize-instance_method" title="Msf::DataStore::DataStoreSearchResult#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_result'>result</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span><span class='comma'>,</span> <span class='label'>namespace:</span> <span class='symbol'>:global_data_store</span><span class='comma'>,</span> <span class='label'>fallback_key:</span> <span class='id identifier rubyid_fallback_key'>fallback_key</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="store-instance_method">
#<strong>store</strong>(k, v) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Case-insensitive wrapper around store; Skips option validation entirely</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
98
99
100</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 98</span>
<span class='kw'>def</span> <span class='id identifier rubyid_store'>store</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span><span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span>
<span class='ivar'>@user_defined</span><span class='lbracket'>[</span><span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_v'>v</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="to_external_message_h-instance_method">
#<strong>to_external_message_h</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Hack on a hack for the external modules</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 279</span>
<span class='kw'>def</span> <span class='id identifier rubyid_to_external_message_h'>to_external_message_h</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='id identifier rubyid_array_nester'>array_nester</span> <span class='op'>=</span> <span class='tlambda'>-&gt;</span><span class='lparen'>(</span><span class='id identifier rubyid_arr'>arr</span><span class='rparen'>)</span> <span class='kw'>do</span>
<span class='kw'>if</span> <span class='id identifier rubyid_arr'>arr</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span> <span class='const'>Array</span>
<span class='id identifier rubyid_arr'>arr</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='op'>&amp;</span><span class='id identifier rubyid_array_nester'>array_nester</span>
<span class='kw'>else</span>
<span class='id identifier rubyid_arr'>arr</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_item'>item</span><span class='op'>|</span> <span class='id identifier rubyid_item'>item</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span><span class='period'>.</span><span class='id identifier rubyid_force_encoding'>force_encoding</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>UTF-8</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span> <span class='rbrace'>}</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_k'>k</span><span class='op'>|</span>
<span class='comment'># TODO arbitrary depth
</span> <span class='kw'>if</span> <span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_is_a?'>is_a?</span> <span class='const'>Array</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span><span class='period'>.</span><span class='id identifier rubyid_force_encoding'>force_encoding</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>UTF-8</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_array_nester'>array_nester</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span><span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span><span class='rparen'>)</span>
<span class='kw'>else</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span><span class='period'>.</span><span class='id identifier rubyid_force_encoding'>force_encoding</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>UTF-8</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span><span class='period'>.</span><span class='id identifier rubyid_force_encoding'>force_encoding</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>UTF-8</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='kw'>end</span>
<span class='kw'>end</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="to_file-instance_method">
#<strong>to_file</strong>(path, name = &#39;global&#39;) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Persists the contents of the data store to a file</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
304
305
306
307
308
309
310
311
312
313
314
315</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 304</span>
<span class='kw'>def</span> <span class='id identifier rubyid_to_file'>to_file</span><span class='lparen'>(</span><span class='id identifier rubyid_path'>path</span><span class='comma'>,</span> <span class='id identifier rubyid_name'>name</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>global</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_ini'>ini</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Rex.html" title="Rex (module)">Rex</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../Rex/Parser.html" title="Rex::Parser (module)">Parser</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="../Rex/Parser/Ini.html" title="Rex::Parser::Ini (class)">Ini</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="../Rex/Parser/Ini.html#initialize-instance_method" title="Rex::Parser::Ini#initialize (method)">new</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_path'>path</span><span class='rparen'>)</span>
<span class='id identifier rubyid_ini'>ini</span><span class='period'>.</span><span class='id identifier rubyid_add_group'>add_group</span><span class='lparen'>(</span><span class='id identifier rubyid_name'>name</span><span class='rparen'>)</span>
<span class='comment'># Save all user-defined options to the file.
</span> <span class='ivar'>@user_defined</span><span class='period'>.</span><span class='id identifier rubyid_each_pair'>each_pair</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='op'>|</span>
<span class='id identifier rubyid_ini'>ini</span><span class='lbracket'>[</span><span class='id identifier rubyid_name'>name</span><span class='rbracket'>]</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_v'>v</span>
<span class='rbrace'>}</span>
<span class='id identifier rubyid_ini'>ini</span><span class='period'>.</span><span class='id identifier rubyid_to_file'>to_file</span><span class='lparen'>(</span><span class='id identifier rubyid_path'>path</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="to_h-instance_method">
#<strong>to_h</strong> &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Override Hashs to_h method so we can include the original case of each key (failing to do this breaks a number of places in framework and pro that use serialized datastores)</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
270
271
272
273
274
275
276</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 270</span>
<span class='kw'>def</span> <span class='id identifier rubyid_to_h'>to_h</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
<span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_k'>k</span><span class='op'>|</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_k'>k</span><span class='rbracket'>]</span>
<span class='kw'>end</span>
<span class='id identifier rubyid_datastore_hash'>datastore_hash</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="to_s-instance_method">
#<strong>to_s</strong>(delim = &#39; &#39;) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Serializes the options in the datastore to a string.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
257
258
259
260
261
262
263
264
265</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 257</span>
<span class='kw'>def</span> <span class='id identifier rubyid_to_s'>to_s</span><span class='lparen'>(</span><span class='id identifier rubyid_delim'>delim</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'> </span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span>
<span class='id identifier rubyid_keys'>keys</span><span class='period'>.</span><span class='id identifier rubyid_sort'>sort</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_key'>key</span><span class='op'>|</span>
<span class='id identifier rubyid_str'>str</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_key'>key</span><span class='embexpr_end'>}</span><span class='tstring_content'>=</span><span class='embexpr_beg'>#{</span><span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_key'>key</span><span class='rbracket'>]</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span> <span class='op'>+</span> <span class='lparen'>(</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span><span class='rparen'>)</span> <span class='op'>?</span> <span class='id identifier rubyid_delim'>delim</span> <span class='op'>:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
<span class='rbrace'>}</span>
<span class='id identifier rubyid_str'>str</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="unset-instance_method">
#<strong>unset</strong>(key) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>unset the current key from the datastore</p>
</div>
</div>
<div class="tags">
<p class="tag_title">Parameters:</p>
<ul class="param">
<li>
<span class='name'>key</span>
<span class='type'>(<tt>String</tt>)</span>
&mdash;
<div class='inline'>
<p>The key to search for</p>
</div>
</li>
</ul>
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
113
114
115
116
117
118
119</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 113</span>
<span class='kw'>def</span> <span class='id identifier rubyid_unset'>unset</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_k'>k</span> <span class='op'>=</span> <span class='id identifier rubyid_find_key_case'>find_key_case</span><span class='lparen'>(</span><span class='id identifier rubyid_key'>key</span><span class='rparen'>)</span>
<span class='id identifier rubyid_search_result'>search_result</span> <span class='op'>=</span> <span class='id identifier rubyid_search_for'>search_for</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='ivar'>@user_defined</span><span class='period'>.</span><span class='id identifier rubyid_delete'>delete</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='rparen'>)</span>
<span class='id identifier rubyid_search_result'>search_result</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
<div class="method_details ">
<h3 class="signature " id="update_value-instance_method">
#<strong>update_value</strong>(k, v) &#x21d2; <tt>Object</tt>
</h3><div class="docstring">
<div class="discussion">
<p>Updates a value in the datastore with the specified name, k, to the specified value, v. Skips option validation entirely.</p>
</div>
</div>
<div class="tags">
</div><table class="source_code">
<tr>
<td>
<pre class="lines">
106
107
108</pre>
</td>
<td>
<pre class="code"><span class="info file"># File 'lib/msf/core/data_store.rb', line 106</span>
<span class='kw'>def</span> <span class='id identifier rubyid_update_value'>update_value</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span>
<span class='id identifier rubyid_store'>store</span><span class='lparen'>(</span><span class='id identifier rubyid_k'>k</span><span class='comma'>,</span> <span class='id identifier rubyid_v'>v</span><span class='rparen'>)</span>
<span class='kw'>end</span></pre>
</td>
</tr>
</table>
</div>
</div>
</div>
<div id="footer">
Generated on Fri May 8 17:03:19 2026 by
<a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
0.9.37 (ruby-3.1.5).
</div>
</div>
</body>
</html>