def get(self, request, *args, **kwargs):
     context = self.get_context()
     response = redirect(
         get_redirect_url(
             "/apps/{0}/{1}/detail/".format(self.tenantName,
                                            self.serviceAlias), request))
     try:
         docker_c_id = request.COOKIES.get('docker_c_id', '')
         docker_h_id = request.COOKIES.get('docker_h_id', '')
         docker_s_id = request.COOKIES.get('docker_s_id', '')
         if docker_c_id != "" and docker_h_id != "" and docker_s_id != "" and docker_s_id == self.service.service_id:
             t_docker_h_id = docker_h_id.lower()
             context["tenant_id"] = self.service.tenant_id
             context["service_id"] = docker_s_id
             context["ctn_id"] = docker_c_id
             context["md5"] = md5fun(self.service.tenant_id + "_" +
                                     docker_s_id + "_" + docker_c_id)
             context["ws_uri"] = self.make_docker_ws_uri(
                 settings.DOCKER_WSS_URL, t_docker_h_id)
             response = TemplateResponse(self.request, "www/console.html",
                                         context)
         response.delete_cookie('docker_c_id')
         response.delete_cookie('docker_h_id')
         response.delete_cookie('docker_s_id')
     except Exception as e:
         logger.exception(e)
     return response
Example #2
0
    def get(self, request, *args, **kwargs):

        self.tenantName = kwargs.get('tenantName', None)
        self.serviceAlias = kwargs.get('serviceAlias', None)
        tenant = team_repo.get_team_by_team_name(self.tenantName)
        if tenant:
            self.tenant = tenant
        else:
            raise http.Http404

        service = service_repo.get_service_by_tenant_and_alias(
            self.tenant.tenant_id, self.serviceAlias)
        if service:
            self.service = service
        else:
            raise http.Http404

        context = dict()
        response = redirect(
            get_redirect_url(
                "/#/app/{0}/overview".format(self.service.service_alias),
                request))
        try:
            docker_c_id = request.COOKIES.get('docker_c_id', '')
            docker_h_id = request.COOKIES.get('docker_h_id', '')
            docker_s_id = request.COOKIES.get('docker_s_id', '')
            if docker_c_id != "" and docker_h_id != "" and docker_s_id != "" and docker_s_id == self.service.service_id:
                t_docker_h_id = docker_h_id.lower()
                context["tenant_id"] = self.service.tenant_id
                context["service_id"] = docker_s_id
                context["ctn_id"] = docker_c_id
                context["md5"] = md5fun(self.service.tenant_id + "_" +
                                        docker_s_id + "_" + docker_c_id)

                main_url = region_services.get_region_wsurl(
                    self.service.service_region)
                if main_url == "auto":
                    context[
                        "ws_uri"] = '{}://{}:6060/docker_console?nodename={}'.format(
                            settings.DOCKER_WSS_URL["type"],
                            settings.DOCKER_WSS_URL[
                                self.service.service_region], t_docker_h_id)
                else:
                    context[
                        "ws_uri"] = "{0}/docker_console?nodename={1}".format(
                            main_url, t_docker_h_id)

                response = TemplateResponse(self.request, "www/console.html",
                                            context)
            response.delete_cookie('docker_c_id')
            response.delete_cookie('docker_h_id')
            response.delete_cookie('docker_s_id')
        except Exception as e:
            logger.exception(e)
        return response
Example #3
0
    def get(self, request, *args, **kwargs):
        """
        获取console TTY页面
        ---
        parameters:
            - name: tenantName
              description: 租户名
              required: true
              type: string
              paramType: path
            - name: serviceAlias
              description: 组件别名
              required: true
              type: string
              paramType: path
        """
        response = redirect(get_redirect_url("/index#/index", request))
        try:
            docker_c_id = request.COOKIES.get('docker_c_id', '')
            docker_h_id = request.COOKIES.get('docker_h_id', '')
            docker_s_id = request.COOKIES.get('docker_s_id', '')
            bean = dict()
            if docker_c_id != "" and docker_h_id != "" and docker_s_id != "" and docker_s_id == self.service.service_id:
                t_docker_h_id = docker_h_id.lower()
                bean["tenant_id"] = self.service.tenant_id
                bean["service_id"] = docker_s_id
                bean["ctn_id"] = docker_c_id
                bean["md5"] = md5fun(self.service.tenant_id + "_" +
                                     docker_s_id + "_" + docker_c_id)
                main_url = region_services.get_region_wsurl(
                    self.service.service_region)
                if main_url == "auto":
                    bean[
                        "ws_uri"] = '{}://{}:6060/docker_console?nodename={}'.format(
                            settings.DOCKER_WSS_URL["type"],
                            settings.DOCKER_WSS_URL[
                                self.service.service_region], t_docker_h_id)
                else:
                    bean["ws_uri"] = "{0}/docker_console?nodename={1}".format(
                        main_url, t_docker_h_id)
                response = Response(general_message(200, "success", "信息获取成功"),
                                    status=200,
                                    template_name="www/console.html")
        except Exception as e:
            logger.exception(e)

        return response
