<?php
class
IDF_Plugin_SyncSvn
{
static
public
function
entry(
$signal
, &
$params
)
{
if
(!Pluf::f(
'idf_plugin_syncsvn_authz_file'
, false)
or
!Pluf::f(
'idf_plugin_syncsvn_passwd_file'
, false)
or
!Pluf::f(
'idf_plugin_syncsvn_svn_path'
. false)) {
return
;
}
include_once
'File/Passwd/Authdigest.php'
;
$plug
=
new
IDF_Plugin_SyncSvn();
switch
(
$signal
) {
case
'IDF_Project::created'
:
$plug
->processSvnCreate(
$params
[
'project'
]);
break
;
case
'IDF_Project::membershipsUpdated'
:
$plug
->processSyncAuthz(
$params
[
'project'
]);
break
;
case
'Pluf_User::passwordUpdated'
:
$plug
->processSyncPasswd(
$params
[
'user'
]);
break
;
case
'IDF_Project::preDelete'
:
$plug
->processSvnDelete(
$params
[
'project'
]);
break
;
}
}
function
processSvnCreate(
$project
)
{
if
(
$project
->getConf()->getVal(
'scm'
) !=
'svn'
) {
return
false;
}
$shortname
=
$project
->shortname;
if
(false===(
$svn_path
=Pluf::f(
'idf_plugin_syncsvn_svn_path'
,false))) {
throw
new
Pluf_Exception_SettingError(
"'idf_plugin_syncsvn_svn_path' must be defined in your configuration file."
);
}
if
(
file_exists
(
$svn_path
.
'/'
.
$shortname
)) {
throw
new
Exception(sprintf(__(
'The repository %s already exists.'
),
$svn_path
.
'/'
.
$shortname
));
}
$return
= 0;
$output
=
array
();
$cmd
= sprintf(Pluf::f(
'svnadmin_path'
,
'svnadmin'
).
' create %s'
,
escapeshellarg
(
$svn_path
.
'/'
.
$shortname
));
$cmd
= Pluf::f(
'idf_exec_cmd_prefix'
,
''
).
$cmd
;
$ll
=
exec
(
$cmd
,
$output
,
$return
);
return
(
$return
== 0);
}
function
processSvnDelete(
$project
)
{
if
(!Pluf::f(
'idf_plugin_syncsvn_remove_orphans'
, false)) {
return
;
}
if
(
$project
->getConf()->getVal(
'scm'
) !=
'svn'
) {
return
false;
}
$this
->SyncAccess(
$project
);
$shortname
=
$project
->shortname;
if
(false===(
$svn_path
=Pluf::f(
'idf_plugin_syncsvn_svn_path'
,false))) {
throw
new
Pluf_Exception_SettingError(
"'idf_plugin_syncsvn_svn_path' must be defined in your configuration file."
);
}
if
(
file_exists
(
$svn_path
.
'/'
.
$shortname
)) {
$cmd
= Pluf::f(
'idf_exec_cmd_prefix'
,
''
).
'rm -rf '
.
$svn_path
.
'/'
.
$shortname
;
exec
(
$cmd
);
}
}
function
processSyncPasswd(
$user
)
{
$passwd_file
= Pluf::f(
'idf_plugin_syncsvn_passwd_file'
);
if
(!
file_exists
(
$passwd_file
)
or
!
is_writable
(
$passwd_file
)) {
return
false;
}
$ht
=
new
File_Passwd_Authbasic(
$passwd_file
);
$ht
->load();
$ht
->setMode(FILE_PASSWD_SHA);
if
(
$ht
->userExists(
$user
->login)) {
$ht
->changePasswd(
$user
->login,
$this
->getSvnPass(
$user
));
}
else
{
$ht
->addUser(
$user
->login,
$this
->getSvnPass(
$user
));
}
$ht
->save();
return
true;
}
function
processSyncAuthz(
$project
)
{
$this
->SyncAccess();
$this
->generateProjectPasswd(
$project
);
}
function
getSvnPass(
$user
){
return
substr
(sha1(
$user
->password.Pluf::f(
'secret_key'
)), 0, 8);
}
function
generateProjectPasswd(
$project
)
{
$passwd_file
= Pluf::f(
'idf_plugin_syncsvn_passwd_file'
);
if
(!
file_exists
(
$passwd_file
)
or
!
is_writable
(
$passwd_file
)) {
return
false;
}
$ht
=
new
File_Passwd_Authbasic(
$passwd_file
);
$ht
->setMode(FILE_PASSWD_SHA);
$ht
->load();
$mem
=
$project
->getMembershipData();
$members
=
array_merge
((
array
)
$mem
[
'members'
], (
array
)
$mem
[
'owners'
],
(
array
)
$mem
[
'authorized'
]);
foreach
(
$members
as
$user
) {
if
(
$ht
->userExists(
$user
->login)) {
$ht
->changePasswd(
$user
->login,
$this
->getSvnPass(
$user
));
}
else
{
$ht
->addUser(
$user
->login,
$this
->getSvnPass(
$user
));
}
}
$ht
->save();
}
function
SyncAccess(
$exclude
=null)
{
$authz_file
= Pluf::f(
'idf_plugin_syncsvn_authz_file'
);
$access_owners
= Pluf::f(
'idf_plugin_syncsvn_access_owners'
,
'rw'
);
$access_members
= Pluf::f(
'idf_plugin_syncsvn_access_members'
,
'rw'
);
$access_extra
= Pluf::f(
'idf_plugin_syncsvn_access_extra'
,
'r'
);
$access_public
= Pluf::f(
'idf_plugin_syncsvn_access_public'
,
'r'
);
$access_public_priv
= Pluf::f(
'idf_plugin_syncsvn_access_private'
,
''
);
if
(!
file_exists
(
$authz_file
)
or
!
is_writable
(
$authz_file
)) {
return
false;
}
$fcontent
=
''
;
foreach
(Pluf::factory(
'IDF_Project'
)->getList()
as
$project
) {
if
(
$exclude
and
$exclude
->id ==
$project
->id) {
continue
;
}
$conf
=
new
IDF_Conf();
$conf
->setProject(
$project
);
if
(
$conf
->getVal(
'scm'
) !=
'svn'
or
strlen
(
$conf
->getVal(
'svn_remote_url'
)) > 0) {
continue
;
}
$mem
=
$project
->getMembershipData();
$fcontent
.=
'['
.
$project
->shortname.
':/]'
.
"\n"
;
foreach
(
$mem
[
'owners'
]
as
$v
) {
$fcontent
.=
$v
->login.
' = '
.
$access_owners
.
"\n"
;
}
foreach
(
$mem
[
'members'
]
as
$v
) {
$fcontent
.=
$v
->login.
' = '
.
$access_members
.
"\n"
;
}
if
(
$project
->
private
== true) {
foreach
(
$mem
[
'authorized'
]
as
$v
) {
$fcontent
.=
$v
->login.
' = '
.
$access_extra
.
"\n"
;
}
$fcontent
.=
'* = '
.
$access_public_priv
.
"\n"
;
}
else
{
$fcontent
.=
'* = '
.
$access_public
.
"\n"
;
}
$fcontent
.=
"\n"
;
}
file_put_contents
(
$authz_file
,
$fcontent
, LOCK_EX);
return
true;
}
}