<HTML>
<BODY BGCOLOR="white">
<PRE>
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
<FONT color="green">002</FONT>     * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
<FONT color="green">003</FONT>     * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
<FONT color="green">004</FONT>     * distributed with this work for additional information<a name="line.4"></a>
<FONT color="green">005</FONT>     * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
<FONT color="green">006</FONT>     * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
<FONT color="green">007</FONT>     * "License"); you may not use this file except in compliance<a name="line.7"></a>
<FONT color="green">008</FONT>     * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
<FONT color="green">009</FONT>     *<a name="line.9"></a>
<FONT color="green">010</FONT>     *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
<FONT color="green">011</FONT>     *<a name="line.11"></a>
<FONT color="green">012</FONT>     * Unless required by applicable law or agreed to in writing,<a name="line.12"></a>
<FONT color="green">013</FONT>     * software distributed under the License is distributed on an<a name="line.13"></a>
<FONT color="green">014</FONT>     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<a name="line.14"></a>
<FONT color="green">015</FONT>     * KIND, either express or implied.  See the License for the<a name="line.15"></a>
<FONT color="green">016</FONT>     * specific language governing permissions and limitations<a name="line.16"></a>
<FONT color="green">017</FONT>     * under the License.<a name="line.17"></a>
<FONT color="green">018</FONT>     */<a name="line.18"></a>
<FONT color="green">019</FONT>    package org.apache.shiro.realm.text;<a name="line.19"></a>
<FONT color="green">020</FONT>    <a name="line.20"></a>
<FONT color="green">021</FONT>    import org.apache.shiro.authc.SimpleAccount;<a name="line.21"></a>
<FONT color="green">022</FONT>    import org.apache.shiro.authz.Permission;<a name="line.22"></a>
<FONT color="green">023</FONT>    import org.apache.shiro.authz.SimpleRole;<a name="line.23"></a>
<FONT color="green">024</FONT>    import org.apache.shiro.config.ConfigurationException;<a name="line.24"></a>
<FONT color="green">025</FONT>    import org.apache.shiro.realm.SimpleAccountRealm;<a name="line.25"></a>
<FONT color="green">026</FONT>    import org.apache.shiro.util.PermissionUtils;<a name="line.26"></a>
<FONT color="green">027</FONT>    import org.apache.shiro.util.StringUtils;<a name="line.27"></a>
<FONT color="green">028</FONT>    <a name="line.28"></a>
<FONT color="green">029</FONT>    import java.text.ParseException;<a name="line.29"></a>
<FONT color="green">030</FONT>    import java.util.*;<a name="line.30"></a>
<FONT color="green">031</FONT>    <a name="line.31"></a>
<FONT color="green">032</FONT>    <a name="line.32"></a>
<FONT color="green">033</FONT>    /**<a name="line.33"></a>
<FONT color="green">034</FONT>     * A SimpleAccountRealm that enables text-based configuration of the initial User, Role, and Permission objects<a name="line.34"></a>
<FONT color="green">035</FONT>     * created at startup.<a name="line.35"></a>
<FONT color="green">036</FONT>     * &lt;p/&gt;<a name="line.36"></a>
<FONT color="green">037</FONT>     * Each User account definition specifies the username, password, and roles for a user.  Each Role definition<a name="line.37"></a>
<FONT color="green">038</FONT>     * specifies a name and an optional collection of assigned Permissions.  Users can be assigned Roles, and Roles can be<a name="line.38"></a>
<FONT color="green">039</FONT>     * assigned Permissions.  By transitive association, each User 'has' all of their Role's Permissions.<a name="line.39"></a>
<FONT color="green">040</FONT>     * &lt;p/&gt;<a name="line.40"></a>
<FONT color="green">041</FONT>     * User and user-to-role definitions are specified via the {@link #setUserDefinitions} method and<a name="line.41"></a>
<FONT color="green">042</FONT>     * Role-to-permission definitions are specified via the {@link #setRoleDefinitions} method.<a name="line.42"></a>
<FONT color="green">043</FONT>     *<a name="line.43"></a>
<FONT color="green">044</FONT>     * @since 0.9<a name="line.44"></a>
<FONT color="green">045</FONT>     */<a name="line.45"></a>
<FONT color="green">046</FONT>    public class TextConfigurationRealm extends SimpleAccountRealm {<a name="line.46"></a>
<FONT color="green">047</FONT>    <a name="line.47"></a>
<FONT color="green">048</FONT>        //TODO - complete JavaDoc<a name="line.48"></a>
<FONT color="green">049</FONT>    <a name="line.49"></a>
<FONT color="green">050</FONT>        private volatile String userDefinitions;<a name="line.50"></a>
<FONT color="green">051</FONT>        private volatile String roleDefinitions;<a name="line.51"></a>
<FONT color="green">052</FONT>    <a name="line.52"></a>
<FONT color="green">053</FONT>        public TextConfigurationRealm() {<a name="line.53"></a>
<FONT color="green">054</FONT>            super();<a name="line.54"></a>
<FONT color="green">055</FONT>        }<a name="line.55"></a>
<FONT color="green">056</FONT>    <a name="line.56"></a>
<FONT color="green">057</FONT>        /**<a name="line.57"></a>
<FONT color="green">058</FONT>         * Will call 'processDefinitions' on startup.<a name="line.58"></a>
<FONT color="green">059</FONT>         *<a name="line.59"></a>
<FONT color="green">060</FONT>         * @since 1.2<a name="line.60"></a>
<FONT color="green">061</FONT>         * @see &lt;a href="https://issues.apache.org/jira/browse/SHIRO-223"&gt;SHIRO-223&lt;/a&gt;<a name="line.61"></a>
<FONT color="green">062</FONT>         */<a name="line.62"></a>
<FONT color="green">063</FONT>        @Override<a name="line.63"></a>
<FONT color="green">064</FONT>        protected void onInit() {<a name="line.64"></a>
<FONT color="green">065</FONT>            super.onInit();<a name="line.65"></a>
<FONT color="green">066</FONT>            processDefinitions();<a name="line.66"></a>
<FONT color="green">067</FONT>        }<a name="line.67"></a>
<FONT color="green">068</FONT>    <a name="line.68"></a>
<FONT color="green">069</FONT>        public String getUserDefinitions() {<a name="line.69"></a>
<FONT color="green">070</FONT>            return userDefinitions;<a name="line.70"></a>
<FONT color="green">071</FONT>        }<a name="line.71"></a>
<FONT color="green">072</FONT>    <a name="line.72"></a>
<FONT color="green">073</FONT>        /**<a name="line.73"></a>
<FONT color="green">074</FONT>         * &lt;p&gt;Sets a newline (\n) delimited String that defines user-to-password-and-role(s) key/value pairs according<a name="line.74"></a>
<FONT color="green">075</FONT>         * to the following format:<a name="line.75"></a>
<FONT color="green">076</FONT>         * &lt;p/&gt;<a name="line.76"></a>
<FONT color="green">077</FONT>         * &lt;p&gt;&lt;code&gt;&lt;em&gt;username&lt;/em&gt; = &lt;em&gt;password&lt;/em&gt;, role1, role2,...&lt;/code&gt;&lt;/p&gt;<a name="line.77"></a>
<FONT color="green">078</FONT>         * &lt;p/&gt;<a name="line.78"></a>
<FONT color="green">079</FONT>         * &lt;p&gt;Here are some examples of what these lines might look like:&lt;/p&gt;<a name="line.79"></a>
<FONT color="green">080</FONT>         * &lt;p/&gt;<a name="line.80"></a>
<FONT color="green">081</FONT>         * &lt;p&gt;&lt;code&gt;root = &lt;em&gt;reallyHardToGuessPassword&lt;/em&gt;, administrator&lt;br/&gt;<a name="line.81"></a>
<FONT color="green">082</FONT>         * jsmith = &lt;em&gt;jsmithsPassword&lt;/em&gt;, manager, engineer, employee&lt;br/&gt;<a name="line.82"></a>
<FONT color="green">083</FONT>         * abrown = &lt;em&gt;abrownsPassword&lt;/em&gt;, qa, employee&lt;br/&gt;<a name="line.83"></a>
<FONT color="green">084</FONT>         * djones = &lt;em&gt;djonesPassword&lt;/em&gt;, qa, contractor&lt;br/&gt;<a name="line.84"></a>
<FONT color="green">085</FONT>         * guest = &lt;em&gt;guestPassword&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;<a name="line.85"></a>
<FONT color="green">086</FONT>         *<a name="line.86"></a>
<FONT color="green">087</FONT>         * @param userDefinitions the user definitions to be parsed and converted to Map.Entry elements<a name="line.87"></a>
<FONT color="green">088</FONT>         */<a name="line.88"></a>
<FONT color="green">089</FONT>        public void setUserDefinitions(String userDefinitions) {<a name="line.89"></a>
<FONT color="green">090</FONT>            this.userDefinitions = userDefinitions;<a name="line.90"></a>
<FONT color="green">091</FONT>        }<a name="line.91"></a>
<FONT color="green">092</FONT>    <a name="line.92"></a>
<FONT color="green">093</FONT>        public String getRoleDefinitions() {<a name="line.93"></a>
<FONT color="green">094</FONT>            return roleDefinitions;<a name="line.94"></a>
<FONT color="green">095</FONT>        }<a name="line.95"></a>
<FONT color="green">096</FONT>    <a name="line.96"></a>
<FONT color="green">097</FONT>        /**<a name="line.97"></a>
<FONT color="green">098</FONT>         * Sets a newline (\n) delimited String that defines role-to-permission definitions.<a name="line.98"></a>
<FONT color="green">099</FONT>         * &lt;p/&gt;<a name="line.99"></a>
<FONT color="green">100</FONT>         * &lt;p&gt;Each line within the string must define a role-to-permission(s) key/value mapping with the<a name="line.100"></a>
<FONT color="green">101</FONT>         * equals character signifies the key/value separation, like so:&lt;/p&gt;<a name="line.101"></a>
<FONT color="green">102</FONT>         * &lt;p/&gt;<a name="line.102"></a>
<FONT color="green">103</FONT>         * &lt;p&gt;&lt;code&gt;&lt;em&gt;rolename&lt;/em&gt; = &lt;em&gt;permissionDefinition1&lt;/em&gt;, &lt;em&gt;permissionDefinition2&lt;/em&gt;, ...&lt;/code&gt;&lt;/p&gt;<a name="line.103"></a>
<FONT color="green">104</FONT>         * &lt;p/&gt;<a name="line.104"></a>
<FONT color="green">105</FONT>         * &lt;p&gt;where &lt;em&gt;permissionDefinition&lt;/em&gt; is an arbitrary String, but must people will want to use<a name="line.105"></a>
<FONT color="green">106</FONT>         * Strings that conform to the {@link org.apache.shiro.authz.permission.WildcardPermission WildcardPermission}<a name="line.106"></a>
<FONT color="green">107</FONT>         * format for ease of use and flexibility.  Note that if an individual &lt;em&gt;permissionDefnition&lt;/em&gt; needs to<a name="line.107"></a>
<FONT color="green">108</FONT>         * be internally comma-delimited (e.g. &lt;code&gt;printer:5thFloor:print,info&lt;/code&gt;), you will need to surround that<a name="line.108"></a>
<FONT color="green">109</FONT>         * definition with double quotes (&amp;quot;) to avoid parsing errors (e.g.<a name="line.109"></a>
<FONT color="green">110</FONT>         * &lt;code&gt;&amp;quot;printer:5thFloor:print,info&amp;quot;&lt;/code&gt;).<a name="line.110"></a>
<FONT color="green">111</FONT>         * &lt;p/&gt;<a name="line.111"></a>
<FONT color="green">112</FONT>         * &lt;p&gt;&lt;b&gt;NOTE:&lt;/b&gt; if you have roles that don't require permission associations, don't include them in this<a name="line.112"></a>
<FONT color="green">113</FONT>         * definition - just defining the role name in the {@link #setUserDefinitions(String) userDefinitions} is<a name="line.113"></a>
<FONT color="green">114</FONT>         * enough to create the role if it does not yet exist.  This property is really only for configuring realms that<a name="line.114"></a>
<FONT color="green">115</FONT>         * have one or more assigned Permission.<a name="line.115"></a>
<FONT color="green">116</FONT>         *<a name="line.116"></a>
<FONT color="green">117</FONT>         * @param roleDefinitions the role definitions to be parsed at initialization<a name="line.117"></a>
<FONT color="green">118</FONT>         */<a name="line.118"></a>
<FONT color="green">119</FONT>        public void setRoleDefinitions(String roleDefinitions) {<a name="line.119"></a>
<FONT color="green">120</FONT>            this.roleDefinitions = roleDefinitions;<a name="line.120"></a>
<FONT color="green">121</FONT>        }<a name="line.121"></a>
<FONT color="green">122</FONT>    <a name="line.122"></a>
<FONT color="green">123</FONT>        protected void processDefinitions() {<a name="line.123"></a>
<FONT color="green">124</FONT>            try {<a name="line.124"></a>
<FONT color="green">125</FONT>                processRoleDefinitions();<a name="line.125"></a>
<FONT color="green">126</FONT>                processUserDefinitions();<a name="line.126"></a>
<FONT color="green">127</FONT>            } catch (ParseException e) {<a name="line.127"></a>
<FONT color="green">128</FONT>                String msg = "Unable to parse user and/or role definitions.";<a name="line.128"></a>
<FONT color="green">129</FONT>                throw new ConfigurationException(msg, e);<a name="line.129"></a>
<FONT color="green">130</FONT>            }<a name="line.130"></a>
<FONT color="green">131</FONT>        }<a name="line.131"></a>
<FONT color="green">132</FONT>    <a name="line.132"></a>
<FONT color="green">133</FONT>        protected void processRoleDefinitions() throws ParseException {<a name="line.133"></a>
<FONT color="green">134</FONT>            String roleDefinitions = getRoleDefinitions();<a name="line.134"></a>
<FONT color="green">135</FONT>            if (roleDefinitions == null) {<a name="line.135"></a>
<FONT color="green">136</FONT>                return;<a name="line.136"></a>
<FONT color="green">137</FONT>            }<a name="line.137"></a>
<FONT color="green">138</FONT>            Map&lt;String, String&gt; roleDefs = toMap(toLines(roleDefinitions));<a name="line.138"></a>
<FONT color="green">139</FONT>            processRoleDefinitions(roleDefs);<a name="line.139"></a>
<FONT color="green">140</FONT>        }<a name="line.140"></a>
<FONT color="green">141</FONT>    <a name="line.141"></a>
<FONT color="green">142</FONT>        protected void processRoleDefinitions(Map&lt;String, String&gt; roleDefs) {<a name="line.142"></a>
<FONT color="green">143</FONT>            if (roleDefs == null || roleDefs.isEmpty()) {<a name="line.143"></a>
<FONT color="green">144</FONT>                return;<a name="line.144"></a>
<FONT color="green">145</FONT>            }<a name="line.145"></a>
<FONT color="green">146</FONT>            for (String rolename : roleDefs.keySet()) {<a name="line.146"></a>
<FONT color="green">147</FONT>                String value = roleDefs.get(rolename);<a name="line.147"></a>
<FONT color="green">148</FONT>    <a name="line.148"></a>
<FONT color="green">149</FONT>                SimpleRole role = getRole(rolename);<a name="line.149"></a>
<FONT color="green">150</FONT>                if (role == null) {<a name="line.150"></a>
<FONT color="green">151</FONT>                    role = new SimpleRole(rolename);<a name="line.151"></a>
<FONT color="green">152</FONT>                    add(role);<a name="line.152"></a>
<FONT color="green">153</FONT>                }<a name="line.153"></a>
<FONT color="green">154</FONT>    <a name="line.154"></a>
<FONT color="green">155</FONT>                Set&lt;Permission&gt; permissions = PermissionUtils.resolveDelimitedPermissions(value, getPermissionResolver());<a name="line.155"></a>
<FONT color="green">156</FONT>                role.setPermissions(permissions);<a name="line.156"></a>
<FONT color="green">157</FONT>            }<a name="line.157"></a>
<FONT color="green">158</FONT>        }<a name="line.158"></a>
<FONT color="green">159</FONT>    <a name="line.159"></a>
<FONT color="green">160</FONT>        protected void processUserDefinitions() throws ParseException {<a name="line.160"></a>
<FONT color="green">161</FONT>            String userDefinitions = getUserDefinitions();<a name="line.161"></a>
<FONT color="green">162</FONT>            if (userDefinitions == null) {<a name="line.162"></a>
<FONT color="green">163</FONT>                return;<a name="line.163"></a>
<FONT color="green">164</FONT>            }<a name="line.164"></a>
<FONT color="green">165</FONT>    <a name="line.165"></a>
<FONT color="green">166</FONT>            Map&lt;String, String&gt; userDefs = toMap(toLines(userDefinitions));<a name="line.166"></a>
<FONT color="green">167</FONT>    <a name="line.167"></a>
<FONT color="green">168</FONT>            processUserDefinitions(userDefs);<a name="line.168"></a>
<FONT color="green">169</FONT>        }<a name="line.169"></a>
<FONT color="green">170</FONT>    <a name="line.170"></a>
<FONT color="green">171</FONT>        protected void processUserDefinitions(Map&lt;String, String&gt; userDefs) {<a name="line.171"></a>
<FONT color="green">172</FONT>            if (userDefs == null || userDefs.isEmpty()) {<a name="line.172"></a>
<FONT color="green">173</FONT>                return;<a name="line.173"></a>
<FONT color="green">174</FONT>            }<a name="line.174"></a>
<FONT color="green">175</FONT>            for (String username : userDefs.keySet()) {<a name="line.175"></a>
<FONT color="green">176</FONT>    <a name="line.176"></a>
<FONT color="green">177</FONT>                String value = userDefs.get(username);<a name="line.177"></a>
<FONT color="green">178</FONT>    <a name="line.178"></a>
<FONT color="green">179</FONT>                String[] passwordAndRolesArray = StringUtils.split(value);<a name="line.179"></a>
<FONT color="green">180</FONT>    <a name="line.180"></a>
<FONT color="green">181</FONT>                String password = passwordAndRolesArray[0];<a name="line.181"></a>
<FONT color="green">182</FONT>    <a name="line.182"></a>
<FONT color="green">183</FONT>                SimpleAccount account = getUser(username);<a name="line.183"></a>
<FONT color="green">184</FONT>                if (account == null) {<a name="line.184"></a>
<FONT color="green">185</FONT>                    account = new SimpleAccount(username, password, getName());<a name="line.185"></a>
<FONT color="green">186</FONT>                    add(account);<a name="line.186"></a>
<FONT color="green">187</FONT>                }<a name="line.187"></a>
<FONT color="green">188</FONT>                account.setCredentials(password);<a name="line.188"></a>
<FONT color="green">189</FONT>    <a name="line.189"></a>
<FONT color="green">190</FONT>                if (passwordAndRolesArray.length &gt; 1) {<a name="line.190"></a>
<FONT color="green">191</FONT>                    for (int i = 1; i &lt; passwordAndRolesArray.length; i++) {<a name="line.191"></a>
<FONT color="green">192</FONT>                        String rolename = passwordAndRolesArray[i];<a name="line.192"></a>
<FONT color="green">193</FONT>                        account.addRole(rolename);<a name="line.193"></a>
<FONT color="green">194</FONT>    <a name="line.194"></a>
<FONT color="green">195</FONT>                        SimpleRole role = getRole(rolename);<a name="line.195"></a>
<FONT color="green">196</FONT>                        if (role != null) {<a name="line.196"></a>
<FONT color="green">197</FONT>                            account.addObjectPermissions(role.getPermissions());<a name="line.197"></a>
<FONT color="green">198</FONT>                        }<a name="line.198"></a>
<FONT color="green">199</FONT>                    }<a name="line.199"></a>
<FONT color="green">200</FONT>                } else {<a name="line.200"></a>
<FONT color="green">201</FONT>                    account.setRoles(null);<a name="line.201"></a>
<FONT color="green">202</FONT>                }<a name="line.202"></a>
<FONT color="green">203</FONT>            }<a name="line.203"></a>
<FONT color="green">204</FONT>        }<a name="line.204"></a>
<FONT color="green">205</FONT>    <a name="line.205"></a>
<FONT color="green">206</FONT>        protected static Set&lt;String&gt; toLines(String s) {<a name="line.206"></a>
<FONT color="green">207</FONT>            LinkedHashSet&lt;String&gt; set = new LinkedHashSet&lt;String&gt;();<a name="line.207"></a>
<FONT color="green">208</FONT>            Scanner scanner = new Scanner(s);<a name="line.208"></a>
<FONT color="green">209</FONT>            while (scanner.hasNextLine()) {<a name="line.209"></a>
<FONT color="green">210</FONT>                set.add(scanner.nextLine());<a name="line.210"></a>
<FONT color="green">211</FONT>            }<a name="line.211"></a>
<FONT color="green">212</FONT>            return set;<a name="line.212"></a>
<FONT color="green">213</FONT>        }<a name="line.213"></a>
<FONT color="green">214</FONT>    <a name="line.214"></a>
<FONT color="green">215</FONT>        protected static Map&lt;String, String&gt; toMap(Collection&lt;String&gt; keyValuePairs) throws ParseException {<a name="line.215"></a>
<FONT color="green">216</FONT>            if (keyValuePairs == null || keyValuePairs.isEmpty()) {<a name="line.216"></a>
<FONT color="green">217</FONT>                return null;<a name="line.217"></a>
<FONT color="green">218</FONT>            }<a name="line.218"></a>
<FONT color="green">219</FONT>    <a name="line.219"></a>
<FONT color="green">220</FONT>            Map&lt;String, String&gt; pairs = new HashMap&lt;String, String&gt;();<a name="line.220"></a>
<FONT color="green">221</FONT>            for (String pairString : keyValuePairs) {<a name="line.221"></a>
<FONT color="green">222</FONT>                String[] pair = StringUtils.splitKeyValue(pairString);<a name="line.222"></a>
<FONT color="green">223</FONT>                if (pair != null) {<a name="line.223"></a>
<FONT color="green">224</FONT>                    pairs.put(pair[0].trim(), pair[1].trim());<a name="line.224"></a>
<FONT color="green">225</FONT>                }<a name="line.225"></a>
<FONT color="green">226</FONT>            }<a name="line.226"></a>
<FONT color="green">227</FONT>    <a name="line.227"></a>
<FONT color="green">228</FONT>            return pairs;<a name="line.228"></a>
<FONT color="green">229</FONT>        }<a name="line.229"></a>
<FONT color="green">230</FONT>    }<a name="line.230"></a>




























































</PRE>
</BODY>
</HTML>
