{"record":{"id":"3963a3903458b58b","repo":"kgretzky/evilginx2","slug":"edit-site-url-must-be-absolute","errorCode":null,"errorMessage":"edit: site url must be absolute","messagePattern":"edit: site url must be absolute","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/terminal.go","lineNumber":1009,"sourceCode":"\t\t\t\t\t\t\treturn fmt.Errorf(\"edit: %v\", err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif !u.IsAbs() {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"edit: image url must be absolute\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tl.OgImageUrl = u.String()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tl.OgImageUrl = \"\"\n\t\t\t\t\t}\n\t\t\t\t\tdo_update = true\n\t\t\t\t\tlog.Info(\"og_image = '%s'\", l.OgImageUrl)\n\t\t\t\tcase \"og_url\":\n\t\t\t\t\tif val != \"\" {\n\t\t\t\t\t\tu, err := url.Parse(val)\n\t\t\t\t\t\tif err != nil {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"edit: %v\", err)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif !u.IsAbs() {\n\t\t\t\t\t\t\treturn fmt.Errorf(\"edit: site url must be absolute\")\n\t\t\t\t\t\t}\n\t\t\t\t\t\tl.OgUrl = u.String()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tl.OgUrl = \"\"\n\t\t\t\t\t}\n\t\t\t\t\tdo_update = true\n\t\t\t\t\tlog.Info(\"og_url = '%s'\", l.OgUrl)\n\t\t\t\tcase \"redirector\":\n\t\t\t\t\tif val != \"\" {\n\t\t\t\t\t\tpath := val\n\t\t\t\t\t\tif !filepath.IsAbs(val) {\n\t\t\t\t\t\t\tredirectors_dir := t.cfg.GetRedirectorsDir()\n\t\t\t\t\t\t\tpath = filepath.Join(redirectors_dir, val)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif _, err := os.Stat(path); !os.IsNotExist(err) {\n\t\t\t\t\t\t\tl.Redirector = val\n\t\t\t\t\t\t} else {","sourceCodeStart":991,"sourceCodeEnd":1027,"githubUrl":"https://github.com/kgretzky/evilginx2/blob/4c0988a1d9db4d172a185e979a38bfd0efdb5830/core/terminal.go#L991-L1027","documentation":"In 'lures edit <id> og_url <value>', the provided site URL parsed but is not absolute (missing scheme like https://). The Open Graph og:url value must be a full absolute URL, so the edit is rejected and the lure is not updated.","triggerScenarios":"Running `lures edit <id> og_url` with a scheme-less value like 'example.com' or a path-only value.","commonSituations":"Setting the OG url tag from a bare hostname, forgetting https:// when configuring social-preview metadata for a lure.","solutions":["Use a fully qualified URL: `lures edit 0 og_url https://example.com`","Validate the value parses and IsAbs() is true beforehand","Pass an empty string to clear the og_url"],"exampleFix":"// before\nlures edit 0 og_url example.com\n// after\nlures edit 0 og_url https://example.com","handlingStrategy":"validation","validationCode":"u, err := url.Parse(val)\nif err != nil || !u.IsAbs() {\n    return errors.New(\"og_url must be absolute, e.g. https://example.com\")\n}","typeGuard":"func isAbsoluteURL(s string) bool {\n    u, err := url.Parse(s)\n    return err == nil && u.IsAbs()\n}","tryCatchPattern":"if !isAbsoluteURL(val) {\n    return errors.New(\"og_url must include scheme and host\")\n}","preventionTips":["Include https:// in og_url values","Do not use bare hostnames or paths","Pass an empty string to clear og_url"],"tags":["cli","url-validation","og-metadata","evilginx2"],"backgroundTag":"invalid-url-format","analyzedSha":"4c0988a1d9db4d172a185e979a38bfd0efdb5830","analyzedAt":"2026-09-05T19:23:07.238Z","contentChangedAt":"2026-09-05T19:23:07.238Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}