首页 > 其他分享 >svnhooks--分路径锁定仓库

svnhooks--分路径锁定仓库

时间:2024-09-02 18:04:11浏览次数:11  
标签:status svnhooks get -- 路径 提交 path 权限

在之前的文章简单的实现了锁定仓库已经授予用户权限提交文件,但是在实际项目中,有时候我们是要锁定资源路径,不允许提交资源了,但是还可以提交配置和代码,那就需要通过分路径锁定。

实现方式和思路也是借助pre-commit,我们先在程序里面定义一个字典,简单点我们就不用数据库了,数据先初始化先用一个json文件初始化,里面的key就是路径地址,value就是锁定状态。

在pre-commit的时候获取本次提交的所有路径,然后在程序里面做一个请求方法,获取路劲的value,再做一个更新路径状态的方法就差不多了,还需要把路劲状态和总开关联动起来,总开关打开就全部路径的状态都开,关闭就全部路径都关闭

客户端呢就做一个子开关,如果总开关打开了,子开关就动态显示当前子路径的状态,下面就是大概效果

 

 下面就是pre-commit的核心判断代码,主要就是在判断到当前总开关打开后,先默认设置当前所有路径都是可以提交的,然后获取本次提交的路径,向服务端请求提交状态,只要有一个路径不允许提交,本次提交就需要判断用户权限

