From 57fb37151a6c29d857733c78e3b00909aabaf413 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Thu, 19 Jul 2012 22:42:18 +0200
Subject: [PATCH] imap user backend

---
 apps/user_external/appinfo/app.php  |  2 ++
 apps/user_external/appinfo/info.xml | 13 ++++++++++
 apps/user_external/appinfo/version  |  1 +
 apps/user_external/lib/imap.php     | 40 +++++++++++++++++++++++++++++
 apps/user_external/tests/config.php | 16 ++++++++++++
 apps/user_external/tests/imap.php   | 34 ++++++++++++++++++++++++
 6 files changed, 106 insertions(+)
 create mode 100644 apps/user_external/appinfo/app.php
 create mode 100644 apps/user_external/appinfo/info.xml
 create mode 100644 apps/user_external/appinfo/version
 create mode 100644 apps/user_external/lib/imap.php
 create mode 100644 apps/user_external/tests/config.php
 create mode 100644 apps/user_external/tests/imap.php

diff --git a/apps/user_external/appinfo/app.php b/apps/user_external/appinfo/app.php
new file mode 100644
index 0000000000..e53b839daf
--- /dev/null
+++ b/apps/user_external/appinfo/app.php
@@ -0,0 +1,2 @@
+<?php
+OC::$CLASSPATH['OC_User_IMAP']='apps/user_external/lib/imap.php';
diff --git a/apps/user_external/appinfo/info.xml b/apps/user_external/appinfo/info.xml
new file mode 100644
index 0000000000..1d1dcee540
--- /dev/null
+++ b/apps/user_external/appinfo/info.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<info>
+	<id>user_external</id>
+	<name>External user support</name>
+	<description>Use external user authentication methods</description>
+	<licence>AGPL</licence>
+	<author>Robin Appelman</author>
+	<require>4</require>
+	<shipped>true</shipped>
+	<types>
+		<authentication/>
+	</types>
+</info>
diff --git a/apps/user_external/appinfo/version b/apps/user_external/appinfo/version
new file mode 100644
index 0000000000..ceab6e11ec
--- /dev/null
+++ b/apps/user_external/appinfo/version
@@ -0,0 +1 @@
+0.1
\ No newline at end of file
diff --git a/apps/user_external/lib/imap.php b/apps/user_external/lib/imap.php
new file mode 100644
index 0000000000..584e9804b1
--- /dev/null
+++ b/apps/user_external/lib/imap.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class OC_User_IMAP extends OC_User_Backend{
+	private $mailbox;
+	
+	public function __construct($mailbox){
+		$this->mailbox=$mailbox;
+	}
+	
+	/**
+	 * @brief Check if the password is correct
+	 * @param $uid The username
+	 * @param $password The password
+	 * @returns true/false
+	 *
+	 * Check if the password is correct without logging in the user
+	 */
+	public function checkPassword($uid, $password){
+		$mbox = @imap_open($this->mailbox, $uid, $password);
+		imap_errors();
+		imap_alerts();
+		if($mbox){
+			imap_close($mbox);
+			return $uid;
+		}else{
+			return false;
+		}
+	}
+
+	public function userExists($uid){
+		return true;
+	}
+}
+
diff --git a/apps/user_external/tests/config.php b/apps/user_external/tests/config.php
new file mode 100644
index 0000000000..a32ad5d83a
--- /dev/null
+++ b/apps/user_external/tests/config.php
@@ -0,0 +1,16 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+return array(
+	'imap'=>array(
+		'run'=>false,
+		'mailbox'=>'{imap.gmail.com:993/imap/ssl}INBOX', //see http://php.net/manual/en/function.imap-open.php
+		'user'=>'foo',//valid username/password combination
+		'password'=>'bar',
+	),
+);
diff --git a/apps/user_external/tests/imap.php b/apps/user_external/tests/imap.php
new file mode 100644
index 0000000000..c703b32107
--- /dev/null
+++ b/apps/user_external/tests/imap.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_User_Imap extends UnitTestCase{
+	/**
+	 * @var OC_User_IMAP $instance
+	 */
+	private $instance;
+
+	private function getConfig(){
+		return include(__DIR__.'/config.php');
+	}
+
+	function skip(){
+		$config=$this->getConfig();
+		$this->skipUnless($config['imap']['run']);
+	} 
+
+	function setUp(){
+		$config=$this->getConfig();
+		$this->instance=new OC_User_IMAP($config['imap']['mailbox']);
+	}
+	
+	function testLogin(){
+		$config=$this->getConfig();
+		$this->assertEqual($config['imap']['user'],$this->instance->checkPassword($config['imap']['user'],$config['imap']['password']));
+		$this->assertFalse($this->instance->checkPassword($config['imap']['user'],$config['imap']['password'].'foo'));
+	}
+}
-- 
GitLab