Project

General

Profile

Feature #3079 » Reposman_Redmine_0.8.2.patch

- Patch against Redmine .0.8.2 - Tide _, 2009-03-31 06:43

View differences:

app/apis/sys_api.rb (working copy)
20 20
  member :identifier,      :string
21 21
  member :name,            :string
22 22
  member :is_public,       :bool
23
  member :public_repo,     :bool
23 24
  member :repository,      Repository
24 25
end
25 26

  
app/controllers/projects_controller.rb (working copy)
70 70
      @project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
71 71
      @project.trackers = Tracker.all
72 72
      @project.is_public = Setting.default_projects_public?
73
      @project.public_repo = Setting.default_projects_public?
73 74
      @project.enabled_module_names = Redmine::AccessControl.available_project_modules
74 75
    else
75 76
      @project.enabled_module_names = params[:enabled_modules]
app/views/projects/_form.rhtml (working copy)
15 15
<% end %></p>
16 16
<p><%= f.text_field :homepage, :size => 60 %></p>
17 17
<p><%= f.check_box :is_public %></p>
18
<p><%= f.check_box :create_repo, :disabled => !Setting.sys_api_enabled? %></p>
19
<p><%= f.check_box :public_repo, :disabled => !Setting.sys_api_enabled? %></p>
18 20
<%= wikitoolbar_for 'project_description' %>
19 21

  
20 22
<% @project.custom_field_values.each do |value| %>
extra/svn/Redmine.pm (working copy)
206 206
  my $project_id = get_project_identifier($r);
207 207

  
208 208
  $r->set_handlers(PerlAuthenHandler => [\&OK])
209
      if is_public_project($project_id, $r);
209
     if (is_public_project($project_id, $r) && public_repository($project_id, $r));
210 210

  
211 211
  return OK
212 212
}
......
217 217
  my ($res, $redmine_pass) =  $r->get_basic_auth_pw();
218 218
  return $res unless $res == OK;
219 219
  
220
  if (is_member($r->user, $redmine_pass, $r)) {
220
  if (is_member($r->user, $redmine_pass, $r) && can_browse($r->user, $redmine_pass, $r)) {
221 221
      return OK;
222 222
  } else {
223 223
      $r->note_auth_failure();
......
257 257
#     return 1 if (stat($repos_path))[2] & 00007;
258 258
# }
259 259

  
260
sub public_repository {
261
    my $project_id = shift;
262
    my $r = shift;
263

  
264
    my $dbh = connect_database($r);
265
    my $sth = $dbh->prepare(
266
        "SELECT * FROM projects WHERE projects.identifier=? and projects.public_repo=true;"
267
    );
268

  
269
    $sth->execute($project_id);
270
    my $ret = $sth->fetchrow_array ? 1 : 0;
271
    $sth->finish();
272
    $dbh->disconnect();
273

  
274
    $ret;
275
}
276

  
260 277
sub is_member {
261 278
  my $redmine_user = shift;
262 279
  my $redmine_pass = shift;
......
325 342
  $ret;
326 343
}
327 344

  
345
sub can_browse {
346
  my $redmine_user = shift;
347
  my $redmine_pass = shift;
348
  my $r = shift;
349

  
350
  my $dbh         = connect_database($r);
351
  my $project_id  = get_project_identifier($r);
352

  
353
  my $pass_digest = Digest::SHA1::sha1_hex($redmine_pass);
354

  
355
  my $cfg = Apache2::Module::get_config(__PACKAGE__, $r->server, $r->per_dir_config);
356
  my $usrprojpass;
357
  if ($cfg->{RedmineCacheCredsMax}) {
358
    $usrprojpass = $cfg->{RedmineCacheCreds}->get($redmine_user.":".$project_id);
359
    return 1 if (defined $usrprojpass and ($usrprojpass eq $pass_digest));
360
  }
361
  my $query = $cfg->{RedmineQuery};
362
  my $sth = $dbh->prepare($query);
363
  $sth->execute($redmine_user, $project_id);
364

  
365
  my $ret;
366
  while (my ($hashed_password, $auth_source_id, $permissions) = $sth->fetchrow_array) {
367

  
368
      unless ($auth_source_id) {
369
	  my $method = $r->method;
370
          if ($hashed_password eq $pass_digest && $permissions =~ /:browse_repository/) {
371
              $ret = 1;
372
              last;
373
          }
374
      } elsif ($CanUseLDAPAuth) {
375
          my $sthldap = $dbh->prepare(
376
              "SELECT host,port,tls,account,account_password,base_dn,attr_login from auth_sources WHERE id = ?;"
377
          );
378
          $sthldap->execute($auth_source_id);
379
          while (my @rowldap = $sthldap->fetchrow_array) {
380
            my $ldap = Authen::Simple::LDAP->new(
381
                host    =>      ($rowldap[2] == 1 || $rowldap[2] eq "t") ? "ldaps://$rowldap[0]" : $rowldap[0],
382
                port    =>      $rowldap[1],
383
                basedn  =>      $rowldap[5],
384
                binddn  =>      $rowldap[3] ? $rowldap[3] : "",
385
                bindpw  =>      $rowldap[4] ? $rowldap[4] : "",
386
                filter  =>      "(".$rowldap[6]."=%s)"
387
            );
388
            $ret = 1 if ($ldap->authenticate($redmine_user, $redmine_pass));
389
          }
390
          $sthldap->finish();
391
      }
392
  }
393
  $sth->finish();
394
  $dbh->disconnect();
395

  
396
  if ($cfg->{RedmineCacheCredsMax} and $ret) {
397
    if (defined $usrprojpass) {
398
      $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
399
    } else {
400
      if ($cfg->{RedmineCacheCredsCount} < $cfg->{RedmineCacheCredsMax}) {
401
        $cfg->{RedmineCacheCreds}->set($redmine_user.":".$project_id, $pass_digest);
402
        $cfg->{RedmineCacheCredsCount}++;
403
      } else {
404
        $cfg->{RedmineCacheCreds}->clear();
405
        $cfg->{RedmineCacheCredsCount} = 0;
406
      }
407
    }
408
  }
409

  
410
  $ret;
411
}
412

  
328 413
sub get_project_identifier {
329 414
    my $r = shift;
330 415
    
extra/svn/reposman.rb (working copy)
190 190
    yield if block_given?
191 191
  else
192 192
    uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : 0)
193
    right = project.is_public ? 0775 : 0770
193
    right = project.public_repo ? 0775 : 0770
194 194
    yield if block_given?
195 195
    Find.find(repos_path) do |f|
196 196
      File.chmod right, f
......
228 228
    # rights before leaving
229 229
    other_read = other_read_right?(repos_path)
230 230
    owner      = owner_name(repos_path)
231
    next if project.is_public == other_read and owner == $svn_owner
231
    next if project.public_repo == other_read and owner == $svn_owner
232 232

  
233 233
    if $test
234 234
      log("\tchange mode on #{repos_path}")
......
252 252
      next
253 253
    end
254 254

  
255
    project.is_public ? File.umask(0002) : File.umask(0007)
255
    project.public_repo ? File.umask(0002) : File.umask(0007)
256 256

  
257 257
    if $test
258 258
      log("\tcreate repository #{repos_path}")
lang/en.yml (working copy)
139 139
field_role: Role
140 140
field_homepage: Homepage
141 141
field_is_public: Public
142
field_create_repo: Create Repository
143
field_public_repo: Public Repository
142 144
field_parent: Subproject of
143 145
field_is_in_chlog: Issues displayed in changelog
144 146
field_is_in_roadmap: Issues displayed in roadmap
(1-1/2)