while true; do
    COMMIT_SWITCH=$(curl -s --max-time 3 http://192.168.61.116:5000/get_switch | jq -r '.commit_switch' 2>/dev/null)
    CURL_EXIT_CODE=$?

    if [ $CURL_EXIT_CODE -eq 0 ] && [ -n "$COMMIT_SWITCH" ]; then
        echo "获取成功,commit_switch 的值: $COMMIT_SWITCH"

        # 检查 commit_switch 的值
        if [ "$COMMIT_SWITCH" = "true" ]; then
            # 获取当前提交的所有文件路径
            CHANGED_FILES=$($SVNLOOK changed -t $TXN $REPOS | awk '{print \$2}')

            # 标志位,判断是否所有路径都可以提交
            ALL_PATHS_ALLOWED=false

            for FILE_PATH in $CHANGED_FILES; do
                # 检查该路径的提交状态
                PATH_STATUS=$(curl -s "http://xxxxx:5000/get_path_status?path=$FILE_PATH" | jq -r '.status')

                if [ "$PATH_STATUS" = "true" || [ "$PATH_STATUS" = "error" ];]; then
                    #本次提交有一个路劲的文件被锁了,或者报错了本次提交状态就需要判断用户权限
                    ALL_PATHS_ALLOWED=true
                    break
                fi
            done

            # 如果所有路径都允许提交,检查用户权限
            if [ "$ALL_PATHS_ALLOWED" = true ]; then
                USERNAME=$($SVNLOOK author -t $TXN $REPOS)

                # 获取用户权限
                USER_PERMISSIONS=$(curl -s http://xxxxx:5000/api/users2 | jq -r ".\"$USERNAME\"")
                
                if [ "$USER_PERMISSIONS" = "null" ]; then        
                    echo "提交被拒绝,SVN仓库已锁定,用户 $USERNAME 不存在。请联系QA更新名单,授予权限" >&2
                    exit 1  # 不允许提交
                fi

                # 检查用户权限
                if [ "$USER_PERMISSIONS" = "true" ]; then
                    exit 0  # 允许提交
                else
                    echo "提交被拒绝,SVN仓库已锁定,用户 $USERNAME 没有权限,请联系QA授予权限。" >&2
                    exit 1  # 不允许提交
                fi
            else
                echo "所有路径状态为 false,直接允许提交,无需验证用户权限。"
                exit 0  # 允许提交
            fi
        fi
        #如果COMMIT_SWITCH是false,就是开关被关闭,允许提交
        exit 0
    fi

    # 检查是否超时
    CURRENT_TIME=$(date +%s)
    ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
    if [ $ELAPSED_TIME -ge $TIMEOUT ]; then
        echo "超时了,获取失败。"
        exit 0  # 超时,允许提交
    fi

    # 等待一段时间后重试
    sleep 1
done

 

 

服务端的一些核心代码

#获取不同路径的提交状态
@app.route('/get_path_status', methods=['GET'])
def get_path_status():
    path = request.args.get('path')

    if not path:
        return jsonify({'status': 'error', 'message': '路径不能为空'}), 400

    with open(PATH_STATUS_FILE, 'r') as f:
        path_status = json.load(f)

    # 检查路径的前缀
    status = True
    for key in path_status.keys():
        if path.startswith(key):  # 判断路径是否以某个大路径开头
            status = path_status[key]
            break
    return jsonify({'status': str(status).lower()}), 200

#获取所有路劲的状态
@app.route('/get_path', methods=['GET'])
def get_path():
    with open('path_status.json') as f:
        pathStatus = json.load(f)
    return jsonify(pathStatus)

#更改不同路径的提交状态
@app.route('/update_path_status', methods=['POST'])
def update_path_status():
    new_status = request.json
    # 更新 JSON 文件的逻辑
    with open('path_status.json', 'w') as f:
        json.dump(new_status, f)
    # 通知所有连接的客户端刷新页面
    socketio.emit('refresh_page')
    return jsonify(success=True)

 

标签:status,svnhooks,get,--,路径,提交,path,权限
From: https://www.cnblogs.com/a565810497/p/18393206

相关文章

  • 安全:nftables的常用命令(查看规则)
    一,nftables的地址簇和相应的iptables命令行工具nftables的地址簇iptables命令行工具ip  仅匹配IPv4数据包。如果没有指定地址系列,这是默认设置iptablesip6   ip6tablesinet   iptables和ip6tablesarp   arptablesbridge   ebtable......
  • Capital许可管理常见问题解答
    在软件资产管理过程中,企业经常会遇到各种关于许可管理的问题。这些问题不仅影响软件的合规使用,还可能导致不必要的法律风险和成本浪费。作为专业的软件许可管理解决方案提供商,Capital致力于帮助企业轻松应对这些挑战。以下是Capital许可管理中常见的问题及其解答,助您更好地理解和......
  • ros openvslam
     CMakeLists.txtcmake_minimum_required(VERSION3.1)project(openvslamLANGUAGESCXXC)set(CMAKE_CXX_STANDARD11)set(CMAKE_CXX_STANDARD_REQUIREDON)if(POLICYCMP0042)cmake_policy(SETCMP0042NEW)endif()if(POLICYCMP0074)cmake_policy(SET......
  • js面试题手写代码
    实现一个new操作符实现一个instacneof操作符 实现一个new操作符 functionmyNew(fn,...args){if(typeoffn!=='function){returnTypeError('fnmustbeafunction')}//letobj={}创建一个空对象//obj.__proto__=fn.prototype将......
  • 【自动驾驶】控制算法(六)前馈控制与航向误差
    写在前面:......
  • 人员拥挤检测系统 Python
    人员拥挤检测系统通过Python网络模型算法技术,人员拥挤检测算法对校园/厂区/车间/港口/街道等场景的监控画面区域实现7X24小时全天候不间断进行自动分析监测,当人员拥挤检测算法监测到现场区域范围内,有异常的人群聚集(出现拥挤情况)时,人员拥挤检测算法会立刻抓拍存档并通知相关后台人员......
  • 七个合法学习黑客技术的平台,让你从萌新成为大佬
     1、HackThisSite提供在线IRC聊天和论坛,让用户交流更加方便。网站涵盖多种主题,包括密码破解、网络侦察、漏洞利用、社会工程学等。非常适用于个人提高网络安全技能2、HackaDay涵盖多个领域,包括黑客技术、科技、工程和DIY等内容,站内提供大量有趣的文章、视频、教程和......
  • 七个合法学习黑客技术的平台,让你从萌新成为大佬
     1、HackThisSite提供在线IRC聊天和论坛,让用户交流更加方便。网站涵盖多种主题,包括密码破解、网络侦察、漏洞利用、社会工程学等。非常适用于个人提高网络安全技能2、HackaDay涵盖多个领域,包括黑客技术、科技、工程和DIY等内容,站内提供大量有趣的文章、视频、教程和......
  • Java平衡树--查找树的新建与树的实现
    Java学习+面试指南:https://javaxiaobear.cn1、查找树的定义一棵2-3查找树要么为空,要么满足满足下面两个要求:2-结点含有一个键(及其对应的值)和两条链,左链接指向2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点含有两个键(及其对应的值)和三条链,左链接指向的2......
  • uni-app v-if条件渲染和v-show的选择对比
    一,v-ifv-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才被渲染代码示例:<template> <viewclass=""> <viewv-if="shop">京东</view> <viewv-else>淘宝网</view> </view></template><scriptsetup>impor......