Example #4
0
    def get(self, request, *args, **kwargs):
        context = self.get_context()
        response = redirect(
            get_redirect_url(
                "/apps/{0}/{1}/detail/".format(self.tenantName,
                                               self.serviceAlias), request))
        try:
            docker_c_id = request.COOKIES.get('docker_c_id', '')
            docker_h_id = request.COOKIES.get('docker_h_id', '')
            docker_s_id = request.COOKIES.get('docker_s_id', '')
            if docker_c_id != "" and docker_h_id != "" and docker_s_id != "" and docker_s_id == self.service.service_id:
                t_docker_h_id = docker_h_id.lower()
                context["tenant_id"] = self.service.tenant_id
                context["service_id"] = docker_s_id
                context["ctn_id"] = docker_c_id
                context["md5"] = md5fun(self.service.tenant_id + "_" +
                                        docker_s_id + "_" + docker_c_id)

                main_url = region_services.get_region_wsurl(
                    self.service.service_region)
                if main_url == "auto":
                    context[
                        "ws_uri"] = '{}://{}:6060/docker_console?nodename={}'.format(
                            settings.DOCKER_WSS_URL["type"],
                            settings.DOCKER_WSS_URL[
                                self.service.service_region], t_docker_h_id)
                else:
                    context[
                        "ws_uri"] = "{0}/docker_console?nodename={1}".format(
                            main_url, t_docker_h_id)

                response = TemplateResponse(self.request, "www/console.html",
                                            context)
            response.delete_cookie('docker_c_id')
            response.delete_cookie('docker_h_id')
            response.delete_cookie('docker_s_id')
        except Exception as e:
            logger.exception(e)
        return response
