From b06df0bfd2f79f8b1467cb0b640de0e64ec27679 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 7 Aug 2024 17:16:36 +0100 Subject: fix(remote): `push` apply proposal permissions so that only the author and repo maintainers can push to a proposal --- src/git_remote_helper.rs | 65 +++++++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs index 06eeff5..eed8dd6 100644 --- a/src/git_remote_helper.rs +++ b/src/git_remote_helper.rs @@ -667,34 +667,43 @@ async fn push( let (ahead, behind) = git_repo .get_commits_ahead_behind(&tip_of_proposal_commit, &tip_of_pushed_branch)?; if behind.is_empty() { - let thread_id = if patches.len().eq(&1) { - tip_patch.id() + if [repo_ref.maintainers.clone(), vec![proposal.author()]] + .concat() + .contains(&user_ref.public_key) + { + let thread_id = if patches.len().eq(&1) { + tip_patch.id() + } else { + get_event_root(tip_patch)? + }; + let mut parent_patch = tip_patch.clone(); + for (i, commit) in ahead.iter().enumerate() { + let new_patch = generate_patch_event( + git_repo, + &git_repo.get_root_commit()?, + commit, + Some(thread_id), + &signer, + repo_ref, + Some(parent_patch.id()), + Some(( + (patches.len() + i + 1).try_into().unwrap(), + (patches.len() + ahead.len()).try_into().unwrap(), + )), + None, + &None, + &[], + ) + .await + .context("cannot make patch event from commit")?; + events.push(new_patch.clone()); + parent_patch = new_patch; + } } else { - get_event_root(tip_patch)? - }; - // TODO do I have permission? - let mut parent_patch = tip_patch.clone(); - for (i, commit) in ahead.iter().enumerate() { - let new_patch = generate_patch_event( - git_repo, - &git_repo.get_root_commit()?, - commit, - Some(thread_id), - &signer, - repo_ref, - Some(parent_patch.id()), - Some(( - (patches.len() + i + 1).try_into().unwrap(), - (patches.len() + ahead.len()).try_into().unwrap(), - )), - None, - &None, - &[], - ) - .await - .context("cannot make patch event from commit")?; - events.push(new_patch.clone()); - parent_patch = new_patch; + println!( + "error {to} permission denied. you are not the proposal author or a repo maintainer" + ); + rejected_proposal_refspecs.push(refspec.to_string()); } } else { // we shouldn't get here @@ -712,7 +721,7 @@ async fn push( } } } else { - // TODO new proposal / proposal no longeer open + // TODO new proposal / proposal no longer open // / we couldn't } } -- cgit v1.2.3