<?xml version="1.0" encoding="UTF-8"?>
<!--
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="website.xsd">
	<properties>
		<title>Howto create a Custom Crypt styles</title>
		<author email="sebawagner@apache.org">
			OpenMeetings Team
		</author>
	</properties>
	<body>
		<section name="Configuration of Custom Crypt-Style">
			<p>
				You can use custom Crypt-Types, but you should decide during
				installation which Type of encryption you want to use. By default
				two type are available:
			</p>

			<ul>
				<li>org.xmlcrm.utils.crypt.MD5Implementation - this uses common MD5
					Crypt like PHP does, this is the default one (results in something
					like: fe01ce2a7fbac8fafaed7c982a04e229)</li>
				<li>org.xmlcrm.utils.crypt.MD5CryptImplementation - does use
					BSD-Style of encryption using a salt (results in something like:
					$1$GMsj7F2I$5S3r9CeukXGXNwf6b4sph1)</li>
			</ul>
			<p>
				You can edit the config-key during Installation or later in the
				Administration Panel. But if you change it using the
				Administration-Panel previous passwords might be not working anymore
				as they are encrypted with another algorithm.
			</p>
		</section>
		<section name="Configuration of Custom Crypt-Style">
			<p>
				To add your own crypt style you need to write a class which
				implements the interface: org.xmlcrm.utils.cryptCryptString
				<br />
				and extends the Adapter: org.xmlcrm.utils.CryptStringAdapter
				<br />
				Example of an Implementation:
			</p>
			<div class="xmlcode">
				package org.xmlcrm.utils.crypt;
				
				import java.security.NoSuchAlgorithmException;
				
				public class MD5Implementation extends CryptStringAdapter implements CryptString {
				
				        @Override
				        public String createPassPhrase(String userGivenPass) {
				                String passPhrase = null;
				                try {
				                        passPhrase = MD5.do_checksum(userGivenPass);
				                } catch (NoSuchAlgorithmException e) {
				                        e.printStackTrace();
				                }
				                return passPhrase;
				        }
				
				        @Override
				        public Boolean verifyPassword(String passGiven, String passwdFromDb) {
				                return (passwdFromDb.equals(createPassPhrase(passGiven)));
				        }
				        
				}
			</div>
			<p>To add your own Encryption-Class you need to add your class to the
				OpenMeetings-Webapp (make it available to the webapp-classpath) and
				use your custom-class-name instead of
				org.xmlcrm.utils.crypt.MD5Implementation during the Installation or
				at runtime by editing the config-key crypt_ClassName</p>
		</section>
		<section name="Configuration of Custom Crypt-Style">
			<p>credits goto Mika for sharing his Implementation of the
				MD5Crypt-Style</p>
		</section>
	</body>
</document>