Example #5
0
    def get(self, request, *args, **kwargs):
        import datetime
        # 获取cookie中的csrf
        csrftoken = request.COOKIES.get('csrftoken')
        if csrftoken is None:
            csrftoken = "csrf"
        # 获取statue
        state = request.GET.get("state")
        # 解码toke, type
        logger.debug("account.wechat", state)
        logger.debug("account.wechat",
                     "is_weixin:{0}".format(str(is_weixin(request))))
        # 查询数据库
        err_url = settings.WECHAT_CALLBACK.get("index")
        try:
            wechat_state = WeChatState.objects.get(pk=state)
        except Exception as e:
            logger.exception("account.wechat", e)
            logger.error("account.wechat",
                         "wechatstate is missing,id={0}".format(state))
            return self.redirect_to(err_url)
        cry_state = wechat_state.state

        state_array = AuthCode.decode(str(cry_state),
                                      'we_chat_login').split(',')
        oldcsrftoken = state_array[0]
        origin = state_array[1]
        next_url = state_array[2]
        config = state_array[3]
        origin_url = None
        if len(state_array) == 5:
            origin_url = state_array[4]
        logger.debug("account.wechat", oldcsrftoken)
        logger.debug("account.wechat", origin)
        logger.debug("account.wechat", next_url)
        logger.debug("account.wechat", config)
        logger.debug("account.wechat", origin_url)

        if csrftoken != oldcsrftoken:
            return self.redirect_to(err_url)
        # 获取的code
        code = request.GET.get("code")
        logger.info(code)
        if code is None:
            return self.redirect_to(err_url)
        # 根据code获取access_token
        wechat_config = WeChatConfig.objects.get(config=config)
        access_token, open_id = OpenWeChatAPI.access_token_oauth2_static(
            wechat_config.app_id, wechat_config.app_secret, code)
        logger.info(access_token)
        if access_token is None:
            # 登录失败,跳转到失败页面
            return self.redirect_to(err_url)
        # 检查用户的open_id是否已经存在
        need_new = False
        wechat_user = None
        try:
            wechat_user = WeChatUser.objects.get(open_id=open_id)
        except WeChatUser.DoesNotExist:
            logger.warning(
                "account.wechat",
                "open_id is first to access console. now regist...")
            need_new = True

        # 添加wechatuser
        if need_new:
            jsondata = OpenWeChatAPI.query_userinfo_static(
                open_id, access_token)
            nick_name = jsondata.get("nickname")
            if nick_name:
                nick_name = nick_name.encode("utf-8")
            wechat_user = WeChatUser(open_id=jsondata.get("openid"),
                                     nick_name=nick_name,
                                     union_id=jsondata.get("unionid"),
                                     sex=jsondata.get("sex"),
                                     city=jsondata.get("city"),
                                     province=jsondata.get("province"),
                                     country=jsondata.get("country"),
                                     headimgurl=jsondata.get("headimgurl"),
                                     config=config)
            wechat_user.save()

        # 根据微信的union_id判断用户是否已经注册
        need_new = False
        user = None
        try:
            user = Users.objects.get(union_id=wechat_user.union_id)
        except Users.DoesNotExist:
            logger.warning(
                "account.wechat",
                "union id is first to access console. now create user...")
            need_new = True
        # 用户表中不存在对应用户,判断是否已经解绑
        if need_new:
            try:
                binding = WeChatUnBind.objects.get(
                    union_id=wechat_user.union_id, status=0)
                user = Users.objects.get(pk=binding.user_id)
                user.union_id = wechat_user.union_id
                user.save()
                need_new = False
            except WeChatUnBind.DoesNotExist:
                pass

        # 创建租户
        if need_new:
            union_id = wechat_user.union_id
            tmp_union_id = md5fun(union_id)
            begin_index = len(tmp_union_id) - 8
            tenant_name = tmp_union_id[begin_index:]
            tenant_name = tenant_name.replace("_", "-").lower()
            email = tenant_name + "@wechat.com"
            logger.debug(
                "account.wechat",
                "new wx regist user.email:{0} tenant_name:{1}".format(
                    email, tenant_name))
            # 创建用户,邮箱为openid后8位@wechat.comemail=email,
            # 统计当前wx数量
            count = Users.objects.filter(rf="open_wx").count()
            count += 1989
            nick_name = "wxgd0" + str(count)
            user = Users(nick_name=nick_name,
                         phone="",
                         client_ip=get_client_ip(request),
                         rf="open_wx",
                         status=2,
                         union_id=union_id)
            user.set_password("wechatpwd")
            user.save()
            monitorhook.registerMonitor(user, 'register')
            # 创建租户,默认为alish
            region = RegionInfo.register_choices()[0][0]

            # add by tanm
            regions = [region]
            enterprise_svc.create_and_init_tenant(user.user_id, tenant_name,
                                                  regions, user.enterprise_id)

            # create gitlab user
            if user.email is not None and user.email != "":
                codeRepositoriesService.createUser(user, email, password,
                                                   nick_name, nick_name)
        logger.info(user)
        if user is None:
            logger.error("account.wechat", "微信用户登录失败!")
            return self.redirect_to(err_url)
        # 微信用户登录
        user = authenticate(union_id=user.union_id)
        login(request, user)
        self.user = request.user

        # 回跳到云市
        if next_url is not None \
                and next_url != "" \
                and next_url != "none" \
                and next_url != "None":
            if origin == "app":
                logger.debug("account.wechat",
                             "now return to cloud market login..")
                if origin_url is None or origin_url == "redirect_url" or origin_url == "":
                    origin_url = settings.APP_SERVICE_API.get("url")
                if not origin_url.startswith("http://"):
                    origin_url = "http://" + origin_url
                # 返回参数
                payload = {
                    "nick_name": user.nick_name,
                    "user_id": str(user.user_id),
                    "next_url": next_url,
                    "action": "register" if need_new else "login"
                }
                if wechat_user is not None:
                    payload["wechat_name"] = wechat_user.nick_name
                ticket = AuthCode.encode(json.dumps(payload), "goodrain")
                next_url = "{0}/login/{1}/success?ticket={2}".format(
                    origin_url, sn.instance.cloud_assistant, ticket)
                # next_url = settings.APP_SERVICE_API.get("url") + '/login/goodrain/success?ticket=' + ticket
                logger.debug("account.wechat", next_url)
            return redirect(next_url)

        return self.redirect_view()