diff -uNrp smbldap-tools-0.9.2.org/smbldap-groupmod smbldap-tools-0.9.2.OracleSES/smbldap-groupmod
--- smbldap-tools-0.9.2.org/smbldap-groupmod	2006-01-03 19:57:41.000000000 +0900
+++ smbldap-tools-0.9.2.OracleSES/smbldap-groupmod	2007-07-14 13:16:57.000000000 +0900
@@ -112,6 +112,7 @@ if (defined($Options{'m'})) {
   my $members = $Options{'m'};
   my @members = split( /,/, $members );
   my $member;
+  my $memberdn;
   foreach $member ( @members ) {
     my $group_entry=read_group_entry($groupName);
     $config{groupsdn}=$group_entry->dn;
@@ -120,11 +121,24 @@ if (defined($Options{'m'})) {
 	print "User $member already in the group\n";
       } else {
 	print "adding user $member to group $groupName\n";
-	my $modify = $ldap_master->modify ($config{groupsdn},
+	my $modify;
+	if ($config{OracleSES} == 1) {
+	$memberdn = get_user_dn($member);
+	$memberdn =~ s/^dn: //;
+	$modify = $ldap_master->modify ($config{groupsdn},
+					   changes => [
+						       add => [memberUid => $member],
+                                                       add => [uniqueMember => $memberdn]
+						      ]
+					  );
+
+        } else {
+	$modify = $ldap_master->modify ($config{groupsdn},
 					   changes => [
 						       add => [memberUid => $member]
 						      ]
 					  );
+        }
 	$modify->code && warn "failed to add entry: ", $modify->error ;
       }
     } else {
@@ -138,9 +152,37 @@ if (defined($Options{'x'})) {
   my $members = $Options{'x'};
   my @members = split( /,/, $members );
   my $member;
+  my $memberdn;
   foreach $member ( @members ) {
     my $user_entry=read_user_entry($member);
     my $group_entry=read_group_entry($groupName);
+
+    if ($config{OracleSES} == 1) {
+    $memberdn = get_user_dn($member);
+    $memberdn =~ s/^dn: //;
+    $config{groupsdn}=$group_entry->dn;
+    if (is_group_member("$config{groupsdn}",$member) and is_hostg_member("$config{groupsdn}",$memberdn)) {
+      my $delete=1;
+      if (defined $group_entry->get_value('sambaSID')) {
+        if ($group_entry->get_value('sambaSID') eq $user_entry->get_value('sambaPrimaryGroupSID')) {
+    	  $delete=0;
+  	  print "Cannot delete user ($member) from his primary group ($groupName)\n";
+        }
+      }
+      if ($delete eq 1) {
+	print "deleting user $member from group $groupName\n";
+        my $modify = $ldap_master->modify ($config{groupsdn},
+                                           changes => [
+                                                       delete => [memberUid => $member],
+                                                       delete => [uniqueMember => $memberdn]
+                                                      ]
+                                          );
+        $modify->code && warn "failed to delete entry: ", $modify->error ;
+      }
+    } else {
+      print "User $member is not in the group $groupName!\n";
+    }
+    } else {  # else of "if ($config{OracleSES} == 1) {"
     $config{groupsdn}=$group_entry->dn;
     if (is_group_member("$config{groupsdn}",$member)) {
       my $delete=1;
@@ -162,6 +204,7 @@ if (defined($Options{'x'})) {
     } else {
       print "User $member is not in the group $groupName!\n";
     }
+    }  # end of "if ($config{OracleSES} == 1) {"
   }
 }
 
diff -uNrp smbldap-tools-0.9.2.org/smbldap.conf smbldap-tools-0.9.2.OracleSES/smbldap.conf
--- smbldap-tools-0.9.2.org/smbldap.conf	2007-07-13 20:43:56.000000000 +0900
+++ smbldap-tools-0.9.2.OracleSES/smbldap.conf	2007-07-14 12:50:08.000000000 +0900
@@ -227,3 +227,5 @@ slappasswd="/usr/sbin/slappasswd"
 # Character encoding on command-line
 encoding="UTF-8"
 
+# Enable Samba with OracleSES (default is 0)
+OracleSES="0"
diff -uNrp smbldap-tools-0.9.2.org/smbldap_tools.pm smbldap-tools-0.9.2.OracleSES/smbldap_tools.pm
--- smbldap-tools-0.9.2.org/smbldap_tools.pm	2007-07-13 20:43:56.000000000 +0900
+++ smbldap-tools-0.9.2.OracleSES/smbldap_tools.pm	2007-07-14 13:47:11.000000000 +0900
@@ -104,6 +104,7 @@ use vars qw(%config $ldap);
 	     getLocalSID
 	     utf8Encode
 	     utf8Decode
+	     is_hostg_member
 	     %config
 	    );
 
@@ -642,6 +643,8 @@ sub group_add_user
 	my ($group, $userid) = @_;
 	my $members='';
 	my $dn_line = get_group_dn($group);
+	my $memberdn;
+	my $modify;
 	if (!defined(get_group_dn($group))) {
 	  print "$0: group \"$group\" doesn't exist\n";
 	  exit (6); 
@@ -652,19 +655,39 @@ sub group_add_user
 	my $dn = get_dn_from_line("$dn_line");
 	# on look if the user is already present in the group
 	my $is_member=is_group_member($dn,$userid);
+	if ($config{OracleSES} == 1) {
+        $memberdn = get_user_dn($userid);
+	$memberdn =~ s/^dn: //;
+	my $is_member1=is_hostg_member($dn,$memberdn);
+	if ($is_member == 1 and $is_member1 == 1) {
+	  print "User \"$userid\" already member of the group \"$group\".\n";
+	} else {
+	  # bind to a directory with dn and password
+	  # It does not matter if the user already exist, Net::LDAP will add the user
+	  # if he does not exist, and ignore him if his already in the directory.
+	  $modify = $ldap->modify ( "$dn",
+										  changes => [
+													  add => [memberUid => $userid],
+                           add => [uniqueMember => $memberdn]
+													 ]
+										);
+	  $modify->code && die "failed to modify entry: ", $modify->error ;
+	}
+	} else {  # else of "if($config{OracleSES} == 1) {"
 	if ($is_member == 1) {
 	  print "User \"$userid\" already member of the group \"$group\".\n";
 	} else {
 	  # bind to a directory with dn and password
 	  # It does not matter if the user already exist, Net::LDAP will add the user
 	  # if he does not exist, and ignore him if his already in the directory.
-	  my $modify = $ldap->modify ( "$dn",
+	  $modify = $ldap->modify ( "$dn",
 										  changes => [
 													  add => [memberUid => $userid]
 													 ]
 										);
 	  $modify->code && die "failed to modify entry: ", $modify->error ;
 	}
+        } # end of "if($config{OracleSES} == 1) {"
   }
 
 sub group_del
@@ -731,6 +754,7 @@ sub group_add
   {
 	my ($gname, $gid, $force) = @_;
 	my $nscd_status = system "/etc/init.d/nscd status >/dev/null 2>&1";
+	my $modify;
 	if ($nscd_status == 0) {
 	  system "/etc/init.d/nscd stop > /dev/null 2>&1";
 	}
@@ -750,14 +774,24 @@ sub group_add
 	if ($nscd_status == 0) {
 	  system "/etc/init.d/nscd start > /dev/null 2>&1";
 	}
-	my $modify = $ldap->add ( "cn=$gname,$config{groupsdn}",
+	if ($config{OracleSES} == 1) {
+	$modify = $ldap->add ( "cn=$gname,$config{groupsdn}",
+									 attrs => [
+											   objectClass => [ 'top', 'posixGroup', 'groupOfUniqueNames' ],
+											   cn => "$gname",
+											   gidNumber => "$gid"
+											  ]
+								   );
+
+        } else { # else of "if ($config{OracleSES} == 1) { "
+	$modify = $ldap->add ( "cn=$gname,$config{groupsdn}",
 									 attrs => [
 											   objectClass => [ 'top', 'posixGroup' ],
 											   cn => "$gname",
 											   gidNumber => "$gid"
 											  ]
 								   );
-	
+        } # end of "if ($config{OracleSES} == 1){ "
 	$modify->code && die "failed to add entry: ", $modify->error ;
 	return $gid;
   }
@@ -948,21 +982,39 @@ sub group_remove_member
 	my ($group, $user) = @_;
 	my $members='';
 	my $grp_line = get_group_dn($group);
+	my $modify;
 	if (!defined($grp_line)) {
 	  return 0;
 	}
 	my $dn = get_dn_from_line($grp_line);
 	# we test if the user exist in the group
 	my $is_member=is_group_member($dn,$user);
+	if ($config{OracleSES} == 1){
+        my $memberdn = get_user_dn($user);
+	$memberdn =~ s/^dn: //;
+	my $is_member1=is_hostg_member($dn,$memberdn);
+	if ($is_member == 1 and $is_member1 == 1) {
+	  # delete only the user from the group
+	  $modify = $ldap->modify ( "$dn",
+										  changes => [
+													  delete => [memberUid => ["$user"]],
+                           delete => [uniqueMember => $memberdn]
+													 ]
+										);
+	  $modify->code && die "failed to delete entry: ", $modify->error ;
+	}
+
+	} else {  # else of "if ($config{OracleSES} == 1) {"
 	if ($is_member == 1) {
 	  # delete only the user from the group
-	  my $modify = $ldap->modify ( "$dn",
+	  $modify = $ldap->modify ( "$dn",
 										  changes => [
 													  delete => [memberUid => ["$user"]]
 													 ]
 										);
 	  $modify->code && die "failed to delete entry: ", $modify->error ;
 	}
+        } # end of "if ($config{OracleSES} == 1) {"
 	return 1;
   }
 
@@ -1121,5 +1173,18 @@ sub utf8Decode {
   return $from_utf8->($arg);
 }   
 
+sub is_hostg_member
+{
+    my $dn_group = shift;
+    my $user = shift;
+    my $mesg = $ldap->search (   base   => $dn_group,
+				 scope => 'base',
+				 filter => "(&(uniqueMember=$user))"
+				 );
+    $mesg->code && die $mesg->error;
+    return ($mesg->count ne 0);
+}
+
+
 1;
 
