This is an automated email from the ASF dual-hosted git repository. benjobs pushed a commit to branch mvn_bug in repository https://gitbox.apache.org/repos/asf/incubator-streampark.git
commit a74c14ec08f81cfe43287e433b9580398a408e39 Author: benjobs <[email protected]> AuthorDate: Wed Nov 29 22:42:19 2023 +0800 [Improve] maven build args improvement --- .../streampark/console/core/entity/Project.java | 33 +++++- .../src/main/resources/db/data-h2.sql | 4 +- .../streampark-console-webapp/src/api/flink/app.ts | 4 +- .../src/api/flink/flinkBuild.ts | 5 +- .../components/Form/src/components/FormItem.vue | 8 +- .../Modal/src/components/ModalWrapper.vue | 4 +- .../components/Table/src/components/HeaderCell.vue | 2 +- .../src/hooks/setting/useMenuSetting.ts | 10 +- .../streampark-console-webapp/src/utils/props.ts | 46 ++++---- .../src/views/base/error-log/data.tsx | 12 +- .../src/views/flink/app/data/option.ts | 121 ++++++++++----------- .../views/resource/project/components/ListItem.vue | 5 +- 12 files changed, 140 insertions(+), 114 deletions(-) diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/Project.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/Project.java index 1db459925..d861c18a3 100644 --- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/Project.java +++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/entity/Project.java @@ -22,6 +22,7 @@ import org.apache.streampark.common.conf.InternalConfigHolder; import org.apache.streampark.common.conf.Workspace; import org.apache.streampark.common.util.CommandUtils; import org.apache.streampark.common.util.Utils; +import org.apache.streampark.console.base.exception.ApiAlertException; import org.apache.streampark.console.base.exception.ApiDetailException; import org.apache.streampark.console.base.util.GitUtils; import org.apache.streampark.console.base.util.WebUtils; @@ -43,9 +44,11 @@ import org.eclipse.jgit.lib.Constants; import java.io.File; import java.io.IOException; import java.io.Serializable; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.jar.JarFile; +import java.util.stream.Collectors; @Slf4j @Data @@ -213,17 +216,41 @@ public class Project implements Serializable { StringBuilder cmdBuffer = new StringBuilder(mvn).append(" clean package -DskipTests "); if (StringUtils.isNotBlank(this.buildArgs)) { - cmdBuffer.append(this.buildArgs.trim()); + List<String> dangerArgs = getLogicalOperators(this.buildArgs); + if (dangerArgs.isEmpty()) { + cmdBuffer.append(this.buildArgs.trim()); + } else { + throw new IllegalArgumentException( + String.format( + "Invalid build args, dangerous operator detected: %s, in your buildArgs: %s", + dangerArgs.stream().collect(Collectors.joining(",")), this.buildArgs)); + } } String setting = InternalConfigHolder.get(CommonConfig.MAVEN_SETTINGS_PATH()); if (StringUtils.isNotBlank(setting)) { - cmdBuffer.append(" --settings ").append(setting); + List<String> dangerArgs = getLogicalOperators(setting); + ApiAlertException.throwIfTrue( + !dangerArgs.isEmpty(), + String.format( + "Invalid maven setting path, dangerous operator detected: %s, in your maven setting path: %s", + dangerArgs.stream().collect(Collectors.joining(",")), setting)); + File file = new File(setting); + if (file.exists() && file.isFile()) { + cmdBuffer.append(" --settings ").append(setting); + } else { + throw new IllegalArgumentException( + String.format("Invalid maven setting path, %s no exists or not file", setting)); + } } - return cmdBuffer.toString(); } + private List<String> getLogicalOperators(String param) { + List<String> dangerArgs = Arrays.asList(" || ", " | ", " && ", " & "); + return dangerArgs.stream().filter(param::contains).collect(Collectors.toList()); + } + @JsonIgnore public String getMavenWorkHome() { String buildHome = this.getAppSource().getAbsolutePath(); diff --git a/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql b/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql index 48f013570..f5d2df45b 100644 --- a/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql +++ b/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql @@ -81,10 +81,10 @@ insert into `t_menu` values (130200, 130000, 'resource.variable', '/resource/var insert into `t_menu` values (130300, 130000, 'resource.upload', '/resource/upload', 'resource/upload/View', null, null, '0', 1, 3, now(), now()); insert into `t_menu` values (130101, 130100, 'project view', null, null, 'project:view', null, '1', 1, null, now(), now()); -insert into `t_menu` values (130102, 130100, 'project add', '/project/add', 'project/Add', 'project:create', '', '0', 0, null, now(), now()); +insert into `t_menu` values (130102, 130100, 'project add', '/project/add', 'resource/project/Add', 'project:create', '', '0', 0, null, now(), now()); insert into `t_menu` values (130103, 130100, 'project build', null, null, 'project:build', null, '1', 1, null, now(), now()); insert into `t_menu` values (130104, 130100, 'project delete', null, null, 'project:delete', null, '1', 1, null, now(), now()); -insert into `t_menu` values (130105, 130100, 'project edit', '/project/edit', 'project/Edit', 'project:update', null, '0', 0, null, now(), now()); +insert into `t_menu` values (130105, 130100, 'project edit', '/project/edit', 'resource/project/Edit', 'project:update', null, '0', 0, null, now(), now()); insert into `t_menu` values (130201, 130200, 'variable view', NULL, NULL, 'variable:view', NULL, '1', 1, null, now(), now()); insert into `t_menu` values (130202, 130200, 'variable depend view', null, null, 'variable:depend_apps', null, '1', 1, NULL, now(), now()); diff --git a/streampark-console/streampark-console-webapp/src/api/flink/app.ts b/streampark-console/streampark-console-webapp/src/api/flink/app.ts index 48a61cbfb..13110db38 100644 --- a/streampark-console/streampark-console-webapp/src/api/flink/app.ts +++ b/streampark-console/streampark-console-webapp/src/api/flink/app.ts @@ -109,7 +109,7 @@ export function fetchCheckName(data: { id?: string; jobName: string }): Promise< return defHttp.post({ url: APP_API.CHECK_NAME, data }); } -export function fetchMain(data):Promise<string> { +export function fetchMain(data): Promise<string> { return defHttp.post({ url: APP_API.MAIN, data }); } /** @@ -117,7 +117,7 @@ export function fetchMain(data):Promise<string> { * @param params * @returns {String} file path */ -export function fetchUpload(params) :Promise<string> { +export function fetchUpload(params): Promise<string> { return defHttp.post<string>({ url: APP_API.UPLOAD, params, diff --git a/streampark-console/streampark-console-webapp/src/api/flink/flinkBuild.ts b/streampark-console/streampark-console-webapp/src/api/flink/flinkBuild.ts index 8fbda0dc9..de201ec67 100644 --- a/streampark-console/streampark-console-webapp/src/api/flink/flinkBuild.ts +++ b/streampark-console/streampark-console-webapp/src/api/flink/flinkBuild.ts @@ -22,7 +22,10 @@ enum BUILD_API { DETAIL = '/flink/pipe/detail', } -export function fetchBuild(data: { appId: string; forceBuild: boolean; }): Promise<AxiosResponse<any>> { +export function fetchBuild(data: { + appId: string; + forceBuild: boolean; +}): Promise<AxiosResponse<any>> { return defHttp.post({ url: BUILD_API.BUILD, data }, { isReturnNativeResponse: true }); } /** diff --git a/streampark-console/streampark-console-webapp/src/components/Form/src/components/FormItem.vue b/streampark-console/streampark-console-webapp/src/components/Form/src/components/FormItem.vue index 137ae94d6..9bbb5023f 100644 --- a/streampark-console/streampark-console-webapp/src/components/Form/src/components/FormItem.vue +++ b/streampark-console/streampark-console-webapp/src/components/Form/src/components/FormItem.vue @@ -333,8 +333,8 @@ return slot ? getSlot(slots, slot, unref(getValues)) : render - ? render(unref(getValues)) - : renderComponent(); + ? render(unref(getValues)) + : renderComponent(); }; const showSuffix = !!suffix; @@ -382,8 +382,8 @@ return colSlot ? getSlot(slots, colSlot, values) : renderColContent - ? renderColContent(values) - : renderItem(); + ? renderColContent(values) + : renderItem(); }; return ( diff --git a/streampark-console/streampark-console-webapp/src/components/Modal/src/components/ModalWrapper.vue b/streampark-console/streampark-console-webapp/src/components/Modal/src/components/ModalWrapper.vue index 1b1b9a613..52c8b5eb8 100644 --- a/streampark-console/streampark-console-webapp/src/components/Modal/src/components/ModalWrapper.vue +++ b/streampark-console/streampark-console-webapp/src/components/Modal/src/components/ModalWrapper.vue @@ -153,8 +153,8 @@ realHeightRef.value = props.height ? props.height : realHeight > maxHeight - ? maxHeight - : realHeight; + ? maxHeight + : realHeight; } emit('height-change', unref(realHeightRef)); } catch (error) { diff --git a/streampark-console/streampark-console-webapp/src/components/Table/src/components/HeaderCell.vue b/streampark-console/streampark-console-webapp/src/components/Table/src/components/HeaderCell.vue index 35c080269..36ab854c5 100644 --- a/streampark-console/streampark-console-webapp/src/components/Table/src/components/HeaderCell.vue +++ b/streampark-console/streampark-console-webapp/src/components/Table/src/components/HeaderCell.vue @@ -22,7 +22,7 @@ props: { column: { type: Object as PropType<BasicColumn>, - default: () => ({} as BasicColumn), + default: () => ({}) as BasicColumn, }, }, setup(props) { diff --git a/streampark-console/streampark-console-webapp/src/hooks/setting/useMenuSetting.ts b/streampark-console/streampark-console-webapp/src/hooks/setting/useMenuSetting.ts index 3566bfd27..f501c6e80 100644 --- a/streampark-console/streampark-console-webapp/src/hooks/setting/useMenuSetting.ts +++ b/streampark-console/streampark-console-webapp/src/hooks/setting/useMenuSetting.ts @@ -105,8 +105,8 @@ export function useMenuSetting() { return siderHidden ? 0 : collapsedShowTitle - ? SIDE_BAR_SHOW_TIT_MINI_WIDTH - : SIDE_BAR_MINI_WIDTH; + ? SIDE_BAR_SHOW_TIT_MINI_WIDTH + : SIDE_BAR_MINI_WIDTH; }); const getCalcContentWidth = computed(() => { @@ -114,9 +114,9 @@ export function useMenuSetting() { unref(getIsTopMenu) || !unref(getShowMenu) || (unref(getSplit) && unref(getMenuHidden)) ? 0 : unref(getIsMixSidebar) - ? (unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH) + - (unref(getMixSideFixed) && unref(mixSideHasChildren) ? unref(getRealWidth) : 0) - : unref(getRealWidth); + ? (unref(getCollapsed) ? SIDE_BAR_MINI_WIDTH : SIDE_BAR_SHOW_TIT_MINI_WIDTH) + + (unref(getMixSideFixed) && unref(mixSideHasChildren) ? unref(getRealWidth) : 0) + : unref(getRealWidth); return `calc(100% - ${unref(width)}px)`; }); diff --git a/streampark-console/streampark-console-webapp/src/utils/props.ts b/streampark-console/streampark-console-webapp/src/utils/props.ts index 368f490f2..4a5491b27 100644 --- a/streampark-console/streampark-console-webapp/src/utils/props.ts +++ b/streampark-console/streampark-console-webapp/src/utils/props.ts @@ -28,8 +28,8 @@ export type BuildPropOption<T, D extends BuildPropType<T, V, C>, R, V, C> = { default?: R extends true ? never : D extends Record<string, unknown> | Array<any> - ? () => D - : (() => D) | D; + ? () => D + : (() => D) | D; validator?: ((val: any) => val is C) | ((val: any) => boolean); }; @@ -37,8 +37,8 @@ type _BuildPropType<T, V, C> = | (T extends PropWrapper<unknown> ? T[typeof wrapperKey] : [V] extends [never] - ? ResolvePropTypeWithReadonly<T> - : never) + ? ResolvePropTypeWithReadonly<T> + : never) | V | C; export type BuildPropType<T, V, C> = _BuildPropType< @@ -53,8 +53,8 @@ type _BuildPropDefault<T, D> = [T] extends [ ] ? D : D extends () => T - ? ReturnType<D> - : D; + ? ReturnType<D> + : D; export type BuildPropDefault<T, D, R> = R extends true ? { readonly default?: undefined } @@ -146,12 +146,12 @@ export const buildProps = < [K in keyof O]: O[K] extends BuildPropReturn<any, any, any, any, any> ? O[K] : [O[K]] extends NativePropType - ? O[K] - : O[K] extends BuildPropOption<infer T, infer D, infer R, infer V, infer C> - ? D extends BuildPropType<T, V, C> - ? BuildPropOption<T, D, R, V, C> - : never - : never; + ? O[K] + : O[K] extends BuildPropOption<infer T, infer D, infer R, infer V, infer C> + ? D extends BuildPropType<T, V, C> + ? BuildPropOption<T, D, R, V, C> + : never + : never; }, >( props: O, @@ -162,17 +162,17 @@ export const buildProps = < [K in keyof O]: O[K] extends { [propKey]: boolean } ? O[K] : [O[K]] extends NativePropType - ? O[K] - : O[K] extends BuildPropOption< - infer T, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - infer _D, - infer R, - infer V, - infer C - > - ? BuildPropReturn<T, O[K]['default'], R, V, C> - : never; + ? O[K] + : O[K] extends BuildPropOption< + infer T, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + infer _D, + infer R, + infer V, + infer C + > + ? BuildPropReturn<T, O[K]['default'], R, V, C> + : never; }; export const definePropType = <T>(val: any) => ({ [wrapperKey]: val }) as PropWrapper<T>; diff --git a/streampark-console/streampark-console-webapp/src/views/base/error-log/data.tsx b/streampark-console/streampark-console-webapp/src/views/base/error-log/data.tsx index 3ffc2f453..73120a425 100644 --- a/streampark-console/streampark-console-webapp/src/views/base/error-log/data.tsx +++ b/streampark-console/streampark-console-webapp/src/views/base/error-log/data.tsx @@ -16,12 +16,12 @@ export function getColumns(): BasicColumn[] { text === ErrorTypeEnum.VUE ? 'green' : text === ErrorTypeEnum.RESOURCE - ? 'cyan' - : text === ErrorTypeEnum.PROMISE - ? 'blue' - : ErrorTypeEnum.AJAX - ? 'red' - : 'purple'; + ? 'cyan' + : text === ErrorTypeEnum.PROMISE + ? 'blue' + : ErrorTypeEnum.AJAX + ? 'red' + : 'purple'; return <Tag color={color}>{() => text}</Tag>; }, }, diff --git a/streampark-console/streampark-console-webapp/src/views/flink/app/data/option.ts b/streampark-console/streampark-console-webapp/src/views/flink/app/data/option.ts index 84658abf2..54cb399cf 100644 --- a/streampark-console/streampark-console-webapp/src/views/flink/app/data/option.ts +++ b/streampark-console/streampark-console-webapp/src/views/flink/app/data/option.ts @@ -488,68 +488,65 @@ const options = [ }, }, { - key: 'taskmanager.memory.network.max', - name: 'taskmanager.memory.network.max', - placeholder: 'Max Network Memory size for TaskExecutors', - description: - 'This biggest Network Memory is used for allocation of network buffers', - unit: 'mb', - group: 'taskmanager-memory', - type: 'number', - min: 64, - max: 1024, - step: 1, - defaultValue: 1024, - validator: (_rule, value, callback) => { - if (!value) { - callback(new Error('memory.network.max is required or you can delete this option')); - } else { - callback(); - } - }, - }, - { - key: 'taskmanager.memory.network.min', - name: 'taskmanager.memory.network.min', - placeholder: 'Min Network Memory size for TaskExecutors', - description: - 'This minimum Network Memory is used for allocation of network buffers', - unit: 'mb', - group: 'taskmanager-memory', - type: 'number', - min: 64, - max: 1024, - step: 1, - defaultValue: 64, - validator: (_rule, value, callback) => { - if (!value) { - callback(new Error('memory.network.min is required or you can delete this option')); - } else { - callback(); - } - }, - }, - { - key: 'taskmanager.memory.network.fraction', - name: 'taskmanager.memory.network.fraction', - placeholder: 'Fraction of Network Memory size for TaskExecutors', - description: - 'The fraction of Network Memory size is used for allocation of network buffers', - unit: 'mb', - group: 'taskmanager-memory', - type: 'number', - min: 0.1, - max: 1, - step: 0.1, - defaultValue: 0.1, - validator: (_rule, value, callback) => { - if (!value) { - callback(new Error('memory.network.fraction is required or you can delete this option')); - } else { - callback(); - } - }, - }, + key: 'taskmanager.memory.network.max', + name: 'taskmanager.memory.network.max', + placeholder: 'Max Network Memory size for TaskExecutors', + description: 'This biggest Network Memory is used for allocation of network buffers', + unit: 'mb', + group: 'taskmanager-memory', + type: 'number', + min: 64, + max: 1024, + step: 1, + defaultValue: 1024, + validator: (_rule, value, callback) => { + if (!value) { + callback(new Error('memory.network.max is required or you can delete this option')); + } else { + callback(); + } + }, + }, + { + key: 'taskmanager.memory.network.min', + name: 'taskmanager.memory.network.min', + placeholder: 'Min Network Memory size for TaskExecutors', + description: 'This minimum Network Memory is used for allocation of network buffers', + unit: 'mb', + group: 'taskmanager-memory', + type: 'number', + min: 64, + max: 1024, + step: 1, + defaultValue: 64, + validator: (_rule, value, callback) => { + if (!value) { + callback(new Error('memory.network.min is required or you can delete this option')); + } else { + callback(); + } + }, + }, + { + key: 'taskmanager.memory.network.fraction', + name: 'taskmanager.memory.network.fraction', + placeholder: 'Fraction of Network Memory size for TaskExecutors', + description: 'The fraction of Network Memory size is used for allocation of network buffers', + unit: 'mb', + group: 'taskmanager-memory', + type: 'number', + min: 0.1, + max: 1, + step: 0.1, + defaultValue: 0.1, + validator: (_rule, value, callback) => { + if (!value) { + callback(new Error('memory.network.fraction is required or you can delete this option')); + } else { + callback(); + } + }, + }, ]; const optionsKeyMapping = new Map<string, Recordable>(); diff --git a/streampark-console/streampark-console-webapp/src/views/resource/project/components/ListItem.vue b/streampark-console/streampark-console-webapp/src/views/resource/project/components/ListItem.vue index 5f5d9ad9c..2ca92caf3 100644 --- a/streampark-console/streampark-console-webapp/src/views/resource/project/components/ListItem.vue +++ b/streampark-console/streampark-console-webapp/src/views/resource/project/components/ListItem.vue @@ -125,17 +125,16 @@ import { computed } from 'vue'; import { buildProject, deleteProject } from '/@/api/resource/project'; import { useMessage } from '/@/hooks/web/useMessage'; - import { useGo } from '/@/hooks/web/usePage'; import { ProjectRecord } from '/@/api/resource/project/model/projectModel'; import { BuildStateEnum } from '/@/enums/flinkEnum'; import { useI18n } from '/@/hooks/web/useI18n'; import { ProjectTypeEnum } from '/@/enums/projectEnum'; + import { router } from '/@/router'; const { t } = useI18n(); const emit = defineEmits(['viewLog', 'success']); const { Swal, createMessage } = useMessage(); - const go = useGo(); const props = defineProps({ item: { type: Object as PropType<ProjectRecord>, required: true }, }); @@ -172,7 +171,7 @@ } const handleEdit = function () { - go(`/project/edit?id=${props.item.id}`); + router.push({ path: '/project/edit', query: { id: props.item.id } }); }; async function handleDelete() {
