-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Import github.com/git-lfs/lfs-test-server as lfs module base Imported commit is 3968aac269a77b73924649b9412ae03f7ccd3198 Removed: Dockerfile CONTRIBUTING.md mgmt* script/ vendor/ kvlogger.go .dockerignore .gitignore README.md * Remove config, add JWT support from github.com/mgit-at/lfs-test-server Imported commit f0cdcc5a01599c5a955dc1bbf683bb4acecdba83 * Add LFS settings * Add LFS meta object model * Add LFS routes and initialization * Import github.com/dgrijalva/jwt-go into vendor/ * Adapt LFS module: handlers, routing, meta store * Move LFS routes to /user/repo/info/lfs/* * Add request header checks to LFS BatchHandler / PostHandler * Implement LFS basic authentication * Rework JWT secret generation / load * Implement LFS SSH token authentication with JWT Specification: https://github.com/github/git-lfs/tree/master/docs/api * Integrate LFS settings into install process * Remove LFS objects when repository is deleted Only removes objects from content store when deleted repo is the only referencing repository * Make LFS module stateless Fixes bug where LFS would not work after installation without restarting Gitea * Change 500 'Internal Server Error' to 400 'Bad Request' * Change sql query to xorm call * Remove unneeded type from LFS module * Change internal imports to code.gitea.io/gitea/ * Add Gitea authors copyright * Change basic auth realm to "gitea-lfs" * Add unique indexes to LFS model * Use xorm count function in LFS check on repository delete * Return io.ReadCloser from content store and close after usage * Add LFS info to runWeb() * Export LFS content store base path * LFS file download from UI * Work around git-lfs client issue with unauthenticated requests Returning a dummy Authorization header for unauthenticated requests lets git-lfs client skip asking for auth credentials See: git-lfs/git-lfs#1088 * Fix unauthenticated UI downloads from public repositories * Authentication check order, Finish LFS file view logic * Ignore LFS hooks if installed for current OS user Fixes Gitea UI actions for repositories tracking LFS files. Checks for minimum needed git version by parsing the semantic version string. * Hide LFS metafile diff from commit view, marking as binary * Show LFS notice if file in commit view is tracked * Add notbefore/nbf JWT claim * Correct lint suggestions - comments for structs and functions - Add comments to LFS model - Function comment for GetRandomBytesAsBase64 - LFS server function comments and lint variable suggestion * Move secret generation code out of conditional Ensures no LFS code may run with an empty secret * Do not hand out JWT tokens if LFS server support is disabled
- Loading branch information
Showing
37 changed files
with
2,632 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
package models | ||
|
||
import ( | ||
"errors" | ||
"github.com/go-xorm/xorm" | ||
"time" | ||
) | ||
|
||
// LFSMetaObject stores metadata for LFS tracked files. | ||
type LFSMetaObject struct { | ||
ID int64 `xorm:"pk autoincr"` | ||
Oid string `xorm:"UNIQUE(s) INDEX NOT NULL"` | ||
Size int64 `xorm:"NOT NULL"` | ||
RepositoryID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"` | ||
Existing bool `xorm:"-"` | ||
Created time.Time `xorm:"-"` | ||
CreatedUnix int64 | ||
} | ||
|
||
// LFSTokenResponse defines the JSON structure in which the JWT token is stored. | ||
// This structure is fetched via SSH and passed by the Git LFS client to the server | ||
// endpoint for authorization. | ||
type LFSTokenResponse struct { | ||
Header map[string]string `json:"header"` | ||
Href string `json:"href"` | ||
} | ||
|
||
var ( | ||
// ErrLFSObjectNotExist is returned from lfs models functions in order | ||
// to differentiate between database and missing object errors. | ||
ErrLFSObjectNotExist = errors.New("LFS Meta object does not exist") | ||
) | ||
|
||
const ( | ||
// LFSMetaFileIdentifier is the string appearing at the first line of LFS pointer files. | ||
// https://github.com/git-lfs/git-lfs/blob/master/docs/spec.md | ||
LFSMetaFileIdentifier = "version https://git-lfs.github.com/spec/v1" | ||
|
||
// LFSMetaFileOidPrefix appears in LFS pointer files on a line before the sha256 hash. | ||
LFSMetaFileOidPrefix = "oid sha256:" | ||
) | ||
|
||
// NewLFSMetaObject stores a given populated LFSMetaObject structure in the database | ||
// if it is not already present. | ||
func NewLFSMetaObject(m *LFSMetaObject) (*LFSMetaObject, error) { | ||
var err error | ||
|
||
has, err := x.Get(m) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
if has { | ||
m.Existing = true | ||
return m, nil | ||
} | ||
|
||
sess := x.NewSession() | ||
defer sessionRelease(sess) | ||
if err = sess.Begin(); err != nil { | ||
return nil, err | ||
} | ||
|
||
if _, err = sess.Insert(m); err != nil { | ||
return nil, err | ||
} | ||
|
||
return m, sess.Commit() | ||
} | ||
|
||
// GetLFSMetaObjectByOid selects a LFSMetaObject entry from database by its OID. | ||
// It may return ErrLFSObjectNotExist or a database error. If the error is nil, | ||
// the returned pointer is a valid LFSMetaObject. | ||
func GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error) { | ||
if len(oid) == 0 { | ||
return nil, ErrLFSObjectNotExist | ||
} | ||
|
||
m := &LFSMetaObject{Oid: oid} | ||
has, err := x.Get(m) | ||
if err != nil { | ||
return nil, err | ||
} else if !has { | ||
return nil, ErrLFSObjectNotExist | ||
} | ||
return m, nil | ||
} | ||
|
||
// RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID. | ||
// It may return ErrLFSObjectNotExist or a database error. | ||
func RemoveLFSMetaObjectByOid(oid string) error { | ||
if len(oid) == 0 { | ||
return ErrLFSObjectNotExist | ||
} | ||
|
||
sess := x.NewSession() | ||
defer sessionRelease(sess) | ||
if err := sess.Begin(); err != nil { | ||
return err | ||
} | ||
|
||
m := &LFSMetaObject{Oid: oid} | ||
|
||
if _, err := sess.Delete(m); err != nil { | ||
return err | ||
} | ||
|
||
return sess.Commit() | ||
} | ||
|
||
// BeforeInsert sets the time at which the LFSMetaObject was created. | ||
func (m *LFSMetaObject) BeforeInsert() { | ||
m.CreatedUnix = time.Now().Unix() | ||
} | ||
|
||
// AfterSet stores the LFSMetaObject creation time in the database as local time. | ||
func (m *LFSMetaObject) AfterSet(colName string, _ xorm.Cell) { | ||
switch colName { | ||
case "created_unix": | ||
m.Created = time.Unix(m.CreatedUnix, 0).Local() | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.